среда, 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 (документация рулит).

понедельник, 23 июня 2008 г.

Как мне установить программу, распространяемую в исходных кодах?

Статус статьи - надоело писать каждый раз, буду отсылать всех сюда. Первоначально статья была опубликована на сайте томского LUG, автор тот же.


Вступление


Существует несколько способов. Практически у всех есть общая часть - распаковать исходники:
tar xvfj mega_app.tar.bz2
or
tar xvfz mega_app.tar.gz
Выполнить комманду ./configure, затем make. Эти комманды служат для сборки из исходных кодов исполняемых файлов, библиотек и тп.

Отдельно стоит отметить первую комманду - ./configure
Если выполнить ./configure --help, то вы получите список параметров, которые можно передать ./configure
Например часто возможна такая комманда:
./configure --prefix=/opt/mega_app

Или указать путь к библиотеке, которая по каким либо причинам не нашлась сама:
./configure --kerberos-lib=/opt/kerberos/lib

Классический.


Итак делаем последовательность:
./configure
make
и команда которая собственно установит все составляющие программы в систему:
make install
WARNING!!! Используя этот способ легко получить очень серьезные проблемы в дальнейшем. Во первых, скорее всего,
вы не сможете удалить программу (make uninstall).

Checkinstall.


Правильный путь. После выполнения общей части запускаете:
checkinstall
Программа сама спросит вас обо всем, а можете просто везде нажать ENTER.
man checkinstall тоже очень хороший путь : ))

Сборка пакета для Debian.


Это отдельный и сложный путь - вам нужно разобраться со многими аспектами создания deb-пакетов (или любых других).
Здесь этот путь не будет описан в полной мере, только пример как собрать пакет из уже подготовленных материалов. Я,
например, пользовался им чтобы сделать бекпортинг пакетов из Feisty в Dapper.
Итак, пример. Идем на packages.ubuntu.com, находим нужный пакет (diff например) и качаем два файла - исходник (http://archive.ubuntu.com/ubuntu/pool/main/d/diffutils/diffutils_2.8.1.orig.tar.gz) и патч к нему, который поправит исходники и создаст папку debian с магическим файлом rules внутри (http://archive.ubuntu.com/ubuntu/pool/main/d/diffutils/diffutils_2.8.1-11ubuntu4.diff.gz).
Я скопировал их в папку ~/test и для начала распаковал исходник:
tar xvfz diffutils_2.8.1.orig.tar.gz
А затем наложил патч:
cd diffutils-2.8.1/
gzip -cd ../diffutils_2.8.1-11ubuntu4.diff.gz | patch -p1
Теперь надо сделать debian/rules исполняемым:
chmod 750 debian/rules
И собрать пакет:
fakeroot debian/rules binary
Fakeroot нужна для сборки пакета обычным пользователем (обычно многие операции требуемые не позволили бы вам сделать пакет).
ls ../
diff_2.8.1-11ubuntu4_i386.deb diffutils-2.8.1 diffutils_2.8.1-11ubuntu4.diff.gz diffutils_2.8.1.orig.tar.gz
Как видите, пакет готов.

Заключение


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

Ну и конечно автор ответственности не несет ни за что и никогда : ))

среда, 18 июня 2008 г.

Инфраструктура Kerberos, Windows

Включение Windows машины в сферу Kerberos


В этой статье прекрасно описана процедура включения машины под управлением Windows в сферу Kerberos и настройки Samba. Если нет сервера с AD, то это прекрасный метод, только пользователей вручную создавать придется (возможно еще при помощи cfengine или сделать скрипт для синхронизации с LDAP).

Доверительные отношения сферы Kerberos и домена Active Directory



Первым делом ссылка на документацию от Heimdal.

Для настройки доверия нам потребуется утилита ksetup (вы же прочитали статью по ссылке?), с ее помощью мы настроим в Windows адреса KDC сферы на каждом контроллере AD:

$ ksetup.exe /addkdc REALM.TLD kdc1.realm.tld
$ ksetup.exe /addkdc REALM.TLD kdc2.realm.tld

Возможно потребуется перегрузить контроллер. Настройка доверия на контроллере AD:

$ netdom trust AD-REALM.TLD /Domain:SOUZT.TLD /add /realm /passwordt:пароль_доверия

Теперь надо добавить доверительную запись в базу нашего KDC:

# kadmin -l
> add krbtgt/AD-REALM.TLD@REALM.TLD <<< ввести пароль_доверия
> add krbtgt/REALM.TLD@AD-REALM.TLD <<< ввести пароль_доверия


Важно - надо удалить типы кодирования ключей, которые не поддерживаются AD, то есть все кроме des-cbc-md5(pw-salt), des-cbc-md4(pw-salt), des-cbc-crc(pw-salt), arcfour-hmac-md5(pw-salt). Точный список сейчас не скажу, например в W2003R2 была какая то проблема, связанная со сменой типа ключа используемого по умолчанию. Если кто то имеет более актуальную информацию - поделитесь.

Я использую это доверие в работе для доступа к ресурсам AD - к сетевым папкам и каталогу LDAP. Для этого надо настроить отображение - mapping. Отличная ссылка из первых рук, но попробую описать на родном.

Нам понадобится оснастка MMC для управления учетками, меню <Вид>, галочку на <Дополнительные функции>. Теперь находим пользователя deepwalker, в контекстном меню выбираем <Отображение имен>. Выбираем вкладку Kerberos и добавляем в список deepwalker@REALM.TLD. На этом все, попробуйте сделать нечто вроде:

ldapsearch -H ldap://pdc.ad-realm.tld/ -Y gssapi -b dc=ad-realm,dc=tld
klist

Весь домен должен промелькнуть у вас перед глазами, а в выводе klist должна появится строка:

Jun 18 11:19:24 Jun 18 19:08:22 ldap/pdc.ad-realm.tld@AD-REALM.TLD

Это будет означать, что билет вы получили и доверие работает. Далее можете попробовать зайти в сетевые папки через konqueror или через подобную программу.

Fusesmb поддерживает gssapi, но ее часть, составляющую список сетевых папок, надо прибивать. В противном случае, по истечении билета, ваша учетка в AD очень быстро будет заблокирована.

На сегодня все, а про гневные комментарии вы и так помните : ) Надеюсь, что если я что то здесь не доосветил, то приведенные ссылки и google.ru вам помогут.