Application: XMPP.
Помнится, давно-давно, когда я впервые распробовал и начал использовать Jabberd2, на сайте http://codex.xiaoka.com/wiki/ была детальная инструкция по сборке и "прикручиванию" MU-Conference к IM-серверу. Сейчас её нет. Не знаю, с чего бы это, может быть, разработчики не сошлись в каких-то там своих взглядах на методы реализации чего-нибудь. Как бы то ни было, придётся пройти весь путь установки самостоятельно на ощупь.
Устанавливаем необходимые библиотеки и утилиты:
# aptitude install linux-headers-`uname -r` pkg-config make binutils gcc libc6-dev libglib2.0-dev libexpat-dev libidn11-dev
Забираем с сайта разработчиков архив с исходными кодами примерно отсюда:
http://download.gna.org/mu-conference/
В моём случае это была стабильная версия "0.8":
# cd /usr/src
# wget http://download.gna.org/mu-conference/mu-conference_0.8.tar.gz
# tar -xvf mu-conference_0.8.tar.gz
# wget http://download.gna.org/mu-conference/mu-conference_0.8.tar.gz
# tar -xvf mu-conference_0.8.tar.gz
Переходим в директорию с исходными кодами:
# cd ./mu-conference_0.8
Конфигурирования, как такового, не предусмотрено и в результате работы компилятора получается всего один исполняемый файл. Потому, средства контроля за установкой приложений применять не будем. Просто компилируем:
# make
После завершения сборки просто копируем получившийся исполняемый файл в полагающееся ему место:
# cp ./src/mu-conference /usr/local/bin
Создаем группу и пользователя от имени которых будем запускать наш сервис конференций:
# groupadd jabber
# useradd --home-dir /var/jabber --shell /bin/false --gid jabber jabber
# useradd --home-dir /var/jabber --shell /bin/false --gid jabber jabber
Создаем директории, необходимые для работы сервиса, и приводим в соответствие права доступа к ним:
# mkdir -p /var/spool/mu-conference/rooms
# chown -R jabber:jabber /var/spool/mu-conference/rooms
# mkdir -p /var/log/mu-conference
# chown -R jabber:jabber /var/log/mu-conference
# mkdir -p /var/run/mu-conference
# chown -R jabber:jabber /var/run/mu-conference
# chown -R jabber:jabber /var/spool/mu-conference/rooms
# mkdir -p /var/log/mu-conference
# chown -R jabber:jabber /var/log/mu-conference
# mkdir -p /var/run/mu-conference
# chown -R jabber:jabber /var/run/mu-conference
Копируем конфигурационный файл в общий каталог:
# cp ./muc-default.xml /etc/mu-conference.xml
Корректируем его, доводя примерно до следующего вида, следуя подсказкам разработчиков в виде комментариев:
# vi /etc/mu-conference.xml
<jcr>
<name>conference.example.com</name>
<host>conference.example.com</host>
<ip>127.0.0.1</ip>
<port>5347</port>
<secret>strongSecretString</secret>
<spool>/var/spool/mu-conference/rooms</spool>
<logdir>/var/log/mu-conference</logdir>
<pidfile>/var/run/mu-conference/mu-conference.pid</pidfile>
<loglevel>124</loglevel>
<conference xmlns="jabber:config:conference">
<public/>
<vCard>
<FN>Public Chatrooms</FN>
<DESC>This public chatrooms.</DESC>
<URL>http://www.example.com/</URL>
</vCard>
<history>200</history>
<logdir>/var/log/mu-conference/</logdir>
<logsubdirs/>
<notice>
<join>has become available</join>
<leave>has left</leave>
<rename>is now known as</rename>
</notice>
<sadmin>
<user>admin@example.com</user>
</sadmin>
<!-- <dynamic/> -->
<persistent/>
<locknicks/>
<roomlock/>
<!-- <hideempty/> -->
</conference>
</jcr>
<name>conference.example.com</name>
<host>conference.example.com</host>
<ip>127.0.0.1</ip>
<port>5347</port>
<secret>strongSecretString</secret>
<spool>/var/spool/mu-conference/rooms</spool>
<logdir>/var/log/mu-conference</logdir>
<pidfile>/var/run/mu-conference/mu-conference.pid</pidfile>
<loglevel>124</loglevel>
<conference xmlns="jabber:config:conference">
<public/>
<vCard>
<FN>Public Chatrooms</FN>
<DESC>This public chatrooms.</DESC>
<URL>http://www.example.com/</URL>
</vCard>
<history>200</history>
<logdir>/var/log/mu-conference/</logdir>
<logsubdirs/>
<notice>
<join>has become available</join>
<leave>has left</leave>
<rename>is now known as</rename>
</notice>
<sadmin>
<user>admin@example.com</user>
</sadmin>
<!-- <dynamic/> -->
<persistent/>
<locknicks/>
<roomlock/>
<!-- <hideempty/> -->
</conference>
</jcr>
Запускаем сервис для тестирования функциональности:
# /usr/local/bin/mu-conference -c /etc/mu-conference.xml
Создадим скрипт управление сервисом:
# vi /etc/init.d/mu-conference && chmod ugo+x /etc/init.d/mu-conference
#!/bin/bash
### BEGIN INIT INFO
# Provides: mu-conference
# Required-Start: $local_fs $syslog $network
# Required-Stop: $local_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Script management of mu-conference
# Description: Script management of mu-conference
### END INIT INFO
EXEC="/usr/local/bin/mu-conference"
CONF="/usr/local/etc/mu-conference.xml"
PID="/var/run/mu-conference/mu-conference.pid"
case "$1" in
start)
echo "Initializing MU-Conference processes ..."
if [ $( pidof -s "mu-conference" ) ]; then
echo -e "\tMU-Conference already running"
exit 1
fi
echo -e "\tStarting MU-Conference... "
rm -f ${PID}
/bin/su -s /bin/bash -l jabber -c "${EXEC} -c ${CONF} -B" > /dev/null
;;
stop)
echo "Terminating MU-Conference processes ..."
if [ -f ${PID} ]; then
echo -e "\tStopping MU-Conference... "
killall --signal KILL mu-conference
# kill $(cat ${PID})
rm -f ${PID}
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
### BEGIN INIT INFO
# Provides: mu-conference
# Required-Start: $local_fs $syslog $network
# Required-Stop: $local_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Script management of mu-conference
# Description: Script management of mu-conference
### END INIT INFO
EXEC="/usr/local/bin/mu-conference"
CONF="/usr/local/etc/mu-conference.xml"
PID="/var/run/mu-conference/mu-conference.pid"
case "$1" in
start)
echo "Initializing MU-Conference processes ..."
if [ $( pidof -s "mu-conference" ) ]; then
echo -e "\tMU-Conference already running"
exit 1
fi
echo -e "\tStarting MU-Conference... "
rm -f ${PID}
/bin/su -s /bin/bash -l jabber -c "${EXEC} -c ${CONF} -B" > /dev/null
;;
stop)
echo "Terminating MU-Conference processes ..."
if [ -f ${PID} ]; then
echo -e "\tStopping MU-Conference... "
killall --signal KILL mu-conference
# kill $(cat ${PID})
rm -f ${PID}
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
Пробуем запустить службу:
# /etc/init.d/mu-conference start
На самом деле запуск сервиса конференций для XMPP-сервера в отрыве от самого XMPP-сервера занятие бесмысленное, так-что мне представляется естественным разместить ссылку на запуск и остановку сервиса в скрипт управления самим XMPP-сервером, например таким образом:
# vi /etc/init.d/jabberd2
....
start)
echo "Initializing jabberd2 processes ..."
....
/etc/init.d/mu-conference start
;;
stop)
echo "Terminating jabberd2 processes ..."
....
/etc/init.d/mu-conference stop
;;
....
start)
echo "Initializing jabberd2 processes ..."
....
/etc/init.d/mu-conference start
;;
stop)
echo "Terminating jabberd2 processes ..."
....
/etc/init.d/mu-conference stop
;;
....
Сервис работает для всех. Если жалко или просто не нужно, то можно фильтровать обращения к модулям Jabber сервиса (а сервисы у нас работают именно в виде модулей). Для ограничения доступа к сервисам редактируем конфигурационный файл "/etc/jabberd/router-filter.xml", размещая в блоке "
<!-- don't allow use MU-Conference non local users-->
<rule from="*@example.com" to="conference.example.com"/>
<rule error="not-allowed" from="*" to="conference.example.com" what="presence" log="yes"/>
<rule from="*@example.com" to="conference.example.com"/>
<rule error="not-allowed" from="*" to="conference.example.com" what="presence" log="yes"/>
Для того, что бы не получать сильно разросшиеся файлы журналов, настроим их ротацию.
Устанавливаем приложение ротации текстовых файлов с одновременным их сжатием:
# aptitude install logrotate gzip
Создаем конфигурационный файл ротации журнальных файлов для Jabberd2:
# mkdir -p /etc/logrotate.d
# vi /etc/logrotate.d/mu-conference
# vi /etc/logrotate.d/mu-conference
# шаблон указывающий объекты подлежащие "ротации"
/var/log/mu-conference/*.log {
# размер журнального файла, после которого он обрабатывается утилитой
size 10M
# отсутствие файла не вызывает ошибку
missingok
# количество хранимых отработанных резервных копий
rotate 10
# указание сжимать отрабатываемые резервные копии
compress
# указание не сжимать первую резервную копию, делать это при повторном проходе
delaycompress
# указание не отрабатывать пустые файлы
notifempty
# добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
dateext
# задать права доступа, владельца и группу создаваемого журнального файла
create 640 jabber jabber
}
/var/log/mu-conference/*.log {
# размер журнального файла, после которого он обрабатывается утилитой
size 10M
# отсутствие файла не вызывает ошибку
missingok
# количество хранимых отработанных резервных копий
rotate 10
# указание сжимать отрабатываемые резервные копии
compress
# указание не сжимать первую резервную копию, делать это при повторном проходе
delaycompress
# указание не отрабатывать пустые файлы
notifempty
# добавлять к наименованию файла резервной копии даты в формате "-YYYYMMDD"
dateext
# задать права доступа, владельца и группу создаваемого журнального файла
create 640 jabber jabber
}
Проверяем корректность конфигурационного файла:
# logrotate -d /etc/logrotate.d/mu-conference
7 ноября 2017 в 19:56
7 ноября 2017 в 22:03
10 ноября 2017 в 16:53
10 ноября 2017 в 17:07
12 ноября 2017 в 23:08
13 ноября 2017 в 08:42