From c589424bce528a055ebf07bb53b9fb58fc09935b Mon Sep 17 00:00:00 2001 From: Pepijn Over Date: Thu, 31 Jul 2014 12:11:32 +0200 Subject: [PATCH] issue #101: finishing pushover implementation --- composer.json | 9 +- composer.lock | 44 +- src/includes/functions.inc.php | 5 +- src/lang/bg_BG.lang.php | 18 +- src/lang/da_DK.lang.php | 20 +- src/lang/de_DE.lang.php | 18 +- src/lang/en_US.lang.php | 18 +- src/lang/es_ES.lang.php | 16 +- src/lang/fr_FR.lang.php | 15 +- src/lang/it_IT.lang.php | 16 +- src/lang/ko_KR.lang.php | 16 +- src/lang/nl_NL.lang.php | 15 +- src/lang/pt_BR.lang.php | 18 +- src/lang/ru_RU.lang.php | 18 +- src/lang/zh_CN.lang.php | 15 +- .../Controller/ConfigController.class.php | 5 +- .../Server/Controller/LogController.class.php | 10 +- .../Controller/ServerController.class.php | 20 +- src/psm/Util/Install/Installer.class.php | 24 +- src/psm/Util/Pushover.class.php | 54 --- src/psm/Util/Updater/StatusNotifier.class.php | 75 ++- src/templates/config/config.tpl.html | 50 +- src/templates/install/install.tpl.html | 0 src/templates/main.tpl.html | 0 src/templates/main_sidebar.tpl.html | 0 src/templates/server/log.tpl.html | 0 src/templates/server/server.tpl.html | 12 +- src/templates/server/status.tpl.html | 0 src/templates/server/view.tpl.html | 2 +- src/templates/user/login.tpl.html | 0 src/templates/user/profile.tpl.html | 0 src/templates/user/user.tpl.html | 20 +- static/css/style.css | 4 + .../img/glyphicons-halflings-white.png | Bin 15093 -> 15624 bytes .../img/glyphicons-halflings.png | Bin 29411 -> 29923 bytes vendor/Pushover/Pushover.php | 452 ------------------ 36 files changed, 308 insertions(+), 681 deletions(-) mode change 100644 => 100755 composer.json delete mode 100644 src/psm/Util/Pushover.class.php mode change 100755 => 100644 src/templates/config/config.tpl.html mode change 100755 => 100644 src/templates/install/install.tpl.html mode change 100755 => 100644 src/templates/main.tpl.html mode change 100755 => 100644 src/templates/main_sidebar.tpl.html mode change 100755 => 100644 src/templates/server/log.tpl.html mode change 100755 => 100644 src/templates/server/status.tpl.html mode change 100755 => 100644 src/templates/user/login.tpl.html mode change 100755 => 100644 src/templates/user/profile.tpl.html mode change 100755 => 100644 src/templates/user/user.tpl.html delete mode 100644 vendor/Pushover/Pushover.php diff --git a/composer.json b/composer.json old mode 100644 new mode 100755 index 35e8e53d..52a883a2 --- a/composer.json +++ b/composer.json @@ -2,9 +2,16 @@ "name": "phpservermon/phpservermon", "description": "PHP Server Monitor", "homepage": "http://www.phpservermonitor.org", + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/phpservermon/php-pushover" + } + ], "require": { "php": ">=5.3.7", "phpmailer/phpmailer": "5.2.6", - "symfony/http-foundation": "2.4.*" + "symfony/http-foundation": "2.4.*", + "php-pushover/php-pushover": "dev-master" } } diff --git a/composer.lock b/composer.lock index e34ceb9a..ea19d7aa 100644 --- a/composer.lock +++ b/composer.lock @@ -3,8 +3,34 @@ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], - "hash": "63c9618391ed04b38b098c0139b50570", + "hash": "6a941e5369d421e16d869151569bc5c7", "packages": [ + { + "name": "php-pushover/php-pushover", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/phpservermon/php-pushover.git", + "reference": "d13d08dbf5f1cfa73f4adca7e8d27f79c804dd7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpservermon/php-pushover/zipball/d13d08dbf5f1cfa73f4adca7e8d27f79c804dd7b", + "reference": "d13d08dbf5f1cfa73f4adca7e8d27f79c804dd7b", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "Pushover.php" + ] + }, + "description": "PHP class for the Pushover.net project", + "support": { + "source": "https://github.com/phpservermon/php-pushover/tree/master" + }, + "time": "2014-07-30 13:55:53" + }, { "name": "phpmailer/phpmailer", "version": "v5.2.6", @@ -60,17 +86,17 @@ }, { "name": "symfony/http-foundation", - "version": "v2.4.3", + "version": "v2.4.8", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "11ad7352c7bfa12145a0df8e1c4c303c585ce169" + "reference": "68abe34601c519359b60363b99c29ecfb6679bc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/11ad7352c7bfa12145a0df8e1c4c303c585ce169", - "reference": "11ad7352c7bfa12145a0df8e1c4c303c585ce169", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/68abe34601c519359b60363b99c29ecfb6679bc4", + "reference": "68abe34601c519359b60363b99c29ecfb6679bc4", "shasum": "" }, "require": { @@ -111,7 +137,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "http://symfony.com", - "time": "2014-03-26 11:35:33" + "time": "2014-07-15 14:07:10" } ], "packages-dev": [ @@ -121,9 +147,9 @@ ], "minimum-stability": "stable", - "stability-flags": [ - - ], + "stability-flags": { + "php-pushover/php-pushover": 20 + }, "platform": { "php": ">=5.3.7" }, diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index c55150d8..98d11543 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -414,13 +414,12 @@ function psm_build_mail($from_name = null, $from_email = null) { } /** - * Prepare a new Pushover util. * - * @return \psm\Util\Pushover + * @return \Pushover */ function psm_build_pushover() { - $pushover = new \psm\Util\Pushover(); + $pushover = new \Pushover(); $pushover->setToken(psm_get_conf('pushover_api_token')); return $pushover; diff --git a/src/lang/bg_BG.lang.php b/src/lang/bg_BG.lang.php index 21c4d2f8..a8d7d768 100644 --- a/src/lang/bg_BG.lang.php +++ b/src/lang/bg_BG.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => 'Администраторите имат пълен достъп: могат да управляват сървърите, потребителите и да редактират глобалните настройки.
Потребителите могат само да виждат статуса на сървърите и да обнояват информацията за даден сървър, за който им е разрешен достъп.', 'mobile' => 'Мобилен телефон', 'email' => 'Имейл', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Изтриване на потребител', 'delete_message' => 'Сигурни ли сте, че искате да изтриете потребител \'%1\'?', 'deleted' => 'Потребителят е изтрит успешно.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Статус', 'email' => 'Имейл', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'Няма налични логове', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Имейл', 'sms' => 'SMS', 'send_sms' => 'SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Изтриване на сървър', 'delete_message' => 'Сигурни ли сте, че искате да изтриете сървър \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Потребител', 'sms_gateway_password' => 'Парола', 'sms_from' => 'Номер на изпращача', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Изберете кога желаете да получавате известия
', 'alert_type_description' => 'Промяна на сатуса:
'. 'Ще получавате известие когато има промяна със връзката на даден някой от описаните сървър или сайт. От Онлайн -> Офлайн и от Офлайн -> Онлайн.
'. @@ -194,8 +201,7 @@ $sm_lang = array( 'вашия cron скрипт проверява всеки 15 минути и връзката до сървъра е изгубена в 1 часа през нощта и не работи до 6 часа сутринта '. 'Вие ще получите едно известие в 1 часа за това
'. '
Винаги:
'. - 'Ще получавате известие при всяка проверка на Вашия крон скрипт дори когато връзката до даден сървър или сайт е била'. - 'прекъсната в продължение на часове.', + 'Ще получавате известие при всяка проверка на Вашия крон скрипт дори когато връзката до даден сървър или сайт е била прекъсната в продължение на часове.', 'alert_type_status' => 'Промяна на статуса', 'alert_type_offline' => 'Офлайн', 'alert_type_always' => 'Винаги', @@ -203,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Ако е отметнато, системата ще записва всяка промяна.', 'log_email' => 'Да се пази ли лог на изпратените имейли от системата', 'log_sms' => 'Да се пази ли лог на изпратените SMS съобщения от системата', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'Настройките са обновени успешно.', 'nochanges' => 'Не бяха направени промени!', 'tab_email' => 'Имейл', 'tab_sms' => 'SMS', - 'tab_log' => 'Логове', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Имейл настройки', 'settings_sms' => 'SMS настройки', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Настройки на известията', 'settings_log' => 'Настройки на логовете', 'auto_refresh' => 'Автоматично опресняване', @@ -235,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Сървър \'%LABEL%\' е Офлайн: ip=%IP%, port=%PORT%. Greshka=%ERROR%', 'off_email_subject' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', 'off_email_body' => "Неуспешно свързване:

Сървър: %LABEL%
IP адрес: %IP%
Порт: %PORT%
Грешка: %ERROR%
Днес: %DATE%", + 'off_pushover_title' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', + 'off_pushover_message' => "Неуспешно свързване:

Сървър: %LABEL%
IP адрес: %IP%
Порт: %PORT%
Грешка: %ERROR%
Днес: %DATE%", 'on_sms' => 'Сървър \'%LABEL%\' е Онлайн: ip=%IP%, port=%PORT%', 'on_email_subject' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', 'on_email_body' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА:

Сървър: %LABEL%
IP адрес: %IP%
Порт: %PORT%
Днес: %DATE%", + 'on_pushover_title' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', + 'on_pushover_message' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА:

Сървър: %LABEL%
IP адрес: %IP%
Порт: %PORT%
Днес: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Добре дошъл, %user_name%', diff --git a/src/lang/da_DK.lang.php b/src/lang/da_DK.lang.php index 5e84569c..d7a41588 100644 --- a/src/lang/da_DK.lang.php +++ b/src/lang/da_DK.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => 'Administratore har fuld adgang: De kan styre servere, brugere og indstillingere.
Brugere kan kun se og køre opdatere for servere som er tildelt til dem.', 'mobile' => 'Mobil', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Slet bruger', 'delete_message' => 'Er du sikker på du vil slette bruger \'%1\'?', 'deleted' => 'Bruger slettet.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Status', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'Intet i loggen', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Send Email', 'sms' => 'SMS', 'send_sms' => 'Send SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Slet server', 'delete_message' => 'Er du sikker på du vil slette server \'%1\'?', @@ -186,16 +191,17 @@ $sm_lang = array( 'sms_gateway_username' => 'Gateway brugernavn/apikey', 'sms_gateway_password' => 'Gateway adgangskode', 'sms_from' => 'Afsenders navn.', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Vælg hvornår du vil modtage besked.
', - 'alert_type_description' => 'Status ændring: '. + 'alert_type_description' => 'Status ændring: '. 'Du vil modtage en notifcation når en server har en ændring i status. Fra online -> offline eller offline -> online.
'. '
Offline: '. 'Du vil modtage en meddelelse, når en server går offline for * kun første gang *. for eksempel, '. 'Hvis dit cronjob køre hvert kvatere og din server går ned kl 01 og kommer først op kl 06 '. ' så vil du kun modtage en mail kl 01.
'. '
Altid: '. - 'Du vil modtage en besked, hver gang scriptet kører og et websted er nede, selvom site har været '. - 'offline i flere timer.', + 'Du vil modtage en besked, hver gang scriptet kører og et websted er nede, selvom site har været offline i flere timer.', 'alert_type_status' => 'Status ændret', 'alert_type_offline' => 'Offline', 'alert_type_always' => 'Altid', @@ -203,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Hvis log status er sat til TRUE, vil monitoren logge hændelsen hver gang status ændre sig.', 'log_email' => 'Log mails sendt af systemet', 'log_sms' => 'Log SMS sendt af systemet', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'Indstillingerne er blevet opdateret.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Log', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Email indstillinger', 'settings_sms' => 'SMS indstillinger', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Meddelelse indstillinger', 'settings_log' => 'Log indstillinger', 'auto_refresh' => 'Genopfriske automatisk', @@ -235,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Fejl=%ERROR%', 'off_email_subject' => 'VIGTIG: Server \'%LABEL%\' is DOWN', 'off_email_body' => "Det lykkedes ikke at oprette forbindelse til følgende server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Fejl: %ERROR%
Date: %DATE%", + 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', + 'off_pushover_message' => "Det lykkedes ikke at oprette forbindelse til følgende server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Fejl: %ERROR%
Date: %DATE%", 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%', 'on_email_subject' => 'VIGTIG: Server \'%LABEL%\' is RUNNING', 'on_email_body' => "Server '%LABEL%' køre igen:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Dato: %DATE%", + 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', + 'on_pushover_message' => "Server '%LABEL%' køre igen:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Dato: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Velkommen, %user_name%', diff --git a/src/lang/de_DE.lang.php b/src/lang/de_DE.lang.php index cdeabccc..b783b5a7 100644 --- a/src/lang/de_DE.lang.php +++ b/src/lang/de_DE.lang.php @@ -201,8 +201,7 @@ $sm_lang = array( 'Sie bekommen eine Benachrichtigung, wenn ein Server Offline ist.
'. 'Es wird nur eine Mitteilung versendet.
'. '
Immer: '. - 'Sie werden jedesmal wenn der CronJob oder das Script ausgeführt wird benachrichtigt,
'. - 'auch wenn der Dienst mehreres Stunden offline ist', + 'Sie werden jedesmal wenn der CronJob oder das Script ausgeführt wird benachrichtigt auch wenn der Dienst mehreres Stunden offline ist', 'alert_type_status' => 'Status geändert', 'alert_type_offline' => 'Offline', 'alert_type_always' => 'Immer', @@ -216,10 +215,9 @@ $sm_lang = array( 'tab_email' => 'Email', 'tab_sms' => 'SMS', 'tab_pushover' => 'Pushover', - 'tab_log' => 'Log', 'settings_email' => 'Email', 'settings_sms' => 'SMS Nachricht', - 'settings_pushover' => 'Pushover', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Benachrichtigung', 'settings_log' => 'Log', 'auto_refresh' => 'Auto-refresh', @@ -245,17 +243,13 @@ $sm_lang = array( 'off_sms' => 'Server \'%LABEL%\' ist Offline: ip=%IP%, port=%PORT%. Fehler=%ERROR%', 'off_email_subject' => 'Wichtig: Server \'%LABEL%\' ist Offline', 'off_email_body' => "Kann keine Verbindung zum Server aufbauen:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Fehler: %ERROR%
Datum: %DATE%", - 'off_pushover_title' => '\'%LABEL%\' Offline', - 'off_pushover_message' => 'Server \'%LABEL%\'
ist Offline
IP: %IP%
Port: %PORT%
Fehler: %ERROR%', - 'off_pushover_url_title' => 'SERVER MONITOR', - 'off_pushover_url' => '%MONITORURL%', + 'off_pushover_title' => 'Server \'%LABEL%\' ist Offline', + 'off_pushover_message' => "Kann keine Verbindung zum Server aufbauen:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Fehler: %ERROR%
Datum: %DATE%", 'on_sms' => 'Server \'%LABEL%\' ist wieder Online: ip=%IP%, port=%PORT%', 'on_email_subject' => 'Wichtig: Server \'%LABEL%\' ist wieder Online', 'on_email_body' => "Server '%LABEL%' läuft wieder:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Datum: %DATE%", - 'on_pushover_title' => '\'%LABEL%\' Online', - 'on_pushover_message' => 'Server \'%LABEL%\'
ist wieder Online
IP: %IP%
Port: %PORT%', - 'on_pushover_url_title' => 'SERVER MONITOR', - 'on_pushover_url' => '%MONITORURL%', + 'on_pushover_title' => 'Server \'%LABEL%\' ist wieder Online', + 'on_pushover_message' => "Server '%LABEL%' läuft wieder:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Datum: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index 5868625f..9b2fb7c2 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -131,7 +131,7 @@ $sm_lang = array( 'send_email' => 'Send Email', 'sms' => 'SMS', 'send_sms' => 'Send SMS', - 'send_pushover' => 'Send Pushover', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -201,8 +201,7 @@ $sm_lang = array( 'your cronjob is every 15 mins and your server goes down at 1 am and stays down till 6 am. '. 'You will get 1 notification at 1 am and thats it.
'. '
Always: '. - 'You will receive a notification every time the script runs and a site is down, even if the site has been '. - 'offline for hours.', + 'You will receive a notification every time the script runs and a site is down, even if the site has been offline for hours.', 'alert_type_status' => 'Status change', 'alert_type_offline' => 'Offline', 'alert_type_always' => 'Always', @@ -216,7 +215,6 @@ $sm_lang = array( 'tab_email' => 'Email', 'tab_sms' => 'SMS', 'tab_pushover' => 'Pushover', - 'tab_log' => 'Log', 'settings_email' => 'Email settings', 'settings_sms' => 'Text message settings', 'settings_pushover' => 'Pushover settings', @@ -245,17 +243,13 @@ $sm_lang = array( 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', 'off_email_body' => "Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%", - 'off_pushover_title' => '\'%LABEL%\' Offline', - 'off_pushover_message' => 'Server \'%LABEL%\'
ist Offline
IP: %IP%
Port: %PORT%
Fehler: %ERROR%', - 'off_pushover_url_title' => 'SERVER MONITOR', - 'off_pushover_url' => '%MONITORURL%', + 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', + 'off_pushover_message' => "Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%", 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%', 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING', 'on_email_body' => "Server '%LABEL%' is running again:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", - 'on_pushover_title' => '\'%LABEL%\' Online', - 'on_pushover_message' => 'Server \'%LABEL%\'
ist wieder Online
IP: %IP%
Port: %PORT%', - 'on_pushover_url_title' => 'SERVER MONITOR', - 'on_pushover_url' => '%MONITORURL%', + 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', + 'on_pushover_message' => 'Server \'%LABEL%\' is running again:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%', ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/lang/es_ES.lang.php b/src/lang/es_ES.lang.php index 0d313a7b..8f559538 100644 --- a/src/lang/es_ES.lang.php +++ b/src/lang/es_ES.lang.php @@ -81,6 +81,9 @@ $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' => 'Mobil', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Estado', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Email', 'sms' => 'SMS', 'send_sms' => 'SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -137,6 +142,7 @@ $sm_lang = array( 'latency_max' => 'Tiempo de respuesta (maximum)', 'latency_min' => 'Tiempo de respuesta (minimum)', 'latency_avg' => 'Tiempo de respuesta (average)', + 'uptime' => 'Uptime', 'year' => 'Year', 'month' => 'Month', 'week' => 'Week', @@ -185,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Número origen del SMS', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Cuando desea recibir notificaciones ?
', 'alert_type_description' => '... Al cambiar el estado: '. 'p.ej. online -> offline o offline -> online.
'. @@ -201,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Al setear TRUE (marcar) se protocolan todos los estados.', 'log_email' => 'Enviar Log via email?', 'log_sms' => 'Enviar Log via SMS ?', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'Configuración guardada.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Log', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Email', 'settings_sms' => 'Mensaje SMS', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Notificación', 'settings_log' => 'Log', 'auto_refresh' => 'Refrescar automáticamente página de servidores', @@ -233,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Servidor \'%LABEL%\' está fuera de línea: ip=%IP%, port=%PORT%. error=%ERROR%', 'off_email_subject' => 'Importante: Servidor \'%LABEL%\' está fuera de línea', 'off_email_body' => "No posible conectar al servidor:

Servidor: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Fecha: %DATE%", + 'off_pushover_title' => 'Servidor \'%LABEL%\' está fuera de línea', + 'off_pushover_message' => "No posible conectar al servidor:

Servidor: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Fecha: %DATE%", 'on_sms' => 'Servidor \'%LABEL%\' ya está de nuevo funcionando en línea: ip=%IP%, port=%PORT%', 'on_email_subject' => 'Importante: Servidor \'%LABEL%\' ya está de nuevo en línea', 'on_email_body' => "Servidor '%LABEL%' ya está funcionando en línea de nuevo:

Servidor: %LABEL%
IP: %IP%
Port: %PORT%
Fecha: %DATE%", + 'on_pushover_title' => 'Servidor \'%LABEL%\' ya está de nuevo en línea', + 'on_pushover_message' => "Servidor '%LABEL%' ya está funcionando en línea de nuevo:

Servidor: %LABEL%
IP: %IP%
Port: %PORT%
Fecha: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/lang/fr_FR.lang.php b/src/lang/fr_FR.lang.php index 99c33a3e..999fbd20 100644 --- a/src/lang/fr_FR.lang.php +++ b/src/lang/fr_FR.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => 'Les Administrateurs ont un accès total. Ils peuvent gérer les serveurs, les utilisateurs et éditer la configuration globale.
Les Utilisateurs ne peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.', 'mobile' => 'Téléphone', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Supprimer un utilisateur', 'delete_message' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur \'%1\' ?', 'deleted' => 'Utilisateur supprimé.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'État', 'email' => 'email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'Aucun événement', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Envoyer un email', 'sms' => 'SMS', 'send_sms' => 'Envoyer un SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Supprimer un serveur', 'delete_message' => 'Êtes-vous sûr de vouloir supprimer le serveur \'%1\' ?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Nom utilisateur de la passerelle', 'sms_gateway_password' => 'Mot de passe de la passerelle', 'sms_from' => 'SMS de l\'expéditeur', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Choisissez quand vous souhaitez être notifié.
', 'alert_type_description' => 'Changement d\'état : '. 'Vous recevez une notification chaque fois que le serveur change d\'état. C\'est-à-dire passe de l\'état OK à HORS SERVICE ou de HORS SERVICE à OK.
'. @@ -202,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Si l\'option est activée, un événement est enregistré chaque fois qu\'une notification a lieu.', 'log_email' => 'Enregistrer tout les emails envoyés', 'log_sms' => 'Enregistrer tout les SMS envoyés', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'La configuration a été mise à jour.', 'nochanges' => 'La configuration n\'a pas été modifiée.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Événements', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Configuration email', 'settings_sms' => 'Configuration SMS', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Configuration des notifications', 'settings_log' => 'Configuration des événements', 'auto_refresh' => 'Auto-rachaîchissement', @@ -234,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Le Serveur \'%LABEL%\' est HORS SERVICE: IP=%IP%, Port=%PORT%. Erreur=%ERROR%', 'off_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est HORS SERVICE', 'off_email_body' => "Impossible de se connecter au serveur suivant:

Serveur: %LABEL%
IP: %IP%
Port: %PORT%
Erreur: %ERROR%
Date: %DATE%", + 'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE', + 'off_pushover_message' => "Impossible de se connecter au serveur suivant:

Serveur: %LABEL%
IP: %IP%
Port: %PORT%
Erreur: %ERROR%
Date: %DATE%", 'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%', 'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK', 'on_email_body' => "Le Serveur '%LABEL%' est de nouveau OK:

Serveur: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", + 'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK', + 'on_pushover_message' => "Le Serveur '%LABEL%' est de nouveau OK:

Serveur: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Bonjour %user_name%', diff --git a/src/lang/it_IT.lang.php b/src/lang/it_IT.lang.php index cf5a57b1..cbab0bb9 100644 --- a/src/lang/it_IT.lang.php +++ b/src/lang/it_IT.lang.php @@ -81,6 +81,9 @@ $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' => 'Cellulare', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Stato', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Invia Email', 'sms' => 'SMS', 'send_sms' => 'Invia SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -137,6 +142,7 @@ $sm_lang = array( 'latency_max' => 'Tempo di risposta (maximum)', 'latency_min' => 'Tempo di risposta (minimum)', 'latency_avg' => 'Tempo di risposta (average)', + 'uptime' => 'Uptime', 'year' => 'Year', 'month' => 'Month', 'week' => 'Week', @@ -185,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Nome Utente Gateway', 'sms_gateway_password' => 'Password Gateway', 'sms_from' => 'Numero di telefono del mittente', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Seleziona quando vuoi essere notificato.
', 'alert_type_description' => 'Cambio di Stato: '. 'Riceverai una notifica solo quando un server cambierà stato. Quindi da online -> offline oppure da offline -> online.
'. @@ -201,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Se lo Stato Log è impostato su VERO, il monitor registrerà nel log gli eventi appena le notifiche verranno inviate.', 'log_email' => 'Registra email inviate dallo script.', 'log_sms' => 'Registra SMS inviati dallo script.', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'La configurazione è stato aggiornata.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Log', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Impostazioni Email', 'settings_sms' => 'Impostazioni SMS', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Impostazioni Notifiche', 'settings_log' => 'Impostazioni Log', 'auto_refresh' => 'Auto-Aggiorna pagina servers', @@ -233,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Server \'%LABEL%\' è DOWN: ip=%IP%, porta=%PORT%. Errore=%ERROR%', 'off_email_subject' => 'IMPORTANTE: Server \'%LABEL%\' è DOWN', 'off_email_body' => "Impossibile connettersi al seguente server:

Server: %LABEL%
IP: %IP%
Porta: %PORT%
Errore: %ERROR%
Data: %DATE%", + 'off_pushover_title' => 'Server \'%LABEL%\' è DOWN', + 'off_pushover_message' => "Impossibile connettersi al seguente server:

Server: %LABEL%
IP: %IP%
Porta: %PORT%
Errore: %ERROR%
Data: %DATE%", 'on_sms' => 'Server \'%LABEL%\' è ATTIVO: ip=%IP%, porta=%PORT%', 'on_email_subject' => 'IMPORTANTE: Server \'%LABEL%\' è ATTIVO', 'on_email_body' => "Server '%LABEL%' è di nuovo attivo:

Server: %LABEL%
IP: %IP%
Porta: %PORT%
Data: %DATE%", + 'on_pushover_title' => 'Server \'%LABEL%\' è ATTIVO', + 'on_pushover_message' => "Server '%LABEL%' è di nuovo attivo:

Server: %LABEL%
IP: %IP%
Porta: %PORT%
Data: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/lang/ko_KR.lang.php b/src/lang/ko_KR.lang.php index 7f3bada0..e4073f6c 100644 --- a/src/lang/ko_KR.lang.php +++ b/src/lang/ko_KR.lang.php @@ -81,6 +81,9 @@ $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' => '휴대폰', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => '상태', 'email' => 'email', 'sms' => 'sms', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => '메일 전송', 'sms' => 'SMS 전송', 'send_sms' => 'SMS 전송', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Gateway username', 'sms_gateway_password' => 'Gateway password', 'sms_from' => 'Sender\'s phone number', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => '알림을 원하면 다음과 같이 변경하십시오..
', 'alert_type_description' => '상태 변경:
'. '서버 상태가 변경이되면 알림을 받습니다. online -> offline -> online.
'. @@ -194,6 +201,7 @@ $sm_lang = array( 'cron이 매 15분이고 오전1시 부터 오전6시까지 다운되었을때 오전1시에 한번 알림을 받습니다.
' . '
항상:
'. '사이트가 다운되었을 때 매시간 알림을 받습니다.', + 'alert_type_status' => '상태 변경', 'alert_type_offline' => '오프라인', 'alert_type_always' => '항상', @@ -201,13 +209,15 @@ $sm_lang = array( 'log_status_description' => '로그상태가 TRUE이면 알림설정이 통과할때마다 이벤트를 기록합니다.', 'log_email' => '이메일로 로그를 전송하시겠습니까?', 'log_sms' => 'SMS로 로그를 전송하시겠습니까?', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => '설정이 수정되었습니다.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => '로그', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Email 설정', 'settings_sms' => 'SMS 설정', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => '알림 설정', 'settings_log' => '로그 설정', 'auto_refresh' => 'Auto-refresh', @@ -233,9 +243,13 @@ $sm_lang = array( 'off_sms' => '서버(\'%LABEL%\')가 다운되었습니다. : ip=%IP%, port=%PORT%. Error=%ERROR%', 'off_email_subject' => '중요: 서버(\'%LABEL%\')가 다운되었습니다.', 'off_email_body' => "서버 접속을 실패하였습니다.

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%", + 'off_pushover_title' => '서버(\'%LABEL%\')가 다운되었습니다.', + 'off_pushover_message' => "서버 접속을 실패하였습니다.

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%", 'on_sms' => '서버(\'%LABEL%\') 가동중: ip=%IP%, port=%PORT%', 'on_email_subject' => '중요: 서버(\'%LABEL%\')가 가동중입니다.', 'on_email_body' => "서버('%LABEL%')가 재가동됩니다.:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", + 'on_pushover_title' => '서버(\'%LABEL%\')가 가동중입니다.', + 'on_pushover_message' => "서버('%LABEL%')가 재가동됩니다.:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/lang/nl_NL.lang.php b/src/lang/nl_NL.lang.php index c9c8c10e..19d12fc8 100644 --- a/src/lang/nl_NL.lang.php +++ b/src/lang/nl_NL.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => 'Beheerders hebben volledige toegang: ze kunnen servers en gebruiker beheren en de globale configuratie aanpassen.
Gebruikers kunnen alleen de servers bekijken en op fouten testen die aan hun zijn toegewezen.', 'mobile' => 'Mobiel', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Status', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Stuur email', 'sms' => 'SMS', 'send_sms' => 'Stuur SMS', + 'pushover' => 'Pushover', 'users' => 'Gebruikers', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Gateway gebruikersnaam', 'sms_gateway_password' => 'Gateway wachtwoord', 'sms_from' => 'Telefoonnummer afzender', + 'pushover_status' => 'Sta Pushover berichten toe?', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Selecteer wanneer je een notificatie wilt.
', 'alert_type_description' => 'Status change: '. 'Je ontvangt alleen bericht wanneer een server van status verandert. Dus van online -> offline of offline -> online.
'. @@ -202,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Als de log status aan staat, zal de monitor een log aanmaken elke keer dat hij door de notificatie instellingen komt.', 'log_email' => 'Log emails verstuurd bij het script?', 'log_sms' => 'Log sms berichten verstuurd bij het script?', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'De configuratie is gewijzigd.', 'nochanges' => 'De configuratie is ongewijzigd.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Log', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Email instellingen', 'settings_sms' => 'SMS instellingen', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Notificatie instellingen', 'settings_log' => 'Log instellingen', 'auto_refresh' => 'Auto-refresh', @@ -234,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Server %LABEL% is DOWN: ip=%IP%, poort=%PORT%. Fout=%ERROR%', 'off_email_subject' => 'BELANGRIJK: Server %LABEL% is DOWN', 'off_email_body' => "De server kon niet worden bereikt:

Server: %LABEL%
IP: %IP%
Poort: %PORT%
Fout: %ERROR%
Datum: %DATE%", + 'off_pushover_title' => 'Server %LABEL% is DOWN', + 'off_pushover_message' => "De server kon niet worden bereikt:

Server: %LABEL%
IP: %IP%
Poort: %PORT%
Fout: %ERROR%
Datum: %DATE%", 'on_sms' => 'Server %LABEL% is RUNNING: ip=%IP%, poort=%PORT%', 'on_email_subject' => 'BELANGRIJK: Server %LABEL% is RUNNING', 'on_email_body' => "Server %LABEL% is weer online:

Server: %LABEL%
IP: %IP%
Poort: %PORT%
Datum: %DATE%", + 'on_pushover_title' => 'Server %LABEL% is RUNNING', + 'on_pushover_message' => "Server %LABEL% is weer online:

Server: %LABEL%
IP: %IP%
Poort: %PORT%
Datum: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Welkom, %user_name%', diff --git a/src/lang/pt_BR.lang.php b/src/lang/pt_BR.lang.php index 8b069dfe..4094401d 100644 --- a/src/lang/pt_BR.lang.php +++ b/src/lang/pt_BR.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( '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', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Status', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Enviar Email', 'sms' => 'SMS', 'send_sms' => 'Enviar SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Usuário do Gateway', 'sms_gateway_password' => 'Senha do Gateway', 'sms_from' => 'Número de telefone de envio', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Selecione como você gostaria de ser notificado.
', 'alert_type_description' => 'Mudança de Status: '. 'Você receberá uma notificação quando o seridor tive uma mudança de status. De online -> offline ou offline -> online.
'. @@ -194,8 +201,7 @@ $sm_lang = array( 'A cronjob é a cada 15 minutos e seu servidor caiu em 1:00 e permanece offline até 6 am. '. 'Você receberá uma notificação a 1:00 apenas
'. '
Sempre: '. - 'Você receberá uma notificação toda vez que o script é executado e um site esta offline, mesmo se o site tenha ficado '. - 'offline por horas.', + 'Você receberá uma notificação toda vez que o script é executado e um site esta offline, mesmo se o site tenha ficado offline por horas.', 'alert_type_status' => 'Mudança de Status', 'alert_type_offline' => 'Offline', 'alert_type_always' => 'Sempre', @@ -203,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Se o status de registro é definido como TRUE, o monitor irá registrar o evento sempre que as configurações de notificação forem passadas.', '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', 'updated' => 'A configuração foi atualizada.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => 'Email', 'tab_sms' => 'Texto', - 'tab_log' => 'Logs', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Configuração de email', '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', 'auto_refresh' => 'Atualizar automaticamente', @@ -235,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Servidor \'%LABEL%\' está OFFLINE: ip=%IP%, porta=%PORT%. Erro=%ERROR%', 'off_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' está OFFLINE', 'off_email_body' => "Falha ao conectar ao servidor:

Servidor: %LABEL%
IP: %IP%
Porta: %PORT%
Erro: %ERROR%
Data: %DATE%", + 'off_pushover_title' => 'Servidor \'%LABEL%\' está OFFLINE', + 'off_pushover_message' => "Falha ao conectar ao servidor:

Servidor: %LABEL%
IP: %IP%
Porta: %PORT%
Erro: %ERROR%
Data: %DATE%", 'on_sms' => 'Servidor \'%LABEL%\' esta ONLINE: ip=%IP%, porta=%PORT%', 'on_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' esta ONLINE', 'on_email_body' => "Servidor '%LABEL%' esta ONLINE novamente:

Servidor: %LABEL%
IP: %IP%
Porta: %PORT%
Data: %DATE%", + 'on_pushover_title' => 'Servidor \'%LABEL%\' esta ONLINE', + 'on_pushover_message' => "Servidor '%LABEL%' esta ONLINE novamente:

Servidor: %LABEL%
IP: %IP%
Porta: %PORT%
Data: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Bem vindo, %user_name%', diff --git a/src/lang/ru_RU.lang.php b/src/lang/ru_RU.lang.php index d402b95d..eb3ee58b 100644 --- a/src/lang/ru_RU.lang.php +++ b/src/lang/ru_RU.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => 'Администраторы имеют полный доступ: они могут управлять серверами, пользователями и изменять общую конфигурацию.
Пользователи могут только просматривать и запускать проверку для серверов которые были к ним прикрепплены.', 'mobile' => 'Телефон', 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Удалить пользователя', 'delete_message' => 'Вы точно хотите удалить пользователя \'%1\'?', 'deleted' => 'Пользователь удален.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => 'Статус', 'email' => 'Email', 'sms' => 'SMS', + 'pushover' => 'Pushover', 'no_logs' => 'Записей нет', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => 'Отправить Email', 'sms' => 'SMS', 'send_sms' => 'Отправить SMS', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Удалить сервер', 'delete_message' => 'Вы точно хотите удалить сервер \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'Пользователь', 'sms_gateway_password' => 'Пароль', 'sms_from' => 'Номер отправителя', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => 'Выбирите, какие вы хотите получать уведомления
', 'alert_type_description' => 'Изменение статуса : '. 'Вы получите уведомление об изменение статуса. Для онлайн -> оффлайн или офлайн -> онлайн.
'. @@ -194,8 +201,7 @@ $sm_lang = array( 'Задание Cron выставлено на каждые 15 минут. Сервер перейдет в статус оффлайн в 1:00 и не измениться до 6:00. '. 'Вы получите 1 уведомление только в 1:00
'. '
Всегда: '. - 'Вы будете получать уведомление при каждом запуске скрипта проверки, как только сервер перейдет в статус оффлайн, даже если'. - 'сервер находится в этом статусе несколько часов', + 'Вы будете получать уведомление при каждом запуске скрипта проверки, как только сервер перейдет в статус оффлайн, даже если сервер находится в этом статусе несколько часов', 'alert_type_status' => 'Изменение статуса', 'alert_type_offline' => 'Оффлайн', 'alert_type_always' => 'Всегда', @@ -203,13 +209,15 @@ $sm_lang = array( 'log_status_description' => 'Если лог установлен в TRUE, монитор будет логировать все события режим которых выбран в типе уведомлений.', 'log_email' => 'Уведомления отправленые по Email', 'log_sms' => 'Уведомления отправленые по Email', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => 'Параметры были успешно применены.', 'nochanges' => 'Параметры не изменились.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', - 'tab_log' => 'Лог', + 'tab_pushover' => 'Pushover', 'settings_email' => 'Настройка Email', 'settings_sms' => 'Настройка SMS', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => 'Настройка уведомлений', 'settings_log' => 'Настройка логирования', 'auto_refresh' => 'Авто-обновление', @@ -235,9 +243,13 @@ $sm_lang = array( 'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: ip=%IP%, port=%PORT%. Ошибка=%ERROR%', 'off_email_subject' => 'ВАЖНО: сервер \'%LABEL%\' сейчас НЕДОСТУПЕН', 'off_email_body' => "Невозможно подключиться к следующему серверу:

Server: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%", + 'off_pushover_title' => 'Cервер \'%LABEL%\' сейчас НЕДОСТУПЕН', + 'off_pushover_message' => "Невозможно подключиться к следующему серверу:

Server: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%", 'on_sms' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН: ip=%IP%, port=%PORT%', 'on_email_subject' => 'ВАЖНО: Сервер \'%LABEL%\' сейчас ДОСТУПЕН', 'on_email_body' => "Сервер '%LABEL%' снова доступен:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", + 'on_pushover_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН', + 'on_pushover_message' => "Сервер '%LABEL%' снова доступен:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", ), 'login' => array( 'welcome_usermenu' => 'Здравствуйте, %user_name%', diff --git a/src/lang/zh_CN.lang.php b/src/lang/zh_CN.lang.php index 052ddf7c..d3ffd62a 100644 --- a/src/lang/zh_CN.lang.php +++ b/src/lang/zh_CN.lang.php @@ -81,6 +81,9 @@ $sm_lang = array( 'level_description' => '超级管理员 拥有所有权限: 管理服务器, 用户 以及修改设置.
普通用户 只能查看及更新自己名下所属的服务器.', 'mobile' => '手机', 'email' => '邮件', + 'pushover' => 'Pushover', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', 'delete_title' => 'Delete User', 'delete_message' => 'Are you sure you want to delete user \'%1\'?', 'deleted' => 'User deleted.', @@ -104,6 +107,7 @@ $sm_lang = array( 'status' => '状态', 'email' => '邮件', 'sms' => '短信', + 'pushover' => 'Pushover', 'no_logs' => 'No logs', ), 'servers' => array( @@ -127,6 +131,7 @@ $sm_lang = array( 'send_email' => '发送邮件', 'sms' => '短信', 'send_sms' => '发送短信', + 'pushover' => 'Pushover', 'users' => 'Users', 'delete_title' => 'Delete Server', 'delete_message' => 'Are you sure you want to delete server \'%1\'?', @@ -186,6 +191,8 @@ $sm_lang = array( 'sms_gateway_username' => 'SMS网关用户名', 'sms_gateway_password' => 'SMS网关密码', 'sms_from' => '发信人电话号', + 'pushover_status' => 'Allow sending pushover messages', + 'pushover_api_token' => 'Pushover App API Token', 'alert_type' => '如果想要收到提醒请选中此项.
', 'alert_type_description' => '状态变化: '. '服务器 online -> offline 或 offline -> online 的状态变化将会收到提醒.
'. @@ -202,13 +209,15 @@ $sm_lang = array( 'log_status_description' => '如果状态记录设置为开, 提醒发送时均会保存记录.', 'log_email' => '记录脚本所发邮件?', 'log_sms' => '记录脚本所发短信SMS?', + 'log_pushover' => 'Log pushover messages sent by the script', 'updated' => '设置已更新.', 'nochanges' => 'The configuration didn\'t change.', 'tab_email' => '邮件发送设置', 'tab_sms' => '短信发送设置', - 'tab_log' => '日志设置', + 'tab_pushover' => 'Pushover', 'settings_email' => '邮件发送设置', 'settings_sms' => '短信发送设置', + 'settings_pushover' => 'Pushover settings', 'settings_notification' => '提醒设置', 'settings_log' => '日志设置', 'auto_refresh' => 'Auto-refresh', @@ -234,9 +243,13 @@ $sm_lang = array( 'off_sms' => '服务器 \'%LABEL%\' 宕机: ip=%IP%, port=%PORT%. Error=%ERROR%', 'off_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 宕机', 'off_email_body' => "无法连接到以下服务器:

服务器: %LABEL%
IP: %IP%
Port: %PORT%
错误: %ERROR%
日期: %DATE%", + 'off_pushover_title' => '服务器 \'%LABEL%\' 宕机', + 'off_pushover_message' => "无法连接到以下服务器:

服务器: %LABEL%
IP: %IP%
Port: %PORT%
错误: %ERROR%
日期: %DATE%", 'on_sms' => '服务器 \'%LABEL%\' 运行中: ip=%IP%, port=%PORT%', 'on_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 运行中', 'on_email_body' => "服务器 '%LABEL%' 恢复运行:

服务器: %LABEL%
IP: %IP%
Port: %PORT%
日期: %DATE%", + 'on_pushover_title' => '服务器 \'%LABEL%\' 运行中', + 'on_pushover_message' => "服务器 '%LABEL%' 恢复运行:

服务器: %LABEL%
IP: %IP%
Port: %PORT%
日期: %DATE%", ), 'login' => array( 'welcome_usermenu' => '欢迎, %user_name%', diff --git a/src/psm/Module/Config/Controller/ConfigController.class.php b/src/psm/Module/Config/Controller/ConfigController.class.php index 51bc51c6..337cc5af 100644 --- a/src/psm/Module/Config/Controller/ConfigController.class.php +++ b/src/psm/Module/Config/Controller/ConfigController.class.php @@ -237,8 +237,8 @@ class ConfigController extends AbstractController { $this->default_tab = 'email'; } elseif(isset($_POST['sms_submit']) || !empty($_POST['test_sms'])) { $this->default_tab = 'sms'; - } elseif(isset($_POST['logging_submit'])) { - $this->default_tab = 'logging'; + } elseif(isset($_POST['pushover_submit'])) { + $this->default_tab = 'pushover'; } } $this->initializeAction('index'); @@ -253,7 +253,6 @@ class ConfigController extends AbstractController { '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'), - 'label_tab_log' => psm_get_lang('config', 'tab_log'), 'label_settings_email' => psm_get_lang('config', 'settings_email'), 'label_settings_sms' => psm_get_lang('config', 'settings_sms'), 'label_settings_pushover' => psm_get_lang('config', 'settings_pushover'), diff --git a/src/psm/Module/Server/Controller/LogController.class.php b/src/psm/Module/Server/Controller/LogController.class.php index 8c75a883..82eaead6 100644 --- a/src/psm/Module/Server/Controller/LogController.class.php +++ b/src/psm/Module/Server/Controller/LogController.class.php @@ -45,12 +45,7 @@ class LogController extends AbstractServerController { */ protected function executeIndex() { $this->setTemplateId('server_log_list', 'server/log.tpl.html'); - - $entries = array(); - $entries['status'] = $this->getEntries('status'); - $entries['email'] = $this->getEntries('email'); - $entries['sms'] = $this->getEntries('sms'); - $entries['pushover'] = $this->getEntries('pushover'); + $log_types = array('status', 'email', 'sms', 'pushover'); // get users $users = $this->db->select(PSM_DB_PREFIX.'users', null, array('user_id','name')); @@ -60,7 +55,8 @@ class LogController extends AbstractServerController { $users_labels[$user['user_id']] = $user['name']; } - foreach($entries as $key => $records) { + foreach($log_types as $key) { + $records = $this->getEntries($key); $log_count = count($records); for ($x = 0; $x < $log_count; $x++) { diff --git a/src/psm/Module/Server/Controller/ServerController.class.php b/src/psm/Module/Server/Controller/ServerController.class.php index 15a3dd97..df9fe904 100644 --- a/src/psm/Module/Server/Controller/ServerController.class.php +++ b/src/psm/Module/Server/Controller/ServerController.class.php @@ -93,6 +93,11 @@ class ServerController extends AbstractServerController { // we need an array for our template magic (see below): $html_actions = array('html_actions' => $html_actions); + $icons = array( + 'email' => 'icon-envelope', + 'sms' => 'icon-mobile', + 'pushover' => 'icon-pushover', + ); $servers = $this->getServers(); $server_count = count($servers); @@ -120,13 +125,15 @@ class ServerController extends AbstractServerController { if(($servers[$x]['active'] == 'yes')) { $servers[$x]['active_icon'] = 'icon-eye-open'; $servers[$x]['active_title'] = psm_get_lang('servers', 'monitoring'); - $servers[$x]['email_icon'] = ($servers[$x]['email'] == 'yes') ? 'icon-envelope' : ''; - $servers[$x]['sms_icon'] = ($servers[$x]['sms'] == 'yes') ? 'icon-mobile' : ''; + + foreach($icons as $i_id => $i_icon) { + if(psm_get_conf($i_id . '_status') && $servers[$x][$i_id] == 'yes') { + $servers[$x][$i_id . '_icon'] = $i_icon; + } + } } else { $servers[$x]['active_icon'] = 'icon-eye-close'; $servers[$x]['active_title'] = psm_get_lang('servers', 'no_monitoring'); - $servers[$x]['email_icon'] = ''; - $servers[$x]['sms_icon'] = ''; } $servers[$x] = $this->formatServer($servers[$x]); @@ -240,6 +247,7 @@ class ServerController extends AbstractServerController { 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', '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', ); // make sure websites start with http:// if($clean['type'] == 'website' && substr($clean['ip'], 0, 4) != 'http') { @@ -412,7 +420,7 @@ class ServerController extends AbstractServerController { 'label_send_email' => psm_get_lang('servers', 'send_email'), 'label_sms' => psm_get_lang('servers', 'sms'), 'label_send_sms' => psm_get_lang('servers', 'send_sms'), - 'label_send_pushover' => psm_get_lang('servers', 'send_pushover'), + 'label_pushover' => psm_get_lang('servers', 'pushover'), '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'), @@ -447,4 +455,4 @@ class ServerController extends AbstractServerController { } return $result; } -} \ No newline at end of file +} diff --git a/src/psm/Util/Install/Installer.class.php b/src/psm/Util/Install/Installer.class.php index c5cef4b3..a582bb9d 100644 --- a/src/psm/Util/Install/Installer.class.php +++ b/src/psm/Util/Install/Installer.class.php @@ -143,7 +143,7 @@ class Installer { ('sms_gateway_username', 'username'), ('sms_gateway_password', 'password'), ('sms_from', '1234567890'), - ('pushover_status', '1'), + ('pushover_status', '0'), ('pushover_api_token', ''), ('alert_type', 'status'), ('log_status', '1'), @@ -200,7 +200,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') NOT NULL, + `type` enum('status','email','sms','pushover') NOT NULL, `message` varchar(255) NOT NULL, `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, `user_id` varchar(255) NOT NULL, @@ -221,7 +221,7 @@ class Installer { `active` enum('yes','no') NOT NULL default 'yes', `email` enum('yes','no') NOT NULL default 'yes', `sms` enum('yes','no') NOT NULL default 'no', - `pushover` enum('yes','no') NOT NULL default 'no', + `pushover` enum('yes','no') NOT NULL default 'yes', `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, @@ -398,14 +398,16 @@ class Installer { protected function upgrade310() { $queries = array(); - $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('pushover_status', '1');"; - $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('log_pushover', '1');"; - $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('pushover_api_token', '');"; - + psm_update_conf('pushover_status', 1); + psm_update_conf('log_pushover', 1); + psm_update_conf('pushover_api_token', ''); $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_key` VARCHAR( 255 ) NOT NULL AFTER `mobile`;"; - $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_device` VARCHAR( 255 ) NOT NULL AFTER `pushover_key`;"; - - $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pushover` ENOM( 'yes','no' ) NOT NULL DEFAULT 'no' AFTER `sms`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_device` VARCHAR( 255 ) NOT NULL AFTER `pushover_key`;"; + + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pushover` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `sms`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `timeout` smallint(1) unsigned NULL DEFAULT NULL;"; $queries[] = "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users_preferences` ( `user_id` int(11) unsigned NOT NULL, @@ -413,7 +415,7 @@ class Installer { `value` varchar(255) NOT NULL, PRIMARY KEY (`user_id`, `key`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; - $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `timeout` smallint(1) unsigned NULL DEFAULT NULL;"; + $this->execSQL($queries); } } diff --git a/src/psm/Util/Pushover.class.php b/src/psm/Util/Pushover.class.php deleted file mode 100644 index 406fff2d..00000000 --- a/src/psm/Util/Pushover.class.php +++ /dev/null @@ -1,54 +0,0 @@ -. - * - * @package phpservermon - * @author Pepijn Over - * @copyright Copyright (c) 2008-2014 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.0.0 - **/ - -namespace psm\Util; - -/** - * Pushover is not using namespaces so unable to load files in autoloader. - */ -require_once(PSM_PATH_VENDOR . '/Pushover/Pushover.php'); - -/** - * PSM Pushover utility - * - * The Pushover is an open source lib that can be found in vendor/Pushover. - * - * @see \Pushover - */ -class Pushover extends \Pushover { - - /** - * Open new Pushover - * - * @param boolean $exceptions - */ - function __construct($exceptions = false) { - parent::__construct($exceptions); - - } -} \ No newline at end of file diff --git a/src/psm/Util/Updater/StatusNotifier.class.php b/src/psm/Util/Updater/StatusNotifier.class.php index f0423cde..7968c86d 100644 --- a/src/psm/Util/Updater/StatusNotifier.class.php +++ b/src/psm/Util/Updater/StatusNotifier.class.php @@ -164,22 +164,28 @@ class StatusNotifier { ); } + $users = $this->getUsers($this->server_id); + + if(empty($users)) { + return $notify; + } + // check if email is enabled for this server if($this->send_emails && $this->server['email'] == 'yes') { // send email - $this->notifyByEmail(); + $this->notifyByEmail($users); } // check if sms is enabled for this server if($this->send_sms && $this->server['sms'] == 'yes') { // yay lets wake those nerds up! - $this->notifyByTxtMsg(); + $this->notifyByTxtMsg($users); } // check if pushover is enabled for this server if($this->send_pushover && $this->server['pushover'] == 'yes') { // yay lets wake those nerds up! - $this->notifyByPushover(); + $this->notifyByPushover($users); } return $notify; @@ -188,17 +194,12 @@ class StatusNotifier { /** * This functions performs the email notifications * + * @param array $users * @return boolean */ - protected function notifyByEmail() { + protected function notifyByEmail($users) { $userlist = array(); - $users = $this->getUsers($this->server_id); - - if (empty($users)) { - return false; - } - // build mail object with some default values $mail = psm_build_mail(); $mail->Subject = psm_parse_msg($this->status_new, 'email_subject', $this->server); @@ -226,53 +227,43 @@ class StatusNotifier { /** * This functions performs the pushover notifications * + * @param array $users * @return boolean */ - protected function notifyByPushover() { + protected function notifyByPushover($users) { $userlist = array(); - - $users = $this->getUsers($this->server_id); - - if (empty($users)) { - return false; - } - - // build pushover object with some default values $pushover = psm_build_pushover(); - if($this->status_new === true) - { + if($this->status_new === true) { $pushover->setPriority(0); - }else - { + } else { $pushover->setPriority(2); $pushover->setRetry(300); //Used with Priority = 2; Pushover will resend the notification every 60 seconds until the user accepts. $pushover->setExpire(3600); //Used with Priority = 2; Pushover will resend the notification every 60 seconds for 3600 seconds. After that point, it stops sending notifications. } - //$pushover->setCallback('http://some.url/runscript.php'); // The callback parameter must be a URL (HTTP or HTTPS) that is reachable from the Internet that our servers will call out to as soon as the notification has been acknowledged. $pushover->setTimestamp(time()); - //$pushover->setDebug(true); - //$pushover->setSound('bike'); - - $this->server['MONITORURL']=$url = "http".(!empty($_SERVER['HTTPS'])?"s":"").":\/\/".$_SERVER['SERVER_NAME']; $message = psm_parse_msg($this->status_new, 'pushover_message', $this->server); - + $pushover->setTitle(psm_parse_msg($this->status_new, 'pushover_title', $this->server)); $pushover->setMessage(str_replace('
', "\n", $message)); + // @todo fix url when script is executed via CLI +// $pushover->setUrl($url); +// $pushover->setUrlTitle(psm_get_lang('system', 'title')); - $pushover->setUrl(psm_parse_msg($this->status_new, 'pushover_url', $this->server)); - $pushover->setUrlTitle(psm_parse_msg($this->status_new, 'pushover_url_title', $this->server)); - - // go through empl - foreach ($users as $user) { + foreach($users as $user) { + if(trim($user['pushover_key']) == '') { + continue; + } + $userlist[] = $user['user_id']; $pushover->setUser($user['pushover_key']); - $pushover->setDevice($user['pushover_device']); + if($user['pushover_device'] != '') { + $pushover->setDevice($user['pushover_device']); + } $pushover->send(); } if(psm_get_conf('log_pushover')) { - // save to log psm_add_log($this->server_id, 'pushover', $message, implode(',', $userlist)); } } @@ -280,16 +271,10 @@ class StatusNotifier { /** * This functions performs the text message notifications * - * @return unknown + * @param array $users + * @return boolean */ - protected function notifyByTxtMsg() { - // send sms to all users for this server using defined gateway - $users = $this->getUsers($this->server_id); - - if (empty($users)) { - return false; - } - + protected function notifyByTxtMsg($users) { $sms = psm_build_sms(); if(!$sms) { return false; diff --git a/src/templates/config/config.tpl.html b/src/templates/config/config.tpl.html old mode 100755 new mode 100644 index a70aa156..9aff176f --- a/src/templates/config/config.tpl.html +++ b/src/templates/config/config.tpl.html @@ -5,7 +5,6 @@
  • {label_tab_email}
  • {label_tab_sms}
  • {label_tab_pushover}
  • -
  • {label_tab_log}
  • @@ -34,6 +33,8 @@

    {label_auto_refresh_servers}

    + +
    {label_settings_notification}
    @@ -46,6 +47,15 @@

    {label_alert_type_description}

    +
    +
    + {label_settings_log} +
    +
    + +

    {label_log_status_description}

    +
    +
    @@ -59,6 +69,11 @@ +
    +
    + +
    +
    @@ -114,6 +129,11 @@
    +
    +
    + +
    +
    @@ -166,6 +186,11 @@
    +
    +
    + +
    +
    @@ -173,31 +198,10 @@
    - +
    -
    -
    - {label_settings_log} -
    - -

    {label_log_status_description}

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    \ No newline at end of file diff --git a/src/templates/install/install.tpl.html b/src/templates/install/install.tpl.html old mode 100755 new mode 100644 diff --git a/src/templates/main.tpl.html b/src/templates/main.tpl.html old mode 100755 new mode 100644 diff --git a/src/templates/main_sidebar.tpl.html b/src/templates/main_sidebar.tpl.html old mode 100755 new mode 100644 diff --git a/src/templates/server/log.tpl.html b/src/templates/server/log.tpl.html old mode 100755 new mode 100644 diff --git a/src/templates/server/server.tpl.html b/src/templates/server/server.tpl.html index 61e2d5d4..dc898841 100644 --- a/src/templates/server/server.tpl.html +++ b/src/templates/server/server.tpl.html @@ -10,9 +10,6 @@ {label_rtime} {label_last_online} {label_monitoring} - {label_email} - {label_sms} - {label_pushover} {label_action} @@ -27,10 +24,7 @@
    {type}
    {rtime} s
    {last_online}
    -
    -
    {active}
    -
    {email}
    -
    {sms}
    +
    @@ -52,7 +46,7 @@
    {ip_short}
    - +
    @@ -142,7 +136,7 @@
    - +
    +
    + +
    + +
    +
    @@ -130,12 +128,6 @@
    -
    - -
    - -
    -
    diff --git a/static/css/style.css b/static/css/style.css index 47689d54..2c12e455 100755 --- a/static/css/style.css +++ b/static/css/style.css @@ -560,3 +560,7 @@ legend{ .icon-admin { background-position: -48px -168px; } + +.icon-pushover { + background-position: -72px -168px; +} \ No newline at end of file diff --git a/static/plugin/twitter-bootstrap/img/glyphicons-halflings-white.png b/static/plugin/twitter-bootstrap/img/glyphicons-halflings-white.png index d1be41bbab8d8de15c6a58757c1b3fa4e2b995f9..9e7cfb0269aacf5caf0c8bd91354b5c962ff6a03 100644 GIT binary patch delta 14915 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 ToX#|l9$p$M+R7D*mZAR#%WKcl delta 14380 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 HHVOP6^_K9C diff --git a/static/plugin/twitter-bootstrap/img/glyphicons-halflings.png b/static/plugin/twitter-bootstrap/img/glyphicons-halflings.png index 590346d11eff940a592e49264bfaa3452c72bbd9..1b7577d8c496b7dca2952a4d8550d5ff85a9396e 100644 GIT binary patch delta 2427 zcmZ`&dpHvcA70Yu#Hol#5eK0i#cplxO`|$A93r_Sm*z6*$R*cxs7~sjl(5;{jR|L4 z=9b%Wi&ZSS&Rox2hqY-j#>e+O=g;q-_xF3==lwm;@Al4c_suNqdp@iMJL_u%25G{L z&w*etI2>%C2{r;j4UIsCAjnyeu?ZAP6?^Z~G`2yaKo_m7KnR322xJXKKw)qM0}&uN;G`-w`shGA6`g?y9jDKYe(;CYI=gnlzZk&l01? zqnmq$+gVezK-}27Xd#6{0lM1W#N+W=hYlU0Dc{x3blgl<)U$Ze`B=L}uZ|jL-Sdf$ zI;O%ECRMoCScD!6((bY64O3^}v)6AvJ^yUo{tP*xGS)o3Ss)P5)kfB96)bPKyT@Lr zU-6?fwVA10b8%@3uFBM!yj@e)@pZE<{2)0fcXcAF0(ZEW!_ZVT7OilWlH+GiT{byb zLjULd&e- zS#CyU#Niqej;Fj;4fEtw_A(fj{T_r+#Aq4g$Y*U|gUl}b&$_#q4}5%|8>}|UgD>HT z#_U(bcSj>{yBv=YBobuop2UmN;XTr_^jn!*>;nT?0j$+Wk}~P)rlxUfd{fEEjwSdq z!SSzX_4X#hmisb+$+KgZc!#nXA2Z_5X!L{R31l=;e0In&+ev`Alaz=S8YTwW^n1xs zMz)zI*OqiNf+aPn6+KzNXB53IT!z1!*YJze*F~xw{Rb($r985>vD&S`x%S6(W=^x0 z|HPTNtPfvP3 zy^s}M&BYfIFv0aKS3Tk=GC`$xD8{!w`9TF^BLO(Mxj<79@gg2S zsz}#f@6rLjTonog;$cVg_ldM2eRA!Ps19jy-PLt2Te7mU(pA)T#&g5IMnWQy{L)lS z6U2Nz{}0}u8osUDH8`hDES;n-st^Bx0x|=E5r`}Zhu_`T*OwBK?b(;h{MW5E zc1lVLDMxN@vsI~~%2aKP-o3nV$|=A^3yy+uvg=ik&!HCHmrrSCN!1J=|4wjvBGih` z{dwr#Yv%0%s6w|w4FeuB`ekf@0;EIREj zt?3Ch#R)?8{Nu2Cm>*j#KYtgI)0^vV(CcgVcWy2sUc81Q&PwvlyD`F-=(jCohihg? z`!3zJSn%-aspWC%LCLo_KUODO9Q7lC=W~m7e-4ilYY_)ij*N3%Ki29jkXd6ty8-7_vJ*=MuIZgPS(HN zIXX(YnxtAN-9>G#H+-fW-WX?4=~{SWck8GK-J&HI_~+5Ou&|O^^tWk_Ghd-%RfCvk zDuCg{oTqAw>)4zvi${;U!Ug5BobHKxuX+k74h~L(|JHwIsplxiSxj7GF7Z-xO`}$> zT(QkO7lDN!l@131xiU&IUnL4B8Y}y0?5!{HfjL1;+Jd?A2re?^v(&cv#bP7M?mt{` z-Z2aa36VTf$bOo~5KFew{|cB1xmo;lfPt)C6nPihn2jnj!PG}# ze7e(5zqpIo3Opej*z0Xa_ONv12(VA>b>=5WuG9Fmk+ZBX-L1Ei%u8JW0HbE>2*&*v zO?ZBICvDlqPUvR0gU`;6E-EVWqi)0_k-uM>GHew4dsuqq6#m*$)yM3rbewR=2}8tH z`)?!2u8tJ|fOkRx2Uj$62mblFo?d>Sr$OH7y1KeSf9R3>86ywT+W7|GlBv=#%P77; zK&`dfKxRO>!KYd`p~jFC!Fzrxz(+n_DAxm;Upf^DF}(4%w0%x^^*p nXZ2lQM=CM#=skniPU56~1Ylcg4KQn&;63JwH5yfE<(>Fn($~#N delta 1911 zcmZ{gc{tno7RF=iMlq&njf%EPg^GP`nb=yR5^2yGQ+sPkEv+R;8$XRwTkMirQ`<<& z*dnN=V3 zp{BW!fsu)+g@uK_rm>-sA>7ayZe)Dc$imvhxOK~4Lel|s5vC4?_70}TMn+C12rDxS zOH*?PFzbY{vNS8iORE1bWbgccLmiR<5{Sa1Qsw)dFq3%@NED+-$~6>V9L{JwG`l%2 zSJS_>iWopB)eX3(E9nQ+9c8$6+R6y9P)P?<=|2@!jRULTf&I=(7t7kZpj#)kUj|>& z8>ThxYt<)pYmW%pLZNqlW8Rc$4aHYZS_yc9FM=u6`ixx#`Hv-!Z8xT31m|}btl%4$ zIp3J=?M3h3y({(JGByMZKdtb1Gt6X?hjSH&!?Bqfcb85`Q)9bc#r6N_W{kES?O-x1 zFsa^--+{RJcouwcE3lncXO~*!#hdv3({^!D(Nx{gfD38!8U{0VApV2UgOHLa^15=x zZ_JOP|EX=#I4)zIWwHk zt$mr9wrbUSZ^Yx@>vN-nnlm=A$1?Fd%IJEvmd;%x3T5}tn?cwL!sMjdTgGO-s}76`C$2w-q-z2ubEqu?H^mHYNpSw}c;FyFqx zoG$$l^^4i=n=`2_%~0`ijgab?TSrt>(r#d}Nttnt7ZfIsYG}yA4GcuWYC?{-E`FNc z+zjNZndK0rg6}JT0iwuc@;j%VW4xF?L|MaXcOk=Vc$j@EWWKgb8!%f-KG=csjXs5X z2;?2MS@46?0;~Udq%5jAhz$v;4-k9Qla|+A#m0xo>wk$}aQ&EY3dd#ga*K_%^(D^2 zYJQHyWI2_(o7{x1#H=1%O z(0n-@aKSe)gB)0z<&AQaN~TJXGSMG69e{AG9U?n$shG#~A$qcSMTG|9cb`Vc5Tdq{wq4%;)(GJE>p zNIJA>*4o|EQ<;VP?C?wd89F>ry~gw+Jw7(}OmS#@aU{h)DY;DOWVT4-3Ff3Q%I6Q%&|G&xMFk&)M830K;q!}| zo16WrUPOCXfK&;Nk4}$>Fe=BhoETT&uZYk_>l3+yv++G2_ERyJFRSaf(Xb$&P|36B z6XjndP9j7FodMjjdkAX-?PQ;G0>{&WZc=)zIU0$~VLIOy8i2kc9L=n;8CNMsE)eG8 za28|=W%MQt2D6Uy0X|;d>rs>cvk4Rox~zv^e=N?2j?4|bLfj9 zVr_jb8m73oSYGK3Qe~{9q~yM+YMNDR2dJWVz|^wh+k3o^=QD{!NkB{KaW)n_rJ_Pk zk9Y$!m~s%+SscL#ES*{VZi{krs~BRl*_7#!;Na>s@c8PtYw=UD8SU4HUAnHCXgy2} z3k#FCavA31>~a^uHD3Ycw-JLWI8eY!-F`ujKv!x@!QF1Kjm(Q-&3tV5Z2rlv00@U6cp6#D6W)VCnDWTI%8sD s5($U3VIV|Hk=AuL9dHtI>1!uM3Uc77)b)n?_}D$i#R=)yWbaS>59)811poj5 diff --git a/vendor/Pushover/Pushover.php b/vendor/Pushover/Pushover.php deleted file mode 100644 index 99049d6a..00000000 --- a/vendor/Pushover/Pushover.php +++ /dev/null @@ -1,452 +0,0 @@ - - * @version 0.2 - * @package php-pushover - * @example test.php - * @link https://pushover.net/api - * @license BSD License - */ - -class Pushover -{ - // api url - const API_URL = 'https://api.pushover.net/1/messages.xml'; - - /** - * Application API token - * - * @var string - */ - private $_token; - - /** - * User API token - * - * @var string - */ - private $_user; - - /** - * Turn on/off debug mode - * - * @var bool - */ - private $_debug = false; - - /** - * Title of the message - * - * @var string - */ - private $_title; - - /** - * The message itself (up to 512 characters) - * - * @var string - */ - private $_message; - - /** - * Timestamp in Unix timestamp format - * - * @var int - */ - private $_timestamp; - - /** - * User's device (user specific) - * - * @var string - */ - private $_device; - - /** - * Priority of the message. Can be 0, 1 or 2. High-priority messages (1) override a user's "quiet hours" setting and will always be delivered any time they are received. High priority messages are highlighted in red in the Android and iOS clients. Emergency Priority (2) messages work similar to High-Priority messages, but they are repeated until the message is acknowledged by the user. - * - * @var string - */ - private $_priority = 0; - - /** - * Include a Supplementary URL (up to 200 characters) - * - * @var string - */ - private $_url; - - /** - * Title of the included URL (up to 50 characters) - * - * @var string - */ - private $_url_title; - - /** - * The Retry parameter is only used when the Priority is set to 2 (or emergency-priority), and specifies how often (in seconds) the Pushover servers will send the same notification to the user. In a situation where your user might be in a noisy environment or sleeping, retrying the notification (with sound and vibration) will help get his or her attention. This parameter must have a value of at least 30 seconds between retries. - * - * @var int - */ - private $_retry; - - /** - * The expire parameter is only used when the Priority is set to 2 (or emergency-priority), and specifies how many seconds your notification will continue to be retried for. If the notification has not been acknowledged in expire seconds, it will be marked as expired and will stop being sent to the user. This parameter must have a maximum value of at most 86400 seconds (24 hours). - * - * @var int - */ - private $_expire; - - /** - * The optional callback parameter may be supplied with a publicly-accessible URL that our servers will send a request to when the user has acknowledged your notification. - * - * @var string - */ - private $_callback; - - /** - * The sound parameter. Get an up-to-date sound list from https://api.pushover.net/1/sounds.json?token= - * - * @var int - */ - private $_sound; - - /** - * Default constructor - */ - public function __construct () { - } - - /** - * Set API token - * - * @param string $token Your app API key. - * - * @return void - */ - public function setToken ($token) { - $this->_token = (string)$token; - } - - /** - * Get API token - * - * @return string - */ - public function getToken () { - return $this->_token; - } - - /** - * Set API user - * - * @param string $user The user's API key. - * - * @return void - */ - public function setUser ($user) { - $this->_user = (string)$user; - } - - /** - * Get API user - * - * @return string - */ - public function getUser () { - return $this->_user; - } - - /** - * Set message title - * - * @param string $title Title of push notification. - * - * @return void - */ - public function setTitle ($title) { - $this->_title = (string)$title; - } - - /** - * Get message title - * - * @return string - */ - public function getTitle () { - return $this->_title; - } - - /** - * Set Retry Time - * - * @param int $retry The retry time (in seconds). Must have a value of at least 30 seconds. - */ - public function setRetry ($retry) { - $this->_retry = (int)$retry; - } - - /** - * Get Retry Time - * - * @return int - */ - public function getRetry() { - return $this->_retry; - } - - /** - * Set Expire Time - * - * @param int $expire The expiry time (in seconds). Must have a maximum value of at most, 86400 seconds. - */ - public function setExpire ($expire) { - $this->_expire = (int)$expire; - } - - /** - * Get Expire Time - * - * @return string - */ - public function getExpire () { - return $this->_expire; - } - - /** - * Set Callback URL - * - * @param string $callback a publically-accessible URL that Pushover sends a request to when the user has acknowledged your notification. - */ - public function setCallback ($callback) { - $this->_callback = $callback; - } - - /** - * Get Callback URL - * - * @return int - */ - public function getCallback() { - return $this->_callback; - } - - /** - * Set message - * - * @param string $msg Message of push notification. - * - * @return void - */ - public function setMessage ($msg) { - $this->_message = (string)$msg; - } - - /** - * Get message - * - * @return string - */ - public function getMessage () { - return $this->_message; - } - - /** - * Set device - * - * @param string $device Leave this empty if you want to send to all user's devices. This can be user specific! - * - * @return void - */ - public function setDevice ($device) { - $this->_device = (string)$device; - } - - /** - * Get device - * - * @return string - */ - public function getDevice () { - return $this->_device; - } - - /** - * Set timestamp - * - * Messages are stored on the Pushover servers with a timestamp of when they were initially received through the API. This timestamp is sent to and shown on client devices, and messages are listed in order of these timestamps. In most cases, this default timestamp is acceptable. This is not for scheduling! - * - * @param int $time dispaly time on device - * - * @return void - */ - public function setTimestamp ($time) { - $this->_timestamp = (int)$time; - } - - /** - * Get timestamp - * - * @return int - */ - public function getTimestamp () { - return $this->_timestamp; - } - - /** - * Set priority (-1, 0 or 1) - * - * -1 Low priority notifications. - * 0 Default. - * 1 triggers a high-priority alert that always generates sound and vibration. - * 2 triggers the same high-priority alert that #1 does; but is repeated until the notification is acknowledged by the user. - * - * @param int $priority priority level. - * - * @return void - */ - public function setPriority ($priority) { - $this->_priority = (int)$priority; - } - - /** - * Get priority - * - * @return int - */ - public function getPriority () { - return $this->_priority; - } - - /** - * Set url - * - * @param string $url Add an url to your notification. - * - * @return void - */ - public function setUrl ($url) { - $this->_url = (string)$url; - } - - /** - * Get url - * - * @return string - */ - public function getUrl () { - return $this->_url; - } - - /** - * Set url title - * - * @param string $url_title A title if you want to show a text instead of the actual url. - * - * @return void - */ - public function setUrlTitle ($url_title) { - $this->_url_title = (string)$url_title; - } - - /** - * Get url title - * - * @return string - */ - public function getUrlTitle () { - return $this->_url_title; - } - - /** - * Set debug mode - * - * @param bool $debug Enable this to receive detailed input and output info. - * - * @return void - */ - public function setDebug ($debug) { - $this->_debug = (boolean)$debug; - } - - /** - * Get debug mode - * - * @return bool - */ - public function getDebug () { - return $this->_debug; - } - - /** - * Set sound - * - * @param string $sound If no sound parameter is specified, the user's default tone will play. If the user has not chosen a custom sound, the standard Pushover sound will play. - * - * @return void - */ - public function setSound ($sound) { - $this->_sound = (string)$sound; - } - - /** - * Get sound - * - * @return string - */ - public function getSound () { - return $this->_sound; - } - - /** - * Send message to Pushover API - * - * @return bool - */ - public function send() { - if(!Empty($this->_token) && !Empty($this->_user) && !Empty($this->_message)) { - if(!isset($this->_timestamp)) $this->setTimestamp(time()); - - $c = curl_init(); - curl_setopt($c, CURLOPT_URL, self::API_URL); - curl_setopt($c, CURLOPT_HEADER, false); - /* - if possible, set CURLOPT_SSL_VERIFYPEER to true.. - - http://www.tehuber.com/phps/cabundlegen.phps - */ - curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($c, CURLOPT_RETURNTRANSFER, true); - curl_setopt($c, CURLOPT_POSTFIELDS, array( - 'token' => $this->getToken(), - 'user' => $this->getUser(), - 'title' => $this->getTitle(), - 'message' => $this->getMessage(), - 'device' => $this->getDevice(), - 'priority' => $this->getPriority(), - 'timestamp' => $this->getTimestamp(), - 'expire' => $this->getExpire(), - 'retry' => $this->getRetry(), - 'callback' => $this->getCallback(), - 'url' => $this->getUrl(), - 'sound' => $this->getSound(), - 'url_title' => $this->getUrlTitle() - )); - $response = curl_exec($c); - $xml = simplexml_load_string($response); - - if($this->getDebug()) { - return array('output' => $xml, 'input' => $this); - } - else { - return ($xml->status == 1) ? true : false; - } - } - } -} -?> \ No newline at end of file