Pull to refresh

Ejabberd + передача файлов + «засланец»

Здравствуйте, уважаемое сообщество. Новый опыт, новая статья и новая попытка вскарабкаться на Хабр. Я эникейщик и для себе подобных решил написать очерк про установку и настройку сервера обмена сообщениями, ну и небольшой бонус напоследок.

Сразу оговорюсь, что интеграция с AD не рассмотрена, т.к. практического опыта нет.

Конфигурация железа:

Intel® Pentium® 4 CPU 2.40GHz
768 Mb RAM
HDD 40 Gb
ОС: Debian 6

В качестве сервера выбран ejabber (по сравнению с openfiler не такой требовательный к ресурсам)

Устанавливаем:
sudo aptitude install ejabberd

Настройки хранятся в файле /etc/ejabberd/ejabberd.cfg
Хочу заметить, что настройки в файле очень хорошо прокомментированы разработчиками.

Настраиваем:

sudo mcedit /etc/ejabberd/ejabberd.cfg

1. Находим и раскомментируем следующую строку:
override_local.

2. Находим секцию:

%% Admin user
{acl, admin, {user, «ADMIN», «SERVER_NAME»}}.

%% Hostname
{hosts, [«SERVER_NAME»].


И прописываем свои данные для ejabberd-администратора

Пример:
%% Admin user
{acl, admin, {user, «xxx», «example.com»}}.

%% Hostname
{hosts, [«example.com»].


3. Секция ACCESS RULES и строка:

{access, register,

В комментариях сказано, что эта строка отвечает за самостоятельную регистрацию пользователей Если необходима возможность создания нового пользователя из клиентской программы, то приводим строку к виду:
{access, register, [{allow, all}]}

Я эту возможность не использую, потому у меня строка выглядит так:

{access, register, [{deny, all}]}

4. Секция DEFAULT LANGUAGE

прописываем язык по умолчанию ru:

{language, «ru»}.

5. Настроим такую полезную вещь как общий ростер (все контора сразу в списке у каждого пользователя)
находим и расскоментируем:

{mod_shared_roster, []},

Передача файлов:

При таких настройках пользователи смогут прекрасно обмениваться не только сообщениями, но и файлами (при условии использования одинаковых клиентских программ, но об этом ниже), НО, проблема появилась тогда, когда я попытался передать файл человеку, который присоединился к серверу «снаружи». Поясню на примере: наш ejabberd-сервер в локальной сети — 192.168.100.100/ejabberd.local и он же в интернете (или другой локальной сети) 55.55.55.55/example.com — при таком раскладе пересылка файлов между пользователями из разных сетей не работала. Так вот если у вас сервер так же будет располагаться на шлюзе, то необходимо настроить следующее:

6. Находим в конфиге mod_proxy65 и приводим к такому виду:
{mod_proxy65, [
{host, «55.55.55.55»},
{name, «55.55.55.55»},
{hostname, «55.55.55.55»},
{ip, {0.0.0.0}},
{port, 7777},
{access, all},
{shaper, c2s_shaper}
]},


*Примечание:
host, name и hostname я специально заполнял внешним ip-адресом, когда настраивал, с тех пор так и осталось;
ip 0.0.0.0 — после этой строки ejabberd начнёт слушать на всех сетевых интерфейсах

Отлично, с конфигом, кажется, закончили. Осталось чуть.

Регистрируем учётную запись администратора ejabberd-сервера:

sudo ejabberdctl register XXX Example.com PASSWORD

Перезапускаем ejabberd:

sudo /etc/init.d/ejabberd restart

Администрируется сервер по адресу: наш_сервер:5280/admin
*Примечание:
логин вводим полностью, т.е. xxx@example.com и пароль, заданный на предыдущем шаге.

С помощью этой панели выполняются операции с сервером/пользователями/группами и прочее.
Переходим в раздел Virtual Hosts/название нашего сервера/группы общих контактов
Создаём группу
Название: Наша контора
Описание: Наша контора
Члены: собакаallсобака (значок собаки превращается в ссылку в предпросмотре, так что подстраховываюсь)
* если нужны определённые пользователи, то они перечисляются по порядку через пробел (vasya@example.com nadya@example.com)
Видимые группы: Наша контора

Всё норм, ejabberd готов к приему пользователей.
Пара слов о клиентских программах.
Я пробовал несколько программ, но остановился на Psi plus. Не навязываю, но советую присмотреться. Не ахти какой «корпоративный стиль», но своё дело знает туго.
*Примечание: для передачи файлов между всеми, необходимо в настройках аккаунта (Другое/Передача данных/Прокси сервер) указать внешний ip адрес ejabberd-сервера (в нашем примере 55.55.55.55)

Итак, сервер настроен, клиенты подключены, всё ок.

Засланец

Пришло время для бонуса, на который я недавно наткнулся.
Создадим специальный аккаунт (zaslanetc@example.com с паролем password) на нашем сервере. Все сообщения, которые поступят от определенного пользователя будут выполнены на том компьютере, с которого залогинился «Засланец», а результат выслан в ответном сообщении.
Суперпользы такой финт не несёт, но порцию положительных эмоций получите запросто.

Это тот случай, когда подготовка оказалась сложнее самой реализации. Тренировался на рабочем компьютере с
ubuntu 13.04
Необходимо установить ruby
Оказалось, что версии выше 1.8.7 (как позже выяснилось) капризничают, поэтому её я и поставил.
Устанавливал по этому руководству (nodejs — не надо, наша версия 1.8.7)
Затем устанавливаем «гемы»

gem install xmpp4r-simple
gem install session

и пишем скрипт/засланца

sudo mcedit zaslanetc.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'xmpp4r-simple'
require 'session'
#sh, в котором выполняются команды
@sh = Session::new
# Подключение к ejabberd-серверу
bot = Jabber::Simple.new('zaslanetc@example.com', 'password')
while true
# Ожидаем сообщение
bot.received_messages do |msg|
# Проверка, что отправитель, кто надо отправитель
if msg && msg.from.to_s.include?('vasya@example.com')
# Выполняем команды в сеансе sh
stdout, stderr = @sh.execute(msg.body) if msg.body
# Отправляем в ответном сообщении вывод команды
bot.deliver(msg.from, "\n" + stdout.chomp) unless stdout.empty?
# Отправляем ошибки
bot.deliver(msg.from, "\n" + stderr.chomp) unless stderr.empty?
end
end
end


Запускаем:
ruby zaslanetc.rb

и проверяем

Итог:

при получении засланцем сообщения от vasya@example.com, он «пытается» выполнить это сообщение, а результат отправляет Васе в чат. При получении сообщения от кого-либо другого, он прикидывается ветошью и не реагирует. Натуральный засланец!

Всем спасибо за внимание, пока пока!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.