#!/bin/sh
# Copyright (C) 2010 Chris "Pada" Kistner
# Modified by PacoLM to check only shared memory settings
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# if you find errors, check that coreutils are installed, if not, run the command below
# apt-get -y install coreutils bc
echo "--- Checking memory setting..."
page_size=$(getconf PAGE_SIZE)
mem_bytes=$(awk '/MemTotal:/ { printf "%0.f",$2 * 1024}' /proc/meminfo)
mb=1048576
mem_bytes_mb=$(expr $mem_bytes / $mb)
shmmax=$(echo "$mem_bytes * 0.90" | bc | cut -f 1 -d '.')
shmmax_mb=$(expr $shmmax / $mb)
shmall=$(expr $mem_bytes / $page_size)
shmmax_cur=$(sysctl -n kernel.shmmax)
shmmax_cur_mb=$(expr $shmmax_cur / $mb)
shmall_cur=$(sysctl -n kernel.shmall)
echo "-- Total memory = $mem_bytes B = $mem_bytes_mb MB"
echo "-- Page size = $page_size B"
echo "-- Current kernel.shmmax = $shmmax_cur B = $shmmax_cur_mb MB"
echo "-- Current kernel.shmall = $shmall_cur pages"
if [ "$shmmax" -eq "$shmmax_cur" ] && [ "$shmall" -eq "$shmall_cur" ]; then
echo "-- Recommended shm values already set"
else
echo "-- Recommended: kernel.shmmax = $shmmax B = $shmmax_mb MB"
echo "-- Recommended: kernel.shmall = $shmall pages"
fi
# Done
echo "--- Done."
Підбираємо опримальний об'єм пам'яті для zoneminder
додатковий трафік з Google Images
В свій час писав автоматизацію для наповнення інтернет-магазину, яка використовувала пошук в "Google Images". І час від часу натрапляв на сайти, де знаходився потрібний мені малюнок, але я не встигав на нього клікнути чи то скопіювати шлях, як відбувався повний перехід на вищезгаданий сайт з фреймів "Google Images". І перехід не на потрібну мені сторінку, де є малюнок, а в корінь сайту. Велика незручність для кінцевого користувача і додатковий трафік для власнику сайту. Про корисність цього трафіку можна довго сперечатись, але і немає страху втратити цього випадкового відвідувача :)
Технічний момент. В head'і прописуємо:
Закоментований варіант - перехід на сторінку де є малюнок, розкоментований - в корінь сайту.
Технічний момент. В head'і прописуємо:
<script type='text/javascript'>
if (parent.frames.length > 0) {.
//parent.location.href = location.href;
parent.location.href = 'http://t-v.te.ua';
}
</script>
Закоментований варіант - перехід на сторінку де є малюнок, розкоментований - в корінь сайту.
split на bash'і
snat=(
55410:192.168.10.99:80
55415:192.168.10.199:80
55411:192.168.20.99:80
55412:192.168.30.199:80
55413:192.168.24.99:80
55414:192.168.20.199:80
)
for i in ${snat[@]}; do
set -- "$i"
IFS=":"; declare -a Array=($*)
iptables -A FORWARD -p tcp -s ${Array[1]} --sport ${Array[2]} -j ACCEPT
iptables -A FORWARD -p tcp -d ${Array[1]} --dport ${Array[2]} -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport ${Array[0]} -j DNAT --to-destination ${Array[1]}\:${Array[2]}
echo "${Array[@]}"
done
п.с. збоченська мова
Багатопотокова проксі-чекалка на Python
#!/usr/bin/python
import Queue
import threading
import MySQLdb
import urllib2
import time
class DB:
conn = None
def connect(self):
self.conn = MySQLdb.connect(host = "x.y.z.q", user = "user", passwd = "password", db = "database")
def query(self, sql):
try:
cursor = self.conn.cursor()
cursor.execute(sql)
except (AttributeError, MySQLdb.OperationalError):
self.connect()
cursor = self.conn.cursor()
cursor.execute(sql)
return cursor
proxyList = []
global db
db = DB()
curr = db.query("SELECT url FROM proxy")
result_set = curr.fetchall ()
for row in result_set:
proxyList.append(row[0])
queue = Queue.Queue()
class ThreadUrl(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
host = self.queue.get()
try:
proxy_handler = urllib2.ProxyHandler({'http':host})
opener = urllib2.build_opener(proxy_handler)
opener.addheaders = [('User-agent','Mozilla/5.0')]
urllib2.install_opener(opener)
req = urllib2.Request("http://www.proxylists.net/proxyjudge.php")
sock=urllib2.urlopen(req, timeout= 7)
rs = sock.read(5000)
if 'ProxyLists.Net - Proxy judge ' in rs:
print "ok %s" % host
db.query("UPDATE proxy SET checked=NOW() WHERE url = '%s' " % host)
except:
print "err %s" % host
db.query("DELETE FROM proxy WHERE url LIKE '%s' " % host)
self.queue.task_done()
def main():
for i in range(20):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()
for host in proxyList:
queue.put(host)
queue.join()
main()
Django: реалізація динамічного select'у
Не доводилось раніше використовувати динамічний select, тобто select, який через ajax підтягує значення відповідно до значення вибраного в попередньому select'і. Тож довелось розібратись. Пропоную свій код, який не претендує на супер-оригінальність
models.py
models.py
# -*- coding:utf-8 -*-
from decimal import Decimal
from django.db import models
from django.db.models import permalink
class Category(models.Model):
name = models.CharField(max_length=60)
slug = models.SlugField(max_length=60, unique=True)
order = models.IntegerField(default=255)
count_posts = models.IntegerField(default=0)
class Meta:
ordering = ['order']
def __unicode__(self):
return self.name
class SubCategory(models.Model):
name = models.CharField(max_length=60)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category, null=True, blank=True, related_name='subcategories')
count_posts = models.IntegerField(default=0)
order = models.IntegerField(default=255)
class Meta:
unique_together = (('parent', 'slug'),)
ordering = ['name']
def __unicode__(self):
return u'%s -> %s' % (self.parent, self.name)
class Post(models.Model):
DENIED_STATUS = 0
APPROVED_STATUS = 1
PENDING_STATUS = 2
POST_STATUS=(
(DENIED_STATUS, 'Denied'),
(APPROVED_STATUS, 'Approved'),
(PENDING_STATUS, 'Pending'),
)
OFFER = 1
DEMAND = 2
SERVICES = 3
RENTAL = 4
ABSTRACT = 5
VACANCY = 6
POST_SUBJ=(
(OFFER, u'Попит'),
(DEMAND, u'Пропозиція'),
(SERVICES, u'Послуги'),
(RENTAL, u'Аренда'),
(ABSTRACT, u'Резюме'),
(VACANCY, u'Вакансії'),
)
category = models.ForeignKey(SubCategory)
subj=models.IntegerField(u'Тип', max_length=1, choices=POST_SUBJ, default=OFFER)
status=models.IntegerField(u'Стан', max_length=1, choices=POST_STATUS, default=APPROVED_STATUS)
title = models.CharField(max_length=60)
slug = models.SlugField(max_length=60)
body = models.CharField(max_length=250)
contact = models.CharField(max_length=120)
email = models.CharField(max_length=100, null=True, blank=True)
price = models.DecimalField(max_digits=8, decimal_places=2, default=Decimal('0.00'), )
ip_address = models.IPAddressField(u'IP address', null=True, blank=True)
youtube = models.CharField(max_length=100, null=True, blank=True)
site_link = models.CharField(max_length=100, null=True, blank=True)
posted_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['posted_on']
def __unicode__(self):
return u'%s' % self.title
@permalink
def get_absolute_url(self):
return (
'ogo_ogo', None, {
'cat_slug':self.category.parent.slug,
'sub_cat_slug':self.category.slug,
'id':self.pk,
})
def formattedprice(self):
return u'%01.2f' % self.price
def save(self, *args, **kwargs):
super(Post, self).save(*args, ** kwargs)
views.py
@render_to('')
def add(request, form_class=AddPostForm, template="add.html"):
if request.method == "POST":
form = form_class(request.POST)
if form.is_valid():
new_obj = form.save()
return redirect(reverse('ogo_add_complete', kwargs={'id':new_obj.id,}))
else:
form = form_class()
return {
"form": form,
}, template
@render_json
def fetch_subcat_json(request):
result = list()
try:
cat = Category.objects.get(pk=int(request.GET.get('id', '')))
sub_cat = SubCategory.objects.filter(parent=cat)
result.append({ 'optionDisplay': '-- Оберіть категорію --', "optionValue" : '' })
for sc in sub_cat:
result.append({ 'optionDisplay': sc.name, "optionValue" : sc.pk })
except:
result.append({ 'optionDisplay': '-- Оберіть категорію --', "optionValue" : '' })
return result
forms.py
# -*- coding:utf-8 -*-
from types import *
from django import forms
from django.utils.translation import ugettext_lazy as _, ugettext
from django.template.defaultfilters import slugify
from apps.ogo.models import Post, Category, SubCategory
class AddPostForm(forms.Form):
category = forms.ChoiceField(required=True,)
sub_category = forms.ChoiceField(required=True,)
type_post = forms.ChoiceField(required=True,)
title = forms.CharField(label=_(u'Заголовок'), max_length=100, widget=forms.TextInput())
contact = forms.CharField(label=_(u'Конакт'), max_length=100, widget=forms.TextInput())
body = forms.CharField(label=_(u"Текст оголошення"),max_length = 350, widget = forms.Textarea, required=True)
contact = forms.CharField(label=_(u'Конакт'), max_length=100, widget=forms.TextInput())
price = forms.CharField(label=_(u'Вартість, грн.'), max_length=10, widget=forms.TextInput(),required=True)
def __init__(self, *args, **kwargs):
super(AddPostForm, self).__init__(*args, **kwargs)
self.sub_cat = SubCategory.objects.all()
CAT_CHOICES = [('', '-- Оберіть --'), ] + [(c.pk, c.name) for c in Category.objects.all().order_by("pk")]
SUBCAT_CHOICES = [('', '-- Оберіть категорію --'),]
TYPE_CHOICES = [('', '-- Оберіть --'), ] + [(t[0], t[1]) for t in Post.POST_SUBJ]
try:
init_cat = int(args[0]['category'])
SUBCAT_CHOICES = [('', '-- Оберіть --'), ] + [(c.pk, c.name) for c in SubCategory.objects.filter(parent=init_cat).order_by("pk")]
except:
init_cat = None
try:
init_sub_cat = int(args[0]['sub_category'])
SUBCAT_CHOICES = [('', '-- Оберіть --'), ] + [(c.pk, c.name) for c in SubCategory.objects.filter(parent=init_cat).order_by("pk")]
except:
init_sub_cat = None
try:
init_type = int(args[0]['type_post'])
except:
init_type=None
self.fields['category'] = forms.ChoiceField(choices=CAT_CHOICES, label=u'Категорія', initial=init_cat)
self.fields['sub_category'] = forms.ChoiceField(choices=SUBCAT_CHOICES, label=u'Підкатегорія', initial=init_sub_cat)
self.fields['type_post'] = forms.ChoiceField(choices=TYPE_CHOICES, label=u'Тип', initial=init_type)
def save(self):
return Post.objects.create(
category = self.sub_cat.get(pk=self.cleaned_data["sub_category"]),
subj = self.cleaned_data["type_post"],
title = self.cleaned_data["title"],
slug = slugify(self.cleaned_data["title"]),
body = self.cleaned_data["body"],
contact = self.cleaned_data["contact"],
price = self.cleaned_data["price"],
)
add.html
urls.py
# -*- coding:utf-8 -*-
from django.conf.urls.defaults import *
urlpatterns = patterns('ogo.views',
url(r'^dodaty/', 'add', name = "ogo_add"),
url(r'^dodano-uspishno/(?P\d{1,5})/$', 'add_complete', name = "ogo_add_complete"),
url(r'^fetch-subcat/$', 'fetch_subcat_json', name = "fetch_subcat"),
)
Оновлення (RENEW) домену org.ua
Залишу шпаргалку для себе і може для когось.
to: register_query@org.ua
subject: RENEW domain.org.ua
to: register_query@org.ua
subject: RENEW domain.org.ua
domain:domain.org.ua descr: domain homepage admin-c:ваш_нік-UANIC tech-c: ваш_нік-UANIC nserver: ns1.ваш_днс nserver: ns2.ваш_днс changed: e-mail@e-mail.com 20121003 source: UANIC
програмне (HTTP) перезавантаження китайських ІР-камер
Є ноунеймовська китайська ІР-камера. Постала задача програмно її перевантажувати. Перше що спало на думку - телнет. І він виявився навіть відкритим, але зайти таки не вдалось. Так званий український сапорт сказав що телнет не працює, закрили його китайці. Довелось копати в сторону HTTP.
Отож рішення:
Подібним методом можна автоматизувати не лише камери. FireBug в поміч.
Отож рішення:
wget --cookies=on \
--keep-session-cookies \
--save-cookies cookies.txt \
--post-data 'A=login&B=password&button=Login' \
http://x.y.z.x/cgi-bin/LoginAction.cgi
wget --load-cookies cookies.txt \
-p http://x.y.z.x/cgi-bin/Reboot.cgi
Подібним методом можна автоматизувати не лише камери. FireBug в поміч.
Підписатися на:
Дописи (Atom)