PyICQ-t и все, все, все

Некоторые мои знакомые упорно не хотят переходить с ICQ на какой-либо другой IM, и Jabber в частности. Причин множество. Прежде всего, привязанность к своим icq-контактам, которые также не хотят никуда переходить. Банальная лень что-либо менять тоже играет не малую роль :) Но не об этом речь. Тему «ICQ — зло» до меня раскрыло множество людей, поэтому повторяться не буду.
Разговор пойдёт о том, как же все-таки с этими упёртыми асечниками общаться, оставаясь пользователем Jabber`а. Можно поставить мультипротокольный IM: sim-im, gaim, centericq и т.п. Но мы пойдём другим путём :)

Прежде всего надо добавить в свой ростер какой-нибудь icq-транспорт. Особо тут не разбежишься. На данный момент существует 2 наиболее вменяемых транспорта: JIT и PyICQ-t. Первый, по моим наблюденям, используется на большем количестве jabber-серверов. Но у него есть существенные недостатки: бывает так, что часть асечных контактов находятся в оффлайне, хотя на самом деле они в сети, невозможно с его помощью получить контакт-лист с icq-сервера, не отображает статусы у контактов, не обрабатывает события «контакт пишет», и некоторые другие. В отличие от JIT, PyICQ-t все вышеперечисленные фичи поддерживает. К тому же недавно вышла версия 0.8, в которой были исправлены ошибки и, наверное, добавлены новые :)

Ради спортивного интереса я решил поставить jabber-сервер себе на localhost вместе с icq-транспортом. Т.к. я использую Gentoo, то все описанные грабли необходимо адаптирвать для вашего дистрибутива :) В качестве сервера я выбрал замечательный проект ejabberd, разрабатываемый нашими соотечественниками. Ебилда для последней на данный момент версии 1.1.2 в portage не оказалось, зато в багзилле он уже лежит вместе с исправленным init-скриптом. Закинув ебилд к себе в оверлей, я установил jabber-сервер.

sudo emerge ejabberd

Грабли: по умолчанию пользователь jabber, которого создает пакет jabber-base, использует шелл /sbin/nologin. Надо заменить в /etc/passwd на /bin/bash. Тогда ejabberd будет запускаться и не выдавать ошибку
This account is currently not available.

Теперь нужно отконфигурировать ejabberd.
Вот мой /etc/jabber/ejabberd.cfg:


{acl, local, {user_regexp, ""}}.
{access, pubsub_createnode, [{allow, all}]}.
{access, configure, [{allow, admin}]}.
{access, register, [{allow, all}]}.
{welcome_message,
{"Welcome!",
"Welcome to Jabber Service. "
"For information about Jabber visit http://jabber.org"}}.
{access, announce, [{allow, admin}]}.
{access, c2s, [{deny, blocked},
{allow, all}]}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, local, [{allow, local}]}.
{auth_method, internal}.
{host, "localhost"}.
{max_user_sessions, 10}.
{language, "en"}.
{listen,
[{5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper},
{max_stanza_size, 65536},
starttls, {certfile, "./ssl.pem"}]},
{5223, ejabberd_c2s, [{access, c2s},
{max_stanza_size, 65536},
tls, {certfile, "./ssl.pem"}]},
{5269, ejabberd_s2s_in, [{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
{5280, ejabberd_http, [http_poll, web_admin]},
{5347, ejabberd_service, [{access, all},
{host, "icq.localhost", [{password, "secret"}]}]}
]}.
{s2s_use_starttls, true}.
{s2s_certfile, "./ssl.pem"}.
{outgoing_s2s_port, 5269}.
{modules,
[
{mod_register, [{access, register}]},
{mod_roster, []},
{mod_privacy, []},
{mod_adhoc, []},
{mod_configure2, []},
{mod_disco, []},
{mod_stats, []},
{mod_vcard, []},
{mod_offline, []},
{mod_echo, [{host, "echo.localhost"}]},
{mod_private, []},
{mod_muc, [{access, muc},
{access_create, muc},
{access_admin, muc_admin}]},
{mod_pubsub, [{access_createnode, pubsub_createnode}]},
{mod_time, []},
{mod_last, []},
{mod_version, []}
]}.

Изменения минимальны и касаются только секции listen.

Запускаем сервер

sudo /etc/init.d/ejabberd start

Если всё удачно, то в списке процессов можно увидеть beam.

$ ps aux | grep beam
jabber 5679 0.0 3.0 25364 11656 pts/4 Sl 20:40 0:03 /usr/lib/erlang/erts-5.5/bin/beam -- -root /usr/lib/erlang -progname erl -- -home /var/run/jabber -pa /usr/lib/erlang/lib/ejabberd-1.1.2/ebin -sname ejabberd -s ejabberd -ejabberd config "/etc/jabber/ejabberd.cfg" log_path "/var/log/jabber/ejabberd.log" -kernel inetrc "/etc/jabber/inetrc" -sasl sasl_error_logger {file,"/var/log/jabber/sasl.log"} -mnesia dir "/var/spool/jabber" -noshell -noshell -noinput

Добавим админа сервера с помошью ejabberdctl

ejabberdctl ejabberd@localhost register admin localhost password

Теперь можно управлять сервером через веб-морду по адреcу http://localhost:5280/admin.

Устанавливаем транспорт. Порывшись в гугле, нашёл ебилд для pyicq-t в оверлее zugaina, но для версии 0.7b. После редактирования и смены версии до 0.8, я закинул его в свой локальный оверлей и установил pyicq-t:

sudo emerge pyicq-t

Вот мой /etc/jabber/pyicq-t.xml:

<pyicqt>
<jid>icq.localhost</jid>
<spooldir>/var/spool/jabber/</spooldir>
<pid>/var/run/jabber/pyicq-t.pid</pid>
<mainServer>127.0.0.1</mainServer>
<mainServerJID>jabber.localhost</mainServerJID>
<website>http://localhost/</website&gt;
<port>5347</port>
<secret>secret</secret>
<lang>en</lang>
<encoding>iso-8859-1</encoding>
<icqServer>login.icq.com</icqServer>
<icqPort>5190</icqPort>
<admins>
<jid>admin@jabber.localhost</jid>
</admins>
<reactor>epoll</reactor>
</pyicqt>

Грабли:Не стартовал сервис pyicq-t. Как выяснилось, с первого раза twisted-words установилась некорректно, и import twisted.words в python выдавал ошибку. Вылечилось повторной установкой. Причину не выяснил.

Чтобы не было задержек при отправлении сообщений, необходимо в конфиге раскомментировать строчку <reactor>epoll</reactor>
Запускаем icq-транспорт

sudo /etc/init.d/pyicq-t start

Теперь можно и потестировать свой сервер. Делал я это с помощью tkabber, т.к. PSI попросту валился при подключении к localhost (грешу на то, что у меня установлена версия из darcs, которая по определению не является стабильной). Я создал нового пользователя и сделал Service Discovery. В списке обнаружился и icq-транспорт (удивительно, правда? ;)). Добавив его в ростер, я получил свой контакт-лист, правда пользователи оказались без ников, одни UIN`ы. Но оно работает! :)

Немножко слов о переезде с одного транспорта на другой. Для этого существует Jabber Roster Utility. С её помощью я перевел свои контакты с icq.jabber.snc.ru (JIT) на icq.jabber.org.by (PyICQ-t). В хелпе всё достаточно хорошо расписано.

P.S. Данный опус ни в коем случае не претендует на роль руководства по установке ejabberd и pyicqt :) Для этого лучше воспользоваться официальными документами: Ejabberd 1.1.2 Installation and Operation Guide и Install PyICQt — ICQ Transport.

UPD: Ники теперь резолвятся из UIN`ов, а icq.jabber.perm.ru поддерживает away-статусы пользователей на русском языке.

Реклама
Опубликовано в Gentoo, Jabber, Linux, Personal. 11 комментариев »

комментариев 11 to “PyICQ-t и все, все, все”

  1. virens Says:

    Отличный пост — подробный и очень толковый. Это очень дополняет официальные руководства. Так держать :-)

  2. kaktyc Says:

    Спасибо! Будем стараться :)

  3. Igor Says:

    А нет такой проблемы, что часть сообщений от тебя не доходит? Обнаружил это недавно на jabber.org.by, неприятно. Проблема в PSI или в сервере?..

  4. kaktyc Says:

    Вроде все сообщения доходят. Можно попробовать ещё icq.jabber.perm.ru, там тоже установлен PyICQ-t.
    Кстати, PSI у меня некорректно обрабатывает события «контакт пишет». На другой стороне выглядело так, как будто я постоянно что-то пишу. В результате просто отключил эту фичу в настройках клиента, заодно и трафик сэкономлю :)

  5. Igor Says:

    Нет, с этим всё нормально. Сейчас ещё попробую. А за адрес спасибо :).

  6. Igor Says:

    С пермским адресом всё нормально. Попробую написать в белорусский. Спасибо ещё раз! А с постоянно подключенной машиной к сети реально организовать свой сервер (типа jabber.cheer.ru =))? И что для этого нужно?

  7. kaktyc Says:

    Вполне реально :) Для этого машина должна быть доступна через DNS, а в конфиге в нужных местах поменять localhost на соответствующее имя.
    Можно ещё исхитриться и воспользоваться DynDNS и использовать свою домашнюю машину (даже если ip динамический) с доменным именем типа username.is-a-geek.org. Для «поиграться» на первое время вполне хватит :)

  8. Igor Says:

    Спасибо! Постараюсь где-то в конце января попробовать!

  9. ram32 Says:

    огромное спасибо за статью, в недалеком будущем тоже собираюсь сделать свой сервачок =)

  10. vladimir_re Says:

    а у как тут с группами. он их не может прорезолвить?

  11. java Says:

    Ага, интересная темка… насчет сервачка, так можно и хостинг продовать?


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: