понедельник, 31 марта 2008 г.

Подписаный репозитарий Ubuntu

Сделал репозитарий своих пакетов. Вдохновило описание работы Яндекса с deb пакетами. Ну и самое главное - подписал. Ниже результат изысканий:


dpkg-scanpackages . > Packages

cat Packages | gzip -c > Packages.gz
cat Packages | bzip2 -c > Packages.bz2

rm Release Release.gpg

apt-ftparchive release . \
-o APT::FTPArchive::Release::Origin="JSC SOUZ T"\
-o APT::FTPArchive::Release::Codename="hardy" > /root/Release

# Важно - Release нужно класть именно в другую папку, иначе потом будет ошибка
# неверной подписи

mv /root/Release Release

# Перед подписью неплохо бы gpg ключ сгенерировать - gpg --gen-key
# на сервере, стоящем далеко, подергать мышью не удастся, и энтропию фиг получите : )
# я сделал что то типа find / | xargs -I'{}' dd if='{}' of=/dev/null
# а потом эскпортировать - gpg --export --armor > repo-key.asc
# ну и на клиенте импортировать - apt-key add repo-key.asc

gpg -abs -o Release.gpg Release

четверг, 27 марта 2008 г.

Thinstation, протираем фару

За что я все таки больше люблю linux, чем известный аналог, так это за благодарность системы пытливому уму. То есть, если вы не жалеете времени изучая принципы, стандартные решения, идеологию в конце концов, то повернется она к вам таки не то что лицом, а всей своей душой своей механической, такими же пытливыми умами созданой.
Я это все к чему, случается иногда, что править душу эту приходится, так как иные умы и мыслят не по вашему, и железо у них другое, и ваши тяготы не всем доступны.
К делу - у thinstation есть четыря уровня для пытливости:
1. скачать готовый вариант, подходящий для большинства;
2. натыкать галки и получить несколько заточеный под себя (позволяет выбрать включаемые компоненты);
3. скачать вариант для ручной сборки уже собранных бинарников, ядра и тп (позволяет поправить конфиги, стартовые скрипты, сделать то, для чего вообще не думалось применять thinstation);
4. самый глубокий уровень - скачать среду разработчика и руками собрать все, что иные умы сочли излишним, или же вообще не слышали о таком;

Моя ситуация была довольно банальна, несмотря на выспренность слога в первом абзаце - драйвера от сетевой карты не работали, ибо оборудование было уж слишком свежим. На сайте intel (а именно они отцы этой карты), драйвера под линукс были.
Чтобы получить модуль нужны исходники ядра, но не только. Еще требуется собрать модуль той же версией компилятора, что и ядро. В общем проще скачать среду разработчика Thinstation, там все для счастья положено.
1. Качаем;
2. tar xvfz thinstation_src-2.3.tgz
3. cd thinstation_src-2.3
4. ./RUNME
Вот мы и "дома". То есть можно делать теперь все, ради чего тянули 300 мегабайт. Драйвера с сайта intel тихо и не заметно уже легли в директорию между пунктами 3 и 4, и в 4 пункте sudo я забыл.


sh-3.1# cd intel
sh-3.1# ls
e1000-7.6.5.tar.gz
sh-3.1# tar xvfz e1000-7.6.5.tar.gz
sh-3.1# cd e1000-7.6.5/src/
sh-3.1# make
Makefile:197: ***
Makefile:202: *** Warning: kernel source configuration (UP)
Makefile:203: *** does not match running kernel (SMP)
Makefile:205: *** Continuing with build,
Makefile:206: *** resulting driver may not be what you want
Makefile:207: ***
make -C /usr/src/linux SUBDIRS=/intel/e1000-7.6.5/src modules
...
CC /intel/e1000-7.6.5/src/e1000.mod.o
LD [M] /intel/e1000-7.6.5/src/e1000.ko
make[1]: Leaving directory `/source/kernel-2.6.21.1/linux-2.6.21.1'


На этом все, полученным e1000.ko заменяем уже имеющийся в каталогах 3го варианта сборки. На самом деле Thinstation я перетряс куда основательнее, да разве все упомнишь. А это так - пример образа мыслей, что собственно намного вернее всяческих howto.

понедельник, 24 марта 2008 г.

Черный Баламут

Прочел недавно книгу "Черный Баламут" - поразила настолько сильно, что уже вторую неделю разговариваю в стиле Индры и Карны Секача, и постоянно думаю о нелегкой ошибке Кришны Бхагавана. Настоятельно рекомендую к прочтению.

Читать в википедии

linux в торговле

Уже много лет активно обсуждается применение linux на корпоративном десктопе. Ну что же, это вполне возможно и ни капли не смертельно. Уж я то точно могу об этом сказать, так как проэкспериментировал на собственной фирме.

Не так давно наша фирма решила немного расширить свое розничное направление (а торгует наша компания мебелью), и запустила новый бренд розничной сети. Ну и под этим брендом открываются у нас несколько магазинов. Вообще магазины у нас были довольно таки обкатаной единицей к тому времени - контроллер домена + файлосвалка, офисная АТС, около 4 рабочих станций, около 5 тонких клиентов (Thinstation linux).

Как у любых администраторов, linux был конечно же у всех на слуху (а у кого то и на рабочем месте). Я вообще довольно давно разбирался в вопросах как сделать интегрированую сеть на linux, и наработки были. И решили все таки попробовать.

Стандартную схему переработали, контроллер домена сменили на linux сервер, АТС на него же. Так же linux установили на все рабочие места. Единственной рабочее место с windows, это место "Моделирование кухонь". Многие производители кухонь делают что то на коленке для этих целей, а коленка у них это access, ms jet и иже с ними. В общем wine я под это заточить не сумел, да и с возможными косяками возится не очень то и хотелось - я же все таки ленивый админ или как?

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

Ну а самое важное для корпоратива, это конечно же логины, пароли, сетевые папки. Ну это просто достаточно - ldap как хранилище авторизационной информации, kerberos как служба аутентификации, nfs4 как сетевая фс, samba для общения с офисом, который еще не так продвинут (тяжело его продвинуть все таки, магазин он маленький, а офис...).

Вот это то наверное и буду описывать в дальнейшем, для этого и завел себе блог. Но сразу стоит оговориться, что коробочного толкового решения я еще не видел, чтоб хоп, как в windows, пару раз мышкой щелкнули, и машина в домене. Сейчас активно разрабатываются FreeIPA, Mandriva DS, но первый минус этой кухни - работает в одном каком то конкретном дистрибутиве (fedora и mandriva, конечно же), а второе - еще не допилено до конца. Можно сказать , что у меня есть предвзятое отношение, но mandriva у меня всегда вызывала опасения. Возможно я не прав, и руки у них за столько лет стали прямее, но ранний опыт использования не впечатлил. Fedora же довольно последовательно строит свой каталог, и уважение корпоративщиков к ее старшему брату, существует видимо неспроста.

А пока я строю свой каталог на коленке из openldap и heimdal kerberos, но об этом в следующих сериях.

SipX, стоит обратить внимание

Не многие знают об этом продукте, а между тем, работает он, на мой взгляд, лучше asterisk.
Ниша его - корпоративная VoIP связь. В отличие от ser, который может применятся для создания публичных VoIP сервисов, SipX имеет в своем составе голосовую почту, группы дозвона, хороший web интерфейс для управления. Также есть возможность настройки телефонов через тот же интерфейс (телефоны будут забирать все настройки через dhcp + tftp). Есть и еще пара полезных фич, о которых вы можете прочесть сами. Главные отличия от asterisk - поддерживает только sip (но уж ближе к rfc его не поддерживает практически никто), нет никаких reinvite (те сервер просто не пропускает поток rtp через себя, и именно поэтому не имеет проблем с джиттерами и кодеками).

Самым сложным для меня в отоношениях с sipx была его установка. Но есть уже готовые пакеты для rpm дистрибутивов. Мне же, как любителю debian, пришлось порядком повозиться с доустановкой дополнительных пакетов и настройкой odbc и java. Впрочем, в wiki есть основные моменты.

Данная запись это не подробное описание продукта. Это скорее повод посмотреть на него, для тех, кому VoIP интересен.

Мои личные впечатления от SipX крайне положительны. Его эксплуатация в тестовом режиме за несколько месяцев не выявила никаких паталогий. Могу только вспомнить неприятность с телефоном Addpac IP100, который не сохранял CSeq, и из за этого не мог зарегистрироваться на сервере после перезагрузки. Перезагружать SipX из за глюков не приходилось.

Из переписки

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

Я его на данный момент расставляю в филиалах, где обычной телефонии нет в принципе. А так связь на данный момент через шлюзы, прицепленные к атскам в старых филиалах (у нас сейчас куча новых открывается, в них вот как раз АТСки офисной нет, есть шлюз на городские номера и ip фоны на рабочих местах).

Почему не астериск - был плохой опыт его использования. Много глюков от его привычки пускать вначале соединение через себя. Те он проксирует rtp поток. Из этого получается, что он должен понимать все кодеки, а это не так. Потом он rtp пытается перевести с помощью функции reinvite, и это самый большой источник глюков. Победить это все можно, если желание есть. У меня нет : )

SipX настраивается через web морду, удобно, просто (астериск тоже умеет). Потоки через себя не пропускает, что избавляет от части проблем - меньше нагрузка на сервер, нет возни с jitter буферами и тп (пусть этим производители железок озабачиваются). А оно ему и не надо. Всякие штуки типа звонка сразу на 5 телефонов держит легко. Есть что то для ivr и тп, пока не требовалось, полный переход на ип телефонию планируется после обкатки решения на филиалах. Намного более asterisk'a соответствует rfc. В общем именно как офисная АТС прекрасен. Можно делать кластер и тп.

По части сервера, смотрящего в мир (ну там по типу skype, sipnet) я бы наверное не рекомендовал. Тут больше ser подходит, особенно по сравнению с астериском, ибо в нем уже вообще нечему глючить. Вот только ser не совсем тривиален в настройке - это вообще конструктор еще тот. Конфиг - программа на си подобном языке. Но уж наконфигурить можно все что угодно. Но тут подводный камень - это sip router именно, а потому делать специфичные вещи типа звонков на несколько номеров ему тупо не под силу. В общем для публичного сервиса хорош, для офиса не очень.

суббота, 8 марта 2008 г.

Откат изменений при загрузке

Пришла мне в голову идея - помню вот народ Hg использовал для сохранения всех изменений в дереве /etc, я и сам пользуюсь этим на серверах. Кто не в курсе - Hg это система контроля версий, Mercurial. Системы контроля версий сохраняют все ваши изменения и используются в основном программистами для совместной работы и, собственно, контроля версий : )
Итак, в качестве полигона используем папку у себя в домашней директории :

aptitude install mercurial # у кого еще нет : )
mkdir temp
cd temp
hg init
# создадим тестовый набор файлов
for i in `echo "0 1 2 3 4" | xargs`; do touch test$i; done

Добавим их под контроль:


hg add test*

смотрим hg status:



A test0
A test1
A test2
A test3
A test4

Далее фиксируем текущий шаг изменений:


»mkrivushin@dot:~/temp$ hg commit -m "`date` автоматический фикс"
No username found, using 'mkrivushin@dot.souzt.tld' instead

еще разок:



»mkrivushin@dot:~/temp$ hg commit -m "`date` автоматический фикс"
nothing changed

Как видите, по второму разу неизмененное не фиксируется.

поправим test0:



echo "wqerqwrqwer" > test0
»mkrivushin@dot:~/temp$ hg commit -m “`date` автоматический фикс”
No username found, using ‘mkrivushin@dot.souzt.tld’ instead

Изменения зафиксировались, посмотрим:



»mkrivushin@dot:~/temp$ hg log
changeset: 1:e2aab7338581
tag: tip
user: mkrivushin@dot.souzt.tld
date: Fri Mar 07 11:44:18 2008 +0600
summary: Птн Мар 7 11:44:18 NOVT 2008 автоматический фикс

changeset: 0:88a5a7a6c86a
user: mkrivushin@dot.souzt.tld
date: Fri Mar 07 11:41:39 2008 +0600
summary: Птн Мар 7 11:41:39 NOVT 2008 автоматический фикс

Пробуем теперь с откатами к предыдущей редакции:



»mkrivushin@dot:~/temp$ echo "осмысленный текст" > test0
»mkrivushin@dot:~/temp$ hg commit -m "`date` автоматический фикс"
No username found, using 'mkrivushin@dot.souzt.tld' instead
»mkrivushin@dot:~/temp$ hg log
changeset: 2:0b341c5a3f32
tag: tip
user: mkrivushin@dot.souzt.tld
date: Fri Mar 07 11:47:00 2008 +0600
summary: Птн Мар 7 11:47:00 NOVT 2008 автоматический фикс

changeset: 1:e2aab7338581
user: mkrivushin@dot.souzt.tld
date: Fri Mar 07 11:44:18 2008 +0600
summary: Птн Мар 7 11:44:18 NOVT 2008 автоматический фикс

changeset: 0:88a5a7a6c86a
user: mkrivushin@dot.souzt.tld
date: Fri Mar 07 11:41:39 2008 +0600
summary: Птн Мар 7 11:41:39 NOVT 2008 автоматический фикс
»mkrivushin@dot:~/temp$ hg revert -a -r 1
reverting test0
»mkrivushin@dot:~/temp$ cat test0
wqerqwrqwer

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




»mkrivushin@dot:~/temp$ for i in `echo "0 1 2 3 4" | xargs`; do touch new$i; done
»mkrivushin@dot:~/temp$ ls
new0 new1 new2 new3 new4 test0 test1 test2 test3 test4
»mkrivushin@dot:~/temp$ hg st
? new0
? new1
? new2
? new3
? new4

Смотрим - новые файлы выводятся вопросами. Ну значит применим : )



»mkrivushin@dot:~/temp$ hg st | grep ^? | sed s/^?\ /\"/g | sed s/$/\"/g | xargs -n 1 hg add
»mkrivushin@dot:~/temp$ hg st
A kuku kuku
A new0
A new1
A new2
A new3
A new4

Добавились! : )


В общем вы догадались уже, что это можно применить к одному очень интересному каталогу - /etc
Но это еще не все! А как же нам при загрузке вернуться к рабочей системе, которую мы грохнули изучая pam, hesiod и kerberos? : ) Вот тут приходит такой очень хороший каталог - /proc



»mkrivushin@dot:~/temp$ cat /proc/cmdline
root=UUID=hehe-hehe-hehe-hehe ro quiet splash

А вот и параметры переданные ядру : ) Продолжать? Я думаю, вы конечно догадались, но так и быть допишем опус. Итак, напишем скрипт, который будет смотреть в параметры переданые ядру при загрузке, вылавливать оттуда номер ревизии и откатывать /etc к ней.



#! /usr/bin/python
import re
import os
cmd = open(’/proc/cmdline’,'r’).read().strip()
try:
revert = re.search(r’revert=(?P\d+)’,cmd).groupdict()[’revert’]
except:
revert=None
if revert:
os.system(”cd /etc && hg revert -a -r %s”%revert)
print “System config catalog /etc was reverted!!!”


Ставим этот скрипт в загрузку первым (/etc/event.d или используем дебиановский update-rc.d) и ломаем систему спокойно : ) Можно еще сделать возврат к какой либо версии по дате/времени.


А теперь самоe страшное - не тестировал, только собираюсь, но времени пока нет. Если кому-то интересно, я могу помочь советами, а также могу помочь сделать пакет из этого хозяйства. Кстати, если это велосипед, скажите автору в комментариях, чтоб больше не занимался фигней на рабочем месте : )