Merge branch 'develop' of https://github.com/phpservermon/phpservermon into develop
This commit is contained in:
commit
23e09b613a
16
README.rst
16
README.rst
|
@ -60,6 +60,7 @@ The following SMS gateways are currently available:
|
|||
* SolutionsInfini - <https://solutionsinfini.com/>
|
||||
* Plivo - <https://www.plivo.com/>
|
||||
* Callr - <https://www.callr.com/>
|
||||
* SMSAPI - <https://www.smsapi.com/en>
|
||||
|
||||
|
||||
|
||||
|
@ -79,10 +80,19 @@ Requirements
|
|||
* MySQL database
|
||||
* For PHP5: 5.5.9+
|
||||
* For PHP7: 7.0.8+
|
||||
* PHP cURL package
|
||||
* PHP PDO mysql driver
|
||||
* PHP-XML
|
||||
* PHP Extensions (modules)
|
||||
|
||||
* ext-curl
|
||||
* ext-ctype
|
||||
* ext-filter
|
||||
* ext-hash
|
||||
* ext-json
|
||||
* ext-libxml
|
||||
* ext-openssl
|
||||
* ext-pdo
|
||||
* ext-pcre
|
||||
* ext-sockets
|
||||
* ext-xml
|
||||
|
||||
Install
|
||||
-------
|
||||
|
|
|
@ -85,6 +85,10 @@ The following people have contributed to the development of PHP Server Monitor:
|
|||
|
||||
* Nexmo SMS gateway
|
||||
|
||||
* Mateusz Małek - https://github.com/mateuszmalek
|
||||
|
||||
* SMSAPI gateway
|
||||
|
||||
Translators
|
||||
+++++++++++
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ The other way is to parse the access logs created by your webserver software, wh
|
|||
|
||||
When using tools such as Google Analytics, the monitor requests will not show up in your statistics, because the monitor does not execute any Javascript.
|
||||
Tools that parse your raw access logs like Awstats, will include the requests made by the monitor.
|
||||
To make sure these requests can be identified, the monitor uses a custom user agent, which you can usually filter out. The user agent of the monitor looks like::
|
||||
To make sure these requests can be identified, the monitor uses a custom user agent, which you can usually filter out. The user agent can be modified in the config section, but bij default looks like::
|
||||
|
||||
Mozilla/5.0 (compatible; phpservermon/3.0.1; +http://www.phpservermonitor.org)
|
||||
|
||||
|
|
|
@ -452,8 +452,8 @@ namespace {
|
|||
}
|
||||
|
||||
if ($add_agent) {
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; phpservermon/' .
|
||||
PSM_VERSION . '; +https://github.com/phpservermon/phpservermon)');
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, psm_get_conf('user_agent', 'Mozilla/5.0 (compatible; phpservermon/' .
|
||||
PSM_VERSION . '; +https://github.com/phpservermon/phpservermon)'));
|
||||
}
|
||||
|
||||
$result['exec'] = curl_exec($ch);
|
||||
|
@ -689,7 +689,7 @@ namespace {
|
|||
$client->add_cb('on_auth_success', function () use ($client, $receivers, $message) {
|
||||
JAXLLogger::info('got on_auth_success cb');
|
||||
foreach ($receivers as $receiver) {
|
||||
$client->send_chat_msg($receiver, $message);
|
||||
$client->send_chat_msg($receiver, $message);
|
||||
}
|
||||
$client->send_end_stream();
|
||||
});
|
||||
|
@ -779,6 +779,9 @@ namespace {
|
|||
case 'solutionsinfini':
|
||||
$sms = new \psm\Txtmsg\SolutionsInfini();
|
||||
break;
|
||||
case 'smsapi':
|
||||
$sms = new \psm\Txtmsg\SMSAPI();
|
||||
break;
|
||||
}
|
||||
|
||||
// copy login information from the config file
|
||||
|
|
|
@ -66,6 +66,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'преди минута',
|
||||
'seconds_ago' => 'преди %d секунди',
|
||||
'a_second_ago' => 'преди секунда',
|
||||
'seconds' => 'секунди',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Настройки',
|
||||
|
@ -219,8 +220,6 @@ $sm_lang = array(
|
|||
'email_smtp' => 'Активиране на SMTP',
|
||||
'email_smtp_host' => 'SMTP сървър',
|
||||
'email_smtp_port' => 'SMTP порт',
|
||||
'email_smtp_security' => 'SMTP security',
|
||||
'email_smtp_security_none' => 'None',
|
||||
'email_smtp_username' => 'SMTP потребителско име',
|
||||
'email_smtp_password' => 'SMTP парола',
|
||||
'email_smtp_noauth' => 'Оставете празно за "без аутентикация"',
|
||||
|
@ -267,7 +266,6 @@ $sm_lang = array(
|
|||
системата',
|
||||
'log_sms' => 'Да се пази ли лог на изпратените SMS съобщения от
|
||||
системата',
|
||||
'log_pushover' => 'Log pushover messages sent by the script',
|
||||
'updated' => 'Настройките са обновени успешно.',
|
||||
'tab_email' => 'Имейл',
|
||||
'tab_sms' => 'SMS',
|
||||
|
|
|
@ -347,7 +347,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-recàrrega',
|
||||
'auto_refresh_description' => 'Recarregar automàticament la plana Servidors.<br/><span class="small">Temps en
|
||||
segons, si poseu ZERO la plana no s\'auto-recarregarà.</span>',
|
||||
'seconds' => 'segons',
|
||||
'test' => 'Provar',
|
||||
'test_email' => 'S\'enviarà un correu a l\'adreça que teniu al vostre perfil d\'usuari.',
|
||||
'test_sms' => 'S\'enviarà un SMS al telèfon que teniu al vostre perfil d\'usuari.',
|
||||
|
|
|
@ -68,6 +68,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'cca před minutou',
|
||||
'seconds_ago' => 'před %d vteřinami',
|
||||
'a_second_ago' => 'před chvílí',
|
||||
'seconds' => 'sekunder',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Konfigurace',
|
||||
|
@ -260,7 +261,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Automaticky obnovit',
|
||||
'auto_refresh_description' => 'Automaticky obnovit stránku Servery.<br><span class="small">Čas v sekundách,
|
||||
0 pro vypnutí automatického obnovení.</span>',
|
||||
'seconds' => 'sekund',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'E-mail bude odeslán na adresu uvedenou v uživatelském profilu.',
|
||||
'test_sms' => 'SMS bude odeslána na telefonní číslo uvedené v uživatelském profilu.',
|
||||
|
|
|
@ -65,6 +65,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'omkring et minut siden',
|
||||
'seconds_ago' => '%d sekunder siden',
|
||||
'a_second_ago' => 'et sekund siden',
|
||||
'seconds' => 'sekunder',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Indstillinger',
|
||||
|
@ -245,7 +246,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Genopfrisk automatisk',
|
||||
'auto_refresh_description' => 'Genopfrisk automatisk serversider.<br><span class="small">Tid i sekunder. Hvis
|
||||
0 vil siden ikke genopfriske automatisk</span>',
|
||||
'seconds' => 'sekunder',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'En e-mail vil blive sendt til den adresse, der er angivet i din brugerprofil.',
|
||||
'test_sms' => 'En SMS vil blive sendt til det nummer, der er angivet i din brugerprofil.',
|
||||
|
|
|
@ -66,6 +66,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'vor über einer Minute',
|
||||
'seconds_ago' => 'vor %d Sekunden',
|
||||
'a_second_ago' => 'vor über einer Sekunde',
|
||||
'seconds' => 'Sekunden',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Einstellungen',
|
||||
|
@ -249,7 +250,6 @@ $sm_lang = array(
|
|||
'auto_refresh_description' => 'Automatische Aktualisierung der Server-Übersichtsseite<br><span
|
||||
class="small">Zeit in Sekunden - die Ziffer \'0\' deaktiviert die automatische
|
||||
Aktualisierung.</span>',
|
||||
'seconds' => 'Sekunden',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Eine E-Mail wird an die E-Mail-Adresse gesendet, die in Ihrem Profil hinterlegt ist.',
|
||||
'test_sms' => 'Eine SMS wird an die Telefonnummer gesendet, die in Ihrem Profil hinterlegt ist.',
|
||||
|
|
|
@ -83,6 +83,8 @@ $sm_lang = array(
|
|||
'minutes' => 'minutes',
|
||||
'second' => 'second',
|
||||
'seconds' => 'seconds',
|
||||
'millisecond' => 'millisecond',
|
||||
'milliseconds' => 'milliseconds',
|
||||
'current' => 'current',
|
||||
'settings' => 'Settings',
|
||||
'search' => 'Search',
|
||||
|
@ -281,6 +283,7 @@ $sm_lang = array(
|
|||
),
|
||||
'config' => array(
|
||||
'general' => 'General',
|
||||
'site_title' => 'Site title',
|
||||
'language' => 'Language',
|
||||
'show_update' => 'Check for updates?',
|
||||
'password_encrypt_key' => 'The encryption key password',
|
||||
|
@ -379,7 +382,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-refresh',
|
||||
'auto_refresh_description' => 'Auto-refresh servers page.<br><span class="small">Time in seconds, if 0 the
|
||||
page won\'t refresh.</span>',
|
||||
'seconds' => 'seconds',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'An email will be sent to the address specified in your user profile.',
|
||||
'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.',
|
||||
|
@ -414,6 +416,8 @@ $sm_lang = array(
|
|||
'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',
|
||||
'user_agent' => 'User Agent',
|
||||
'user_agent_key_note' => 'Custom user agent used by monitor within communication with external services.',
|
||||
),
|
||||
'notifications' => array(
|
||||
'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%',
|
||||
|
|
|
@ -354,7 +354,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-actualizar',
|
||||
'auto_refresh_description' => 'Auto-actualizar la página de servidores.<br><span class="small">Tiempo en
|
||||
segundos, si se utiliza 0 la página no se actualizará.</span>',
|
||||
'seconds' => 'segundos',
|
||||
'test' => 'Prueba',
|
||||
'test_email' => 'Un correo electrónico será enviado a la dirección especificada en su perfil de usuario.',
|
||||
'test_sms' => 'Un SMS se enviará al número de teléfono especificado en su perfil de usuario.',
|
||||
|
|
|
@ -66,6 +66,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'umbes minut aega tagasi',
|
||||
'seconds_ago' => '%d sekundit tagasi',
|
||||
'a_second_ago' => 'üks sekund tagasi',
|
||||
'seconds' => 'sekundit',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Konfiguratsioon',
|
||||
|
@ -244,7 +245,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Automaatne värskendamine',
|
||||
'auto_refresh_description' => 'Värskenda lehte automaatselt.<br><span class="small">Aeg sekundites, kui 0
|
||||
siis lehte ei värskendata.</span>',
|
||||
'seconds' => 'sekundit',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Email saadetakse profiilil märgitud aadressile.',
|
||||
'test_sms' => 'SMS saadetakse profiilil märgitud numbrile.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'حدود یک دقیقه پیش',
|
||||
'seconds_ago' => '%d ثانیه پیش',
|
||||
'a_second_ago' => 'یک ثانیه پیش',
|
||||
'seconds' => 'ثانیه',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'تنظیم',
|
||||
|
@ -263,7 +264,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'رفرش خودکار',
|
||||
'auto_refresh_description' => 'رفرش خودکار صفحه سرورها.<br><span class="small">زمان
|
||||
به ثنیه, اگر 0 باشد صفحه رفرش نخواهد شد.</span>',
|
||||
'seconds' => 'ثانیه',
|
||||
'test' => 'تست',
|
||||
'test_email' => 'یک ایمیل به آدرس تعیین شده در پروفایل شما ارسال
|
||||
خواهد شد.',
|
||||
|
|
|
@ -244,7 +244,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Automaattipäivitys',
|
||||
'auto_refresh_description' => 'Päivittää automaattisesti palvelimet-sivun.<br><span class="small">Aika
|
||||
sekunteina, jos 0, sivu ei päivity automaattisesti.</span>',
|
||||
'seconds' => 'sekuntia',
|
||||
'test' => 'Testi',
|
||||
'test_email' => 'Testisähköposti lähetetään profiilisi sähköpostiosoitteeseen.',
|
||||
'test_sms' => 'Testitekstiviesti lähetetään profiilisi numeroon.',
|
||||
|
|
|
@ -361,7 +361,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-rachaîchissement',
|
||||
'auto_refresh_description' => 'Auto-rachaîchissement de la page serveurs.<br><span class="small">Temps en
|
||||
secondes. Si 0, la page n\'est pas rafraîchie.</span>',
|
||||
'seconds' => 'secondes',
|
||||
'test' => 'Tester',
|
||||
'test_email' => 'Un email va vous être envoyé à l\'adresse définie dans votre profil utilisateur.',
|
||||
'test_sms' => 'Un SMS va vous être envoyé au numéro défini dans votre profil utilisateur.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'circa un minuto fa',
|
||||
'seconds_ago' => '%d secondi fa',
|
||||
'a_second_ago' => 'un secondo fa',
|
||||
'seconds' => 'secondi',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Configurazione',
|
||||
|
@ -247,7 +248,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-Aggiornamento',
|
||||
'auto_refresh_description' => 'Auto-Aggiornamento pagina servers.<br><span class="small">Tempo in secondi, se
|
||||
impostato a 0 la pagina non si aggiornerà.</span>',
|
||||
'seconds' => 'secondi',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Un Email verrà inviata all\'indirizzo specificato nel tuo profilo.',
|
||||
'test_sms' => 'Un SMS verrà inviato al numero di telefono specificato nel tuo profilo.',
|
||||
|
|
|
@ -345,7 +345,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => '自動更新',
|
||||
'auto_refresh_description' => 'サーバーページを自動更新します。<br><span
|
||||
class="small">時間を秒で指定し、0に設定すると更新しません。</span>',
|
||||
'seconds' => '秒',
|
||||
'test' => 'テスト',
|
||||
'test_email' => 'あなたのユーザープロフィールで指定されたアドレスに電子メールが送信されます。',
|
||||
'test_sms' => 'あなたのユーザープロフィールで指定された電話番号にSMSが送信されます。',
|
||||
|
|
|
@ -81,6 +81,8 @@ $sm_lang = array(
|
|||
'minutes' => 'minuten',
|
||||
'second' => 'seconde',
|
||||
'seconds' => 'seconden',
|
||||
'millisecond' => 'milliseconde',
|
||||
'milliseconds' => 'milliseconden',
|
||||
'current' => 'huidig',
|
||||
'settings' => 'Instellingen',
|
||||
),
|
||||
|
@ -110,8 +112,8 @@ $sm_lang = array(
|
|||
'email' => 'Email',
|
||||
'pushover' => 'Pushover',
|
||||
'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te
|
||||
ontvangen. Zie <a href="https://pushover.net/" target="_blank">hun website</a> voor meer
|
||||
informatie.',
|
||||
ontvangen. Zie <a href="https://pushover.net/" target="_blank">hun website</a> voor
|
||||
meer informatie.',
|
||||
'pushover_key' => 'Pushover Key',
|
||||
'pushover_device' => 'Pushover Device',
|
||||
'pushover_device_description' => 'Apparaat waar de berichten naar toe gaan. Laat leeg voor alle apparaten.',
|
||||
|
@ -244,6 +246,7 @@ $sm_lang = array(
|
|||
),
|
||||
'config' => array(
|
||||
'general' => 'Algemeen',
|
||||
'site_title' => 'Website titel',
|
||||
'language' => 'Taal',
|
||||
'show_update' => 'Controleer wekelijks voor updates?',
|
||||
'email_status' => 'Sta email berichten toe?',
|
||||
|
@ -264,8 +267,8 @@ $sm_lang = array(
|
|||
'sms_from' => 'Telefoonnummer afzender',
|
||||
'pushover_status' => 'Sta Pushover berichten toe?',
|
||||
'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te
|
||||
ontvangen. Zie <a href="https://pushover.net/" target="_blank">hun website</a> voor meer
|
||||
informatie.',
|
||||
ontvangen. Zie <a href="https://pushover.net/" target="_blank">hun website</a> voor
|
||||
meer informatie.',
|
||||
'pushover_clone_app' => 'Klik hier om je Pushover app te maken',
|
||||
'pushover_api_token' => 'Pushover App API Token',
|
||||
'pushover_api_token_description' => 'Voordat je Pushover kunt gebruiken moet je een <a href="%1$s"
|
||||
|
@ -308,7 +311,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Herlaad automatisch',
|
||||
'auto_refresh_description' => 'Auto-herladen servers pagina.<br><span class="small">Tijd in seconden, als de
|
||||
tijd 0 is wordt de pagina niet ververst.</span>',
|
||||
'seconds' => 'seconden',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Er zal een email verstuurd worden naar het email adres in je profiel.',
|
||||
'test_sms' => 'Er zal een SMS verstuurd worden naar het telefoonnummer in je profiel.',
|
||||
|
@ -336,6 +338,9 @@ $sm_lang = array(
|
|||
'log_retention_period_description' => 'Aantal dagen dat logs van notificaties en archieven van server uptime
|
||||
worden bewaard. Vul 0 in om log opruiming uit te zetten.',
|
||||
'log_retention_days' => 'dagen',
|
||||
'user_agent' => 'User Agent',
|
||||
'user_agent_key_note' => 'Aangepaste user agent wordt door de monitor gebruikt bij de communicatie met externe
|
||||
services.',
|
||||
),
|
||||
'notifications' => array(
|
||||
'off_sms' => 'Server %LABEL% is DOWN: ip=%IP%, poort=%PORT%. Fout=%ERROR%',
|
||||
|
|
|
@ -326,7 +326,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-refresh',
|
||||
'auto_refresh_description' => 'Auto-refresh server side.<br><span class="small">Tid i sekunder, hvis 0 siden
|
||||
ikke blir oppdatert.</span>',
|
||||
'seconds' => 'sekunder',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'En e-post vil bli sendt til adressen spesifisert i brukerprofilen din.',
|
||||
'test_sms' => 'En tekstmelding vil bli sendt til telefonnummeret som er angitt i brukerprofilen din.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'minutę temu',
|
||||
'seconds_ago' => '%d sekund temu',
|
||||
'a_second_ago' => 'sekundę temu',
|
||||
'seconds' => 'sekund',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Konfiguracja',
|
||||
|
@ -191,6 +192,7 @@ $sm_lang = array(
|
|||
),
|
||||
'config' => array(
|
||||
'general' => 'Ogólne',
|
||||
'site_title' => 'Tytuł strony',
|
||||
'language' => 'Język',
|
||||
'show_update' => 'Sprawdzić aktualizacje?',
|
||||
'email_status' => 'Pozwól na wysyłkę email',
|
||||
|
@ -211,8 +213,8 @@ $sm_lang = array(
|
|||
'sms_from' => 'Numer nadawcy',
|
||||
'pushover_status' => 'Pozwól na wysyłkę notyfikacji Pushover',
|
||||
'pushover_description' => 'Pushover jest usługą ułatwiającą otrzymywanie powiadomień w czasie
|
||||
rzeczywistym. Sprawdź <a href="https://pushover.net/" target="_blank">ich stronę</a> aby uzyskać
|
||||
więcej informacji.',
|
||||
rzeczywistym. Sprawdź <a href="https://pushover.net/" target="_blank">ich
|
||||
stronę</a> aby uzyskać więcej informacji.',
|
||||
'pushover_clone_app' => 'Kliknij tutaj aby stworzyć aplikację korzystającą z Pushover',
|
||||
'pushover_api_token' => 'Pushover App API Token',
|
||||
'pushover_api_token_description' => 'Zanim zaczniesz używać Pushover, musisz <a href="%1$s" target="_blank"
|
||||
|
@ -247,7 +249,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-odświeżanie',
|
||||
'auto_refresh_description' => 'Auto-odświeżanie strony serwera.<br><span class="small">Czas w sekundach, dla
|
||||
czasu 0 strona nie będzie odświeżana.</span>',
|
||||
'seconds' => 'sekund',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Email zostanie wysłany na adres podany w Twoim profilu.',
|
||||
'test_sms' => 'SMS zostanie wysłany na numer podany w Twoim profilu.',
|
||||
|
@ -272,6 +273,8 @@ $sm_lang = array(
|
|||
archiwizować uptime serwera. Wpisz 0 aby wyłączyć czyszczenie
|
||||
logów.',
|
||||
'log_retention_days' => 'dni',
|
||||
'user_agent' => 'User Agent',
|
||||
'user_agent_key_note' => 'Nazwa używana przez monitoring do identyfikacji ze sprawdzaną usługą.',
|
||||
),
|
||||
'notifications' => array(
|
||||
'off_sms' => 'Serwer \'%LABEL%\' przestał odpowiadać: ip=%IP%, port=%PORT%. Błąd=%ERROR%',
|
||||
|
|
|
@ -66,6 +66,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'cerca de um minuto atrás',
|
||||
'seconds_ago' => '%d segundos atrás',
|
||||
'a_second_ago' => 'um segundo atrás',
|
||||
'seconds' => 'segundos',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Configuração',
|
||||
|
@ -245,7 +246,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Atualizar automaticamente',
|
||||
'auto_refresh_description' => 'Atualizar automaticamente a página de servidores.<br><span class="small">Tempo
|
||||
em segundos, Se 0 a página não será atualizada.</span>',
|
||||
'seconds' => 'segundos',
|
||||
'test' => 'Teste',
|
||||
'test_email' => 'Um e-mail será enviado para o endereço especificado em seu perfil de usuário.',
|
||||
'test_sms' => 'Um SMS será enviado para o número de telefone especificado em seu perfil de usuário.',
|
||||
|
|
|
@ -121,12 +121,12 @@ $sm_lang = array(
|
|||
пустым, что бы отправлять уведомления на
|
||||
все устройства.',
|
||||
'telegram' => 'Telegram',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> удобный мессенджер
|
||||
для получения уведомлений в реальном
|
||||
времени. Посетите <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">раздел документации</a>
|
||||
для получения доп. информации и инструкций по
|
||||
установке.',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> удобный
|
||||
мессенджер для получения уведомлений в
|
||||
реальном времени. Посетите <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">раздел
|
||||
документации</a> для получения доп. информации
|
||||
и инструкций по установке.',
|
||||
'telegram_chat_id' => 'Telegram chat id',
|
||||
'telegram_chat_id_description' => 'Сообщения будут отправляться на
|
||||
указанный идентификатор чата.',
|
||||
|
@ -313,12 +313,12 @@ $sm_lang = array(
|
|||
rel="noopener">"App"</a> на их веб-сайте и ввести "App
|
||||
API Token" сюда.',
|
||||
'telegram_status' => 'Разрешить отправку уведомлений в Telegram',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> удобный мессенджер
|
||||
для получения уведомлений в реальном
|
||||
времени. Посетите <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">раздел документации</a>
|
||||
для получения доп. информации и инструкций по
|
||||
установке.',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> удобный
|
||||
мессенджер для получения уведомлений в
|
||||
реальном времени. Посетите <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">раздел
|
||||
документации</a> для получения доп. информации
|
||||
и инструкций по установке.',
|
||||
'telegram_api_token' => 'Telegram API Token',
|
||||
'telegram_api_token_description' => 'Прежде чем вы сможете начать
|
||||
пользоваться Telegram, вам необходимо
|
||||
|
@ -371,7 +371,6 @@ $sm_lang = array(
|
|||
серверов.<br><span class="small">Время в секундах.
|
||||
Если указано 0, то страница не будет
|
||||
обновляться.</span>',
|
||||
'seconds' => 'секунд',
|
||||
'test' => 'Проверка',
|
||||
'test_email' => 'Сообщение будет отправлено на адрес указаный в
|
||||
профиле пользователя.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'cca pred minútou',
|
||||
'seconds_ago' => 'pred %d sekundami',
|
||||
'a_second_ago' => 'pred chvíľou',
|
||||
'seconds' => 'sekúnd',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Konfigurácia',
|
||||
|
@ -259,7 +260,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Automaticky obnoviť',
|
||||
'auto_refresh_description' => 'Automaticky obnoviť stránku Servery.<br><span class="small">Čas v
|
||||
sekundách, 0 pre vypnutie automatického obnovenia.</span>',
|
||||
'seconds' => 'sekúnd',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'E-mail bude odoslaný na adresu uvedenú v užívateľskom profile.',
|
||||
'test_sms' => 'SMS bude odoslaná na telefónne číslo uvedené v užívateľskom profile.',
|
||||
|
|
|
@ -65,6 +65,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'pred približno minuto',
|
||||
'seconds_ago' => 'pred %d sekundami',
|
||||
'a_second_ago' => 'pred sekundo',
|
||||
'seconds' => 'sekund',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Nastavitve',
|
||||
|
@ -92,8 +93,8 @@ $sm_lang = array(
|
|||
'email' => 'E-pošta',
|
||||
'pushover' => 'Pushover',
|
||||
'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času.
|
||||
Več informacij je na voljo <a href="https://pushover.net/" target="_blank">na njihovi spletni
|
||||
strani</a>.',
|
||||
Več informacij je na voljo <a href="https://pushover.net/" target="_blank">na
|
||||
njihovi spletni strani</a>.',
|
||||
'pushover_key' => 'Pushover ključ',
|
||||
'pushover_device' => 'Pushover naprava',
|
||||
'pushover_device_description' => 'Ime naprave na katero naj se pošlje obvestilo. Če želite obvestilo
|
||||
|
@ -209,8 +210,8 @@ $sm_lang = array(
|
|||
'sms_from' => 'Telefonska številka pošiljatelja',
|
||||
'pushover_status' => 'Dovolim pošiljanje Pushover sporočil',
|
||||
'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času.
|
||||
Več informacij je na voljo <a href="https://pushover.net/" target="_blank">na njihovi spletni
|
||||
strani</a>.',
|
||||
Več informacij je na voljo <a href="https://pushover.net/" target="_blank">na
|
||||
njihovi spletni strani</a>.',
|
||||
'pushover_clone_app' => 'Kliknite za ustvarjanje vaše Pushover aplikacije',
|
||||
'pushover_api_token' => 'Pushover API žeton',
|
||||
'pushover_api_token_description' => 'Pred uporabo storitve Pushover, morate na njihovi spletni strani <a
|
||||
|
@ -247,7 +248,6 @@ $sm_lang = array(
|
|||
'auto_refresh_description' => 'Samodejno posodabljanje pregleda statusa strežnikov.<br><span
|
||||
class="small">Čas v sekundah. Če je vrednost 0 se stran ne bo samodejno
|
||||
posodabljala.</span>',
|
||||
'seconds' => 'sekund',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Na naslov, ki ste ga določili v vašem profilu, bo poslano e-sporočilo.',
|
||||
'test_sms' => 'Na telefonsko številko, ki ste jo določili v vašem profilu, bo poslan SMS.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'ungefär en minut sen',
|
||||
'seconds_ago' => '%d sekunder sedan',
|
||||
'a_second_ago' => 'en sekund sedan',
|
||||
'seconds' => 'sekunder',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Inställningar',
|
||||
|
@ -94,7 +95,8 @@ $sm_lang = array(
|
|||
'email' => 'Email',
|
||||
'pushover' => 'Pushover',
|
||||
'pushover_description' => 'Pushover är en tjänst som skickar meddelande i realtid. Se <a
|
||||
href="https://pushover.net/" target="_blank">deras webbsida</a> för mer information.',
|
||||
href="https://pushover.net/" target="_blank">deras webbsida</a> för mer
|
||||
information.',
|
||||
'pushover_key' => 'Pushover Key',
|
||||
'pushover_device' => 'Pushover Device',
|
||||
'pushover_device_description' => 'Enhetsnman att skicka meddelande till. Lämna tomt för att skicka till alla
|
||||
|
@ -245,7 +247,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Auto-uppdatera',
|
||||
'auto_refresh_description' => 'Auto-uppdatera status-sidan.<br><span class="small">Tid i sekunder, om "0" så
|
||||
uppdateras sidan inte automatiskt.</span>',
|
||||
'seconds' => 'sekunder',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Ett emial kommer skickas till adressen i din profil.',
|
||||
'test_sms' => 'Ett SMS kommer skickas till mobilnumret i din profil.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'yaklaşık bir dakika önce',
|
||||
'seconds_ago' => '%d saniye önce',
|
||||
'a_second_ago' => 'bir saniye önce',
|
||||
'seconds' => 'saniye',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Ayarlar',
|
||||
|
@ -248,7 +249,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Otomatik Yenileme',
|
||||
'auto_refresh_description' => 'Otomatik yenileme sunucu sayfası<br><span class="small">Eğer sayfa yenilenmez
|
||||
ise.</span>',
|
||||
'seconds' => 'saniye',
|
||||
'test' => 'Test',
|
||||
'test_email' => 'Profilinizde tanımladığınız e-posta adresinize bir e-posta gönderilecek.',
|
||||
'test_sms' => 'Profilinizde tanımladığınız numaranıza bir SMS mesajı gönderilecek.',
|
||||
|
|
|
@ -124,11 +124,12 @@ $sm_lang = array(
|
|||
повідомлення. Залиште пустим, щоб
|
||||
надсилати на всі пристрої.',
|
||||
'telegram' => 'Telegram',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> — чат-застосунок, що
|
||||
дозволяє легко отримувати сповіщення у
|
||||
реальному часі. За деталями й інструкцією зі
|
||||
встановлення зверніться до <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">документації</a>.',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> —
|
||||
чат-застосунок, що дозволяє легко отримувати
|
||||
сповіщення у реальному часі. За деталями й
|
||||
інструкцією зі встановлення зверніться до <a
|
||||
href="http://docs.phpservermonitor.org/"
|
||||
target="_blank">документації</a>.',
|
||||
'telegram_chat_id' => 'Ідентифікатор чату Telegram',
|
||||
'telegram_chat_id_description' => 'Повідомлення буде надіслане у
|
||||
відповідний чат.',
|
||||
|
@ -330,8 +331,8 @@ $sm_lang = array(
|
|||
'pushover_status' => 'Дозволити надсилання Pushover-повідомлень',
|
||||
'pushover_description' => 'Pushover — сервіс, що дозволяє легко отримувати
|
||||
сповіщення у реальному часі. За детальнішою
|
||||
інформацію перейдіть на <a
|
||||
href="https://pushover.net/" target="_blank">їхній вебсайт</a>.',
|
||||
інформацію перейдіть на <a href="https://pushover.net/"
|
||||
target="_blank">їхній вебсайт</a>.',
|
||||
'pushover_clone_app' => 'Натисніть тут, щоб створити ваш Pushover-додаток',
|
||||
'pushover_api_token' => 'Токен API Pushover-додатку',
|
||||
'pushover_api_token_description' => 'Перед використанням Pushover ви маєте <a
|
||||
|
@ -339,16 +340,17 @@ $sm_lang = array(
|
|||
Додаток</a> на їхньому вебсайті та ввести
|
||||
токен API Додатку тут.',
|
||||
'telegram_status' => 'Дозволити надсилання Telegram-повідомлень',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> — чат-застосунок, що
|
||||
дозволяє легко отримувати сповіщення у
|
||||
реальному часі. Детальніша інформація та
|
||||
інструкція зі встановлення доступні у <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">документації</a>.',
|
||||
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> —
|
||||
чат-застосунок, що дозволяє легко отримувати
|
||||
сповіщення у реальному часі. Детальніша
|
||||
інформація та інструкція зі встановлення
|
||||
доступні у <a href="http://docs.phpservermonitor.org/"
|
||||
target="_blank">документації</a>.',
|
||||
'telegram_api_token' => 'Токен Telegram API',
|
||||
'telegram_api_token_description' => 'Перед використанням Telegram ви маєте
|
||||
отримати токен API. За довідкою
|
||||
зверніться до <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">документації</a>.',
|
||||
зверніться до <a href="http://docs.phpservermonitor.org/"
|
||||
target="_blank">документації</a>.',
|
||||
'alert_type' => 'Виберіть, коли б вам хотілося отримувати
|
||||
сповіщення.',
|
||||
'alert_type_description' => '<b>Зміна статусу:</b> Ви отримуватимете
|
||||
|
@ -404,7 +406,6 @@ $sm_lang = array(
|
|||
'auto_refresh_description' => 'Сторінка автооновлення серверів.<br><span
|
||||
class="small">Час у секундах; якщо 0, сторінка не
|
||||
оновлюватиметься.</span>',
|
||||
'seconds' => 'секунд',
|
||||
'test' => 'Тест',
|
||||
'test_email' => 'Електронний лист буде надісланий на адресу,
|
||||
вказану у вашому профілі користувача.',
|
||||
|
|
|
@ -64,6 +64,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => 'khoảng một phút trước',
|
||||
'seconds_ago' => '%d giây trước',
|
||||
'a_second_ago' => 'một giây trước',
|
||||
'seconds' => 'giây',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => 'Cấu hình',
|
||||
|
@ -91,8 +92,8 @@ $sm_lang = array(
|
|||
'email' => 'Email',
|
||||
'pushover' => 'Pushover',
|
||||
'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian
|
||||
thực. Xem <a href="https://pushover.net/" target="_blank">website của họ</a> để biết
|
||||
thêm thông tin.',
|
||||
thực. Xem <a href="https://pushover.net/" target="_blank">website của họ</a>
|
||||
để biết thêm thông tin.',
|
||||
'pushover_key' => 'Pushover Key',
|
||||
'pushover_device' => 'Pushover Device',
|
||||
'pushover_device_description' => 'Tên thiết bị để gửi tin nhắn đến. Để trống để gửi
|
||||
|
@ -208,8 +209,8 @@ $sm_lang = array(
|
|||
'sms_from' => 'Số điện thoại của người gửi',
|
||||
'pushover_status' => 'Cho phép gửi tin nhắn bằng Pushover',
|
||||
'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian
|
||||
thực. Xem <a href="https://pushover.net/" target="_blank">website của họ</a> để biết
|
||||
thêm thông tin.',
|
||||
thực. Xem <a href="https://pushover.net/" target="_blank">website của họ</a>
|
||||
để biết thêm thông tin.',
|
||||
'pushover_clone_app' => 'Nhấn vào đây để tạo ứng dụng Pushover của bạn',
|
||||
'pushover_api_token' => 'Pushover App API Token',
|
||||
'pushover_api_token_description' => 'Trước khi bạn có thể sử dụng Pushover, bạn cần phải <a
|
||||
|
@ -246,7 +247,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => 'Tự động làm mới',
|
||||
'auto_refresh_description' => 'Tự động làm mới servers page.<br><span class="small">Trong vài giây,
|
||||
nếu 0 trang sẽ không làm mới.</span>',
|
||||
'seconds' => 'giây',
|
||||
'test' => 'Thử',
|
||||
'test_email' => 'Một email sẽ được gửi đến địa chỉ được xác định trong hồ sơ
|
||||
người dùng của bạn.',
|
||||
|
|
|
@ -67,6 +67,7 @@ $sm_lang = array(
|
|||
'a_minute_ago' => '1分钟前',
|
||||
'seconds_ago' => '%d 秒前',
|
||||
'a_second_ago' => '刚刚',
|
||||
'seconds' => '秒',
|
||||
),
|
||||
'menu' => array(
|
||||
'config' => '设置',
|
||||
|
@ -259,7 +260,6 @@ $sm_lang = array(
|
|||
'auto_refresh' => '自动刷新',
|
||||
'auto_refresh_description' => '自动刷新服务器页.<br><span class="small">单位为秒, 设置为 0
|
||||
则不自动刷新.</span>',
|
||||
'seconds' => '秒',
|
||||
'test' => '测试',
|
||||
'test_email' => '将发送一封邮件到您账户设置的邮件地址.',
|
||||
'test_sms' => '将发送一封短信到您账户设置的手机号码.',
|
||||
|
|
|
@ -258,7 +258,8 @@ $sm_lang = array(
|
|||
'sms_from' => '發送人電話號碼',
|
||||
'pushover_status' => '啟用Pushover通知',
|
||||
'pushover_description' => 'Pushover是線上服務,讓您可以方便的收到即時通知,請參考 <a
|
||||
href="https://pushover.net/" target="_blank"> 網站</a> 可以得到更詳細的資訊。</a> ',
|
||||
href="https://pushover.net/" target="_blank"> 網站</a>
|
||||
可以得到更詳細的資訊。</a> ',
|
||||
'pushover_clone_app' => '點選這裡可快速建立Pushover App',
|
||||
'pushover_api_token_description' => '在您使用 Pushover 通知之前,需要先到這裡-><a href="%1$s"
|
||||
target="_blank" rel="noopener">註冊Pushover App帳號</a>
|
||||
|
@ -269,7 +270,8 @@ $sm_lang = array(
|
|||
<a href="http://docs.phpservermonitor.org/" target="_blank">文件庫</a>
|
||||
可以取得更多資訊與安裝說明。',
|
||||
'telegram_api_token_description' => '使用 Telegram 通知之前,您必需先取得 API Token。請到 <a
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">文件庫</a> 取得說明。',
|
||||
href="http://docs.phpservermonitor.org/" target="_blank">文件庫</a>
|
||||
取得說明。',
|
||||
'alert_type' => '需要提醒的類別',
|
||||
'alert_type_description' => '<b>狀態改變:</b> 伺服器 連線 -> 離線或連線 ->
|
||||
連線的狀態變化將會收到提醒通知。<br/><br /><b>離線:</b>
|
||||
|
@ -298,7 +300,6 @@ $sm_lang = array(
|
|||
'settings_log' => '記錄設定',
|
||||
'settings_proxy' => 'Proxy 設定',
|
||||
'auto_refresh' => '自動更新',
|
||||
'seconds' => '秒',
|
||||
'test' => '測試',
|
||||
'test_email' => '電子郵件將發送到您在使用者設定內指定的電子郵件信箱。',
|
||||
'test_sms' => '簡訊將發送到您在使用者設定內指定的行動電話號碼。',
|
||||
|
|
|
@ -217,7 +217,7 @@ abstract class AbstractController implements ControllerInterface
|
|||
if (!$this->xhr) {
|
||||
// in XHR mode, we will not add the main template
|
||||
$tpl_data = array(
|
||||
'title' => strtoupper(psm_get_lang('system', 'title')),
|
||||
'title' => psm_get_conf('site_title', strtoupper(psm_get_lang('system', 'title'))),
|
||||
'label_back_to_top' => psm_get_lang('system', 'back_to_top'),
|
||||
'add_footer' => $this->add_footer,
|
||||
'version' => 'v' . PSM_VERSION,
|
||||
|
|
|
@ -74,10 +74,12 @@ class ConfigController extends AbstractController
|
|||
'sms_from',
|
||||
'pushover_api_token',
|
||||
'telegram_api_token',
|
||||
'jabber_host',
|
||||
'jabber_port',
|
||||
'jabber_username',
|
||||
'jabber_domain'
|
||||
'jabber_host',
|
||||
'jabber_port',
|
||||
'jabber_username',
|
||||
'jabber_domain',
|
||||
'user_agent',
|
||||
'site_title'
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -86,7 +88,7 @@ class ConfigController extends AbstractController
|
|||
*/
|
||||
protected $encryptedFields = [
|
||||
'email_smtp_password',
|
||||
'jabber_password'
|
||||
'jabber_password'
|
||||
];
|
||||
|
||||
private $default_tab = 'general';
|
||||
|
@ -191,6 +193,14 @@ class ConfigController extends AbstractController
|
|||
foreach ($this->fields as $input_key) {
|
||||
$tpl_data[$input_key] = (isset($config[$input_key])) ? $config[$input_key] : '';
|
||||
}
|
||||
|
||||
$tpl_data['user_agent'] = empty($tpl_data['user_agent']) ?
|
||||
'Mozilla/5.0 (compatible; phpservermon/' .
|
||||
PSM_VERSION . '; +https://github.com/phpservermon/phpservermon)' : $tpl_data['user_agent'];
|
||||
|
||||
$tpl_data['site_title'] = empty($tpl_data['site_title']) ?
|
||||
strtoupper(psm_get_lang('system', 'title')) : $tpl_data['site_title'];
|
||||
|
||||
// encrypted fields
|
||||
foreach ($this->encryptedFields as $encryptedField) {
|
||||
$tpl_data[$encryptedField] = '';
|
||||
|
@ -221,9 +231,10 @@ class ConfigController extends AbstractController
|
|||
protected function executeSave()
|
||||
{
|
||||
if (!empty($_POST)) {
|
||||
// save new config
|
||||
// save new config
|
||||
$clean = array(
|
||||
'language' => $_POST['language'],
|
||||
'site_title' => $_POST['site_title'],
|
||||
'sms_gateway' => $_POST['sms_gateway'],
|
||||
'alert_type' => $_POST['alert_type'],
|
||||
'email_smtp_security' =>
|
||||
|
@ -234,7 +245,7 @@ class ConfigController extends AbstractController
|
|||
'log_retention_period' => intval(psm_POST('log_retention_period', 365)),
|
||||
'password_encrypt_key' => psm_POST('password_encrypt_key', sha1(microtime()))
|
||||
);
|
||||
foreach ($this->checkboxes as $input_key) {
|
||||
foreach ($this->checkboxes as $input_key) {
|
||||
$clean[$input_key] = (isset($_POST[$input_key])) ? '1' : '0';
|
||||
}
|
||||
foreach ($this->fields as $input_key) {
|
||||
|
@ -264,7 +275,7 @@ class ConfigController extends AbstractController
|
|||
} elseif (!empty($_POST['test_telegram'])) {
|
||||
$this->testTelegram();
|
||||
} elseif (!empty($_POST['test_jabber'])) {
|
||||
$this->testJabber();
|
||||
$this->testJabber();
|
||||
}
|
||||
|
||||
if ($language_refresh) {
|
||||
|
@ -283,7 +294,7 @@ class ConfigController extends AbstractController
|
|||
} elseif (isset($_POST['telegram_submit']) || !empty($_POST['test_telegram'])) {
|
||||
$this->default_tab = 'telegram';
|
||||
} elseif (isset($_POST['jabber_submit']) || !empty($_POST['test_jabber'])) {
|
||||
$this->default_tab = 'jabber';
|
||||
$this->default_tab = 'jabber';
|
||||
}
|
||||
}
|
||||
return $this->runAction('index');
|
||||
|
@ -408,24 +419,24 @@ class ConfigController extends AbstractController
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Jabber.
|
||||
*/
|
||||
/**
|
||||
* Test Jabber.
|
||||
*/
|
||||
protected function testJabber()
|
||||
{
|
||||
$user = $this->getUser()->getUser();
|
||||
psm_jabber_send_message(
|
||||
psm_get_conf('jabber_host'),
|
||||
psm_get_conf('jabber_username'),
|
||||
psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')),
|
||||
[$user->jabber],
|
||||
psm_get_lang('config', 'test_message'),
|
||||
(trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null),
|
||||
(trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null)
|
||||
);
|
||||
// no message - async ... so just info
|
||||
$this->addMessage(psm_get_lang('config', 'jabber_check'), 'info');
|
||||
// @todo possible to set message via ajax with callback ...
|
||||
$user = $this->getUser()->getUser();
|
||||
psm_jabber_send_message(
|
||||
psm_get_conf('jabber_host'),
|
||||
psm_get_conf('jabber_username'),
|
||||
psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')),
|
||||
[$user->jabber],
|
||||
psm_get_lang('config', 'test_message'),
|
||||
(trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null),
|
||||
(trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null)
|
||||
);
|
||||
// no message - async ... so just info
|
||||
$this->addMessage(psm_get_lang('config', 'jabber_check'), 'info');
|
||||
// @todo possible to set message via ajax with callback ...
|
||||
}
|
||||
|
||||
protected function getLabels()
|
||||
|
@ -435,12 +446,12 @@ class ConfigController extends AbstractController
|
|||
'label_tab_sms' => psm_get_lang('config', 'tab_sms'),
|
||||
'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'),
|
||||
'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'),
|
||||
'label_tab_jabber' => psm_get_lang('config', 'tab_jabber'),
|
||||
'label_tab_jabber' => psm_get_lang('config', 'tab_jabber'),
|
||||
'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'),
|
||||
'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'),
|
||||
'label_settings_jabber' => psm_get_lang('config', 'settings_jabber'),
|
||||
'label_settings_jabber' => psm_get_lang('config', 'settings_jabber'),
|
||||
'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'),
|
||||
|
@ -482,17 +493,17 @@ class ConfigController extends AbstractController
|
|||
'label_telegram_api_token' => psm_get_lang('config', 'telegram_api_token'),
|
||||
'label_telegram_api_token_description' => psm_get_lang('config', 'telegram_api_token_description'),
|
||||
'label_jabber_status' => psm_get_lang('config', 'jabber_status'),
|
||||
'label_jabber_description' => psm_get_lang('config', 'jabber_description'),
|
||||
'label_jabber_description' => psm_get_lang('config', 'jabber_description'),
|
||||
'label_jabber_host' => psm_get_lang('config', 'jabber_host'),
|
||||
'label_jabber_host_description' => psm_get_lang('config', 'jabber_host_description'),
|
||||
'label_jabber_port' => psm_get_lang('config', 'jabber_port'),
|
||||
'label_jabber_port_description' => psm_get_lang('config', 'jabber_port_description'),
|
||||
'label_jabber_username' => psm_get_lang('config', 'jabber_username'),
|
||||
'label_jabber_username_description' => psm_get_lang('config', 'jabber_username_description'),
|
||||
'label_jabber_domain' => psm_get_lang('config', 'jabber_domain'),
|
||||
'label_jabber_domain_description' => psm_get_lang('config', 'jabber_domain_description'),
|
||||
'label_jabber_password' => psm_get_lang('config', 'jabber_password'),
|
||||
'label_jabber_password_description' => psm_get_lang('config', 'jabber_password_description'),
|
||||
'label_jabber_host_description' => psm_get_lang('config', 'jabber_host_description'),
|
||||
'label_jabber_port' => psm_get_lang('config', 'jabber_port'),
|
||||
'label_jabber_port_description' => psm_get_lang('config', 'jabber_port_description'),
|
||||
'label_jabber_username' => psm_get_lang('config', 'jabber_username'),
|
||||
'label_jabber_username_description' => psm_get_lang('config', 'jabber_username_description'),
|
||||
'label_jabber_domain' => psm_get_lang('config', 'jabber_domain'),
|
||||
'label_jabber_domain_description' => psm_get_lang('config', 'jabber_domain_description'),
|
||||
'label_jabber_password' => psm_get_lang('config', 'jabber_password'),
|
||||
'label_jabber_password_description' => psm_get_lang('config', 'jabber_password_description'),
|
||||
'label_alert_type' => psm_get_lang('config', 'alert_type'),
|
||||
'label_alert_type_description' => psm_get_lang('config', 'alert_type_description'),
|
||||
'label_combine_notifications' => psm_get_lang('config', 'combine_notifications'),
|
||||
|
@ -503,12 +514,12 @@ class ConfigController extends AbstractController
|
|||
'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_log_jabber' => psm_get_lang('config', 'log_jabber'),
|
||||
'label_log_jabber' => psm_get_lang('config', 'log_jabber'),
|
||||
'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'),
|
||||
'label_auto_refresh_description' => psm_get_lang('config', 'auto_refresh_description'),
|
||||
'label_seconds' => psm_get_lang('config', 'seconds'),
|
||||
'label_seconds' => psm_get_lang('system', 'seconds'),
|
||||
'label_save' => psm_get_lang('system', 'save'),
|
||||
'label_test' => psm_get_lang('config', 'test'),
|
||||
'label_log_retention_period' => psm_get_lang('config', 'log_retention_period'),
|
||||
|
@ -516,7 +527,9 @@ class ConfigController extends AbstractController
|
|||
'label_log_retention_days' => psm_get_lang('config', 'log_retention_days'),
|
||||
'label_days' => psm_get_lang('config', 'log_retention_days'),
|
||||
'label_leave_blank' => psm_get_lang('users', 'password_leave_blank'),
|
||||
|
||||
'label_user_agent' => psm_get_lang('config', 'user_agent'),
|
||||
'label_user_agent_key_note' => psm_get_lang('config', 'user_agent_key_note'),
|
||||
'label_site_title' => psm_get_lang('config', 'site_title'),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -257,7 +257,7 @@ class InstallController extends AbstractController
|
|||
'pushover_key' => '',
|
||||
'pushover_device' => '',
|
||||
'telegram_id' => '',
|
||||
'jabber' => ''
|
||||
'jabber' => ''
|
||||
);
|
||||
|
||||
$validator = $this->container->get('util.user.validator');
|
||||
|
|
|
@ -114,7 +114,7 @@ abstract class AbstractServerController extends AbstractController
|
|||
*/
|
||||
protected function formatServer($server)
|
||||
{
|
||||
$server['rtime'] = round((float) $server['rtime'], 4);
|
||||
$server['rtime'] = $server['rtime'];
|
||||
$server['last_online'] = psm_timespan($server['last_online']);
|
||||
$server['last_offline'] = psm_timespan($server['last_offline']);
|
||||
if ($server['last_offline'] != psm_get_lang('system', 'never')) {
|
||||
|
|
|
@ -57,7 +57,7 @@ class LogController extends AbstractServerController
|
|||
'label_sms' => psm_get_lang('log', 'sms'),
|
||||
'label_pushover' => psm_get_lang('log', 'pushover'),
|
||||
'label_telegram' => psm_get_lang('log', 'telegram'),
|
||||
'label_jabber' => psm_get_lang('log', 'jabber'),
|
||||
'label_jabber' => psm_get_lang('log', 'jabber'),
|
||||
'label_title' => psm_get_lang('log', 'title'),
|
||||
'label_server' => psm_get_lang('servers', 'server'),
|
||||
'label_type' => psm_get_lang('log', 'type'),
|
||||
|
@ -161,9 +161,9 @@ class LogController extends AbstractServerController
|
|||
if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) {
|
||||
// restrict by user_id
|
||||
$sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON (
|
||||
`us`.`user_id`={$this->getUser()->getUserId()}
|
||||
AND `us`.`server_id`=`servers`.`server_id`
|
||||
)";
|
||||
`us`.`user_id`={$this->getUser()->getUserId()}
|
||||
AND `us`.`server_id`=`servers`.`server_id`
|
||||
)";
|
||||
}
|
||||
$entries = $this->db->query(
|
||||
'SELECT ' .
|
||||
|
|
|
@ -102,7 +102,7 @@ class ServerController extends AbstractServerController
|
|||
'sms' => 'icon-mobile',
|
||||
'pushover' => 'icon-pushover',
|
||||
'telegram' => 'icon-telegram',
|
||||
'jabber' => 'icon-jabber'
|
||||
'jabber' => 'icon-jabber'
|
||||
);
|
||||
|
||||
$servers = $this->getServers();
|
||||
|
@ -174,6 +174,13 @@ class ServerController extends AbstractServerController
|
|||
|
||||
$tpl_data['users'] = $this->db->select(PSM_DB_PREFIX . 'users', null, array('user_id', 'name'), '', 'name');
|
||||
|
||||
foreach ($tpl_data['users'] as &$user) {
|
||||
$user['id'] = $user['user_id'];
|
||||
unset($user['user_id']);
|
||||
$user['label'] = $user['name'];
|
||||
unset($user['name']);
|
||||
}
|
||||
|
||||
switch ($this->server_id) {
|
||||
case 0:
|
||||
// insert mode
|
||||
|
@ -194,10 +201,6 @@ class ServerController extends AbstractServerController
|
|||
|
||||
$user_idc_selected = $this->getServerUsers($this->server_id);
|
||||
foreach ($tpl_data['users'] as &$user) {
|
||||
$user['id'] = $user['user_id'];
|
||||
unset($user['user_id']);
|
||||
$user['label'] = $user['name'];
|
||||
unset($user['name']);
|
||||
if (in_array($user['id'], $user_idc_selected)) {
|
||||
$user['edit_selected'] = 'selected="selected"';
|
||||
}
|
||||
|
@ -236,7 +239,7 @@ class ServerController extends AbstractServerController
|
|||
'edit_sms_selected' => $edit_server['sms'],
|
||||
'edit_pushover_selected' => $edit_server['pushover'],
|
||||
'edit_telegram_selected' => $edit_server['telegram'],
|
||||
'edit_jabber_selected' => $edit_server['jabber'],
|
||||
'edit_jabber_selected' => $edit_server['jabber'],
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -310,7 +313,7 @@ class ServerController extends AbstractServerController
|
|||
'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',
|
||||
'jabber' => in_array($_POST['jabber'], array('yes', 'no')) ? $_POST['jabber'] : 'no',
|
||||
'jabber' => in_array($_POST['jabber'], array('yes', 'no')) ? $_POST['jabber'] : 'no',
|
||||
);
|
||||
// make sure websites start with http://
|
||||
if (
|
||||
|
@ -518,6 +521,15 @@ class ServerController extends AbstractServerController
|
|||
if (strlen($tpl_data['last_error_output']) > 255) {
|
||||
$tpl_data['last_error_output_truncated'] = substr($tpl_data['last_error_output'], 0, 255) . '...';
|
||||
}
|
||||
|
||||
// fetch server status logs
|
||||
$log_entries = $this->getServerLogs($this->server_id);
|
||||
for ($x = 0; $x < count($log_entries); $x++) {
|
||||
$record = &$log_entries[$x];
|
||||
$record['datetime_format'] = psm_date($record['datetime']);
|
||||
}
|
||||
|
||||
$tpl_data['log_entries'] = $log_entries;
|
||||
|
||||
return $this->twig->render('module/server/server/view.tpl.html', $tpl_data);
|
||||
}
|
||||
|
@ -579,10 +591,10 @@ class ServerController extends AbstractServerController
|
|||
'label_send_sms' => psm_get_lang('servers', 'send_sms'),
|
||||
'label_send_pushover' => psm_get_lang('servers', 'send_pushover'),
|
||||
'label_telegram' => psm_get_lang('servers', 'telegram'),
|
||||
'label_jabber' => psm_get_lang('servers', 'jabber'),
|
||||
'label_jabber' => psm_get_lang('servers', 'jabber'),
|
||||
'label_pushover' => psm_get_lang('servers', 'pushover'),
|
||||
'label_send_telegram' => psm_get_lang('servers', 'send_telegram'),
|
||||
'label_send_jabber' => psm_get_lang('servers', 'send_jabber'),
|
||||
'label_send_jabber' => psm_get_lang('servers', 'send_jabber'),
|
||||
'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'),
|
||||
|
@ -597,7 +609,8 @@ class ServerController extends AbstractServerController
|
|||
'label_yes' => psm_get_lang('system', 'yes'),
|
||||
'label_no' => psm_get_lang('system', 'no'),
|
||||
'label_add_new' => psm_get_lang('system', 'add_new'),
|
||||
'label_seconds' => psm_get_lang('config', 'seconds'),
|
||||
'label_seconds' => psm_get_lang('system', 'seconds'),
|
||||
'label_milliseconds' => psm_get_lang('system', 'milliseconds'),
|
||||
'label_online' => psm_get_lang('servers', 'online'),
|
||||
'label_offline' => psm_get_lang('servers', 'offline'),
|
||||
'label_ok' => psm_get_lang('system', 'ok'),
|
||||
|
@ -606,6 +619,10 @@ class ServerController extends AbstractServerController
|
|||
'label_settings' => psm_get_lang('system', 'settings'),
|
||||
'label_output' => psm_get_lang('servers', 'output'),
|
||||
'label_search' => psm_get_lang('system', 'search'),
|
||||
'label_log_title' => psm_get_lang('log', 'title'),
|
||||
'label_log_no_logs' => psm_get_lang('log', 'no_logs'),
|
||||
'label_date' => psm_get_lang('system', 'date'),
|
||||
'label_message' => psm_get_lang('system', 'message'),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -627,4 +644,42 @@ class ServerController extends AbstractServerController
|
|||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get logs for a server
|
||||
* @param int $server_id
|
||||
* @param string $type status/email/sms
|
||||
* @return \PDOStatement array
|
||||
*/
|
||||
protected function getServerLogs($server_id, $type = 'status')
|
||||
{
|
||||
$sql_join = '';
|
||||
if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) {
|
||||
// restrict by user_id
|
||||
$sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON (
|
||||
`us`.`user_id`={$this->getUser()->getUserId()}
|
||||
AND `us`.`server_id`=`servers`.`server_id`
|
||||
)";
|
||||
}
|
||||
$entries = $this->db->query(
|
||||
'SELECT ' .
|
||||
'`servers`.`label`, ' .
|
||||
'`servers`.`ip`, ' .
|
||||
'`servers`.`port`, ' .
|
||||
'`servers`.`type` AS server_type, ' .
|
||||
'`log`.`log_id`, ' .
|
||||
'`log`.`type`, ' .
|
||||
'`log`.`message`, ' .
|
||||
'`log`.`datetime` ' .
|
||||
'FROM `' . PSM_DB_PREFIX . 'log` AS `log` ' .
|
||||
'JOIN `' . PSM_DB_PREFIX . 'servers` AS `servers` ON (`servers`.`server_id`=`log`.`server_id`) ' .
|
||||
$sql_join .
|
||||
'WHERE `log`.`type`=\'' . $type . '\' ' .
|
||||
'AND `log`.`server_id`=' . $server_id . ' ' .
|
||||
'ORDER BY `datetime` DESC ' .
|
||||
'LIMIT 0,20'
|
||||
);
|
||||
|
||||
return $entries;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,8 +90,8 @@ class ProfileController extends AbstractController
|
|||
'label_activate_telegram' => psm_get_lang('users', 'activate_telegram'),
|
||||
'label_telegram_get_chat_id' => psm_get_lang('users', 'telegram_get_chat_id'),
|
||||
'telegram_get_chat_id_url' => PSM_TELEGRAM_GET_ID_URL,
|
||||
'label_jabber' => psm_get_lang('users', 'jabber'),
|
||||
'label_jabber_description' => psm_get_lang('users', 'jabber_description'),
|
||||
'label_jabber' => psm_get_lang('users', 'jabber'),
|
||||
'label_jabber_description' => psm_get_lang('users', 'jabber_description'),
|
||||
'label_email' => psm_get_lang('users', 'email'),
|
||||
'label_save' => psm_get_lang('system', 'save'),
|
||||
'form_action' => psm_build_url(array(
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHP Server Monitor
|
||||
* Monitor your servers and websites.
|
||||
*
|
||||
* This file is part of PHP Server Monitor.
|
||||
* PHP Server Monitor is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PHP Server Monitor is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with PHP Server Monitor. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* @package phpservermon
|
||||
* @author Mateusz Małek <tajgeer@gmail.com>
|
||||
* @copyright Copyright (c) 2008-2017 Pepijn Over <pep@mailbox.org>
|
||||
* @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3
|
||||
* @version Release: @package_version@
|
||||
* @link http://www.phpservermonitor.org/
|
||||
* @since phpservermon 3.5
|
||||
**/
|
||||
|
||||
namespace psm\Txtmsg;
|
||||
|
||||
class SMSAPI extends Core
|
||||
{
|
||||
const VARIANT_INTERNATIONAL = 1;
|
||||
const VARIANT_POLISH = 2;
|
||||
|
||||
/**
|
||||
* SMSAPI comes with two variants - designed for polish or international customers.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $variant = self::VARIANT_INTERNATIONAL;
|
||||
|
||||
/**
|
||||
* Name of the sender. As a default the sender name is set to "Test".
|
||||
* Only verified names are being accepted.
|
||||
* Sender name may be set after logging into Customer Portal on Sendernames.
|
||||
* @see https://www.smsapi.com/docs/#2-single-sms
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $originator;
|
||||
|
||||
/**
|
||||
* Token used to authenticate in SMSAPI system.
|
||||
* @see https://www.smsapi.com/docs/#authentication
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $password;
|
||||
|
||||
/**
|
||||
* Send sms using the SMSAPI
|
||||
*
|
||||
* @var string $message
|
||||
* @var array $this->recipients
|
||||
* @var array $this->originator
|
||||
* @var string $this->password
|
||||
* @var array $recipients_chunk
|
||||
* @var string $host
|
||||
*
|
||||
* @var mixed $result
|
||||
* @var array $headers
|
||||
*
|
||||
* @var int $success
|
||||
* @var string $error
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
|
||||
public function sendSMS($message)
|
||||
{
|
||||
$tld = ($this->variant === static::VARIANT_INTERNATIONAL) ? "com" : "pl";
|
||||
$host = "api.smsapi.{$tld}";
|
||||
$backupHost = "api2.smsapi.{$tld}";
|
||||
|
||||
// One user at a time.
|
||||
$recipients_chunk = array_chunk($this->recipients, 1);
|
||||
foreach ($recipients_chunk as $recipient) {
|
||||
try {
|
||||
$response = $this->processSendOperation($host, $recipient, $message);
|
||||
} catch (\RuntimeException $e) {
|
||||
try {
|
||||
$response = $this->processSendOperation($backupHost, $recipient, $message);
|
||||
} catch (\RuntimeException $e) {
|
||||
return "({$recipient}) " . $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($response->error)) {
|
||||
return $response->message;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform actual SMS sending operation
|
||||
*
|
||||
* @param $host
|
||||
* @param $recipient
|
||||
* @param $message
|
||||
* @return object
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
private function processSendOperation($host, $recipient, $message)
|
||||
{
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, "https://{$host}/sms.do");
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
|
||||
"access_token" => $this->password,
|
||||
"from" => $this->originator,
|
||||
"to" => $recipient,
|
||||
"message" => $message,
|
||||
"encoding" => "utf-8",
|
||||
"normalize" => "1",
|
||||
"format" => "json"
|
||||
)));
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
||||
|
||||
$result = curl_exec($ch);
|
||||
|
||||
$error = false;
|
||||
if (curl_errno($ch)) {
|
||||
$error = curl_error($ch);
|
||||
}
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
if ($error !== false) {
|
||||
throw new \RuntimeException($error);
|
||||
}
|
||||
|
||||
return json_decode($result);
|
||||
}
|
||||
}
|
|
@ -145,7 +145,7 @@ class Modal implements ModalInterface
|
|||
$tpl = $this->twig->loadTemplate('util/module/modal.tpl.html');
|
||||
$html = $tpl->render(array(
|
||||
'modal_id' => $this->modal_id,
|
||||
'modal_title' => !empty($this->title) ? $this->title : psm_get_lang('system', 'title'),
|
||||
'modal_title' => !empty($this->title) ? $this->title : psm_get_conf('site_title', psm_get_lang('system', 'title')),
|
||||
'modal_body' => $message,
|
||||
'has_cancel' => $has_cancel,
|
||||
'label_cancel' => psm_get_lang('system', 'cancel'),
|
||||
|
|
|
@ -74,7 +74,7 @@ class HistoryGraph
|
|||
1 => $this->generateGraphHistory($server_id, $last_year, $last_week),
|
||||
);
|
||||
$info_fields = array(
|
||||
'latency_avg' => '%01.4f',
|
||||
'latency_avg' => '%01.5f',
|
||||
'uptime' => '%01.3f%%',
|
||||
);
|
||||
|
||||
|
@ -252,6 +252,20 @@ class HistoryGraph
|
|||
$prev_downtime = 0;
|
||||
$downtime = 0;
|
||||
|
||||
// get highest latency record for offline height
|
||||
$n = count($records);
|
||||
$highest_latency = 0.0000;
|
||||
for ($i = 0; $i < $n; $i++) {
|
||||
if (!array_key_exists('latency', $records[$i])) {
|
||||
continue;
|
||||
}
|
||||
// Update if latency is higher
|
||||
$highest_latency = $highest_latency < floatval($records[$i]['latency']) ?
|
||||
floatval($records[$i]['latency']) : $highest_latency;
|
||||
}
|
||||
// to ms
|
||||
$highest_latency = round($highest_latency * 1000);
|
||||
|
||||
// Create the list of points and server down zones
|
||||
foreach ($records as $record) {
|
||||
$time = strtotime($record['date']);
|
||||
|
@ -266,11 +280,11 @@ class HistoryGraph
|
|||
if ($record['status'] == 0) {
|
||||
$lines['online'][] = $prev['status']
|
||||
// Previous datapoint was online
|
||||
? '{ x: ' . ($time * 1000) . ', y: ' . $prev['latency'] . '}'
|
||||
? '{ x: ' . ($time * 1000) . ', y: ' . $prev['latency'] * 1000 . '}'
|
||||
// Previous datapoint was offline
|
||||
: '{ x: ' . ($time * 1000) . ', y: null}';
|
||||
// new outage start
|
||||
$lines['offline'][] = '{ x: ' . ($time * 1000) . ', y:0.1}';
|
||||
$lines['offline'][] = '{ x: ' . ($time * 1000) . ', y:' . $highest_latency . '}';
|
||||
|
||||
$prev_downtime != 0 ?: $prev_downtime = $time;
|
||||
} else {
|
||||
|
@ -280,15 +294,15 @@ class HistoryGraph
|
|||
// Previous datapoint was online
|
||||
? '{ x: ' . ($time * 1000) . ', y:null}'
|
||||
// Previous datapoint was offline
|
||||
: '{ x: ' . ($time * 1000) . ', y:0.1}';
|
||||
: '{ x: ' . ($time * 1000) . ', y:' . $highest_latency . '}';
|
||||
$lines['online'][] = '{ x: ' . ($time * 1000) . ', y: ' .
|
||||
round((float) $record[$key], 4) . '}';
|
||||
round((float) $record[$key] * 1000, 2) . '}';
|
||||
|
||||
$prev_downtime == 0 ?: $downtime += ($time - $prev_downtime);
|
||||
$prev_downtime = 0;
|
||||
}
|
||||
} else {
|
||||
$lines[$key][] = '{ x: \'' . $record['date'] . '\', y: ' . $record[$key] . '}';
|
||||
$lines[$key][] = '{ x: \'' . $record['date'] . '\', y: ' . $record[$key] * 1000 . '}';
|
||||
}
|
||||
$prev = $record;
|
||||
}
|
||||
|
@ -298,7 +312,8 @@ class HistoryGraph
|
|||
// Record the first and last date as a string in the down array
|
||||
$prev_downtime == 0 ?: $downtime += ($now->getTimestamp() - $prev_downtime);
|
||||
if ($add_uptime) {
|
||||
$prev['status'] ?: $lines['offline'][] = '{ x: ' . ($now->getTimestamp() * 1000) . ', y:0.1}';
|
||||
$prev['status'] ?: $lines['offline'][] =
|
||||
'{ x: ' . ($now->getTimestamp() * 1000) . ', y:' . $highest_latency . '}';
|
||||
$data['uptime'] = 100 - ($downtime / ($end_time->getTimestamp() - $start_time->getTimestamp()));
|
||||
}
|
||||
|
||||
|
|
|
@ -53,9 +53,9 @@ class UpdateManager implements ContainerAwareInterface
|
|||
*/
|
||||
public function run($skip_perms = false, $status = null)
|
||||
{
|
||||
if (false === in_array($status, ['on', 'off'], true)) {
|
||||
$status = null;
|
||||
}
|
||||
if (false === in_array($status, ['on', 'off'], true)) {
|
||||
$status = null;
|
||||
}
|
||||
|
||||
// check if we need to restrict the servers to a certain user
|
||||
$sql_join = '';
|
||||
|
@ -63,17 +63,17 @@ class UpdateManager implements ContainerAwareInterface
|
|||
if (!$skip_perms && $this->container->get('user')->getUserLevel() > PSM_USER_ADMIN) {
|
||||
// restrict by user_id
|
||||
$sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON (
|
||||
`us`.`user_id`={$this->container->get('user')->getUserId()}
|
||||
AND `us`.`server_id`=`s`.`server_id`
|
||||
)";
|
||||
`us`.`user_id`={$this->container->get('user')->getUserId()}
|
||||
AND `us`.`server_id`=`s`.`server_id`
|
||||
)";
|
||||
}
|
||||
|
||||
$sql = "SELECT `s`.`server_id`,`s`.`ip`,`s`.`port`,`s`.`label`,`s`.`type`,`s`.`pattern`,`s`.`header_name`,
|
||||
`s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover`,`s`.`telegram`,
|
||||
`s`.`jabber`
|
||||
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
|
||||
{$sql_join}
|
||||
WHERE `active`='yes' " . ($status !== null ? ' AND `status` = \'' . $status . '\'' : '');
|
||||
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
|
||||
{$sql_join}
|
||||
WHERE `active`='yes' " . ($status !== null ? ' AND `status` = \'' . $status . '\'' : '');
|
||||
|
||||
$servers = $this->container->get('db')->query($sql);
|
||||
|
||||
|
|
|
@ -69,10 +69,10 @@ class StatusNotifier
|
|||
*/
|
||||
protected $send_telegram = false;
|
||||
|
||||
/**
|
||||
* Send Jabber?
|
||||
* @var bool
|
||||
*/
|
||||
/**
|
||||
* Send Jabber?
|
||||
* @var bool
|
||||
*/
|
||||
protected $send_jabber = false;
|
||||
|
||||
/**
|
||||
|
@ -258,7 +258,7 @@ class StatusNotifier
|
|||
}
|
||||
|
||||
if ($this->send_jabber && $this->server['jaber'] == 'yes') {
|
||||
$this->combine ? $this->setCombi('jabber') : $this->notifyByJabber($users);
|
||||
$this->combine ? $this->setCombi('jabber') : $this->notifyByJabber($users);
|
||||
}
|
||||
|
||||
return $notify;
|
||||
|
@ -461,7 +461,7 @@ class StatusNotifier
|
|||
$pushover->setTitle($title);
|
||||
$pushover->setMessage(str_replace('<br/>', "\n", $message));
|
||||
$pushover->setUrl(psm_build_url());
|
||||
$pushover->setUrlTitle(psm_get_lang('system', 'title'));
|
||||
$pushover->setUrlTitle(psm_get_conf('site_title', psm_get_lang('system', 'title')));
|
||||
|
||||
// Log
|
||||
if (psm_get_conf('log_pushover')) {
|
||||
|
@ -562,52 +562,52 @@ class StatusNotifier
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $users
|
||||
* @param array $combi
|
||||
*/
|
||||
/**
|
||||
* @param array $users
|
||||
* @param array $combi
|
||||
*/
|
||||
protected function notifyByJabber($users, $combi = [])
|
||||
{
|
||||
// Remove users that have no jabber
|
||||
foreach ($users as $k => $user) {
|
||||
if (trim($user['jabber']) === '') {
|
||||
unset($users[$k]);
|
||||
}
|
||||
}
|
||||
// Remove users that have no jabber
|
||||
foreach ($users as $k => $user) {
|
||||
if (trim($user['jabber']) === '') {
|
||||
unset($users[$k]);
|
||||
}
|
||||
}
|
||||
|
||||
// Validation
|
||||
if (empty($users)) {
|
||||
return;
|
||||
}
|
||||
// Validation
|
||||
if (empty($users)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Message
|
||||
$message = key_exists('message', $combi) ?
|
||||
$combi['message'] :
|
||||
psm_parse_msg($this->status_new, 'jabber_message', $this->server);
|
||||
// Message
|
||||
$message = key_exists('message', $combi) ?
|
||||
$combi['message'] :
|
||||
psm_parse_msg($this->status_new, 'jabber_message', $this->server);
|
||||
|
||||
// Log
|
||||
if (psm_get_conf('log_jabber')) {
|
||||
$log_id = psm_add_log($this->server_id, 'jabber', $message);
|
||||
}
|
||||
// Log
|
||||
if (psm_get_conf('log_jabber')) {
|
||||
$log_id = psm_add_log($this->server_id, 'jabber', $message);
|
||||
}
|
||||
|
||||
$usersJabber = [];
|
||||
foreach ($users as $user) {
|
||||
// Log
|
||||
if (!empty($log_id)) {
|
||||
psm_add_log_user($log_id, $user['user_id']);
|
||||
}
|
||||
$usersJabber[] = $user['jabber'];
|
||||
}
|
||||
// Jabber
|
||||
psm_jabber_send_message(
|
||||
psm_get_conf('jabber_host'),
|
||||
psm_get_conf('jabber_username'),
|
||||
psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')),
|
||||
$usersJabber,
|
||||
$message,
|
||||
(trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null),
|
||||
(trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null)
|
||||
);
|
||||
$usersJabber = [];
|
||||
foreach ($users as $user) {
|
||||
// Log
|
||||
if (!empty($log_id)) {
|
||||
psm_add_log_user($log_id, $user['user_id']);
|
||||
}
|
||||
$usersJabber[] = $user['jabber'];
|
||||
}
|
||||
// Jabber
|
||||
psm_jabber_send_message(
|
||||
psm_get_conf('jabber_host'),
|
||||
psm_get_conf('jabber_username'),
|
||||
psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')),
|
||||
$usersJabber,
|
||||
$message,
|
||||
(trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null),
|
||||
(trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -622,12 +622,12 @@ class StatusNotifier
|
|||
SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`,
|
||||
`u`.`pushover_device`, `u`.`telegram_id`,
|
||||
`u`.`jabber`
|
||||
FROM `' . PSM_DB_PREFIX . 'users` AS `u`
|
||||
JOIN `' . PSM_DB_PREFIX . "users_servers` AS `us` ON (
|
||||
`us`.`user_id`=`u`.`user_id`
|
||||
AND `us`.`server_id` = {$server_id}
|
||||
)
|
||||
");
|
||||
FROM `' . PSM_DB_PREFIX . 'users` AS `u`
|
||||
JOIN `' . PSM_DB_PREFIX . "users_servers` AS `us` ON (
|
||||
`us`.`user_id`=`u`.`user_id`
|
||||
AND `us`.`server_id` = {$server_id}
|
||||
)
|
||||
");
|
||||
return $users;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -179,36 +179,42 @@ class StatusUpdater
|
|||
$max_runs = 1;
|
||||
}
|
||||
$result = null;
|
||||
// Execute ping
|
||||
// Choose right ping version, ping6 for IPV6, ping for IPV4
|
||||
$pingCommand = 'ping6';
|
||||
$serverIp = $this->server['ip'];
|
||||
if (filter_var($serverIp,FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false){
|
||||
if (filter_var($serverIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
|
||||
$pingCommand = 'ping';
|
||||
}
|
||||
$txt = exec($pingCommand . " -c " . $max_runs . " " . $serverIp . " 2>&1", $output);
|
||||
// Non-greedy match on filler
|
||||
$re1 = '.*?';
|
||||
// Uninteresting: float
|
||||
$re2 = '[+-]?\\d*\\.\\d+(?![-+0-9\\.])';
|
||||
// Non-greedy match on filler
|
||||
$re3 = '.*?';
|
||||
// Float 1
|
||||
$re4 = '([+-]?\\d*\\.\\d+)(?![-+0-9\\.])';
|
||||
if (preg_match_all("/" . $re1 . $re2 . $re3 . $re4 . "/is", $txt, $matches)) {
|
||||
$result = $matches[1][0];
|
||||
}
|
||||
if (substr($output[0],0,4) == 'PING' && strpos($output[count($output)-2],'packets transmitted')){
|
||||
$result = 0;
|
||||
}
|
||||
if (!is_null($result)) {
|
||||
$this->header = $output[0];
|
||||
|
||||
// execute PING
|
||||
$txt = exec($pingCommand . " -c " . $max_runs . " " . $serverIp . " 2>&1", $output);
|
||||
|
||||
// Check if output is PING and if transmitted packets is equal to received packets.
|
||||
preg_match('/^(\d{1,3}) packets transmitted, (\d{1,3}).*$/', $output[count($output) - 2], $output_package_loss);
|
||||
|
||||
if (
|
||||
substr($output[0], 0, 4) == 'PING' &&
|
||||
!empty($output_package_loss) &&
|
||||
$output_package_loss[1] === $output_package_loss[2]
|
||||
) {
|
||||
// Gets avg from 'round-trip min/avg/max/stddev = 7.109/7.109/7.109/0.000 ms'
|
||||
preg_match_all("/(\d+\.\d+)/", $output[count($output) - 1], $result);
|
||||
$result = floatval($result[0][1]);
|
||||
|
||||
$this->header = "";
|
||||
foreach ($output as $key => $value) {
|
||||
$this->header .= $value . "\n";
|
||||
}
|
||||
$status = true;
|
||||
} else {
|
||||
$this->header = "-";
|
||||
$this->error = $output[0];
|
||||
foreach ($output as $key => $value) {
|
||||
$this->header .= $value . "\n";
|
||||
}
|
||||
$this->error = $output[count($output) - 2];
|
||||
$status = false;
|
||||
}
|
||||
//Divide by a thousand to convert to milliseconds
|
||||
// To miliseconds
|
||||
$this->rtime = $result / 1000;
|
||||
|
||||
// check if server is available and rerun if asked.
|
||||
|
@ -233,7 +239,7 @@ class StatusUpdater
|
|||
$starttime = microtime(true);
|
||||
|
||||
$serverIp = $this->server['ip'];
|
||||
if (filter_var($serverIp,FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false){
|
||||
if (filter_var($serverIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
|
||||
$serverIp = "[$serverIp]";
|
||||
}
|
||||
$fp = @fsockopen($serverIp, $this->server['port'], $errno, $this->error, $timeout);
|
||||
|
|
|
@ -31,31 +31,33 @@
|
|||
|
||||
<body>
|
||||
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark">
|
||||
<a class="navbar-brand" href="index.php">{{ title }}</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="index.php">{{ title }}</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
{{ html_menu|raw }}
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
{{ html_menu|raw }}
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
{{ html_modal|raw }}
|
||||
<main role="main" class="container">
|
||||
<main role="main" class="container-fluid px-4">
|
||||
<noscript>
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<b>Javascript is disabled!</b> PHP Server Monitor works best with JavaScript enabled!
|
||||
</div>
|
||||
</noscript>
|
||||
{% if not user_level and subtitle %}<h1>{{ subtitle }}</h1>{% endif %}
|
||||
<div class="container">{{ header_accessories|raw }}</div>
|
||||
<div class="container-fluid">{{ header_accessories|raw }}</div>
|
||||
{% for msg in messages %}
|
||||
<div class="alert alert-{{ msg.class }}" role="alert">
|
||||
<i class="fas fa-{{ msg.icon }}"></i> {{ msg.message|raw }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="container">
|
||||
<div class="container-fluid">
|
||||
<div class="row">{{ html_sidebar|raw }}</div>
|
||||
<div class="row" id="content">{{ html_content|raw }}</div>
|
||||
</div>
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
<legend>{{ label_general }}</legend>
|
||||
<!-- Update check -->
|
||||
{{ macro.input_checkbox("show_update", "show_update[]", label_show_update, show_update_checked) }}
|
||||
<!-- Site title -->
|
||||
{{ macro.input_field("text", "site_title", null, "site_title", label_site_title, site_title, label_site_title, "255", null, null, null, null, true) }}
|
||||
<!-- Language -->
|
||||
{{ macro.input_select("language", "language", label_language, languages, language_current) }}
|
||||
<!-- Auto refresh -->
|
||||
|
@ -48,6 +50,8 @@
|
|||
<!-- Password encryption key -->
|
||||
<!-- TODO how does the encryption function works currently? -->
|
||||
{{ macro.input_field("text", "password_encrypt_key", null, "password_encrypt_key", label_password_encrypt_key, password_encrypt_key, "cab03a766...", "40", "password_encrypt_key_help", label_password_encrypt_key_note) }}
|
||||
<!-- Custom user agent -->
|
||||
{{ macro.input_field("text", "user_agent", null, "user_agent", label_user_agent, user_agent, "Mozilla/5.0...", "255", "user_agent_key_help", label_user_agent_key_note) }}
|
||||
</fieldset>
|
||||
<!-- Notification settings -->
|
||||
<fieldset>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<span id="needle" style="transform: rotate({{ ((graph.uptime|round/100)*180)|round }}deg);"></span>
|
||||
</div><br>
|
||||
{% endif %}
|
||||
{{ graph.info.0.label }}: {{ graph.info.0.value }}s
|
||||
{{ graph.info.0.label }}: {{ graph.info.0.value * 1000 }} ms
|
||||
</div>
|
||||
|
||||
{% if graph.id == 'history_short' %}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<th scope="col">{{ label_domain }}</th>
|
||||
<th scope="col" style="width: 5%;">{{ label_port }}</th>
|
||||
<th scope="col" style="width: 8%;">{{ label_type }}</th>
|
||||
<th scope="col" style="width: 8%;">{{ label_rtime }}</th>
|
||||
<th scope="col" style="width: 8%;">{{ label_rtime }} (ms)</th>
|
||||
<th scope="col" style="width: 10%;">{{ label_last_online }}</th>
|
||||
<th scope="col" style="width: 10%;">{{ label_last_offline }}</th>
|
||||
<th scope="col" style="width: 10%;">{{ label_monitoring }}</th>
|
||||
|
@ -41,7 +41,7 @@
|
|||
<td><div class="content">{{ server.ip|raw }}</div></td>
|
||||
<td>{{ server.port }}</td>
|
||||
<td>{{ server.type }}</td>
|
||||
<td>{{ server.rtime }}</td>
|
||||
<td>{{ (server.rtime * 1000)|round(2) }}</td>
|
||||
<td><div class="content">{{ server.last_online }}</div></td>
|
||||
<td><div class="content">{{ server.last_offline }}</div></td>
|
||||
<td>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{% import 'main/macros.tpl.html' as macro %}
|
||||
{{ macro.input_csrf() }}
|
||||
<div class="container">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="card text-white text-center col-md-2 pl-0 pr-0 mb-4 {% if status|lower == 'on' %}bg-success{% elseif status|lower == 'warning' %}bg-warning{% elseif status|lower == 'off' %}bg-danger{% endif %}">
|
||||
<div class="card-body d-flex align-items-center justify-content-center">
|
||||
|
@ -51,7 +51,7 @@
|
|||
<li class="list-group-item">
|
||||
<dl class="row">
|
||||
<dt class="col-md-4">{{ label_rtime }}:</dt>
|
||||
<dd class="col-md-8">{{ rtime }} {{ label_seconds }}</dd>
|
||||
<dd class="col-md-8">{{ (rtime * 1000)|round(2) }} {{ label_milliseconds }}</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -354,6 +354,35 @@
|
|||
<div class="row">
|
||||
{{ html_history|raw }}
|
||||
</div>
|
||||
{% if log_entries %}
|
||||
<div class="row mt-4">
|
||||
<div class="card col-md-12 pl-0 pr-0">
|
||||
<div class="card-header">
|
||||
{{ label_log_title }}
|
||||
</div>
|
||||
<div class="card-body d-flex align-items-center justify-content-center">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" style="width: 15%;">{{ label_date }}</th>
|
||||
<th scope="col">{{ label_message }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for entry in log_entries %}
|
||||
<tr>
|
||||
<td><time>{{ entry.datetime_format }}</time></td>
|
||||
<td class="full">{{ entry.message|raw }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="modal fade" id="modal_last_output" tabindex="-1" role="dialog" aria-labelledby="modal_last_output_label" aria-hidden="true">
|
||||
<div class="modal-dialog" style="width:75%;max-width: 100%" role="document">
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{% import 'main/macros.tpl.html' as macro %}
|
||||
{{ macro.input_csrf() }}
|
||||
<div class="container">
|
||||
<div class="container-fluid">
|
||||
<div id="flow-layout" class="{{ block_layout_active }}" aria-labelledby="block-layout">
|
||||
<div class="row">
|
||||
{% for server in servers_offline %}
|
||||
<div class="col-sm-4 col-md-3">
|
||||
<div class="col-sm-4 col-md-3 col-xl-2">
|
||||
<div class="card text-white bg-danger mb-3" onclick="window.location.href='{{ server.url_view|raw }}'">
|
||||
<div class="card-header"><a href="{{ server.url_view|raw }}" class="text-white">{{ server.label }}<span class="sr-only"> ({{ label_offline }})</span></a></div>
|
||||
<div class="card-body">
|
||||
|
@ -17,7 +17,7 @@
|
|||
</div>
|
||||
{% endfor %}
|
||||
{% for server in servers_warning %}
|
||||
<div class="col-sm-4 col-md-3">
|
||||
<div class="col-sm-4 col-md-3 col-xl-2">
|
||||
<div class="card text-white bg-warning mb-3" onclick="window.location.href='{{ server.url_view|raw }}'">
|
||||
<div class="card-header"><a href="{{ server.url_view|raw }}" class="text-white">{{ server.label }}<span class="sr-only"> ({{ label_warning }})</span></a></div>
|
||||
<div class="card-body">
|
||||
|
@ -30,14 +30,14 @@
|
|||
</div>
|
||||
{% endfor %}
|
||||
{% for server in servers_online %}
|
||||
<div class="col-sm-4 col-md-3">
|
||||
<div class="col-sm-4 col-md-3 col-xl-2">
|
||||
<div class="card text-white bg-success mb-3" onclick="window.location.href='{{ server.url_view|raw }}'">
|
||||
<div class="card-header"><a href="{{ server.url_view|raw }}" class="text-white">{{ server.label }}<span class="sr-only"> ({{ label_online }})</span></a></div>
|
||||
<div class="card-body">
|
||||
<p class="card-text">
|
||||
{{ label_last_online }}: {{ server.last_online_nice }}<br>
|
||||
{{ label_last_offline }}: {{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}<br>
|
||||
{{ label_rtime }}: {{ server.rtime }}
|
||||
{{ label_rtime }}: {{ (server.rtime * 1000)|round(2) }} ms
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -97,7 +97,7 @@
|
|||
<th class="full"><a href="{{ server.url_view|raw }}" class="text-white">{{ server.label }}<span class="sr-only"> ({{ label_online }})</span></a></th>
|
||||
<td>{{ server.last_online_nice }}</td>
|
||||
<td>{{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}</td>
|
||||
<td>{{ server.rtime }}s</td>
|
||||
<td>{{ (server.rtime * 1000)|round(2) }} ms</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
html{position:relative;min-height:100%}html[dir='rtl'] #auto_refresh_description,html[dir='rtl'] #log_retention_period_help{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}html[dir='ltr'] #auto_refresh_description,html[dir='ltr'] #log_retention_period_help{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}body{padding-top:4.5rem;margin-bottom:80px}.footer{position:absolute;bottom:0;width:100%;height:60px;line-height:60px;background-color:#f5f5f5}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.64)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,0.85)}dl,dt,dd{margin-bottom:0}footer .text-muted{color:#4C5557 !important}a,button,.nav-link{min-height:44px !important;min-width:44px !important}a.icon{text-decoration:none;cursor:pointer;padding-left:10px}form.form-signin input[type="text"],form.form-reset input[type="text"]{border-bottom-left-radius:0;border-bottom-right-radius:0}form.form-signin input[type="password"]{border-top-left-radius:0;border-top-right-radius:0}form.form-reset input#input-password{border-radius:0}form.form-reset input#input-password-repeat{border-top-left-radius:0;border-top-right-radius:0}form.form-signin,form.form-forgot,form.form-reset{margin:auto}table{table-layout:fixed}th,td{max-width:1px}.content{word-wrap:break-word;overflow-wrap:break-word}table tr[visible='false'],.no-result{display:none}table tr[visible='true']{display:table-row}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:unset}#meter{border-radius:200px 200px 0 0;height:100px;margin:50px auto 0;overflow:hidden;position:relative;width:200px}#meter:before{background:#fbfbfb;border-radius:200px 200px 0 0;-webkit-box-shadow:3px 1px 8px rgba(0,0,0,0.15) inset;box-shadow:3px 1px 8px rgba(0,0,0,0.15) inset;content:"";height:100px;position:absolute;width:200px}#meter:after{background:#fff;border-radius:140px 140px 0 0;bottom:0;-webkit-box-shadow:3px 1px 8px rgba(0,0,0,0.15);box-shadow:3px 1px 8px rgba(0,0,0,0.15);content:"\a" attr(data-value) "%\a" attr(translation);font-size:1.5em;font-weight:100;height:80px;left:20px;line-height:25px;position:absolute;text-align:center;width:160px;z-index:3;white-space:pre}#needle{background:rgba(52,52,64,0.7);border-radius:4px;bottom:-4px;-webkit-box-shadow:3px -1px 4px rgba(0,0,0,0.4);box-shadow:3px -1px 4px rgba(0,0,0,0.4);display:block;height:8px;left:5px;position:absolute;width:95px;-webkit-transform-origin:100% 4px;transform-origin:100% 4px;-webkit-transition:all 1s;transition:all 1s;border-radius:4px;bottom:-4px;box-shadow:3px -1px 4px rgba(0,0,0,0.4);display:block;height:8px;left:5px;position:absolute;width:95px;transform-origin:100% 4px;transition:all 1s}.dropdown-menu.show{left:inherit;right:0px}
|
||||
html{position:relative;min-height:100%}html[dir='rtl'] #auto_refresh_description,html[dir='rtl'] #log_retention_period_help{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}html[dir='ltr'] #auto_refresh_description,html[dir='ltr'] #log_retention_period_help{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}body{padding-top:4.5rem;margin-bottom:80px}.container-fluid{max-width:1920px}.footer{position:absolute;bottom:0;width:100%;height:60px;line-height:60px;background-color:#f5f5f5}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.64)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,0.85)}dl,dt,dd{margin-bottom:0}footer .text-muted{color:#4C5557 !important}a,button,.nav-link{min-height:44px !important;min-width:44px !important}a.icon{text-decoration:none;cursor:pointer;padding-left:10px}form.form-signin input[type="text"],form.form-reset input[type="text"]{border-bottom-left-radius:0;border-bottom-right-radius:0}form.form-signin input[type="password"]{border-top-left-radius:0;border-top-right-radius:0}form.form-reset input#input-password{border-radius:0}form.form-reset input#input-password-repeat{border-top-left-radius:0;border-top-right-radius:0}form.form-signin,form.form-forgot,form.form-reset{margin:auto}table{table-layout:fixed}th,td{max-width:1px}.content{word-wrap:break-word;overflow-wrap:break-word}table tr[visible='false'],.no-result{display:none}table tr[visible='true']{display:table-row}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:unset}#meter{border-radius:200px 200px 0 0;height:100px;margin:50px auto 0;overflow:hidden;position:relative;width:200px}#meter:before{background:#fbfbfb;border-radius:200px 200px 0 0;-webkit-box-shadow:3px 1px 8px rgba(0,0,0,0.15) inset;box-shadow:3px 1px 8px rgba(0,0,0,0.15) inset;content:"";height:100px;position:absolute;width:200px}#meter:after{background:#fff;border-radius:140px 140px 0 0;bottom:0;-webkit-box-shadow:3px 1px 8px rgba(0,0,0,0.15);box-shadow:3px 1px 8px rgba(0,0,0,0.15);content:"\a" attr(data-value) "%\a" attr(translation);font-size:1.5em;font-weight:100;height:80px;left:20px;line-height:25px;position:absolute;text-align:center;width:160px;z-index:3;white-space:pre}#needle{background:rgba(52,52,64,0.7);border-radius:4px;bottom:-4px;-webkit-box-shadow:3px -1px 4px rgba(0,0,0,0.4);box-shadow:3px -1px 4px rgba(0,0,0,0.4);display:block;height:8px;left:5px;position:absolute;width:95px;-webkit-transform-origin:100% 4px;transform-origin:100% 4px;-webkit-transition:all 1s;transition:all 1s;border-radius:4px;bottom:-4px;box-shadow:3px -1px 4px rgba(0,0,0,0.4);display:block;height:8px;left:5px;position:absolute;width:95px;transform-origin:100% 4px;transition:all 1s}.dropdown-menu.show{left:inherit;right:0px}
|
||||
/*# sourceMappingURL=style.min.css.map */
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"version": 3,
|
||||
"mappings": "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",
|
||||
"mappings": "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",
|
||||
"sources": [
|
||||
"../scss/style.scss"
|
||||
],
|
||||
|
|
|
@ -24,6 +24,10 @@ body {
|
|||
margin-bottom: 80px;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
max-width: 1920px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
|
|
Loading…
Reference in New Issue