20 дек. 2012 г.

Python, извлечение параметров из Post или Get запросов.

Извлекать параметры, введенные в форму (get или post), довольно легко. В этом поможет следующая конструкция:


from mod_python import util

def handler(req):
   form_data = util.FieldStorage(req, keep_blank_values=1)
   myparameter = form_data.getfirst("parameter")

В myparameter теперь находится значение того, что было передано с именем "parameter". Например, того, что было в ведено в "EditBox1".

19 дек. 2012 г.

Настройка сетевого интерфейса в RHEL6 (RedHat, CentOS, Oracle Linux)

Решил вот сделать заметку о настройке сетевых интерфейсов RHEL (RedHat, CentOS, Oracle Linux, Fedora).

Вначале редактируем файлик настройки интерфейса, например eth1 (<> - означает специфические значения):

nano /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE="eth1"
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.1.2
PREFIX=24
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"
UUID=<>
ONBOOT=yes
HWADDR=<>
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DNS2=8.8.8.8
VLAN=yes
MASTERr=bond0
SLAVE=yes

Строки говорят сами за себя. HWADDR и UUID проще не указывать, чтобы система сама их розчехлила, а если и указывать, то точно для вашего адаптера.

  • BOOTPROTO=none - при задании статического адреса. Для получения динамического адреса, здесь необходимо указать =dhcp
  • VLAN=yes - если мы настраиваем интерфейс для работы с тегами VLAN.
  • MASTERr=bond0 - если мы настраиваем интерфейс как часть бонда
  • SLAVE=yes - если мы настраиваем интерфейс как часть бонда
  • NETMASK=255.255.255.0 - указываем только ОДИН из параеметров - или NETMASK или PREFIX
Далее редактируем:

nano /etc/sysconfig/network

18 дек. 2012 г.

Подсветка синтаксиса в Blogger

На эту тему довольно много статей есть. При начальной настройке у меня вылазили различные глюки, потому я решил поделиться окончательным решением, которое у меня сейчас работает.

Подсветка синтаксиса использует Java-script библиотеку SyntaxHighlighter

Итак, открываем панель блоггера, переходим в Шаблон › Изменить HTML и находим там строчку такого вида (у вас может быть другая, главное - чтобы были теги <title>):


<title><data:blog.pageTitle/></title>

После этой строчки дописываем следующее:


<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript">
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/>

<script type='text/javascript'>
  SyntaxHighlighter.config.bloggerMode = false;
  SyntaxHighlighter.all();
</script>

Также, чтобы в браузере Google Chrome не было глюков с нумерацией строк, нужно найти строчку:

Сеть 1Gb (1000BaseT) на контроллерах RTL8111/8168B встроенных в материнскую плату

Недавно столкнулся с тем, что драйвер для  интегрированного в материнскую плату сетевого адаптера RealTek RTL8111/8168B/8169, идущий вместе с ОС Debian / Oracle Linux 6 ни в какую не хочет работать в режиме 1Gb.
Проблема эта решается установкой свежей версии драйвера.
В Debian 7 я эту проблему решил установкой драйвера из исходников:

1.  Переходим на сайт разработчика Realtek и качаем нужную нам версию (LINUX driver for kernel 3.x and 2.6.x and 2.4.x) с миррора поближе к нам. Ссылки там сделаны в виде жабаскриптов, потому из консоли мне скачать не удалось, да и не беда это. Скачиваем, затем по scp или ещё как копируем на сервер файлик r8168-8.034.00.tar.bz.

2. Распаковываем и переходим в директорию:

tar -xjvf r8168-8.034.00.tar.bz
cd r8168-8.034.00


3. Устанавливаем необходимые пакеты, если их еще нет:

aptitude install build-essential linux-headers-$(uname -r)

14 дек. 2012 г.

SQLAlchemy в Python

В python для работы с MySQL есть библиотечка SQLAlchemy.
У неё много всяких фишек-плюшек, но я в подавляющем большинстве случаев использую конструкции такого типа:


from sqlalchemy import create_engine
b_connection_string = 'mysql://user:password@localhost/db_name'
user = "admin"
db =  create_engine(db_connection_string)
for row in db.execute("select Permissions from users where Name = \"%s\""%(user)):
    result.append(str(row))

Где в 1й строчке мы импортируем функцию, затем создаем соединение с БД, а затем выполняем какой-то запрос. В итоге мы получим такую конструкцию (в данном примере):

["('On, Off, Bla-bla',)"]

Теперь можно облагородить результат, добавив , например:


result = result[0].replace("('","")
result = result.replace("',)","")
result = result.replace(", ", ",")

Получим в result:  'On, Off, Bla-bla'

Как с помощью iptables разрешить доступ к локальному порту только для списка IP адресов

Возможно, есть способы и попроще, но я сделал так.
Защищать будем, например, Asterisk (по-умолчанию порт для протокола SIP 5060)

Создаем новую цепочку:

iptables -N asterisk-manual
iptables -I INPUT -i eth0 -p udp --dport 5060 -j asterisk-manual

Прописываем, из каких адресов можно подключаться и в конце запрещаем остальным:

iptables -A asterisk-manual -s 192.168.1.0/24 -j ACCEPT
iptables -A asterisk-manual -s 192.168.2.0/24 -j ACCEPT
iptables -A asterisk-manual -s 192.168.3.0/24 -j ACCEPT
iptables -A asterisk-manual -s 192.168.4.2 -j ACCEPT
iptables -A asterisk-manual -j DROP

И сохраняем правила:

iptables-save

Чтобы добавить новый адрес вначале удалим последнюю строчку (по ее номеру), а затем добавим новую и восстановим запрещающую:

iptables -L asterisk-manual -n --line-numbers
iptables -D asterisk-manual 5
iptables -A asterisk-manual -s 192.168.4.3 -j ACCEPT
iptables -A asterisk-manual -j DROP

Не забываем сохраняться:

iptables-save

Как разрешить обычному пользователю Linux выполнять команду shutdown

В некоторых дистрибутивах обычный пользователь не может из консоли выключить/перезагрузить компьютер под управлением ОС Linux. Разрешаем так:

which shutdown
chmod u+s /sbin/shutdown

Быстрое сохраниение и восстановление конфигурации alsa в Linux

Чтобы сохранить текущую конфигурацию выполняем:

alsactl store -f ./alsamixer.conf

Для восстановления конфигурации:

alsactl restore -f ./alsamixer.conf

Открытие портов в iptables в RHEL дистрибутивах (RedHat, Oracle Linux, CentOS, etc.)

nano /etc/sysconfig/iptables

Добавляем запись, например:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT


Сохраняем и рестартуем iptables:

/etc/init.d/iptables restart


Возможно Selinux будет ругаться при рестарте. Придется его отключить:

nano /etc/selinux/config 

И изменяем строчку SELINUX:

SELINUX=disabled

Добавление статического роута в RHEL дистрибутивах (RedHat, Oracle, CentOS, etc.)

Роуты нужно класть в папку /etc/sysconfig/network-scripts/ в виде текстового файлика route-X где Х - имя интерфейса. Например:

nano /etc/sysconfig/network-scripts/route-eth0

в формате

192.168.1.0/24 via 192.168.1.1

или

ADDRESS0=192.168.1.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.1.1

Если роутов нужно больше одного, то для первого формата просто записываем с новой строки, а для второго - меняем цифру:

ADDRESS1=192.168.2.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.2.1

Проверяем:

netstat -rn
route -n

Добавить не статический роут можно командой:

route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.3.1

4 дек. 2012 г.

Проверка балланса GSM-модема, подключенного к Asterisk и формирование лога звонков за прошедшие сутки с отправкой по e-mail на Python 3

Недавно был описанный в заголовке таск.

Т. к. я очень люблю питончик, то скрипты пишу на нём. В скрипте выполняется команда астериска (USSD-запрос), далее вытягивается содержимое ответа на ussd, вытягивается лог звонков за сутки, формируется письмо в виде html и отсылается на заданные адреса по электронной почте.

1. Импорты необходимых библиотек:


#!/usr/bin/env python3
import os, smtplib, time, subprocess, shlex, sys, csv
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

2. Формируем шапку письма - кому, куда, что и зачем :)


# me == my email address
# you == recipient's email address
# cc == copy's address
me = "asterisk@example.com"
сс = "recipient1@example.com"
you = "recipient2@example.com"
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "GSM modem balance ("+time.strftime("%m/%d/%Y",time.localtime())+")"
msg['From'] = me
msg['To'] = you+", "+cc
msg['Date'] = formatdate(localtime=True)

Отправка USSD-запроса сосстояния балланса и обработка результата. Для посылки запроса использую вызов bash команды через subprocess.call - может быть и слишком криво, но быстро и работает.

Затем идет пауза в 10 сек - необходима, чтобы пришел ответ от оператора.