AllInfo
Main: Info Blog Temp Mail


unix 2020-03-16 18-36-47

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, он «пытается» выполнить это сообщение, а результат отправляет Васе в чат. При получении сообщения от кого-либо другого, он прикидывается ветошью и не реагирует. Натуральный засланец!

Всем спасибо за внимание, пока пока!

https://habr.com/ru/sandbox/69886/

3.239.2.192 / 2023-12-09_11-23-51 UTC.