Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
abills:docs:manual:sender:browser [2017/01/03 10:12] anton [Установка сервера WebSocket] |
abills:docs:manual:sender:browser [2017/07/19 12:53] (текущий) anton [Abills::Sender::Browser API] |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
Сервер websoket_backend реализован асинхронно на AnyEvent. | Сервер websoket_backend реализован асинхронно на AnyEvent. | ||
- | ==== Установка сервера WebSocket ==== | + | [[abills:docs:manual:websocket_backend|Установка сервера WebSocket]] \\ |
- | Установить perl модули: | + | |
- | * AnyEvent::Socket | + | |
- | * AnyEvent::Handle | + | |
- | * Protocol::WebSocket | + | |
- | + | ||
- | Установить и включить модули апача: | + | |
- | * mod_proxy | + | |
- | * mod_proxy_wstunnel | + | |
- | + | ||
- | Прописать в конфигурацию apache2 ''abills_httpd'' в секцию VirtualHost биллинга | + | |
- | <code> | + | |
- | ProxyPass "/admin/wss/" "ws://127.0.0.1:19443/wss/admin/" retry=1 | + | |
- | </code> | + | |
- | + | ||
- | Установить и включить сервер вебсокетов | + | |
- | 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 | + | |
- | + | ||
- | **Включать при загрузке** | + | |
- | **/etc/systemd/system/abills-backend.service** | + | |
- | <code> | + | |
- | [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 | + | |
- | </code> | + | |
- | Включить службу | + | |
- | <code> | + | |
- | systemctl enable abills-backend.service | + | |
- | </code> | + | |
** Конфигурация ** | ** Конфигурация ** | ||
**libexec/config.pl** | **libexec/config.pl** | ||
- | $conf{WEBSOCKET_URL} = 'wss://%host.example.com%/admin/wss/'; # URL WebSocket сервера | + | $conf{WEBSOCKET_ENABLED} = 1; |
\\ | \\ | ||
Строка 61: | Строка 17: | ||
^has_connected_admin($aid)| Проверяет, есть ли admin на линии (подключился ли его браузер к серверу) | | ^has_connected_admin($aid)| Проверяет, есть ли admin на линии (подключился ли его браузер к серверу) | | ||
^send_message({ AID => 1, MESSAGE => $json_message })| Отправляет $json_message указаному администратору, [[abills:docs:events|формат сообщений]] | | ^send_message({ AID => 1, MESSAGE => $json_message })| Отправляет $json_message указаному администратору, [[abills:docs:events|формат сообщений]] | | ||
+ | ^json_request| Отсылает сообщение демону ''websocket_backend'' (Плагину ''Internal'') | | ||
Пример отправки сообщения администратору: | Пример отправки сообщения администратору: | ||
<code> | <code> | ||
- | use Abills::Sender::Browser | + | use Abills::Sender::Browser; |
my $Browser = Abills::Sender::Browser->new( $db, $admin, \%conf); | my $Browser = Abills::Sender::Browser->new( $db, $admin, \%conf); | ||
my $test_aid = 1; | my $test_aid = 1; | ||
- | my $test_notification = <<"TEST_NOTIFICATION"; | + | my $test_notification = { |
- | { | + | TYPE => "MESSAGE", |
- | "TYPE" : "MESSAGE", | + | TITLE => "Test notification", |
- | "TITLE" : "Test notification", | + | TEXT => "Just<br/>some<br/>text" |
- | "TEXT" : "Just<br/>some<br/>text" | + | }; |
- | } | + | |
- | TEST_NOTIFICATION | + | |
# Проверяем, что админ есть на линии | # Проверяем, что админ есть на линии | ||
my $test_admin_connected = $Browser->has_connected_admin( $test_aid ); | my $test_admin_connected = $Browser->has_connected_admin( $test_aid ); | ||
- | my $received = 0; | + | return 0 if ( !$test_admin_connected ); |
- | if ( $test_admin_connected ){ | + | |
- | $received = $Browser->send_message( { AID => $test_aid, MESSAGE => $test_notification } ); | + | return $Browser->send_message( { AID => $test_aid, MESSAGE => $test_notification } ); |
- | } | + | |
- | else { | + | </code> |
- | print "Admin $test_aid is not online \n" | + | |
- | return 0; | + | ==== Запуск внешней команды с уведомлением ==== |
- | } | + | <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; | ||
- | return $received; | + | run_in_background('/usr/bin/ping', { timeout => 5 }, { PROGRAM_ARGS => [ '-c 3', '-q', '192.168.1.1' ] }); |
</code> | </code> |