Xgu.ru теперь в Контакте  — приходите и подключайтесь.
Пока мы работаем над следующими видео, вы можете подключиться в Контакте. Познакомимся и обсудим новые страницы и ролики.

Vk-big.pngYoutube-big.jpeg

Jabber

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] История Jabber

История XMPP, ejabberd и Erlang в графическом представлении[1]: jabber-timeline.png

[править] SRV-записи

Аналогом MX-записи для Jabber является специальная запись SRV. В этой записи указываются не только имена серверов, но и порты для обращения к ним.

Пример SRV-записей для Jabber (сервер jabber.example.com; домен example.com):

_jabber._tcp.example.com.       IN SRV   0 0 5269   jabber.example.com.
_xmpp-server._tcp.example.com.  IN SRV   0 0 5269   jabber.example.com.
_xmpp-client._tcp.example.com.  IN SRV   0 0 5222   jabber.example.com.

SRV записи нужны в случае, если вы хотите получить имена пользователей Jabber ID (JID), совпадающими с e-mail. Также, это нужно, чтобы не прописывать вручную имя сервера в джаббер-клиентах.

Генератор записей: [1].

Проверить SRV запись:

dig -t SRV _xmpp-server._tcp.jabber.ru
dig -t SRV _xmpp-client._tcp.jabber.ru

[править] Использование jabber в системном администрировании

[править] Модификация sendxmpp для отправки сообщений типа 'chat'

Многие jabber-клиенты (в частности freetalk) не хотят показывать сообщения типа message, которые sendxmpp отправляет по умолчанию. Если исправить тип сообщений на chat, всё работает хорошо.

Исправление необходимо сделать в функции: <perl/> sub xmpp_send_message ($$$$$$) {

   my ($cnx,$rcpt,$comp,$subject,$headline,$msg) = @_;
   my $type = 'message';
   if ($headline) {
       $type='headline';
   }

   # for some reason, MessageSend does not return anything
   $cnx->MessageSend('to'      => $rcpt . ( $comp ? "\@$comp" :  ),
       'type'      => $type,
       'subject'   => $subject,
       'body'      => $msg);
   
   xmpp_check_result('MessageSend',0,$cnx);

}

Нужно заменить строку

   my $type = 'message';

на

   my $type = 'chat';

Если номер строки известен, замена выполняется просто:

   sudo sed -i '370 s/message/chat/' /usr/bin/sendxmpp

Если неизвестен, его можно определить так:

   cat -n /usr/bin/sendxmpp | grep my.*type.*message

[править] Массовая рассылка указаний

Можно организовать рассылку оперативных инструкций техническому персоналу с помощью jabber'а.

%# cat <<LETTER | for i in admin1 admin2 admin3; do sendxmpp ${i}; done
Привет!

Сейчас будем гасить центральную серверную
Приготовьтесь отвечать на телефонные звонки
Вообще мы всех предупреждали, но сами знаете, почту никто не читает.
Сейчас будут звонить
Ну всё, я нажимаю shutdown -h now через 300 секунд
Обратный отсчёт пошёл
LETTER

Здесь вместо имён admin1, admin2, admin3 должны стоять настоящие jid.

[править] Уведомления monit

Monit

check device DiskRoot with path /dev/sda5
if space usage > 95% then exec '/usr/local/bin/sendxmpp-disk-alert.sh'

sendxmpp-disk-alert.sh

#!/bin/sh -e
/bin/echo 'Маловато будет' | HOME=/root /usr/bin/sendxmpp user@jabber.aaaaa.com.ua

[править] Модификация sendxmpp для поддержки SRV

А точнее не самого sendxmpp, а библиотек, которые он использует.

Сначала установить модуль Net::DNS::Resolver для Perl:

%$ apt-get install libnet-dns-perl

В файле /usr/share/perl5/Net/XMPP/Connection.pm после 143 строки добавить:

srv => '_xmpp-client._tcp',
to => $self->{SERVER}->{hostname},

Источник: [2].


[править] Оповещение в джаббер при звонке через астериск

При поступлении звонка на определённый номер астериск:

exten => 202,n,System(echo Zvonochki v studiyu: " ${STRFTIME(${EPOCH},,%d/\%m/\%Y-%H:%M:%S)} - ${CALLERID(all)} - ${CHANNEL} "
| sendxmpp -f /var/lib/asterisk/.sendxmpprc server@unix.nt)


Мы можем сделать более масштабное решение: например, мы хотим, чтобы при поступлении звонка на номер 2XX, в соответствующий джаббер отправлялось сообщение. Для этого будем использовать макрос и небольшой скрипт.

Макроконтекст в диалплане:

[macro-jabblog]
exten => _2XX,n,Set(ENV(CALLERID)=${CALLERID(all)})
exten => _2XX,n,System(/usr/local/bin/jabblog ${EXTEN})
exten => s,n,Dial(SIP/${ARG1})

Использование этого макроконтекста:

exten => _2XX,1,Macro(jabblog,${EXTEN})

Скрипт /usr/local/bin/jabblog:

#!/bin/sh
JABBTABLE=/etc/asterisk/jabbtable

jid="`grep "^$1 " $JABBTABLE | awk '{print $2}'`"
[ -z "$jid" ] || echo ${CALLERID} is calling | sendxmpp -f /var/lib/asterisk/.sendxmpprc "$jid"


Таблица соответствия:

201 igor@example.com
203 romchiko@example.com
221 gib@example.com

[править] Дополнительная информация

[править] Примечания

  1. Источник: http://www.ejabberd.im/birthday-7
Источник — «http://www.xgu.ru/wiki/Jabber»