четверг, 30 октября 2008 г.

Мой первый плазмоид

Я поклонник KDE и python. С удивлением я, как и многие другие, смотрел на KDE 4.0. После вылизанного 3.5 это было конечно страшно. Особенно мне не хватало kicker и его "кикоидов". Но время идет, проект продолжает развиваться невзирая на возню анонимов на веб просторах, и теперь наконец то есть привязки plasma для python, а значит теперь я сам себе автор плазмоидов.

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

Этот код просто вставьте в командную строку, он создаст структуру каталогов, файлы, соберет пакет, и установит его для текущего пользователя.


mkdir -p wwwv/contents/code
cd wwwv
cat > metadata.desktop << EOF
[Desktop Entry]
Encoding=UTF-8
Name=WWW viewer
Type=Service
ServiceTypes=Plasma/Applet
X-Plasma-API=python
Icon=chronometer

X-KDE-PluginInfo-Author=Mikhail Krivushin
X-KDE-PluginInfo-Email=mkrivushin@yandex.ru
X-KDE-PluginInfo-Name=plasma-wwwv
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=http://deepwalker.blogspot.com
X-KDE-PluginInfo-Category=Tests
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=true
EOF

cat > contents/code/main.py << EOF
#! /usr/bin/python

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtWebKit
from PyKDE4.kdecore import *
from PyKDE4.kdeui import *
from PyKDE4.plasma import Plasma
import plasma

class PyWWWvApplet(plasma.Applet):
def __init__(self,parent,args=None):
plasma.Applet.__init__(self,parent)

self.url = None
self.clicked = QPoint()

def init(self):
KGlobal.locale().insertCatalog("www")

self.setHasConfigurationInterface(False)
self.setAspectRatioMode(Plasma.IgnoreAspectRatio)

self.dialog = None

self.theme = Plasma.Svg(self)
self.theme.setImagePath("widgets/background")
self.theme.setContainsMultipleImages(False)
self.theme.resize(self.size())

self.webview = Plasma.WebContent()
self.mlayout = QGraphicsLinearLayout(Qt.Vertical)
self.eline = Plasma.LineEdit()
self.mlayout.addItem(self.eline)
self.mlayout.addItem(self.webview)
self.setLayout(self.mlayout)

self.connect(self.eline,SIGNAL('returnPressed()'),self.open_page)

self.webview.setUrl(KUrl('http://127.0.0.1/'))
self.webview.update()

def open_page(self):
page = self.eline.text()
#print "Go to %s"%page
self.webview.setUrl(KUrl(page))
self.webview.update()

def shape(self):
if self.theme.hasElement("hint-square-clock"):
return plasma.Applet.shape(self)
path = QPainterPath()
path.addEllipse(self.boundingRect().adjusted(-2, -2, 2, 2))
return path


def constraintsEvent(self, constraints):
if constraints & Plasma.SizeConstraint:
self.resize(self.size())

def CreateApplet(parent):
return PyWWWvApplet(parent)
EOF

zip -r ../wwwv.zip .

plasmapkg -i wwwv.zip


Конечно же надо поставить соответствующие привязки. Так как я уже на 8.10, то просто сделал aptitude install python-plasma.

Далее располагайте плазмоид на рабочем столе и удивляйтесь мощи моего гения. Теперь же я, пожалуй, отправлюсь спать. А вы, дорогие мои, утомляйте неутомимый google бесчисленными запросами - "plasma python qt webkit" в поисках ответа на вопрос - а как же сделать, чтобы оно использовало прокси?

среда, 1 октября 2008 г.

FreeSWITCH, кластеризация

Вопрос был задан в одном из комментариев - поддерживает ли FS кластеризацию? Этот краткий пост будет ответом.

Да, в FS это заложено изначально. Если вы прочитаете историю его создания, то там написано, что автору кластеризация требовалась. Поэтому в архитектуре FS такие возможности заложены.

Всю информацию FS хранит в БД, к которой осуществляется доступ через ODBC. Конфигурацию FS может забирать через xml_curl. Таким образом все данные и настройки легко распределяются на несколько серверов.

среда, 17 сентября 2008 г.

FreeSWITCH+Django

FreeSWITCH предоставляет замечательный механизм - xml_curl. Этот модуль может забирать номерной план, пользователей и даже конфигурацию через http запросы.
Работает весьма просто, например так:

# cat /opt/freeswitch/conf/autoload_configs/xml_curl.conf.xml
<configuration name="xml_curl.conf" description="cURL XML Gateway">
<bindings>
<binding name="fs2web_user_fetcher">
<param name="gateway-url" value="http://localhost:8000/get/user/" bindings="directory">
</binding>
</bindings>
</configuration>


# cat /opt/freeswitch/conf/autoload_configs/modules.conf.xml
...
<load module="mod_xml_curl"/>
...



Теперь FS будет слать тонну информации методом POST на web сервер по указаному адресу и ждать в ответ описание пользователя в стандартном xml:


~$ wget http://127.0.0.1:8000/get/user/?sip_auth_username=3000 -O -
--23:36:28-- http://127.0.0.1:8000/get/user/?sip_auth_username=3000
=> `-'
Устанавливается соединение с 127.0.0.1:8000... соединились.
Запрос HTTP послан, ожидание ответа... 200 OK
Длина: нет информации [text/html]

[<=> ] 0 --.--K/s
<document type="freeswitch/xml">
<section name="directory">
<domain name="">
<user id="3000" mailbox="3000">
<params>
<param name="password" value="1234"/>
<param name="vm-password" value="3000"/>
</params>
<variables>
<variable name="accountcode" value="3000"/>
<variable name="user_context" value="public"/>
<variable name="effective_caller_id_name" value="Mihail Krivushin"/>
<variable name="effective_caller_id_number" value="3000"/>
</variables>
</user>
</domain>
</section>
</document>
[ <=> ] 608 --.--K/s

23:36:29 (1.91 MB/s) - `-' сохранён [608]



Ну и напоследок, мне кажется не совсем бесполезная ссылка на пример готового сервера на Django. Клонируйте, и затем поправьте settings.py. Пользователей можно заводить через стандартный административный интерфейс Django. Администратор - "admin", пароль - "kuku".

четверг, 17 июля 2008 г.

Разработчик, возлюби RFC

Когда вам попадается в руки инструмент, который очень любит стандарты, вы имеете множество шансов найти глюки в разных программах, авторы которых не так свято чтят разнообразные RFC. С другой стороны если не чтить RFC, то как вообще можно гарантировать работу чего либо от разных производителей?

Глюки обнаружились при переходе на FreeSWITCH.
1. Телефоны Linksys SPA901 и SPA921 неправильно называют кодек g729 в SDP (Session Description Protocol). Для того чтобы поправить это, вам нужно зайти на web интерфейс телефона, переключить в режим Admin+Advanced. Далее на вкладке "SIP" в разделе "SDP Payload Types" ищем пункт "G729a Codec Name:" и приводим к виду "g729", то есть убираем "a" на конце.

2. Вообще в интернете не встречал упоминания, но шлюзы Addpac AP1005 (4xFXO) также страдают забавным глюком - они отдают странный SDP при связи друг с другом: a=rtpmap:18 G729/8000/3

Так как FreeSWITCH свято чтит RFC и документ, который будет указан ниже (а быть может эта любовь от SIP стека Sofia, производства компании Nokia), то он прекрасно знает, что rtpmap с номером 18 может означать только G729/8000/1 Никаких "a" или трех звуковых каналов, что вообще забавно смотрится - 3 канала на моно голос это явный перебор.

Излечить шлюзы удалось только путем двухнедельного общения с техподдержкой Addpac - дали все таки какой то вариант прошивки, по словам инженера просто убрали вообще всякие упоминания числа каналов. И правильно - не можете правильно указывать, лучше вообще не указывать, что вполне соответствует RFC.

В остальном телефоны и шлюзы впечатление оставляют самое приятное - телефоны работают как от них ожидается, шлюзы Addpac чудесно гибкие в настройке. Но все же - чем им так не угодили RFC?

Как я подозреваю, большинство реализаций смотрит только на номер rtpmap, и ничуть не заботится разбором последующих конструкций. А вот это зря - например кодеки g726-xx статического номера не имеют, а шлюзы Addpac для g726-16 другой номер, кроме как 116, не воспринимают. Это противоречит RFC и этому документу.

Вот думаю, мучать техподдержку дальше или плюнуть - все таки когда знаешь подводные камни, то знаешь и как их обходить.

На этом внеочередное заседание любителей RFC объявляю закрытым.

вторник, 15 июля 2008 г.

FreeSWITCH

Тема VoIP стала на данный момент ближе моему сердцу, чем Kerberos, а виной тому, наверное, инструмент. Мне кажется странным, что мало кто слышал о FreeSWITCH (далее FS), ведь этот наследок Asterisk несет в себе куда более продуманную архитектуру. Нет, что вы, это не очередной форк от Asterisk как вы уже было подумали, вовсе нет. Это вынужденный ход одного из бывших разработчиков Asterisk, он просто решил, что из за кривизны изначальной архитектуры Asterisk проще будет переписать все с нуля.

И знаете, я уже давно не смотрю новые версии Asterisk, так как желание отбито давно и крепко (кто скажет что не ловил ни разу segmentation fault, или глюки с памятью, или же третье пусть считает себя везунчиком, FS vs Asterisk на ЛОРе). В общем с той поры как я решил, что Asterisk не стоит моих нервов, я пересмотрел много альтернатив. Был в списке и CallWeaver, но так как это просто форк Asterisk, то ничего нового в мой опыт он не привнес. Работал я с SipXpbx (с названиями и их сменой у данного продукта мне разбираться лень), тут главной сложностью было его собрать, так как SipXConfig тянет за собой тонны зависимостей и все из мира Java, в котором я полный ноль. Но гибкости в нем нет, это красивое решение, хороший конфигуратор, соответствие стандартам, но нельзя крутить его настройку теми адскими способами, что в FS.

FreeSWITCH мне порекомендовали в самарской news конференции (nntp еще кто то помнит? В Самаре отлично помнят : )) ). Я сразу ожидал что соберу его через неделю, как SipX, но я был невероятно удивлен, когда в директории слитой с svn я увидел столь любимую мной папку debian! А самой главное чудо, что debian/rules binary сработали, лишь пару библиотечек вроде бы доставить пришлось.

Итак, я получил deb пакеты, и поставил их используя dpkg -i. Еще я немного покрутил директорию debian для сборки mod_python (ну любимый инструмент, что поделаешь), если кому то будет интересно могу описать.

В итоге получается практически готовый сервер - в поставку входит демонстрационный Dialplan (план нумерации наверное буду его называть), настроены учетные записи пользователей. То есть можно сразу начинать работать с FS. Если вы ставили из пакетов, то установится FS в папку /opt/freeswitch, конфигурация хранится в директории conf.

Для начала можно настроить любой IP телефон на учетку 1000 с паролем 1234 и попробовать поиграться с голосовыми меню, с голосовой почтой, с конференциями (никаких модулей ядра не нужно) - все прекрасно работает, правда, как это водится, без намека на русский язык. Впрочем, если кому то будет интересно, можем попробовать сделать русскую локализацию сообща.

Впечатления - все что заявлено работает, в плане нумерации используются регулярные выражения (наверное сразу представили себе что можно с этим вытворить?), набор команд покрывает практически любые хотелки.

Теперь немного по первичной настройке SIP. Для работы с SIP используется mod_sofia (а он используется open source библиотеку от Nokia), загружен по умолчанию. Для работы нужны профили (conf/sip_profiles). Например если вам нужно чтобы на ваш SIP сервер могли звонить все кому придется без регистрации, то вы создаете профиль, настраиваете его, проставляете ему контекст(context), и перезапускаете FS. Профили должны использовать разные порты.

Контексты это отдельные планы нумерации - у профиля прописан контекст по умолчанию, у пользователей могут быть указаны свои (то есть отличающиеся от профиля по умолчанию). План нумерации хранится в conf/dialplan, очень сильно рекомендуется к изучению - там очень много интересного.

Итак, вы стартовали и вам понравилось? Я на это надеюсь, и поэтому дам совет как изучать FreeSWITCH - идете в wiki проекта. Можно просто походить по разделам, но гораздо лучше взяться за файл conf/dialplan/default.xml и вставлять из него непонятные конструкции в поиск по wiki - так вы можете сразу узнать для чего та или иная команда.

Надеюсь вам понравится FreeSWITCH, приятного изучения.

суббота, 5 июля 2008 г.

NFSv4 vs Samba

Выбор это сложная и важная часть в построении офисно-торговых сетей. Вы выбираете роутеры, свитчи, эникейщиков, и, конечно же, технологии, протоколы, программы. Выбор между Kerberos и чистой LDAP аутентификациями для вас я думаю уже ясен, хотя, к сожаления, не обязательно совпадает с моим.

Теперь я задумался - а нужен ли NFSv4? Он весь такой обновленный, очищенный от лишнего, ускоренный и поддерживает Kerberos. Включен в ядро, в дистрибутивы, и даже местами описана его настройка. А также никоим образом не позволяет побороть umask и различия в кодировках, и совершенно не поддерживается windows.

Samba весьма гибкий инструмент, с огромным количеством документации, не лезет в ядро (только клиент, но ядерный клиент пока не сильно интересен - Samba 3.2 конечно вышла, но когда новый mount.cifs упадет в дистрибутивы не известно), есть кластерные примочки, кодировки поддерживаются, в описаниях шары можно указать маску для новых файлов и не только.

Так зачем мне тогда NFSv4, судьба которого еще года два проходить в бетах, так и оставить неразрешенной проблему cross realm, и вообще существовать в отрыве от реальности. У меня постоянно вылезает с ней проблема umask - ну нельзя же делать umask 000! Это в конце концов не только к шарам относится, но и к домашней папке, а системы у нас, как известно, многопользовательские.

Насколько все таки мудро в AFS раздавались права на папки, жаль вот только с кодировками там также полный облом.

В общем Samba на сегодняшний день лучшая сетевая FS для бизнеса/офиса и не только.

вторник, 24 июня 2008 г.

Subversion 1.5 и SASL

Если кто-то пропустил, то обращаю внимание, что теперь Subversion поддерживает GSSAPI, так как они перешли на стороннюю библиотеку для реализации SASL.

Поддержка есть как в svnserve, так и в клиенте. Настройки абсолютно стандартные - принципиал svn/`hostname -f` в keytab, и указать имя keytab в переменной окружения KRB5_KTNAME для svnserve. Ну и надо прописать в списке методов gssapi (документация рулит).