Это старая версия документа.
Browser ( WebSocket )
Благодаря технологии WebSocket, браузер может держать постоянное подключение к серверу, что дает нам постоянный двусторонний канал обмена сообщениями.
Сервер websoket_backend реализован асинхронно на AnyEvent.
Установка сервера WebSocket
Установить perl модули:
- AnyEvent::Socket
- AnyEvent::Handle
- Protocol::WebSocket
Установить и включить модули апача:
- mod_proxy
- mod_proxy_wstunnel
Прописать в конфигурацию apache2 abills_httpd
в секцию VirtualHost биллинга
ProxyPass "/admin/wss/" "ws://127.0.0.1:19443/wss/admin/" retry=1
Установить и включить сервер вебсокетов
ln -s /usr/abills/misc/websocket_backend.pl /usr/abills/libexec/websocket_backend.pl chmod +x /usr/abills/libexec/websocket_backend.pl iptables -I INPUT 1 -p tcp --dport 19443 -j ACCEPT
Включать при загрузке
FreeBSD
# fetch -o /etc/rc.d/abills_websocket http://abills.net.ua/misc/abills_websocket_rc.d # chmod +x /etc/rc.d/abills_websocket
Debian/Ubuntu/CentOS
/etc/systemd/system/abills-backend.service
[Unit] Description=ABillS Websocket Server After=network.target After=mysql.service Requires=mysql.service [Service] Type=forking PIDFile=/usr/abills/var/log/websocket_backend.pid ExecStartPre=/bin/chown -R nobody /usr/abills/var/ ExecStart=/usr/abills/libexec/websocket_backend.pl -d ExecReload=/usr/abills/libexec/websocket_backend.pl stop [Install] WantedBy=multi-user.target
Включить службу
systemctl enable abills-backend.service
Возможные проблемы
Не установлен systemd
Решения:
- установить
systemd
- Использовать
rc.d
скрипт
Ошибки с mysql.service
Если в системе есть systemd
, а вместо mysql', установлена
mariadb, служба может называться
mariadb.service, переименуйте зависимую службу.
Если система не поддерживает запуск mysql через systemd, используйте init.d скрипт.
Конфигурация
libexec/config.pl
До версии 0.75.107
$conf{WEBSOCKET_URL} = 'wss:%host.example.com%:9443/admin/wss/'; # URL WebSocket сервера
После
$conf{WEBSOCKET_ENABLED} = 1;
==== Abills::Sender::Browser API ====
Методы
^is_connected()| Проверяет внутреннее соединение с WebSocket сервером |
^has_connected_admin($aid)| Проверяет, есть ли admin на линии (подключился ли его браузер к серверу) |
^send_message({ AID ⇒ 1, MESSAGE ⇒ $json_message })| Отправляет $json_message указаному администратору, формат сообщений |
^$json_request| Отсылает сообщение демону websocket_backend
(Плагину Internal
) |
Пример отправки сообщения администратору:
<code>
use Abills::Sender::Browser
my $Browser = Abills::Sender::Browser→new( $db, $admin, \%conf);
my $test_aid = 1;
my $test_notification = ««TEST_NOTIFICATION»;
{
«TYPE» : «MESSAGE»,
«TITLE» : «Test notification»,
«TEXT» : «Just<br/>some<br/>text»
}
TEST_NOTIFICATION
# Проверяем, что админ есть на линии
my $test_admin_connected = $Browser→has_connected_admin( $test_aid );
my $received = 0;
if ( $test_admin_connected ){
$received = $Browser→send_message( { AID ⇒ $test_aid, MESSAGE ⇒ $test_notification } );
}
else {
print «Admin $test_aid is not online \n»
return 0;
}
return $received;
</code>
Пример запуска внешней команды с уведомлением
<code>
use Abills::Sender::Browser;
my Abills::Sender::Browser $Browser = Abills::Sender::Browser→new($db, $admin, \%conf);
my $sended = $Browser→json_request( {
MESSAGE ⇒ {
TYPE ⇒ 'COMMAND',
AID ⇒ $admin→{AID}, # Кому придёт уведомление
PROGRAM ⇒ '/usr/bin/ping', # Имя програмы
PROGRAM_ARGS ⇒ [ '-c 3', '-q', '192.168.1.1' ], # Масив аргументов для програмы
ARGS ⇒ { # Аргументы для Abills::Base::cmd
timeout ⇒ 5
}
}
});
</code>
Пример выше можно заменить вызовом функции Abills::Misc::run_in_background
<code>
require Abills::Misc;
run_in_background('/usr/bin/ping', { timeout ⇒ 5 }, { PROGRAM_ARGS ⇒ [ '-c 3', '-q', '192.168.1.1' ] });
</code>
Когда сообщение приходит в браузер администратора, оно передаётся AMesssageChecker.
==== Расширение обработчиков сообщений AMessageChecker ====
* Maps (MAP_EVENT)