четверг, 24 апреля 2008 г.

Addpac, детекция сигнала отбоя

Довольно распространенная проблема - АТС генерирует короткие гудки, дабы человек понял, что разговор окончен, но вот техника это не воспринимает. У шлюзов addpac есть специальная настройка для детекции сигнала отбоя - Clear-down-tone cadence.
Итак, заходим на шлюз:

AP1005# conf
Enter configuration commands, one per line. End with CNTL/Z
AP1005(config)# deb
AP1005(config)# end
AP1005# debug rta voice

Далее звоним через шлюз и кладем трубку со стороны АТС. В момент коротких гудков снимаем нечто вроде:

AP1005# 60 60 60 60 60 60 60 60 60 60 60 60 60 23 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 22 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 22 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 1616 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60

Считаем:
сигналов ~=-16 * 35. Умножаем на 35, если кодек g711 или g729 - на 10. У меня последний вариант, так что получаем 350. Это у нас active power, а число зовется Active Time Duration.
сигналов ~=-60 * 34. Здесь тоже самое - получаем 340. Это idle power, число - Idle Time Duration.
Получаем:

voice class clear-down-cadence 1 -16 350 340 3 11

Здесь
1 - число необходимого повторения данно последовательности, у меня (1);
2 - уровень тона, те active power (-16);
3 - ActiveTimeDuration (350);
4 - Idle Time Duration (340);
5 - Active Power Variance - отклонения уровня, у нас не отклоняется, но все равно ставим 3 - на всякий;
6 - Idle Power Variance - отклонения уровня паузы, ставим 11.
Применяем:

AP1005# conf
Enter configuration commands, one per line. End with CNTL/Z
AP1005(config)# voice class clear-down-cadence 1 -16 350 340 3 11

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

вторник, 22 апреля 2008 г.

upstart, x11vnc

В последних сборках Ubuntu и Debian включен Xorg 7.3, и любимый мной vnc.so там не работает. Ну а няньчить пользователей тем не менее людям надо. Для решения проблемы в Hardy использовал upstart:

# x11vnc
#
# X11VNC start event
#

description "x11vnc starter"
author "Mihail Krivushin "

start on kdm-started
stop on kdm-stopped

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6


console output

pre-start script
DAEMON="x11vnc"
a=`ps -ef | grep $DAEMON | wc -l`
if [a gt 1]; then
killall $DAEMON 2> /dev/null
fi
exit 0
end script

script
DAEMON="x11vnc -rfbauth /путь к файлу/vncpasswd -display :0 -auth `find /var/run/xauth/ -type f` -noxfixes -o /var/log/vnc.log"
$DAEMON
exit 0
end script

post-stop script
DAEMON="x11vnc"
a=`ps -ef | grep $DAEMON | wc -l`
if [a gt 1]; then
killall $DAEMON 2> /dev/null
fi
exit 0
end script

respawn

В /etc/init.d/kdm пришлось вставить initctl emit kdm-started и initctl emit kdm-stopped. Код конечно не причесаный, зато работает, да и вообще я python знаю намного лучше чем bash. Upstart полезная вещь!

вторник, 15 апреля 2008 г.

Heimdal KCM

В коплекте поставки Heimdal Kerberos есть удобный демон KCM. В общем случае он служит для хранения билетов в памяти. Недостаток его в том, что только библиотеки Heimdal его поддерживают. В тоже время, во многих современных дистрибутивах, по умолчанию все пакеты собраны с MIT Kerberos. И nfs4 тоже. Тут можно было бы и забыть о KCM, но не будем этого делать. Для пользователя билет, к которому программы не имеют доступа, конечно бесполезен, но для служб, использующих бибилиотеку Cyrus SASL вполне подойдет.

Долгое время в debian/ubuntu пакет libsasl2-modules-gssapi-heimdal был просто заглушкой, и библиотек, собранных с поддержкой Heimdal, не содержал. В грядущем Hardy Heron ситуацию откатили и теперь это полноценный Heimdal GSSAPI. А значит библиотеки OpenLDAP теперь вполне могут пользоваться очень важной фишкой KCM - этот демон умеет держать билет системы в актуальном состоянии, своевременно его обновляя и переполучая заново.

Итак, правим стартовый скрипт, так, чтобы вышло примерно следующее:

HOSTNAME=`hostname -f`
KCM_PARAMS="--detach --cache-name=0 -k host/$HOSTNAME"


Правим конфиг libnss-ldapd:

uri ldap://kdc.realm.tld
base dc=realm,dc=tld
ldap_version 3
scope sub
use_sasl on
krb5_ccname KCM:0


И для нашей реплики LDAP добавляем (например в /etc/default/slapd):

export KRB5CCNAME="KCM:0"


Все, перезапускаем heimdal-kcm, пользуемся.

четверг, 10 апреля 2008 г.

OpenLDAP, syncrepl

В жестко централизованной структуре, как у меня, есть одна неприятность - связь иногда все таки пропадает между центром и филиалом. Ну и если билет вначале рабочего дня получен, и если в филиале есть реплика ldap, то ничего страшного - по крайней мере обмениваться файлами пользователи смогут.

Филиал у нас лицо не довереное, значит пароли ему знать ни к чему. Не доверяем потому что физически не контролируем.

Что требуется:
1. На нашем центральном сервере/серверах добавляем:

database bdb
...
overlay syncprov

2. Реплика в филиале:

database bdb
...
syncrepl rid=1
provider=ldap://kdc.realm.tld
bindmethod=sasl
saslmech=GSSAPI
searchbase="dc=realm,dc=tld"
filter="(objectClass=*)"
attrs="*"
schemachecking=off
scope=sub
type=refreshOnly
retry="5 5 300 5"

updateref ldap://kdc.realm.tld

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

воскресенье, 6 апреля 2008 г.

pk-init

Из документации heimdal:

4.18 Setting up PK-INIT

PK-INIT is levering the existing PKI infrastructure to use certificates to get the initial ticket, that is usually the krbtgt.

To use PK-INIT you must first have a PKI, so if you don't have one, it is time to create it. Note that you should read the whole chapter of the document to see the requirements on the CA software.

Таким образом есть путь для использования сертификатов (pki) и множества сервисов поддерживающих kerberos. Надо будет обдумать, где это применить этак хитро, в голову сразу приходит pam-usb. О результатах общения с google еще напишу (надо почитать перед изобретением велотранспорта). Просто часть всяких служб поддерживает только сертификаты или только kerberos, а так можно использовать и то и другое.

Upd: да, видимо с pam-usb я поторопился. Думал что там сертификаты используются.

пятница, 4 апреля 2008 г.

nss-ldapd, реинкарнация детища padl

У оригинального libnss-ldap есть серьезный недостаток при работе с gssapi - любому пользователю, желающему ознакомиться со списком пользователей, требуется предоставить билет kerberos. Второй вариант - дать всем читать билет, которым будет пользоваться libnss-ldap. Первое это нереально - ну откуда у dbus свой билет? Второе просто уже тупо как то - зачем вообще тогда весь этот лес?

nss-ldapd решает эту проблему. Возможно, ее автор хотел решить какие то другие проблемы, но меня волновала эта. Эта версия состоит из двух частей - демона, который собственно имеет билет и общается с ldap, и клиента, который просто обащается с демоном в пределах одной машины. Разом снимает головную боль с билетами.

Приведу элементарную настройку на работу с kerberos:

uri ldap://kdc.realm.tld
base dc=realm,dc=tld
ldap_version 3
scope sub
use_sasl on
krb5_ccname FILE:/tmp/krb5cc_0


Кстати в kinit (Heimdal последних версий) есть возможность обновлять билет, до тех пор пока работает программа, переданная в качестве параметра.
То есть можно поправить стартовый скрипт nslcd, и билет будет обновляться автоматически.

четверг, 3 апреля 2008 г.

ldapvi

Предыдущий пост описывает прием работы, который подходит для скриптования. Но есть в репозиториях совершенно дикая вещь - ldapvi.
Что это? Это метод скрестить крокодила с бегемотом - ldap и текстовый редактор. Описывать смысла особого нет - дает возможность быстренько что либо поправить в свойствах записи, удалить записи и тп. Данный пост просто повод обратить внимание.

среда, 2 апреля 2008 г.

ldif

Для редактирования LDAP каталогов многие используют разные программы, например luma, ldap administrator и тп. Для новичков кажется ldif кажется сложноватым, а работа с утилитами командной строки тем более.
На самом деле работа с ldif может сэкономить много времени.

deep@host:~$ ldapsearch -h kdc -b uid=anyuser,ou=users,dc=city,dc=realm,dc=tld
SASL/GSSAPI authentication started
SASL username: deep@REALM.TLD
SASL SSF: 56
SASL data security layer installed.
# extended LDIF
#
# LDAPv3
# base with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

dn: uid=anyuser,ou=users,dc=city,dc=realm,dc=tld
cn: Any User
displayName:: skipped
gecos: Any User
givenName:: skipped
homeDirectory: /home/anyuser
loginShell: /bin/bash
o:: skipped
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: userSecurityInformation
sn: anyuser
title: anyworker
uid: anyuser
uidNumber: 2118
userPassword: secret
gidNumber: 2030

# search result
search: 5
result: 0 Success

# numResponses: 2
# numEntries: 1

Практически этот вывод можно перенаправить сразу в файл. Затем редактируем, заменяя anyuser на anyuser_new и таким образом можно легко создать нового пользовталя:

deep@host:~$ ldapsearch -h kdc -b uid=anyuser,ou=users,dc=city,dc=realm,dc=tld > user.ldif
deep@host:~$ vim user.ldif
deep@host:~$ cat user.ldif > ldapadd -h kdc

А можно сделать из файла шаблон, и при помощи sed заменять поля из командной строки. Я таким образом создаю целые новые ветки. В общем рекомендую не забывать про консоль.

nfs4 и samba - дружим доменами

При мигрировании, грамотно не ломать что либо сразу, а произвести плавный переход. Сначало плавно учимся привыкать к толстому OOo, а потом некоторую часть пользователей переводим на linux. Но перевод на linux не должен прерывать обмен данными с оставшимися пользователями. А у нас большое количество данных проходит через сетевые папки (некую файлопомойку с элементами упорядоченной структуры). Как знают грамотные люди, электронный документооборот требует не только покупки софта, а потому наша фирма пока еще пользуется таким способом работы.
Но вернемся к теме - linux, с некоторых пор, имеет поддержку nfs4, поддержку cifs он имеет с времен незапамятных. В свою очередь, nfs4 имеет поддержку протокола kerberos, ну а современные windows сети без kerberos не живут. Протокол kerberos пятой версии характеризуется хорошим механизмом отношений, или иначе "дружбой" сфер kerberos.
Я решил сделать как раз по этой схеме - у linux машин своя сфера kerberos, у windows - AD.
В общем я придумал три варианта:
1. Файловый сервер на машине с windows. Тут как раз нужно настроить дружбу доменов (сфер), а потом создавать пользователей два раза. Почему? Потому что это самый простой путь для подобной схемы - вы просто настраиваете отображение пользователей сферы linux в пользователей домена windows.
2. Файловый сервер на Samba и nfs4. В этом случае вы вводите машину с samba в домен windows, что, однако никак не отражается на самой системе сервера, просто теперь машины из AD смогут получить доступ к вашему серверу аутентифицируясь в AD. В то же время пользователи из сферы linux смогут получить доступ к файлам по протоколу nfs4, аутентифицируясь в linux сфере kerberos. Ключевым моментом схемы является отображение пользователей windows при помощи winbind - uid'ы пользователей AD не должны пересекаться с linux пользователями.
3. А можно не делать отдельную сферу kerberos для linux пользователей, можно аутентификацию и получение kerberos билетов организовать через домен AD. Тогда и проблем нет - делайте хоть на samba, хоть на windows сервере. Но мне не нравится это тем, что тогда отказаться от AD в дальнейшем не выйдет, и ничего то мы не сэкономим на подобном переходе. В общем я этот вариант не реализовывал.

При использовании второго варианта, доступ через nfs4 для linux машин более удобен и прост, так как монтирование по протоколу cifs(так называется протокол, используемый в windows среде) сетевой папки имеет некоторые недостатки:
1. ядро не имеет поддержки монтирования cifs шар с kerberos;
2. основанный на smbclient, smbfs имеет наприятные особенности;
3. если пользоваться, например, kde, то программы из этой среды смогут работать с сетевой папкой через kio-slaves, а вот OOo нет;
Таким образом, просматривать и скачивать файлы можно при помощи различных slaves (kde, да и гном что то такое имел в своем составе), а вот нормально работать только при использовании smbfs.

А вот конкретные настройки будут в следущей серии...

вторник, 1 апреля 2008 г.

OpenLDAP+GSSAPI начало

Буду описывать краткими кусочками : )
Если хочется полного описания, хотя, на мой взгляд, довольно таки дурацкого, то вам сюда -> http://www.bayour.com/LDAPv3-HOWTO.html
У меня же тут будет все попроще для понимания, я надеюсь. В любом случае на родном оно сподручнее читать.

Нам надо сделать аутентификацию, при обращении к каталогу ldap, по GSSAPI. Можно конечно и по сертификатам, но мне нравится kerberos. Ключевое при получении авторизационной информации машинами клиентами, это аутентификация сервера. Это важно - если вашим машинам подставят другой сервер, и на нем скажут, что вот Вася Пупкин админ, то, согласитесь, радости это нам доставит мало.

На примере ubuntu (мне думается, что debian в этом плане сильно не отличается), мы просто делаем любимое aptitude install slapd.

Далее изменения в конфиг:

backend bdb

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend
+sasl-realm REALM.TLD # Ваша сфера kerberos
+sasl-host ldap.realm.tld # Имя машины, на которой это все присходит
+authz-regexp uid=([^,]*),cn=realm.tld,cn=gssapi,cn=auth # А вот тут нужно почитать
+ ldap:///dc=realm,dc=tld??sub?(uid=$1) # справку, что бы понять

Суть такова - вы указываете сферу, имя, и настраиваете отображение имен. Это довольно важный момент - когда пользователь аутентифицируется, его имя выглядит как uid=anyuser,cn=realm.tld,cn=gssapi,cn=auth, но системе надо знать его dn, те uid=anyuser,ou=users,dc=town,dc=realm,dc=tld. По идее, конечно, и в таком виде сойдет, но тогда в ваших списках доступа не будут иметь смысла записи self, и пользователь не сможет сменить себе /bin/bash на любимый zsh, ну и пароль.

По идее далее идут настройки acl, которые довольно хорошо выполнены по ссылке выше. Но о чем стоит вспомнить, так это о том, что slapd запускается под пользователем openldap и доступа к /etc/krb5.keytab не имеет. Ну это не большая проблема, просто ключ надо сохранить в, например, /etc/ldap/slapd.keytab, поправить права, а демону перед стартом пояснить где его искать. Это можно сделать например редактированием стартового скрипта /etc/init.d/slapd. Вносим вначале файла export KRB5_KTNAME="FILE:/etc/ldap/slapd.keytab" и всех делов.

На первый раз хватит, я думаю. Некоторые возникающие вопросы это поможет решить.

Баше-нико-генератор

Иногда проглядывая баш, замечаю там ники с заменой букв на всякие символы вроде @$%. Ради разминки написал генератор ников, вот только словарь ему пополнить надо, не силен я в этом : )


#! /usr/bin/python
# -*- coding:utf-8 -*-

import sys

a=[(u'aAаА',u'@'),(u'bBбБ',u'$'),
(u'фФ',u'%')]

fraze = u'голубые киты плакали в глубине, фыркали.'

chars_conv = {}
for i in a:
for ch in i[0]:
chars_conv[ch]=i[1]

if len(sys.argv) > 1:
fraze = sys.argv[1].decode('utf8')

res=u''
for char in fraze:
if char in chars_conv:
res=res+chars_conv[char]
else:
res=res+char
print res

Результат:

голу$ые киты пл@к@ли в глу$ине, %ырк@ли.