diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d10b3893..f6ebecca 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,7 +4,7 @@ Changelog not yet released ---------------- - +* #171: Implement Telegram Bot Notifications. v3.2.0 (released April 15, 2017) diff --git a/src/includes/psmconfig.inc.php b/src/includes/psmconfig.inc.php index 4ed3e7ae..59b4eb5a 100644 --- a/src/includes/psmconfig.inc.php +++ b/src/includes/psmconfig.inc.php @@ -29,7 +29,7 @@ /** * Current PSM version */ -define('PSM_VERSION', '3.2.1'); +define('PSM_VERSION', '3.3.0'); /** * URL to check for updates. Will not be checked if turned off on config page. diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index 99012424..399ce160 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -83,6 +83,8 @@ $sm_lang = array( 'level_description' => 'Administrators have full access: they can manage servers, users and edit the global configuration.
Users can only view and run the updater for the servers that have been assigned to them.', 'mobile' => 'Mobile', 'email' => 'Email', + 'telegram_user_code' => 'Telegram User Code', + 'telegram_user_code_description' => 'Enter your code informed by your telegram bot.', 'pushover' => 'Pushover', 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', 'pushover_key' => 'Pushover Key', @@ -112,10 +114,12 @@ $sm_lang = array( 'email' => 'Email', 'sms' => 'SMS', 'pushover' => 'Pushover', + 'telegram' => 'Telegram', 'no_logs' => 'No logs', ), 'servers' => array( 'server' => 'Server', + 'telegram' => 'Telegram', 'status' => 'Status', 'label' => 'Label', 'domain' => 'Domain/IP', @@ -185,10 +189,12 @@ $sm_lang = array( 'error_server_ip_bad_website' => 'The website URL is not valid.', 'error_server_type_invalid' => 'The selected server type is invalid.', 'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.', + 'send_telegram' => 'Retrieve information from Bot' ), 'config' => array( 'general' => 'General', 'language' => 'Language', + 'tab_telegram' => 'Telegram Bot', 'show_update' => 'Check for updates?', 'password_encrypt_key' => 'The encryption key password', 'password_encrypt_key_note' => 'This key is used to encrypt passwords that are stored on servers for access to websites. If the key will change the stored password is invalid!', @@ -250,6 +256,7 @@ $sm_lang = array( 'log_email' => 'Log emails sent by the script', 'log_sms' => 'Log text messages sent by the script', 'log_pushover' => 'Log pushover messages sent by the script', + 'log_telegram' => 'Log telegram messages sent by the script', 'updated' => 'The configuration has been updated.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', @@ -259,6 +266,7 @@ $sm_lang = array( 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Notification settings', 'settings_log' => 'Log settings', + 'settings_telegram' => 'Telegram Settings', 'settings_proxy' => 'Proxy settings', 'auto_refresh' => 'Auto-refresh', 'auto_refresh_servers' => @@ -286,6 +294,12 @@ $sm_lang = array( 'log_retention_period' => 'Log retention period', 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server uptime. Enter 0 to disable log cleanup.', 'log_retention_days' => 'days', + 'telegram_bot_api_key' => 'TelegramBot\'s ApiKey', + 'telegram_api_token_description' => 'Before using BOT, see the guide on how to create and get your ApiKey on your TelegramBot by clicking here.', + 'test_telegram' => 'To test if your key is ok let\'s retrieve the information from your bot.', + 'telegram_status' => 'Enable sending messages with the Telegram', + 'telegram_sent' => '%s is configured correctly.', + 'telegram_error' => 'TelegramBotError', ), // for newlines in the email messages use
'notifications' => array( diff --git a/src/lang/pt_BR.lang.php b/src/lang/pt_BR.lang.php index 1f2b325a..b73cbcd9 100644 --- a/src/lang/pt_BR.lang.php +++ b/src/lang/pt_BR.lang.php @@ -82,7 +82,9 @@ $sm_lang = array( 'level_20' => 'Usuário', 'level_description' => 'Administradores Tem total acesso: podem gerenciar servidores, usuários e configurações globais.
Usuários só podem executar atualizações para servidores que lhe foram atribuídos.', 'mobile' => 'Celular', - 'email' => 'Email', + 'email' => 'Email', + 'telegram_user_code' => 'Código do Telegram', + 'telegram_user_code_description' => 'Digite o código informado pelo seu bot do telegram.', 'pushover' => 'Pushover', 'pushover_description' => 'Pushover para enviar notificações em real-tome. Veja o website para mais informações.', 'pushover_key' => 'Pushover Key', @@ -112,11 +114,13 @@ $sm_lang = array( 'email' => 'Email', 'sms' => 'SMS', 'pushover' => 'Pushover', + 'telegram' => 'Telegram', 'no_logs' => 'Sem logs', ), 'servers' => array( 'server' => 'Servidor', 'status' => 'Status', + 'telegram' => 'Telegram', 'label' => 'Etiqueta', 'domain' => 'Domínio/IP', 'timeout' => 'Timeout', @@ -171,10 +175,12 @@ $sm_lang = array( 'error_server_ip_bad_website' => 'A URL não é válida.', 'error_server_type_invalid' => 'O tipo de servidor selecionado não é valido.', 'error_server_warning_threshold_invalid' => 'O limite de aviso deve ser um número inteiro maior que 0.', + 'send_telegram' => 'Recuperar informações de Bot' ), 'config' => array( 'general' => 'Geral', - 'language' => 'Idioma', + 'language' => 'Idioma', + 'tab_telegram' => 'Telegram Bot', 'show_update' => 'verificar atualizações semanalmente?', 'email_status' => 'Habilitar envio de email?', 'email_from_email' => 'Endereço do envio de email', @@ -228,6 +234,7 @@ $sm_lang = array( 'log_email' => 'Registrar no Log os envios de email feitos pelo script?', 'log_sms' => 'Registrar no Log os envios de mensagens de texto feitos pelo script?', 'log_pushover' => 'Log pushover messages sent by the script', + 'log_telegram' => 'Registrar Log de mensagens enviadas pelo script', 'updated' => 'A configuração foi atualizada.', 'tab_email' => 'Email', 'tab_sms' => 'Texto', @@ -236,7 +243,8 @@ $sm_lang = array( 'settings_sms' => 'Configuração de mensagens de texto', 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Configuração de notificações', - 'settings_log' => 'Configuração de Logs', + 'settings_log' => 'Configuração de Logs', + 'settings_telegram' => 'Configurações Telegram', 'auto_refresh' => 'Atualizar automaticamente', 'auto_refresh_servers' => 'Atualizar automaticamente a página de servidores.
'. @@ -263,6 +271,12 @@ $sm_lang = array( 'log_retention_period' => 'Período de retenção do Log', 'log_retention_period_description' => 'Número de dias para manter os registros de notificações e arquivos de tempo de atividade do servidor. Digite 0 para desativar a limpeza de registro.', 'log_retention_days' => 'dias', + 'telegram_bot_api_key' => 'ApiKey do TelegramBot', + 'telegram_api_token_description' => 'Antes de usar o BOT, veja o guia de como criar e obter o seu ApiKey em seu TelegramBot clicando aqui.', + 'test_telegram' => 'Para testar se sua chave está ok vamos recuperar as informações de seu bot.', + 'telegram_status' => 'Habilitar envio de mensagens via Telegram', + 'telegram_sent' => '%s está configurado corretamente.', + 'telegram_error' => 'Erro em TelegramBot', ), // for newlines in the email messages use
'notifications' => array( diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index b030234f..1ceb3774 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -41,10 +41,12 @@ class ConfigController extends AbstractController { 'email_smtp', 'sms_status', 'pushover_status', + 'telegram_status', 'log_status', 'log_email', 'log_sms', 'log_pushover', + 'log_telegram', 'show_update', ); @@ -66,6 +68,7 @@ class ConfigController extends AbstractController { 'sms_gateway_password', 'sms_from', 'pushover_api_token', + 'telegram_api_token', ); private $default_tab = 'general'; @@ -135,7 +138,7 @@ class ConfigController extends AbstractController { $tpl_data[$this->default_tab . '_active'] = 'active'; - $testmodals = array('email', 'sms', 'pushover'); + $testmodals = array('email', 'sms', 'pushover', 'telegram'); foreach($testmodals as $modal_id) { $modal = new \psm\Util\Module\Modal($this->twig, 'test' . ucfirst($modal_id), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL); $this->addModal($modal); @@ -186,6 +189,8 @@ class ConfigController extends AbstractController { $this->testSMS(); } elseif(!empty($_POST['test_pushover'])) { $this->testPushover(); + } elseif(!empty($_POST['test_telegram'])) { + $this->testTelegram(); } if($language_refresh) { @@ -201,6 +206,8 @@ class ConfigController extends AbstractController { $this->default_tab = 'sms'; } elseif(isset($_POST['pushover_submit']) || !empty($_POST['test_pushover'])) { $this->default_tab = 'pushover'; + } elseif(isset($_POST['telegram_submit']) || !empty($_POST['test_telegram'])) { + $this->default_tab = 'telegram'; } } return $this->runAction('index'); @@ -227,6 +234,38 @@ class ConfigController extends AbstractController { } } + /** + * Execute telegram test + * + * @todo move test to separate class + */ + protected function testTelegram() { + + //$this->addMessage('Erro : hahaha', 'error'); + + try { + + $api = new \psm\Service\Telegram(psm_get_conf('telegram_api_token')); + + $result = $api->getMe(); + + if($result && $result->ok) { + $this->addMessage( + sprintf(psm_get_lang('config', 'telegram_sent'), $result->result->username), + 'success'); + return; + } + + throw new \Exception(json_encode($result)); + //$this->addMessage(psm_get_lang('config', 'telegram_sent'), 'success'); + } catch (\Exception $e) { + $this->addMessage(psm_get_lang('config', 'telegram_error') . ': ' . $e->getMessage(), 'error'); + } + + + + } + /** * Execute SMS test * @@ -289,6 +328,7 @@ class ConfigController extends AbstractController { protected function getLabels() { return array( + 'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'), 'label_tab_email' => psm_get_lang('config', 'tab_email'), 'label_tab_sms' => psm_get_lang('config', 'tab_sms'), 'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'), @@ -298,6 +338,7 @@ class ConfigController extends AbstractController { 'label_settings_notification' => psm_get_lang('config', 'settings_notification'), 'label_settings_log' => psm_get_lang('config', 'settings_log'), 'label_settings_proxy' => psm_get_lang('config', 'settings_proxy'), + 'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'), 'label_general' => psm_get_lang('config', 'general'), 'label_language' => psm_get_lang('config', 'language'), 'label_show_update' => psm_get_lang('config', 'show_update'), @@ -356,6 +397,7 @@ class ConfigController extends AbstractController { 'label_log_email' => psm_get_lang('config', 'log_email'), 'label_log_sms' => psm_get_lang('config', 'log_sms'), 'label_log_pushover' => psm_get_lang('config', 'log_pushover'), + 'label_log_telegram' => psm_get_lang('config', 'log_telegram'), 'label_alert_proxy' => psm_get_lang('config', 'alert_proxy'), 'label_alert_proxy_url' => psm_get_lang('config', 'alert_proxy_url'), 'label_auto_refresh' => psm_get_lang('config', 'auto_refresh'), @@ -366,6 +408,12 @@ class ConfigController extends AbstractController { 'label_log_retention_period' => psm_get_lang('config', 'log_retention_period'), 'label_log_retention_period_description' => psm_get_lang('config', 'log_retention_period_description'), 'label_log_retention_days' => psm_get_lang('config', 'log_retention_days'), + 'label_telegram_status' => psm_get_lang('config', 'telegram_status'), + 'label_telegram_bot_api_key' => psm_get_lang('config', 'telegram_bot_api_key'), + 'label_telegram_api_token_description' => sprintf( + psm_get_lang('config', 'telegram_api_token_description'), + 'https://core.telegram.org/bots#3-how-do-i-create-a-bot' + ), ); } } \ No newline at end of file diff --git a/src/psm/Module/Server/Controller/AbstractServerController.php b/src/psm/Module/Server/Controller/AbstractServerController.php index 8f01f61d..c5f95c81 100644 --- a/src/psm/Module/Server/Controller/AbstractServerController.php +++ b/src/psm/Module/Server/Controller/AbstractServerController.php @@ -75,6 +75,7 @@ abstract class AbstractServerController extends AbstractController { `s`.`email`, `s`.`sms`, `s`.`pushover`, + `s`.`telegram`, `s`.`warning_threshold`, `s`.`warning_threshold_counter`, `s`.`timeout`, diff --git a/src/psm/Module/Server/Controller/LogController.php b/src/psm/Module/Server/Controller/LogController.php index e3d7db6c..ca5e9400 100644 --- a/src/psm/Module/Server/Controller/LogController.php +++ b/src/psm/Module/Server/Controller/LogController.php @@ -49,6 +49,7 @@ class LogController extends AbstractServerController { 'label_email' => psm_get_lang('log', 'email'), 'label_sms' => psm_get_lang('log', 'sms'), 'label_pushover' => psm_get_lang('log', 'pushover'), + 'label_telegram' => psm_get_lang('log', 'telegram'), 'label_title' => psm_get_lang('log', 'title'), 'label_server' => psm_get_lang('servers', 'server'), 'label_type' => psm_get_lang('log', 'type'), @@ -58,7 +59,7 @@ class LogController extends AbstractServerController { 'label_no_logs' => psm_get_lang('log', 'no_logs'), 'tabs' => array(), ); - $log_types = array('status', 'email', 'sms', 'pushover'); + $log_types = array('status', 'email', 'sms', 'pushover', 'telegram'); foreach($log_types as $key) { $records = $this->getEntries($key); diff --git a/src/psm/Module/Server/Controller/ServerController.php b/src/psm/Module/Server/Controller/ServerController.php index 667158b3..3f8f60d2 100644 --- a/src/psm/Module/Server/Controller/ServerController.php +++ b/src/psm/Module/Server/Controller/ServerController.php @@ -92,6 +92,7 @@ class ServerController extends AbstractServerController { 'email' => 'icon-envelope', 'sms' => 'icon-mobile', 'pushover' => 'icon-pushover', + 'telegram' => 'icon-star', //TODO: Add telegram icon ); $servers = $this->getServers(); @@ -208,10 +209,11 @@ class ServerController extends AbstractServerController { 'edit_email_selected_' . $edit_server['email'] => 'selected="selected"', 'edit_sms_selected_' . $edit_server['sms'] => 'selected="selected"', 'edit_pushover_selected_' . $edit_server['pushover'] => 'selected="selected"', + 'edit_telegram_selected_' . $edit_server['telegram'] => 'selected="selected"', )); } - $notifications = array('email', 'sms', 'pushover'); + $notifications = array('email', 'sms', 'pushover', 'telegram'); foreach($notifications as $notification) { if(psm_get_conf($notification . '_status') == 0) { $tpl_data['warning_' . $notification] = true; @@ -272,6 +274,7 @@ class ServerController extends AbstractServerController { 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', 'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no', 'pushover' => in_array($_POST['pushover'], array('yes', 'no')) ? $_POST['pushover'] : 'no', + 'telegram' => in_array($_POST['telegram'], array('yes', 'no')) ? $_POST['telegram'] : 'no', ); // make sure websites start with http:// if($clean['type'] == 'website' && substr($clean['ip'], 0, 4) != 'http') { @@ -479,6 +482,7 @@ class ServerController extends AbstractServerController { 'label_sms' => psm_get_lang('servers', 'sms'), 'label_send_sms' => psm_get_lang('servers', 'send_sms'), 'label_pushover' => psm_get_lang('servers', 'pushover'), + 'label_telegram' => psm_get_lang('servers', 'telegram'), 'label_users' => psm_get_lang('servers', 'users'), 'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'), 'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'), diff --git a/src/psm/Module/User/Controller/ProfileController.php b/src/psm/Module/User/Controller/ProfileController.php index 0d4630e5..8cc63295 100644 --- a/src/psm/Module/User/Controller/ProfileController.php +++ b/src/psm/Module/User/Controller/ProfileController.php @@ -35,7 +35,7 @@ class ProfileController extends AbstractController { * Editable fields for the profile * @var array $profile_fields */ - protected $profile_fields = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'email'); + protected $profile_fields = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'email', 'telegram_user_code'); function __construct(Database $db, \Twig_Environment $twig) { parent::__construct($db, $twig); @@ -61,6 +61,10 @@ class ProfileController extends AbstractController { 'label_password_repeat' => psm_get_lang('users', 'password_repeat'), 'label_level' => psm_get_lang('users', 'level'), 'label_mobile' => psm_get_lang('users', 'mobile'), + + 'label_telegram_user_code' => psm_get_lang('users', 'telegram_user_code'), + 'label_telegram_user_code_description' => psm_get_lang('users', 'user_code_description'), + 'label_pushover' => psm_get_lang('users', 'pushover'), 'label_pushover_description' => psm_get_lang('users', 'pushover_description'), 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), diff --git a/src/psm/Service/Telegram.php b/src/psm/Service/Telegram.php new file mode 100644 index 00000000..b1c8ce29 --- /dev/null +++ b/src/psm/Service/Telegram.php @@ -0,0 +1,68 @@ +. + * + * @package phpservermon + * @author Pepijn Over + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + **/ + +namespace psm\Service; + +class Telegram { + + private $apiKey; + + public function __construct($apiKey) { + if(empty($apiKey)) { + throw new \Exception('ApiKey is not defined'); + } + $this->apiKey = $apiKey; + } + + private function getUrl() { + return 'https://api.telegram.org/bot' . $this->apiKey . '/'; + } + + private function doGet ($method) { + $request = file_get_contents($this->getUrl() . $method); + return json_decode($request); + } + + /** + * Available Telegram Methods + */ + public function sendMessage($obj) { + return $this->doGet('sendMessage?' . http_build_query($obj)); + } + + public function getMe() { + return $this->doGet('getMe'); + } + + public function getUpdates($offset = null) { + if(is_null($offset)) + return $this->doGet('getUpdates'); + else + return $this->doGet('getUpdates?offset=' . $offset); + } + +} \ No newline at end of file diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index ad7d107e..de732261 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -190,6 +190,7 @@ class Installer { `pushover_key` varchar(255) NOT NULL, `pushover_device` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, + `telegram_user_code` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `unique_username` (`user_name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", @@ -207,7 +208,7 @@ class Installer { PSM_DB_PREFIX . 'log' => "CREATE TABLE `" . PSM_DB_PREFIX . "log` ( `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `server_id` int(11) unsigned NOT NULL, - `type` enum('status','email','sms','pushover') NOT NULL, + `type` enum('status','email','sms','pushover', 'telegram') NOT NULL, `message` varchar(255) NOT NULL, `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`log_id`) @@ -235,6 +236,7 @@ class Installer { `email` enum('yes','no') NOT NULL default 'yes', `sms` enum('yes','no') NOT NULL default 'no', `pushover` enum('yes','no') NOT NULL default 'yes', + `telegram` enum('yes','no') NOT NULL default 'no', `warning_threshold` mediumint(1) unsigned NOT NULL DEFAULT '1', `warning_threshold_counter` mediumint(1) unsigned NOT NULL DEFAULT '0', `timeout` smallint(1) unsigned NULL DEFAULT NULL, @@ -298,7 +300,10 @@ class Installer { } if(version_compare($version_from, '3.2.1', '<')) { $this->upgrade321(); + } if(version_compare($version_from, '3.3.0', '<')) { + $this->upgrade320(); } + psm_update_conf('version', $version_to); } @@ -492,4 +497,15 @@ class Installer { $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD COLUMN `header_name` VARCHAR(255) AFTER `pattern`, ADD COLUMN `header_value` VARCHAR(255) AFTER `header_name`"; $this->execSQL($queries); } + + /** + * Upgrade for v3.3.0 release + */ + protected function upgrade330() { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `telegram_user_code` VARCHAR( 255 ) NOT NULL AFTER `pushover_device`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `telegram` ENUM( 'yes', 'no' ) NOT NULL AFTER `pushover` DEFAULT `no`;"; + $this->execSQL($queries); + } } diff --git a/src/psm/Util/Server/UpdateManager.php b/src/psm/Util/Server/UpdateManager.php index 6502d8a2..8fb9ea97 100644 --- a/src/psm/Util/Server/UpdateManager.php +++ b/src/psm/Util/Server/UpdateManager.php @@ -77,5 +77,38 @@ class UpdateManager extends ContainerAware { $archive = new ArchiveManager($this->container->get('db')); $archive->archive(); $archive->cleanup(); + + // telegram send code + if(psm_get_conf('telegram_status')) { + $telegram = new \psm\Service\Telegram(psm_get_conf('telegram_api_token')); + + $offset = psm_get_conf('telegram_updates_offset'); + if(empty($offset)) { + $updates = $telegram->getUpdates(); + } else { + $updates = $telegram->getUpdates($offset); + } + + if($updates && $updates->ok) { + foreach($updates->result as $result) { + + if($result->update_id == $offset) { + continue; + } + + $telegram->sendMessage( + [ + 'chat_id' => $result->message->chat->id, + 'text' => 'Hello ' . $result->message->chat->first_name . ' ' . $result->message->chat->last_name . "\n" . + 'Your PhpServerMon code is ' . $result->message->chat->id + ] + ); + + psm_update_conf('telegram_updates_offset', $result->update_id); + } + } + + /**/ + } } } \ No newline at end of file diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index ba11ad78..8b17877b 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -60,6 +60,12 @@ class StatusNotifier { */ protected $send_pushover = false; + /** + * Send telegram? + * @var boolean $send_telegram + */ + protected $send_telegram = true; + /** * Save log records? * @var boolean $save_log @@ -96,6 +102,7 @@ class StatusNotifier { $this->send_emails = psm_get_conf('email_status'); $this->send_sms = psm_get_conf('sms_status'); $this->send_pushover = psm_get_conf('pushover_status'); + $this->send_telegram = psm_get_conf('telegram_status'); $this->save_logs = psm_get_conf('log_status'); } @@ -121,7 +128,7 @@ class StatusNotifier { $this->server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array( 'server_id' => $server_id, ), array( - 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'status', 'header_name', 'header_value', 'error', 'active', 'email', 'sms', 'pushover', + 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'status', 'header_name', 'header_value', 'error', 'active', 'email', 'sms', 'pushover', 'telegram', )); if(empty($this->server)) { return false; @@ -188,6 +195,12 @@ class StatusNotifier { $this->notifyByPushover($users); } + // check if telegram is enabled for this server + if($this->send_telegram && $this->server['telegram'] == 'yes') { + // yay lets wake those nerds up! + $this->notifyByTelegram($users); + } + return $notify; } @@ -224,6 +237,53 @@ class StatusNotifier { } } + /** + * This functions performs the telegram notifications + * + * @param array $users + * @return boolean + */ + protected function notifyByTelegram($users) { + // Remove users that have no pushover_key + foreach($users as $k => $user) { + if (trim($user['telegram_user_code']) == '') { + unset($users[$k]); + } + } + + // Validation + if (empty($users)) { + return; + } + + $body = psm_parse_msg($this->status_new, 'email_body', $this->server); + $body = str_replace('
', "\n", $body); + + //if(psm_get_conf('log_telegram')) { + $log_id = psm_add_log($this->server_id, 'telegram', $body); + //} + + $telegram = new \psm\Service\Telegram(psm_get_conf('telegram_api_token')); + + // go through empl + foreach ($users as $user) { + if(!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } + + $uc = $user['telegram_user_code']; + $telegram->sendMessage( + [ + 'chat_id' => $uc, + 'text' => $body + ] + ); + } + + } + + + /** * This functions performs the pushover notifications * @@ -321,7 +381,7 @@ class StatusNotifier { public function getUsers($server_id) { // find all the users with this server listed $users = $this->db->query(" - SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`pushover_device` + SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`pushover_device`, `u`.`telegram_user_code` FROM `".PSM_DB_PREFIX."users` AS `u` JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( `us`.`user_id`=`u`.`user_id` diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index de986923..cc785f38 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -105,7 +105,7 @@ class StatusUpdater { $save = array( 'last_check' => date('Y-m-d H:i:s'), 'error' => $this->error, - 'rtime' => $this->rtime, + 'rtime' => empty($this->rtime) ? 0 : $this->rtime, ); // log the uptime before checking the warning threshold, @@ -119,6 +119,7 @@ class StatusUpdater { $save['warning_threshold_counter'] = 0; } else { // server is offline, increase the error counter + $save['warning_threshold_counter'] = $this->server['warning_threshold_counter'] + 1; if($save['warning_threshold_counter'] < $this->server['warning_threshold']) { diff --git a/src/templates/default/module/config/config.tpl.html b/src/templates/default/module/config/config.tpl.html index ff994718..52bba3cc 100644 --- a/src/templates/default/module/config/config.tpl.html +++ b/src/templates/default/module/config/config.tpl.html @@ -5,6 +5,7 @@
  • {{ label_tab_sms }}
  • {{ label_tab_pushover }}
  • +
  • {{ label_tab_telegram }}
  • @@ -232,7 +233,7 @@
    -
    +
    {{ label_settings_pushover }} @@ -265,7 +266,43 @@
    - + +
    +
    + {{ label_settings_telegram }} +
    +
    + +

    {{ label_telegram_description|raw }}

    +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +

    {{ label_telegram_api_token_description|raw }}

    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    +
    {{ macro.csrf_input() }} diff --git a/src/templates/default/module/server/log.tpl.html b/src/templates/default/module/server/log.tpl.html index c69fbab3..2d299845 100644 --- a/src/templates/default/module/server/log.tpl.html +++ b/src/templates/default/module/server/log.tpl.html @@ -4,6 +4,7 @@
  • {{ label_email }}
  • {{ label_sms }}
  • {{ label_pushover }}
  • +
  • {{ label_telegram }}
  • {% for tab in tabs %} diff --git a/src/templates/default/module/server/server/list.tpl.html b/src/templates/default/module/server/server/list.tpl.html index 08e64db3..32dcfc81 100644 --- a/src/templates/default/module/server/server/list.tpl.html +++ b/src/templates/default/module/server/server/list.tpl.html @@ -23,7 +23,7 @@
    {{ server.type }}
    {{ server.rtime }} s
    {{ server.last_online }}
    -
    +
    diff --git a/src/templates/default/module/server/server/update.tpl.html b/src/templates/default/module/server/server/update.tpl.html index 1b1636aa..b03e44c5 100644 --- a/src/templates/default/module/server/server/update.tpl.html +++ b/src/templates/default/module/server/server/update.tpl.html @@ -146,6 +146,17 @@
    +
    + +
    + +
    +
    diff --git a/src/templates/default/module/server/server/view.tpl.html b/src/templates/default/module/server/server/view.tpl.html index 17dad262..f4097208 100644 --- a/src/templates/default/module/server/server/view.tpl.html +++ b/src/templates/default/module/server/server/view.tpl.html @@ -69,6 +69,10 @@ {{ label_pushover }}: {{ pushover }} + + {{ label_telegram }}: + {{ telegram }} + {{ label_timeout }}: {{ timeout }} s diff --git a/src/templates/default/module/user/profile.tpl.html b/src/templates/default/module/user/profile.tpl.html index a5f390d5..1a28e31d 100644 --- a/src/templates/default/module/user/profile.tpl.html +++ b/src/templates/default/module/user/profile.tpl.html @@ -62,6 +62,13 @@ + +
    + +
    + +
    +