Ivanovo Linux Users Group - Not logged in
Forum Help Search Login
Previous Next Up Topic Jabber / Серверное ПО / jabber2 - JUD (9209 hits)
- By hawk Date 16.09.09 07:53 Edited 16.09.09 08:04
Ковыряю с недавнего времени jabber2 server for FreeBSD, конструктор каких еще поискать :-).
Вобщем базовые модули работают, а их там, раз, два..... эм
===
# ps -waux | grep jabber
jabber     91346  0.0  0.3  6176  3744  ??  Ss   11:28AM   0:04.38 /usr/local/bin/perl /usr/local/bin/jabberd -b
jabber     91342  0.0  0.2  6972  2608  p0  S    11:28AM   0:00.33 /usr/local/bin/router -c /usr/local/etc/jabberd/router.xml
jabber     91343  0.0  0.3  7836  3604  p0  S    11:28AM   0:00.40 /usr/local/bin/sm -c /usr/local/etc/jabberd/sm.xml
jabber     91344  0.0  0.2  6916  2512  p0  S    11:28AM   0:00.03 /usr/local/bin/s2s -c /usr/local/etc/jabberd/s2s.xml
jabber     91345  0.0  0.2  7496  3080  p0  S    11:28AM   0:00.14 /usr/local/bin/c2s -c /usr/local/etc/jabberd/c2s.xml
===
солянка :-)
Но это оказалось началом, так как базовый функционал не подразумевает многого. Про общий ростер я отписал в соседнем треде, это сделано и это кул. Следующее, в jabber2 напроч по умолчанию отсутвует возможность поиска юзерей. Чтобы ее прикрутить надо поставить jabber-users-agent
Перескажу краткую последовательность действий, авось кому пригодится:
Ставим:
/usr/ports/net-im/jabber-users-agent
   #make install clean

После инстала в директории /usr/local/lib/jabber/users-agent появятся парочка перловый скриптов, один для создания базы, другой для запуска jabber-users-agent . С созданием базы из перлового скрипта есть проблемы, надо доставлять перловые модули и прочее, поэтому проще создать файло:
DBCreateJUD.sql
===
   CREATE DATABASE JUD;
   GRANT ALL PRIVILEGES ON JUD.* to jud@localhost IDENTIFIED BY 'jud';
   CREATE TABLE JUD.jud (jid VARCHAR(100) PRIMARY KEY, name VARCHAR(100),
                       first VARCHAR(50), last VARCHAR(50),nick VARCHAR(50),
                       email VARCHAR(50), INDEX ind_name (name), INDEX ind_first (first),
                       INDEX ind_last (last), INDEX ind_nick (nick),
                       INDEX ind_email (email));

===
Теперь ставим:
#mysql  -u root -p < DBCreateJUD.sql
Все готово, переходим к редактированию конфига jabber-users-agent
#ee /usr/local/etc/jabber-users-agent.xml
Правим:
<secret>foobar</secret>
foobar меняем на то, что прописано в router.xml в этом же поле.
Дальше меняем параметры подкл к базе Мускул:
===
<mysql>
    <dbname>JUD</dbname>
    <host>localhost</host>
    <port>3306</port>
    <username>root</username>
    <password>пасс</password>
    <limit>250</limit>
  </mysql>

Меняем права на этот файл 660, и юзер группа jabber
===
После этого можно стартовать jabber-users-agent, для этого запускаем скрипт users-agent из /usr/local/lib/jabber/users-agent
===
./users-agent
Чтобы в фон:
./users-agent &
Вобщем после этого в процессах висит:
===
ps -waux | grep user
root       91454 17.3  0.8 13268 10820  p0  S    11:54AM   0:01.19 /usr/local/bin/perl ./users-agent

===
Стало быть работает, далее регим на сервере юзера, настраивал в Psi, смотрим в "Сервисы" и видим что появился "Users-Agent".
ТЕПЕРЬ ПРОБЛЕМА
Тыкаем в него, появляется окно поиска, пробуем искать и вот незадача, поиск не выдает список юзерей.
В этом случае, не очень врубаюсь в механизм. Я как понимаю при реге нового юзера инфа о нем появляется в базе мускула jabberd2 и должна заносится в базу JUD для поиска, вот походу не заносится почему то пусто :-(.
Когда запускаю скрипт ./users-agent конект с базой происходит 100 пудово, в этом скрипте есть отладка параметр $optctl{debug} = 1;
при запуске в режиме отладки полно различной инфы, которая фиг знает что означает, вывод конечно могу дать...
Кто что думает по этому поводу?
===
п.с.. другие сервера не предагать, т.к. юзаю jabberd 1.4, OpenFire, единственное ejabber не юзал :-), но этот уже установлен, работает, в нем куча юзерей и т.д.
echo "good..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Parent - By hawk Date 16.09.09 08:10
Надеюсь не побьют, вот вывод JUD юзер-агента:
===
# ./users-agent
XML::Stream: new: hostname = (host.org.ru)
XML::Stream: SetCallBacks: tag(node) func(CODE(0x8830328))
XMPP::Conn: xmppCallbackInit: start
XMPP::Conn: SetCallBacks: tag(message) func(CODE(0x883013c))
XMPP::Conn: SetCallBacks: tag(presence) func(CODE(0x883019c))
XMPP::Conn: SetCallBacks: tag(iq) func(CODE(0x88301fc))
XMPP::Conn: SetPresenceCallBacks: type(subscribe) func(CODE(0x88301a8))
XMPP::Conn: SetPresenceCallBacks: type(subscribed) func(CODE(0x882dfac))
XMPP::Conn: SetPresenceCallBacks: type(unsubscribe) func(CODE(0x8830028))
XMPP::Conn: SetPresenceCallBacks: type(unsubscribed) func(CODE(0x882df4c))
XMPP::Conn: SetDirectXPathCallBacks: xpath(/[@xmlns="urn:ietf:params:xml:ns:xmpp-tls"]) func(CODE(0x882de8c))
XMPP::Conn: SetDirectXPathCallBacks: xpath(/[@xmlns="urn:ietf:params:xml:ns:xmpp-sasl"]) func(CODE(0x882b3c4))
XMPP::Conn: xmppCallbackInit: stop
XMPP::Conn: SetIQCallBacks: type(get) func(CODE(0x87a320c)) namespace(http://jabber.org/protocol/disco#items)
XMPP::Conn: SetIQCallBacks: type(get) func(CODE(0x87a2f48)) namespace(http://jabber.org/protocol/disco#info)
XMPP::Conn: SetIQCallBacks: type(get) func(CODE(0x879b490)) namespace(jabber:iq:search)
XMPP::Conn: SetIQCallBacks: type(set) func(CODE(0x879b7d8)) namespace(jabber:iq:search)
XMPP::Conn: SetIQCallBacks: type(get) func(CODE(0x8795038)) namespace(jabber:iq:register)
XMPP::Conn: SetIQCallBacks: type(set) func(CODE(0x87955f0)) namespace(jabber:iq:register)
XMPP::Conn: Execute: begin
XMPP::Conn: Execute: Attempt to connect (-1)
XMPP::Conn: Connect: host(127.0.0.1:5347) namespace(jabber:component:accept)
XMPP::Conn: Connect: timeout(10)
XML::Stream: Connect: type(tcpip)
XML::Stream: Connect: Got a connection
XML::Stream: Send: (<?xml version='1.0'?><stream:stream version='1.0' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:component:accept' to='users.host.org.ru' from='host.org.ru' xml:lang='en' >)
XML::Stream: Read: buff(<?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:component:accept' to='host.org.ru' from='users.host.org.ru' version='1.0' id='7xmul5dp8ddqtsmco22ovy61wtrf08vyit82ob43'>)
XML::Stream: Read: buff(<stream:features xmlns:stream='http://etherx.jabber.org/streams'><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features>)
XMPP::Conn: Connect: connection made
XML::Stream: SetCallBacks: tag(node) func(CODE(0x882bdfc))
XMPP::Conn: Execute: Connected...
XML::Stream: SetCallBacks: tag(node) func(CODE(0x882d130))
XMPP::Conn: SendXML: sent(<handshake>746b19896035da359817908b190365d21c2e83c4</handshake>)
XML::Stream: Send: (<handshake>746b19896035da359817908b190365d21c2e83c4</handshake>)
XML::Stream: Read: buff(<handshake xmlns='jabber:component:accept'/>)
XMPP::Conn: Process: status(ARRAY(0x884d84c))
XMPP::Conn: Process: return(ARRAY(0x884d84c))
XML::Stream: SetCallBacks: tag(node) func(CODE(0x884d834))
XMPP::Conn: Connected: (1)
XML::Stream: Read: buff(<iq xmlns='jabber:client' type='get' to='users.host.org.ru' from='host.org.ru' id='rho4hff8'><query xmlns='http://jabber.org/protocol/disco#info'/></iq>)
XMPP::Conn: CallBack: sid(7xmul5dp8ddqtsmco22ovy61wtrf08vyit82ob43) received(<iq from='host.org.ru' id='rho4hff8' to='users.host.org.ru' type='get' xmlns='jabber:client'><query xmlns='http://jabber.org/protocol/disco#info'/></iq>)
XMPP::Conn: CallBack: tag(iq)
XMPP::Conn: CallBack: id(rho4hff8)
XMPP::Conn: CallBack: we either want it or were waiting for it.
XMPP::Conn: CallBack: check directxpath
XMPP::Conn: CallBack: check directxpath(/[@xmlns="urn:ietf:params:xml:ns:xmpp-sasl"])
XMPP::Conn: CallBack: check directxpath(/[@xmlns="urn:ietf:params:xml:ns:xmpp-tls"])
XMPP::Conn: BuildObject: tag(iq) package(Net::Jabber::IQ)
XMPP::Conn: CheckID: tag(iq) id(rho4hff8)
XMPP::Conn: CheckID: we have that here somewhere...
XMPP::Conn: CallBack: no registry entry
XMPP::Conn: CallBack: goto user function(CODE(0x88301fc))
XMPP::Conn: callbackIQ: sid(7xmul5dp8ddqtsmco22ovy61wtrf08vyit82ob43) iq(Net::Jabber::IQ=HASH(0x87ce6b8))
XMPP::Conn: callbackIQ: type(get) ns(http://jabber.org/protocol/disco#info)
XMPP::Conn: callbackIQ: goto user function( CODE(0x87a2f48) )
Users-Agent: iqDiscoGetCB: iq(<iq from='host.org.ru' id='rho4hff8' to='users.host.org.ru' type='get' xmlns='jabber:client'><query xmlns='http://jabber.org/protocol/disco#info'/></iq>)
Users-Agent: iqDiscoGetCB: reply(<iq from='users.host.org.ru' id='rho4hff8' to='host.org.ru' type='result'><query xmlns='http://jabber.org/protocol/disco#info'><identity category='directory' name='Users-Agent' type='user'/><feature var='jabber:iq:register'/><feature var='jabber:iq:search'/></query></iq>)
XMPP::Conn: SendXML: sent(<iq from='users.host.org.ru' id='rho4hff8' to='host.org.ru' type='result'><query xmlns='http://jabber.org/protocol/disco#info'><identity category='directory' name='Users-Agent' type='user'/><feature var='jabber:iq:register'/><feature var='jabber:iq:search'/></query></iq>)
XML::Stream: Send: (<iq from='users.host.org.ru' id='rho4hff8' to='host.org.ru' type='result'><query xmlns='http://jabber.org/protocol/disco#info'><identity category='directory' name='Users-Agent' type='user'/><feature var='jabber:iq:register'/><feature var='jabber:iq:search'/></query></iq>)
XMPP::Conn: Process: status(1)
XMPP::Conn: Process: return(1)

===
host.org.ru - это измененное имя домена джабера.
echo "good..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Parent - By hawk Date 16.09.09 08:43
Выяснил еще небольшие подробности.
В сервисах, по правой кнопке на "User-Agent" - есть поле "Зарегистрировать" открывается форма, в котой можно ввести ник, почту и другие данные, теперь при поиске через Юзер агента я этого (заведенного пользователя через юзеер агента) нахожу, но он не как ни привязан и не зарегистрирован на сервере. Получается что сервер сам по себе, а поиск юзерей и их регистрация в User-Agent сама по себе :-(. Ерунта...
echo "good..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Parent - By hawk Date 16.09.09 09:01
Вобщем все работает, только не так как представлял себе и не так как это реализовано в jabber1.4.

В сервисах, по правой кнопке на "User-Agent" - есть поле "Зарегистрировать" открывается форма, в котой можно ввести ник, почту и другие данные, заполняем их и жмем регистрация. Теперь для данного аккаунда работает поиск.
Получается надо проделать двойную работу, сначало регистрирую пользователя на jabber сервере, потом заходу в сервисы под этим юзером и жму зарегистрировать в "User-Agent", теперь все остальные могут его находить. Еще одна хитрость, чтобы новый пользователь мог видеть все аккаунды сервера, при регистрации в "User-Agent" добавляйте какой нибудь общий символ, например "пробел никнейм" и так для каждого. При поиске вводим пробел и выдаются все юзеры сервера.
echo "good..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Parent By hawk Date 16.09.09 11:39
Статьи по установке и настройке jabberd2 разместил у себя в блоге:

FreeBSD Jabberd2 Server
FreeBSD Jabberd2 Server Часть 2

Может кому пригодятся :-)
echo "good..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Previous Next Up Topic Jabber / Серверное ПО / jabber2 - JUD (9209 hits)

Powered by mwForum 2.12.0 © 1999-2007 Markus Wichitill

Page created in 0.074s with 10 database queries.