Updated default template

Fixes #685.
- Updated to Bootstrap V4.
- Changed jqPlot to Chart.js.
- Updated jQuery to the V3.
- Changed Bootstrap Multiselect to Bootstrap-select.
This commit is contained in:
TimZ99 2019-02-08 15:43:22 +01:00
parent 5424976400
commit 6c14709d7c
No known key found for this signature in database
GPG Key ID: 4D8268DC68E8339D
1871 changed files with 78450 additions and 21593 deletions

View File

@ -175,9 +175,13 @@ Vendors
The following libraries are being used by PHP Server Monitor:
* jqPlot - http://www.jqplot.com
* Chart.js - http://chartjs.org/
* Twitter Bootstrap - http://getbootstrap.com
* Bootstrap Multiselect - https://github.com/davidstutz/bootstrap-multiselect
* jQuery - https://jquery.com
* Font Awesome - https://fontawesome.com
* Twig - https://twig.symfony.com
* Bootstrap-select - https://github.com/snapappointments/bootstrap-select
* PHP Mailer - https://github.com/PHPMailer/PHPMailer
* php-pushover - https://github.com/kryap/php-pushover
* Twig - http://twig.sensiolabs.org
* PHP-Pushover - https://github.com/kryap/php-pushover
* Symfony - https://symfony.com
* Random_compat - https://github.com/paragonie/random_compat

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Ниво на достъп',
'level_10' => 'Администратор',
'level_20' => 'Потребител',
'level_description' => '<b>Администраторите</b> имат пълен достъп: могат да управляват сървърите, потребителите и да редактират глобалните настройки.<br/><b>Потребителите</b> могат само да виждат статуса на сървърите и да обнояват информацията за даден сървър, за който им е разрешен достъп.',
'level_description' => '<b>Администраторите</b> имат пълен достъп: могат да управляват сървърите, потребителите и да редактират глобалните настройки.<br><b>Потребителите</b> могат само да виждат статуса на сървърите и да обнояват информацията за даден сървър, за който им е разрешен достъп.',
'mobile' => 'Мобилен телефон',
'email' => 'Имейл',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Преди да използвате Pushover, трябва да <a href="%1$s" target="_blank" rel="noopener">регистрирате свой App</a> в техния сайт и въведете вашия App API Token тук.',
'alert_type' => 'Изберете кога желаете да получавате известия',
'alert_type_description' => '<b>Промяна на сатуса:</b><br>'.
'Ще получавате известие когато има промяна със връзката на даден някой от описаните сървър или сайт. От Онлайн -> Офлайн и от Офлайн -> Онлайн.<br/>'.
'<br/><b>Офлайн</b><br>'.
'Ще получавате известие когато има промяна със връзката на даден някой от описаните сървър или сайт. От Онлайн -> Офлайн и от Офлайн -> Онлайн.<br>'.
'<br><b>Офлайн</b><br>'.
'Ще получите известие когато връзката до сървъра е изгубена за *ПЪРВИ ПЪТ*. Например, '.
'вашия cron скрипт проверява всеки 15 минути и връзката до сървъра е изгубена в 1 часа през нощта и не работи до 6 часа сутринта '.
'Вие ще получите едно известие в 1 часа за това<br/>'.
'Вие ще получите едно известие в 1 часа за това<br>'.
'<br><b>Винаги:</b><br> '.
'Ще получавате известие при всяка проверка на Вашия крон скрипт дори когато връзката до даден сървър или сайт е била прекъсната в продължение на часове.',
'alert_type_status' => 'Промяна на статуса',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Настройки на логовете',
'auto_refresh' => 'Автоматично опресняване',
'auto_refresh_servers' =>
'Автоматично опресняване на страницата.<br/>'.
'Автоматично опресняване на страницата.<br>'.
'<span class="small">'.
'Времето е в секунди, ако е 0 страницата няма да се обновява.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Какъв брой дни да се пазят логовете от известията и архиви за ъптайм на сървърите. Въведете 0 ако желаете логовете да не се трият.',
'log_retention_days' => 'дни',
),
// За нов ред в имейл съобщението, моля използвайте тага <br/>
// За нов ред в имейл съобщението, моля използвайте тага <br>
'notifications' => array(
'off_sms' => 'Сървър \'%LABEL%\' е Офлайн: ip=%IP%, port=%PORT%. Greshka=%ERROR%',
'off_email_subject' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА',
'off_email_body' => "Неуспешно свързване:<br/><br/>Сървър: %LABEL%<br/>IP адрес: %IP%<br/>Порт: %PORT%<br/>Грешка: %ERROR%<br/>Днес: %DATE%",
'off_email_body' => "Неуспешно свързване:<br><br>Сървър: %LABEL%<br>IP адрес: %IP%<br>Порт: %PORT%<br>Грешка: %ERROR%<br>Днес: %DATE%",
'off_pushover_title' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА',
'off_pushover_message' => "Неуспешно свързване:<br/><br/>Сървър: %LABEL%<br/>IP адрес: %IP%<br/>Порт: %PORT%<br/>Грешка: %ERROR%<br/>Днес: %DATE%",
'off_pushover_message' => "Неуспешно свързване:<br><br>Сървър: %LABEL%<br>IP адрес: %IP%<br>Порт: %PORT%<br>Грешка: %ERROR%<br>Днес: %DATE%",
'on_sms' => 'Сървър \'%LABEL%\' е Онлайн: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА',
'on_email_body' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Сървър: %LABEL%<br/>IP адрес: %IP%<br/>Порт: %PORT%<br/>Днес: %DATE%",
'on_email_body' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:<br><br>Сървър: %LABEL%<br>IP адрес: %IP%<br>Порт: %PORT%<br>Днес: %DATE%",
'on_pushover_title' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА',
'on_pushover_message' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Сървър: %LABEL%<br/>IP адрес: %IP%<br/>Порт: %PORT%<br/>Днес: %DATE%",
'on_pushover_message' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:<br><br>Сървър: %LABEL%<br>IP адрес: %IP%<br>Порт: %PORT%<br>Днес: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Добре дошъл, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Забравили сте паролата си?',
'password_reset' => 'Възстановяване на паролата',
'password_reset_email_subject' => 'Възстановяване на парола за PHP Сървър Мониторинг',
'password_reset_email_body' => 'За да възстановите паролата си е нужно да кликнете на линка по-долу. Валидността на линка е един час.<br/><br/>%link%',
'password_reset_email_body' => 'За да възстановите паролата си е нужно да кликнете на линка по-долу. Валидността на линка е един час.<br><br>%link%',
'error_user_incorrect' => 'Потребителят не може да бъде намерен.',
'error_login_incorrect' => 'Информацията е грешна.',
'error_login_passwords_nomatch' => 'Паролите не съвпадат.',

View File

@ -93,7 +93,7 @@ $sm_lang = array(
'level' => 'Oprávnění',
'level_10' => 'Administrátor',
'level_20' => 'Uživatel',
'level_description' => '<b>Administrátor</b> má plný přístup: může spravovat servery, uživatele a upravit globální konfiguraci.<br/><b>Uživatel</b> má práva pouze na čtení a spustit aktualizaci serverů, které má přiřazeny.',
'level_description' => '<b>Administrátor</b> má plný přístup: může spravovat servery, uživatele a upravit globální konfiguraci.<br><b>Uživatel</b> má práva pouze na čtení a spustit aktualizaci serverů, které má přiřazeny.',
'mobile' => 'Mobil',
'email' => 'E-mail',
'pushover' => 'Pushover',
@ -137,7 +137,8 @@ $sm_lang = array(
'domain' => 'Doména/IP',
'timeout' => 'Časový limit',
'timeout_description' => 'Počet vteřin čekání na odpověď serveru.',
'authentication_settings' => 'Nastavení autentizace (volitelný)',
'authentication_settings' => 'Nastavení autentizace',
'optional' => 'volitelný',
'website_username' => 'Uživatelské jméno',
'website_username_description' => 'Uživatelské jméno pro přístup na stránku. (Pouze Apache autorizace je podporovaná.)',
'website_password' => 'Heslo',
@ -228,9 +229,9 @@ $sm_lang = array(
'pushover_api_token_description' => 'Pře použitím Pushoveru se musíte <a href="%1$s" target="_blank" rel="noopener">registrovat</a> a získat API Token.',
'alert_type' => 'Zvolte kdy si přejete být upozorněni.',
'alert_type_description' => '<b>Změna stavu:</b> '.
'Obdržíte upozornění při změně stavu, tedy:online -> offline nebo offline -> online.<br/>'.
'Obdržíte upozornění při změně stavu, tedy:online -> offline nebo offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Obdržíte upozornění, kdy server přejde poprvé do offline stavu. Například, pokud je cron nastaven na 15 minut a sledovaný server bude offline mezi 01:00 a 06:00. Obdržíte upozornění pouze v 01:00. <br/>'.
'Obdržíte upozornění, kdy server přejde poprvé do offline stavu. Například, pokud je cron nastaven na 15 minut a sledovaný server bude offline mezi 01:00 a 06:00. Obdržíte upozornění pouze v 01:00. <br>'.
'<br><b>Vždy:</b> '.
'Obdržíte upozornění při každém spuštění kontroly, tedy i pokud bude server offline několik hodin.',
'alert_type_status' => 'Změna stavu',
@ -252,7 +253,7 @@ $sm_lang = array(
'settings_log' => 'Nastavení logu',
'auto_refresh' => 'Automaticky obnovit',
'auto_refresh_servers' =>
'Automaticky obnovit stránku Servery.<br/>'.
'Automaticky obnovit stránku Servery.<br>'.
'<span class="small">'.
'Čas v sekundách, 0 pro vypnutí automatického obnovení.'.
'</span>',
@ -277,18 +278,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Počet dnů po které budou zachovány logy upozornění. Vložte 0 pro vypnutí autorotace.',
'log_retention_days' => 'dnů',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%',
'off_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je offline',
'off_email_body' => 'Nebylo možné spojit se se serverem:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Chyba: %ERROR%<br/>Datum: %DATE%',
'off_email_body' => 'Nebylo možné spojit se se serverem:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Chyba: %ERROR%<br>Datum: %DATE%',
'off_pushover_title' => 'Server \'%LABEL%\' je offline',
'off_pushover_message' => 'Nebylo možné spojit se se serverem:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Chyba: %ERROR%<br/>Datum: %DATE%',
'off_pushover_message' => 'Nebylo možné spojit se se serverem:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Chyba: %ERROR%<br>Datum: %DATE%',
'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je online',
'on_email_body' => "Server '%LABEL%' je opět online, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Datum: %DATE%",
'on_email_body' => "Server '%LABEL%' je opět online, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Datum: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' je online',
'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Datum: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Datum: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Vítejte, %user_name%',
@ -305,7 +306,7 @@ $sm_lang = array(
'password_forgot' => 'Zapomenuté heslo?',
'password_reset' => 'Obnovit heslo',
'password_reset_email_subject' => 'Obnovit heslo pro PHP Server Monitor',
'password_reset_email_body' => 'Použijte následující odkaz pro obnovení hesla. Odkaz je platný jednu hodinu.<br/><br/>%link%',
'password_reset_email_body' => 'Použijte následující odkaz pro obnovení hesla. Odkaz je platný jednu hodinu.<br><br>%link%',
'error_user_incorrect' => 'Zadané uživatelské jméno nebylo nalezeno.',
'error_login_incorrect' => 'Přihlášení nebylo úspěšné.',
'error_login_passwords_nomatch' => 'Zadaná hesla neodpovídají.',

View File

@ -90,7 +90,7 @@ $sm_lang = array(
'level' => 'Niveau',
'level_10' => 'Administrator',
'level_20' => 'Bruger',
'level_description' => '<b>Administratorer</b> har fuld adgang: De kan styre servere, brugere og indstillinger.<br/><b>Brugere</b> kan kun se og opdatere servere som er de har adgang til.',
'level_description' => '<b>Administratorer</b> har fuld adgang: De kan styre servere, brugere og indstillinger.<br><b>Brugere</b> kan kun se og opdatere servere som er de har adgang til.',
'mobile' => 'Mobil',
'email' => 'E-mail',
'pushover' => 'Pushover',
@ -213,11 +213,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Før du kan benytte Pushover, skal du <a href="%1$s" target="_blank" rel="noopener">registrere en app</a> på deres website og indtaste en App API Token her.',
'alert_type' => 'Vælg hvornår du vil modtage beskeden',
'alert_type_description' => '<b>Status ændring:</b> '.
'Du vil modtage en notifkation når en server har en ændring i status. Fra online -> offline eller offline -> online.<br/>'.
'Du vil modtage en notifkation når en server har en ændring i status. Fra online -> offline eller offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Du vil modtage en meddelelse, når en server går offline for første gang. Eksempelvis '.
'hvis dit cronjob kører hvert kvarter, og din server går ned kl 01 og kommer først op kl 06, '.
' vil du kun modtage en mail kl 01.<br/>'.
' vil du kun modtage en mail kl 01.<br>'.
'<br><b>Altid:</b> '.
'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',
@ -239,7 +239,7 @@ $sm_lang = array(
'settings_log' => 'Log indstillinger',
'auto_refresh' => 'Genopfrisk automatisk',
'auto_refresh_servers' =>
'Genopfrisk automatisk serversider.<br/>'.
'Genopfrisk automatisk serversider.<br>'.
'<span class="small">'.
'Tid i sekunder. Hvis 0 vil siden ikke genopfriske automatisk'.
'</span>',
@ -264,18 +264,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Antal dage over hvor længe logs med notifikationer og arkiverede serveres oppetid skal gemmes. Indtast 0 for at deaktivere logoprydning.',
'log_retention_days' => 'dage',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Fejl=%ERROR%',
'off_email_subject' => 'VIGTIGT: Server \'%LABEL%\' er NEDE',
'off_email_body' => "Det lykkedes ikke at oprette forbindelse til følgende server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fejl: %ERROR%<br/>Dato: %DATE%",
'off_email_body' => "Det lykkedes ikke at oprette forbindelse til følgende server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fejl: %ERROR%<br>Dato: %DATE%",
'off_pushover_title' => 'Serveren \'%LABEL%\' er NEDE',
'off_pushover_message' => "Det lykkedes ikke at oprette forbindelse til følgende server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fejl: %ERROR%<br/>Dato: %DATE%",
'off_pushover_message' => "Det lykkedes ikke at oprette forbindelse til følgende server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fejl: %ERROR%<br>Dato: %DATE%",
'on_sms' => 'Serveren \'%LABEL%\' KØRER: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'VIGTIGT: Serveren \'%LABEL%\' KØRER',
'on_email_body' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dato: %DATE%",
'on_email_body' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dato: %DATE%",
'on_pushover_title' => 'Serveren \'%LABEL%\' KØRER',
'on_pushover_message' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dato: %DATE%",
'on_pushover_message' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dato: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Velkommen, %user_name%',
@ -292,7 +292,7 @@ $sm_lang = array(
'password_forgot' => 'Glemt adgangskode?',
'password_reset' => 'Nulstil adgangskode',
'password_reset_email_subject' => 'Nulstil din adgangskode for PHP Server Monitor',
'password_reset_email_body' => 'Brug venligst følgende link for at nulstille din adgangskode. Bemærk at linkets gyldighed udløber efter en time.<br/><br/>%link%',
'password_reset_email_body' => 'Brug venligst følgende link for at nulstille din adgangskode. Bemærk at linkets gyldighed udløber efter en time.<br><br>%link%',
'error_user_incorrect' => 'Det angivet brugernavn kunne ikke findes.',
'error_login_incorrect' => 'Oplysningerne stemmer ikke overens.',
'error_login_passwords_nomatch' => 'De angivne adgangskoder er ikke ens.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Berechtigungsstufe',
'level_10' => 'Administrator',
'level_20' => 'Benutzer',
'level_description' => '<b>Administratoren</b> haben vollen Zugriff — sie können Webseiten, Benutzer und globale Einstellungen verwalten.<br/><b>Benutzer</b> können nur (für ihnen zugeordnete Webseiten) Analysedaten einsehen und deren Aktualisierung veranlassen.',
'level_description' => '<b>Administratoren</b> haben vollen Zugriff — sie können Webseiten, Benutzer und globale Einstellungen verwalten.<br><b>Benutzer</b> können nur (für ihnen zugeordnete Webseiten) Analysedaten einsehen und deren Aktualisierung veranlassen.',
'mobile' => 'Mobil',
'email' => 'E-Mail',
'pushover' => 'Pushover',
@ -216,12 +216,12 @@ $sm_lang = array(
'pushover_api_token_description' => 'Bevor Sie Pushover verwenden können, müssen Sie Ihre <a href="%1$s" target="_blank" rel="noopener">Anwendung hier registrieren</a> und Ihren Anwendungs-API-Token hier eingeben.',
'alert_type' => 'Wann möchten Sie benachrichtigt werden?',
'alert_type_description' => '<b>Status geändert:</b> '.
'... wenn sich der Status ändert<br/>'.
'z. B. online -> offline oder offline -> online.<br/>'.
'<br/><b>Offline: </b>'.
'Sie bekommen eine Benachrichtigung, wenn ein Server offline ist.<br/>'.
'Es wird nur eine Mitteilung versendet.<br/>'.
'<br/><b>Immer: </b>'.
'... wenn sich der Status ändert<br>'.
'z. B. online -> offline oder offline -> online.<br>'.
'<br><b>Offline: </b>'.
'Sie bekommen eine Benachrichtigung, wenn ein Server offline ist.<br>'.
'Es wird nur eine Mitteilung versendet.<br>'.
'<br><b>Immer: </b>'.
'Sie erhalten jedes Mal eine Benachrichtigung, sobald der CronJob oder das Skript ausgeführt werden, auch wenn der Dienst mehrere Stunden offline sein sollte.',
'alert_type_status' => 'Status geändert',
'alert_type_offline' => 'Offline',
@ -242,7 +242,7 @@ $sm_lang = array(
'settings_log' => 'Protokollierungseinstellungen',
'auto_refresh' => 'Automatische Aktualisierung',
'auto_refresh_servers' =>
'Automatische Aktualisierung der Server-Übersichtsseite<br/>'.
'Automatische Aktualisierung der Server-Übersichtsseite<br>'.
'<span class="small">'.
'Zeit in Sekunden - die Ziffer \'0\' deaktiviert die automatische Aktualisierung.'.
'</span>',
@ -267,18 +267,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Anzahl in Tagen bis zur automatischen Bereinigung/Löschung sämtlicher Protokollierungsdaten im System. Geben Sie die Ziffer \'0\' ein, um die automatische Bereinigung/Löschung zu deaktivieren.',
'log_retention_days' => 'Tage',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Dienst/Webseite \'%LABEL%\' ist offline: ip=%IP%, port=%PORT%. Fehler=%ERROR%',
'off_email_subject' => 'Warnung: Dienst/Webseite \'%LABEL%\' ist offline.',
'off_email_body' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:<br/><br/>Dienst/Webseite: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fehler: %ERROR%<br/>Datum: %DATE% Uhr",
'off_email_body' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:<br><br>Dienst/Webseite: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fehler: %ERROR%<br>Datum: %DATE% Uhr",
'off_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist offline.',
'off_pushover_message' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:<br/><br/>Dienst/Webseite: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fehler: %ERROR%<br/>Datum: %DATE% Uhr",
'off_pushover_message' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:<br><br>Dienst/Webseite: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fehler: %ERROR%<br>Datum: %DATE% Uhr",
'on_sms' => 'Dienst/Webseite \'%LABEL%\' ist wieder online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'Hinweis: Dienst/Webseite \'%LABEL%\' ist wieder online.',
'on_email_body' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Datum: %DATE% Uhr",
'on_email_body' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Datum: %DATE% Uhr",
'on_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist wieder online.',
'on_pushover_message' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Datum: %DATE% Uhr",
'on_pushover_message' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Datum: %DATE% Uhr",
),
'login' => array(
'welcome_usermenu' => '%user_name%',
@ -295,7 +295,7 @@ $sm_lang = array(
'password_forgot' => 'Passwort vergessen?',
'password_reset' => 'Passwort zurücksetzen',
'password_reset_email_subject' => 'Setzen Sie Ihr Zugangspasswort für den Server Monitor',
'password_reset_email_body' => 'Benutzen Sie bitte den folgenden Link, um Ihr Zugangspasswort zurückzusetzen. Bitte beachten Sie: Der Link verfällt in 1 Stunde.<br/><br/>%link%',
'password_reset_email_body' => 'Benutzen Sie bitte den folgenden Link, um Ihr Zugangspasswort zurückzusetzen. Bitte beachten Sie: Der Link verfällt in 1 Stunde.<br><br>%link%',
'error_user_incorrect' => 'Der angegebene Benutzername konnte nicht gefunden werden.',
'error_login_incorrect' => 'Die angegebenen Informationen sind leider nicht korrekt.',
'error_login_passwords_nomatch' => 'Die angegebenen Passwörter stimmen nicht überein.',

View File

@ -37,13 +37,14 @@ $sm_lang = array(
'save' => 'Save',
'edit' => 'Edit',
'delete' => 'Delete',
'view' => 'View',
'date' => 'Date',
'message' => 'Message',
'yes' => 'Yes',
'no' => 'No',
'insert' => 'Insert',
'add_new' => 'Add new',
'update_available' => 'A new version ({version}) is available from <a href="https://github.com/phpservermon/phpservermon/releases/latest" target="_blank" rel="noopener">http://www.phpservermonitor.org</a>.',
'update_available' => 'A new version ({version}) is available. Click <a href="https://github.com/phpservermon/phpservermon/releases/latest" target="_blank" rel="noopener">here</a> to download the update.',
'back_to_top' => 'Back to top',
'go_back' => 'Go back',
'ok' => 'OK',
@ -51,7 +52,6 @@ $sm_lang = array(
'cancel' => 'Cancel',
'none' => 'None',
'activate' => 'Activate',
'advanced' => 'Advanced',
// date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php
'short_day_format' => '%B %e',
'long_day_format' => '%B %e, %Y',
@ -76,8 +76,9 @@ $sm_lang = array(
'minutes' => 'minutes',
'second' => 'second',
'seconds' => 'seconds',
'online' => 'online',
'offline' => 'offline',
'current' => 'current',
'settings' => 'Settings',
'search' => 'Search'
),
'menu' => array(
'config' => 'Config',
@ -98,7 +99,7 @@ $sm_lang = array(
'level' => 'Level',
'level_10' => 'Administrator',
'level_20' => 'User',
'level_description' => '<b>Administrators</b> have full access: they can manage servers, users and edit the global configuration.<br/><b>Users</b> can only view and run the updater for the servers that have been assigned to them.',
'level_description' => '<b>Administrators</b> have full access: they can manage servers, users and edit the global configuration.<br><b>Users</b> can only view and run the updater for the servers that have been assigned to them.',
'mobile' => 'Mobile',
'email' => 'Email',
'pushover' => 'Pushover',
@ -153,13 +154,15 @@ $sm_lang = array(
'domain' => 'Domain/IP',
'timeout' => 'Timeout',
'timeout_description' => 'Number of seconds to wait for the server to respond.',
'authentication_settings' => 'Authentication Settings (Optional)',
'authentication_settings' => 'Authentication Settings',
'optional' => 'Optional',
'website_username' => 'Username',
'website_username_description' => 'Username to access the site. (Only Apache authentication is supported.)',
'website_password' => 'Password',
'website_password_description' => 'Password to access the site. The password is encrypted in the database.',
'fieldset_monitoring' => 'Monitoring',
'fieldset_permissions' => 'Permissions',
'permissions' => 'Server will be visible for the following users',
'port' => 'Port',
'custom_port' => 'Custom Port',
'popular_ports' => 'Popular Ports',
@ -167,7 +170,7 @@ $sm_lang = array(
'custom_request_method' => 'Custom request method',
'popular_request_methods' => 'Popular request methods',
'post_field' => 'Post field',
'post_field_description' => 'The data that will be send using the request method above. Example: param1=val1&amp;param2=val2&...',
'post_field_description' => 'The data that will be send using the request method above.',
'please_select' => 'Please select',
'type' => 'Type',
'type_website' => 'Website',
@ -180,16 +183,18 @@ $sm_lang = array(
'redirect_check' => 'Redirecting to another domain is',
'redirect_check_description' => 'Redirect to another domain is usually a bad sign.',
'allow_http_status' => 'Allow HTTP status code',
'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as online by default. Seperate with |. Example: 401|403.',
'header' => 'Header',
'header_name_description' => 'Header name (case-sensitive)',
'header_value_description' => 'Header value. Regular expressions are allowed.',
'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as online by default. Seperate with |.',
'header_name' => 'Header name',
'header_value' => 'Header value',
'header_name_description' => 'Case-sensitive.',
'header_value_description' => 'Regular expressions are allowed.',
'last_check' => 'Last check',
'last_online' => 'Last online',
'last_offline' => 'Last offline',
'last_output' => 'Last positive output',
'last_error' => 'Last error',
'last_error_output' => 'Last error output',
'output' => 'Output',
'monitoring' => 'Monitoring',
'no_monitoring' => 'No monitoring',
'email' => 'Email',
@ -210,6 +215,8 @@ $sm_lang = array(
'latency_max' => 'Latency (maximum)',
'latency_min' => 'Latency (minimum)',
'latency_avg' => 'Latency (average)',
'online' => 'online',
'offline' => 'offline',
'uptime' => 'Uptime',
'year' => 'Year',
'month' => 'Month',
@ -274,22 +281,22 @@ $sm_lang = array(
'telegram_api_token_description' => 'Before you can use Telegram, you need to get a API token. Visit the <a href="http://docs.phpservermonitor.org/">documentation</a> for help.',
'alert_type' => 'Select when you\'d like to be notified.',
'alert_type_description' => '<b>Status change:</b> '.
'You will receive a notification when a server has a change in status. So from online -> offline or offline -> online.<br/>'.
'<br /><b>Offline:</b> '.
'You will receive a notification when a server has a change in status. So from online -> offline or offline -> online.<br>'.
'<br><b>Offline:</b> '.
'You will receive a notification when a server goes offline for the *FIRST TIME ONLY*. For example, '.
'your cronjob is every 15 minutes and your server goes down at 1 am and stays down till 6 am. '.
'You will get 1 notification at 1 am and that\'s it.<br/>'.
'You will get 1 notification at 1 am and that\'s it.<br>'.
'<br><b>Always:</b> '.
'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',
'combine_notifications' => 'Combine notifications',
'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into 1 single notification. (This does not affect SMS notifications.)',
'combine_notifications' => 'Combine notifications',
'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into 1 single notification. (This does not affect SMS notifications.)',
'alert_proxy' => 'Even if enabled, proxy is never used for services',
'alert_proxy_url' => '<b>Format:</b> Host:Port',
'alert_proxy_url' => 'Format: host:port',
'log_status' => 'Log status',
'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the Notification settings are passed.',
'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the notification settings are passed.',
'log_email' => 'Log emails sent by the script',
'log_sms' => 'Log text messages sent by the script',
'log_pushover' => 'Log pushover messages sent by the script',
@ -308,7 +315,7 @@ $sm_lang = array(
'settings_proxy' => 'Proxy settings',
'auto_refresh' => 'Auto-refresh',
'auto_refresh_servers' =>
'Auto-refresh servers page.<br/>'.
'Auto-refresh servers page.<br>'.
'<span class="small">'.
'Time in seconds, if 0 the page won\'t refresh.'.
'</span>',
@ -338,31 +345,31 @@ $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',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => 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:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_email_body' => "Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' is DOWN',
'off_pushover_message' => "Failed to connect to the following server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_telegram_message' => "Failed to connect to the following server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_pushover_message' => "Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'off_telegram_message' => "Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING',
'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING',
'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%',
'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for :<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Downtime: %LAST_OFFLINE_DURATION%<br/>Date: %DATE%',
'combi_off_email_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: %ERROR%</li><li>Date: %DATE%</li></ul>",
'combi_off_pushover_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: %ERROR%</li><li>Date: %DATE%</li></ul>",
'combi_off_telegram_message' => "- Server: %LABEL%<br/>- IP: %IP%<br/>- Port: %PORT%<br/>- Error: %ERROR%<br/>- Date: %DATE%<br/><br/>",
'combi_on_email_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date: %DATE%</li></ul>",
'combi_on_pushover_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date: %DATE%</li></ul>',
'combi_on_telegram_message' => '- Server: %LABEL%<br/>- IP: %IP%<br/>- Port: %PORT%<br/>- Downtime: %LAST_OFFLINE_DURATION%<br/>- Date: %DATE%<br/><br/>',
'combi_email_subject' => 'IMPORTANT: \'%UP%\' servers UP again, \'%DOWN%\' servers DOWN',
'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%',
'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for :<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Downtime: %LAST_OFFLINE_DURATION%<br>Date: %DATE%',
'combi_off_email_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: %ERROR%</li><li>Date: %DATE%</li></ul>",
'combi_off_pushover_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: %ERROR%</li><li>Date: %DATE%</li></ul>",
'combi_off_telegram_message' => "- Server: %LABEL%<br>- IP: %IP%<br>- Port: %PORT%<br>- Error: %ERROR%<br>- Date: %DATE%<br><br>",
'combi_on_email_message' => "<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date: %DATE%</li></ul>",
'combi_on_pushover_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date: %DATE%</li></ul>',
'combi_on_telegram_message' => '- Server: %LABEL%<br>- IP: %IP%<br>- Port: %PORT%<br>- Downtime: %LAST_OFFLINE_DURATION%<br>- Date: %DATE%<br><br>',
'combi_email_subject' => 'IMPORTANT: \'%UP%\' servers UP again, \'%DOWN%\' servers DOWN',
'combi_pushover_subject' => '\'%UP%\' servers UP again, \'%DOWN%\' servers DOWN',
'combi_email_message' => '<b>The following servers went down:</b><br/>%DOWN_SERVERS%<br/><b>The following servers are up again:</b><br/>%UP_SERVERS%',
'combi_pushover_message' => '<b>The following servers went down:</b><br/>%DOWN_SERVERS%<br/><b>The following servers are up again:</b><br/>%UP_SERVERS%',
'combi_telegram_message' => '<b>The following servers went down:</b><br/>%DOWN_SERVERS%<br/><b>The following servers are up again:</b><br/>%UP_SERVERS%',
'combi_email_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following servers are up again:</b><br>%UP_SERVERS%',
'combi_pushover_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following servers are up again:</b><br>%UP_SERVERS%',
'combi_telegram_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following servers are up again:</b><br>%UP_SERVERS%',
),
'login' => array(
'welcome_usermenu' => 'Welcome, %user_name%',
@ -379,7 +386,7 @@ $sm_lang = array(
'password_forgot' => 'Forgot password?',
'password_reset' => 'Reset password',
'password_reset_email_subject' => 'Reset your password for PHP Server Monitor',
'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.<br/><br/>%link%',
'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.<br><br>%link%',
'error_user_incorrect' => 'The provided username could not be found.',
'error_login_incorrect' => 'The information is incorrect.',
'error_login_passwords_nomatch' => 'The provided passwords do not match.',

View File

@ -94,7 +94,7 @@ $sm_lang = array(
'level' => 'Nivel',
'level_10' => 'Administrador',
'level_20' => 'Usuarios',
'level_description' => '<b>Administradores</b> tienen acceso completo: pueden administrar servidores, usuarios y editar la configuración global.<br/>Los <b>usuarios</b> sólo pueden ver y ejecutar el programa de actualización para los servidores que se han asignado a los mismos.',
'level_description' => '<b>Administradores</b> tienen acceso completo: pueden administrar servidores, usuarios y editar la configuración global.<br>Los <b>usuarios</b> sólo pueden ver y ejecutar el programa de actualización para los servidores que se han asignado a los mismos.',
'mobile' => 'Móvil',
'email' => 'Email',
'pushover' => 'Pushover',
@ -217,10 +217,10 @@ $sm_lang = array(
'pushover_api_token_description' => 'Antes de poder utilizar Pushover, necesita <a href="%1$s" target="_blank" rel="noopener"> registrar </a> su aplicación en la página web e ingresar el token API.',
'alert_type' => '¿Cuándo desea recibir notificaciones ?',
'alert_type_description' => '<b>... Al cambiar el estado:</b> '.
'p.ej. en línea -> fuera de línea o fuera de línea -> en línea.<br/>'.
'p.ej. en línea -> fuera de línea o fuera de línea -> en línea.<br>'.
'<br /><b>Fuera de Línea:</b> '.
'Recibirá una notificación cuando el servidor esté fuera de línea.'.
'Se envia un sólo mensaje cuando se detecte la caída por primera vez.<br/>'.
'Se envia un sólo mensaje cuando se detecte la caída por primera vez.<br>'.
'<br><b>Siempre:</b> '.
'Se le enviará una notificación cada vez que se ejecuta el script '.
'aunqué el servicio puede haber estado fuera de línea por varias horas.',
@ -243,7 +243,7 @@ $sm_lang = array(
'settings_log' => 'Log',
'auto_refresh' => 'Refrescar automáticamente la página de servidores',
'auto_refresh_servers' =>
'Refrescar automáticamente la página de servidores.<br/>'.
'Refrescar automáticamente la página de servidores.<br>'.
'<span class="small">'.
'Tiempo en segundos, indicar "0" para no actualizar.'.
'</span>',
@ -268,18 +268,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Número de días que se conservan registros de las notificaciones y los archivos de tiempo de actividad del servidor. Introduzca 0 para desactivar la limpieza de los registros.',
'log_retention_days' => 'días',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Servidor \'%LABEL%\' está fuera de línea: ip=%IP%, puerto=%PORT%. error=%ERROR%',
'off_email_subject' => 'Importante: Servidor \'%LABEL%\' está fuera de línea',
'off_email_body' => "No posible conectar al servidor:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Puerto: %PORT%<br/>Error: %ERROR%<br/>Fecha: %DATE%",
'off_email_body' => "No posible conectar al servidor:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Puerto: %PORT%<br>Error: %ERROR%<br>Fecha: %DATE%",
'off_pushover_title' => 'Servidor \'%LABEL%\' está fuera de línea',
'off_pushover_message' => "No posible conectar al servidor:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Puerto: %PORT%<br/>Error: %ERROR%<br/>Fecha: %DATE%",
'off_pushover_message' => "No posible conectar al servidor:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Puerto: %PORT%<br>Error: %ERROR%<br>Fecha: %DATE%",
'on_sms' => 'Servidor \'%LABEL%\' ya está de nuevo funcionando en línea: ip=%IP%, puerto=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'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, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Puerto: %PORT%<br/>Fecha: %DATE%",
'on_email_body' => "Servidor '%LABEL%' ya está funcionando en línea de nuevo, it was down for %LAST_OFFLINE_DURATION%:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Puerto: %PORT%<br>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, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Puerto: %PORT%<br/>Fecha: %DATE%",
'on_pushover_message' => "Servidor '%LABEL%' ya está funcionando en línea de nuevo, it was down for %LAST_OFFLINE_DURATION%:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Puerto: %PORT%<br>Fecha: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Bienvenido, %user_name%',
@ -296,7 +296,7 @@ $sm_lang = array(
'password_forgot' => '¿Has olvidado tu contraseña?',
'password_reset' => 'Perdí mi contraseña',
'password_reset_email_subject' => 'Restablecer la contraseña para PHP Server Monitor',
'password_reset_email_body' => 'Utilice el siguiente enlace para restablecer tu contraseña. Tenga en cuenta que expira de 1 hora.<br/><br/>%link%',
'password_reset_email_body' => 'Utilice el siguiente enlace para restablecer tu contraseña. Tenga en cuenta que expira de 1 hora.<br><br>%link%',
'error_user_incorrect' => 'El nombre de usuario proporcionado no se pudo encontrar.',
'error_login_incorrect' => 'La información es incorrecta.',
'error_login_passwords_nomatch' => 'Las contraseñas proporcionadas no coinciden.',

View File

@ -80,7 +80,7 @@ $sm_lang = array(
'level' => 'Tase',
'level_10' => 'Administraator',
'level_20' => 'Kasutaja',
'level_description' => '<b>Administraatoritel</b> on täielik ligipääs: nad saavad hallata servereid, kasutajaid ja muuta globaalset konfiguratsiooni.<br/><b>Kasutajad</b> saavad ainult näha ja uuendada neid servereid, mis on neile määratud.',
'level_description' => '<b>Administraatoritel</b> on täielik ligipääs: nad saavad hallata servereid, kasutajaid ja muuta globaalset konfiguratsiooni.<br><b>Kasutajad</b> saavad ainult näha ja uuendada neid servereid, mis on neile määratud.',
'mobile' => 'Mobiil',
'email' => 'Email',
'pushover' => 'Pushover',
@ -202,11 +202,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Enne, kui saad Pushoverida pead sa <a href="%1$s" target="_blank" rel="noopener">regristreerima äpi</a> nende kodulehel ja sisestama API žetooni siia.',
'alert_type' => 'Vali, millal sa sooviksid olla teavitatud.',
'alert_type_description' => '<b>Staatuse muutus:</b> '.
'Saate teavituse kui serveri staatuses toimub muudatusi. Seega kättesaadav -> võrgust väljas või võrgust väljas -> kättesaadav.<br/>'.
'Saate teavituse kui serveri staatuses toimub muudatusi. Seega kättesaadav -> võrgust väljas või võrgust väljas -> kättesaadav.<br>'.
'<br /><b>Võrgust väljas:</b> '.
'Saate teavituse kui server läheb võrgust välja *ESIMEST KORDA*. Näiteks, '.
'sinu cronjob on iga 15 minuti tagant ja sulgub kell 1 öösel kuni kella 6ni hommikul. '.
'Saate 1 teavituse kell 1 öösel ja see on kõik.<br/>'.
'Saate 1 teavituse kell 1 öösel ja see on kõik.<br>'.
'<br><b>Alati:</b> '.
'Saate teavituse iga kord kui staatust uuendatakse, isegi kui leht on olnud maas juba tunde.',
'alert_type_status' => 'Staatuse muutus',
@ -228,7 +228,7 @@ $sm_lang = array(
'settings_log' => 'Logi seaded',
'auto_refresh' => 'Automaatne värskendamine',
'auto_refresh_servers' =>
'Värskenda lehte automaatselt.<br/>'.
'Värskenda lehte automaatselt.<br>'.
'<span class="small">'.
'Aeg sekundites, kui 0 siis lehte ei värskendata.'.
'</span>',
@ -253,18 +253,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Arv päevi, mil hoida logid alles. Sisesta 0, et keelata logide puhastus.',
'log_retention_days' => 'päeva',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' on MAAS: ip=%IP%, port=%PORT%. Error=%ERROR%',
'off_email_subject' => 'TÄHTIS: Server \'%LABEL%\' is MAAS',
'off_email_body' => "Ühendus järgnevasse serverisse ebaõnnestus:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Kuupäev: %DATE%",
'off_email_body' => "Ühendus järgnevasse serverisse ebaõnnestus:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Kuupäev: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' on MAAS',
'off_pushover_message' => "Ühendus järgnevasse serverisse ebaõnnestus:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Kuupäev: %DATE%",
'off_pushover_message' => "Ühendus järgnevasse serverisse ebaõnnestus:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Kuupäev: %DATE%",
'on_sms' => 'Server \'%LABEL%\' on KÄTTESAADAV: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'TÄHTIS: Server \'%LABEL%\' on kättesaadav',
'on_email_body' => "Server '%LABEL%' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Kuupäev: %DATE%",
'on_email_body' => "Server '%LABEL%' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Kuupäev: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' on kättesaadav',
'on_pushover_message' => 'Server \'%LABEL%\' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Kuupäev: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Kuupäev: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Teretulemast, %user_name%',
@ -281,7 +281,7 @@ $sm_lang = array(
'password_forgot' => 'Unustasid salasõna?',
'password_reset' => 'Lähtesta parool',
'password_reset_email_subject' => 'Lähtestage oma PHP Serveri Monitori parool',
'password_reset_email_body' => 'Palun kasutage järgnevat linki oma parooli lähtestamiseks. Palume tähendada, et see aegub 1 tunni jooksul.<br/><br/>%link%',
'password_reset_email_body' => 'Palun kasutage järgnevat linki oma parooli lähtestamiseks. Palume tähendada, et see aegub 1 tunni jooksul.<br><br>%link%',
'error_user_incorrect' => 'Antud kasutaja ei ole kehtiv.',
'error_login_incorrect' => 'Informatsioon ei ole õige.',
'error_login_passwords_nomatch' => 'Sisestatud paroolid ei kattu.',

View File

@ -80,7 +80,7 @@ $sm_lang = array(
'level' => 'سطح',
'level_10' => 'مدیر',
'level_20' => 'کاربر',
'level_description' => '<b>مدیر</b> دسترسی کامل: این گروه ها توانایی مدیریت سرورها، کاربران و ویرایش تنظیمات عمومی را داردند.<br/><b>کاربران</b> تنها توانایی دیدن و بروزرسانی سرورهای اختصاص داده شده به خودشان را داردند.',
'level_description' => '<b>مدیر</b> دسترسی کامل: این گروه ها توانایی مدیریت سرورها، کاربران و ویرایش تنظیمات عمومی را داردند.<br><b>کاربران</b> تنها توانایی دیدن و بروزرسانی سرورهای اختصاص داده شده به خودشان را داردند.',
'mobile' => 'موبایل',
'email' => 'ایمیل',
'pushover' => 'Pushover',
@ -202,7 +202,7 @@ $sm_lang = array(
'pushover_api_token_description' => 'قبل از استفاده از پوش آور، شما باید در سایت آن ها <a href="%1$s" target="_blank" rel="noopener">یک برنامه ثبت نام کنید</a> و رمز API برنامه پوش آور را اینجا وارد کنید.',
'alert_type' => 'زمان دلخواه خورد برای دریافت اطلاعیه ها را انتخاب کنید.',
'alert_type_description' => '<b>تغییر وضعیت:</b> '.
'زمانی که وضعیت سرور تغییر کرد شما یک اطلاعیته دریافت خواهید کرد. از آنلاین -> آفلاین یا آفلاین -> آنلاین.<br/>'.
'زمانی که وضعیت سرور تغییر کرد شما یک اطلاعیته دریافت خواهید کرد. از آنلاین -> آفلاین یا آفلاین -> آنلاین.<br>'.
'<br /><b>آفلاین:</b> '.
'زمانی که یک سرور *فقط برای اولین بار* آفلاین شد شما یک اطلاعیه دریافت خواهید کرد. به عنوان مثال،'.
'cronjob شما هر 15 دقیقه است و سرور شما در ساعت 1 صبح دان می شود و تا ساعت 6 صبح دان می ماند.'.
@ -228,7 +228,7 @@ $sm_lang = array(
'settings_log' => 'تنظیمات لاگ',
'auto_refresh' => 'رفرش خودکار',
'auto_refresh_servers' =>
'رفرش خودکار صفحه سرورها.<br/>'.
'رفرش خودکار صفحه سرورها.<br>'.
'<span class="small">'.
'زمان به ثنیه, اگر 0 باشد صفحه رفرش نخواهد شد.'.
'</span>',
@ -253,18 +253,18 @@ $sm_lang = array(
'log_retention_period_description' => 'تعداد روزها برای نگهداری لاگ اطلاعیه ها و آرشیو های آپ تایم های سرور. برای غیرفعال کردن پاکسازی لاگ 0 وارد کنید.',
'log_retention_days' => 'روزها',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' دان است: آی پی=%IP%, پورت=%PORT%. خطا=%ERROR%',
'off_email_subject' => 'مهم: سرور \'%LABEL%\' دان است',
'off_email_body' => "اتصال به سرور زیر با شکست مواجه شد:<br/><br/>سرور: %LABEL%<br/>آی پی: %IP%<br/>پورت: %PORT%<br/>خطا: %ERROR%<br/>تاریخ: %DATE%",
'off_email_body' => "اتصال به سرور زیر با شکست مواجه شد:<br><br>سرور: %LABEL%<br>آی پی: %IP%<br>پورت: %PORT%<br>خطا: %ERROR%<br>تاریخ: %DATE%",
'off_pushover_title' => 'سرور \'%LABEL%\' دان است',
'off_pushover_message' => "اتصال به سرور زیر با شکست مواجه شد:<br/><br/>سرور: %LABEL%<br/>آی پی: %IP%<br/>پورت: %PORT%<br/>خطا: %ERROR%<br/>تاریخ: %DATE%",
'off_pushover_message' => "اتصال به سرور زیر با شکست مواجه شد:<br><br>سرور: %LABEL%<br>آی پی: %IP%<br>پورت: %PORT%<br>خطا: %ERROR%<br>تاریخ: %DATE%",
'on_sms' => 'سرور \'%LABEL%\' در حال اجراست: آی پی=%IP%, پورت=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'مهم: سرور \'%LABEL%\' در حال اجراست',
'on_email_body' => "سرور '%LABEL%' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>سرور: %LABEL%<br/>آی پی: %IP%<br/>پورت: %PORT%<br/>تاریخ: %DATE%",
'on_email_body' => "سرور '%LABEL%' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:<br><br>سرور: %LABEL%<br>آی پی: %IP%<br>پورت: %PORT%<br>تاریخ: %DATE%",
'on_pushover_title' => 'سرور \'%LABEL%\' در حال اجراست',
'on_pushover_message' => 'سرور \'%LABEL%\' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>سرور: %LABEL%<br/>آی پی: %IP%<br/>پورت: %PORT%<br/>تاریخ: %DATE%',
'on_pushover_message' => 'سرور \'%LABEL%\' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:<br><br>سرور: %LABEL%<br>آی پی: %IP%<br>پورت: %PORT%<br>تاریخ: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'خوش آمدید, %user_name%',
@ -281,7 +281,7 @@ $sm_lang = array(
'password_forgot' => 'کلمه عبور خود را فراموش کرده اید؟',
'password_reset' => 'بازنشانی کلمه عبور',
'password_reset_email_subject' => 'کلمه عبور خود را برای مانیتور سرور PHP بازنشانی کنید',
'password_reset_email_body' => 'لطفا برای بازنشانی کلمه عبور خود از این لینک استفاده کنید. لطفا توجه کنید تنها 1 ساعت وقت دارید.<br/><br/>%link%',
'password_reset_email_body' => 'لطفا برای بازنشانی کلمه عبور خود از این لینک استفاده کنید. لطفا توجه کنید تنها 1 ساعت وقت دارید.<br><br>%link%',
'error_user_incorrect' => 'نام کاربری ارائه شده یافته نشد.',
'error_login_incorrect' => 'اطلاعات نادرست است.',
'error_login_passwords_nomatch' => 'کلمه های عبور یکسان نیستند.',

View File

@ -80,7 +80,7 @@ $sm_lang = array(
'level' => 'Taso',
'level_10' => 'Järjestelmänvalvoja',
'level_20' => 'Käyttäjä',
'level_description' => '<b>Järjestelmänvalvojilla</b> on täydet oikeudet: he voivat hallita palvelimia, käyttäjiä ja muokata ohjelmiston asetuksia.<br/><b>Käyttäjät</b> voivat vain nähdä ja päivittää palvelimia jotka on asetettu heille.',
'level_description' => '<b>Järjestelmänvalvojilla</b> on täydet oikeudet: he voivat hallita palvelimia, käyttäjiä ja muokata ohjelmiston asetuksia.<br><b>Käyttäjät</b> voivat vain nähdä ja päivittää palvelimia jotka on asetettu heille.',
'mobile' => 'Puhelin',
'email' => 'Sähköposti',
'pushover' => 'Pushover',
@ -202,11 +202,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Ennen kuin voit käyttää Pushoveria, sinun täytyy <a href="%1$s" target="_blank" rel="noopener">rekisteröidä sovellus</a> heidän nettisivuillaan, ja kopioida API-avain tänne.',
'alert_type' => 'Valitse milloin haluat ilmoituksia.',
'alert_type_description' => '<b>Tilan muutos:</b> '.
'Saat ilmoituksen kun palvelimen tila vaihtuu. Eli tilasta päällä -> sammunut tai sammunut -> päällä.<br/>'.
'Saat ilmoituksen kun palvelimen tila vaihtuu. Eli tilasta päällä -> sammunut tai sammunut -> päällä.<br>'.
'<br /><b>Sammunut:</b> '.
'Saat yhden ilmoituksen kun palvelimen tila vaihtuu sammuneeksi, mutta *VAIN ENSIMMÄISEN KERRAN*. Esimerkiksi, '.
'jos tarkistus tehdään joka 15 minuutti, ja palvelin sammuu klo 1 ja pysyy sammuneena klo 6 asti. '.
'Saat vain yhden ilmoituksen klo 1, ei muuta.<br/>'.
'Saat vain yhden ilmoituksen klo 1, ei muuta.<br>'.
'<br><b>Aina:</b> '.
'Saat ilmoituksen joka kerta kun palvelin tarkistetaan, vaikka palvelin olisi ollut sammuneena tunteja.',
'alert_type_status' => 'Tilan muutos',
@ -228,7 +228,7 @@ $sm_lang = array(
'settings_log' => 'Tapahtumamerkintöjen asetukset',
'auto_refresh' => 'Automaattipäivitys',
'auto_refresh_servers' =>
'Päivittää automaattisesti palvelimet-sivun.<br/>'.
'Päivittää automaattisesti palvelimet-sivun.<br>'.
'<span class="small">'.
'Aika sekunteina, jos 0, sivu ei päivity automaattisesti.'.
'</span>',
@ -253,18 +253,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Kuinka monta päivää pitää palvelinten päälläoloaikoja ja muita tapahtumia. Aseta arvoksi 0 jos haluat pitää ne loputtomasti.',
'log_retention_days' => 'päivää',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => 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:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_email_body' => "Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' is DOWN',
'off_pushover_message' => "Failed to connect to the following server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_pushover_message' => "Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING',
'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING',
'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Tervetuloa, %user_name%',
@ -281,7 +281,7 @@ $sm_lang = array(
'password_forgot' => 'Unohtuiko salasanasi?',
'password_reset' => 'Resetoi salasanasi',
'password_reset_email_subject' => 'Resetoi salasanasi PHP Server Monitoriin',
'password_reset_email_body' => 'Ole hyvä ja käytä seuraavaa linkkiä restoidaksesi salasanasi. Huomaa että linkki vanhentuu tunnin sisällä.<br/><br/>%link%',
'password_reset_email_body' => 'Ole hyvä ja käytä seuraavaa linkkiä restoidaksesi salasanasi. Huomaa että linkki vanhentuu tunnin sisällä.<br><br>%link%',
'error_user_incorrect' => 'Annettua käyttäjänimeä ei löydetty.',
'error_login_incorrect' => 'Antamasi tiedot eivät ole oikein.',
'error_login_passwords_nomatch' => 'Annetut salasanat eivät täsmää.',

View File

@ -93,7 +93,7 @@ $sm_lang = array(
'level' => 'Niveau',
'level_10' => 'Administrateur',
'level_20' => 'Utilisateur',
'level_description' => 'Les <b>Administrateurs</b> ont un accès total. Ils peuvent gérer les serveurs, les utilisateurs et éditer la configuration globale.<br/>Les <b>Utilisateurs</b> ne peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.',
'level_description' => 'Les <b>Administrateurs</b> ont un accès total. Ils peuvent gérer les serveurs, les utilisateurs et éditer la configuration globale.<br>Les <b>Utilisateurs</b> ne peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.',
'mobile' => 'Téléphone',
'email' => 'Email',
'pushover' => 'Pushover',
@ -216,12 +216,12 @@ $sm_lang = array(
'pushover_api_token_description' => 'Avant de pouvoir utiliser Pushover, vous devez <a href="%1$s" target="_blank" rel="noopener">créer une application</a> sur leur site web et entrer ici le jeton (Token) de l\'application.',
'alert_type' => 'Choisissez quand vous souhaitez être notifié',
'alert_type_description' => '<b>Changement d\'état : </b>'.
'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.<br/>'.
'<br/><b>Hors service : </b>'.
'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.<br>'.
'<br><b>Hors service : </b>'.
'Vous ne recevez une notification que quand le serveur passe de l\'état OK à HORS SERVICE. Par exemple, '.
'Votre tâche planifiée s\'exécute toutes les 15 minutes et votre serveur passe à l\'état HORS SERVICE à 1 heure du matin et le reste jusqu\'à 6 heures du matin.'.
'Vous ne recevez qu\'une seule notification à 1 heure du matin.<br/>'.
'<br/><b>Toujours : </b>'.
'Vous ne recevez qu\'une seule notification à 1 heure du matin.<br>'.
'<br><b>Toujours : </b>'.
'Vous recevez une notification à chaque exécution de la tâche planifiée si le serveur est à l\'état HORS SERVICE ',
'alert_type_status' => 'Changement d\'état',
'alert_type_offline' => 'Hors service',
@ -242,7 +242,7 @@ $sm_lang = array(
'settings_log' => 'Configuration des événements',
'auto_refresh' => 'Auto-rachaîchissement',
'auto_refresh_servers' =>
'Auto-rachaîchissement de la page serveurs.<br/>'.
'Auto-rachaîchissement de la page serveurs.<br>'.
'<span class="small">'.
'Temps en secondes. Si 0, la page n\'est pas rafraîchie.'.
'</span>',
@ -267,18 +267,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Nombre de jours de conservation des événements envoyés et des temps de réponse des serveurs. Entrez 0 pour les conserver indéfiniment.',
'log_retention_days' => 'jours',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => 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:<br/><br/>Serveur: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Erreur: %ERROR%<br/>Date: %DATE%",
'off_email_body' => "Impossible de se connecter au serveur suivant:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Erreur: %ERROR%<br>Date: %DATE%",
'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE',
'off_pushover_message' => "Impossible de se connecter au serveur suivant:<br/><br/>Serveur: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Erreur: %ERROR%<br/>Date: %DATE%",
'off_pushover_message' => "Impossible de se connecter au serveur suivant:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Erreur: %ERROR%<br>Date: %DATE%",
'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK',
'on_email_body' => "Le Serveur '%LABEL%' est de nouveau OK, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Serveur: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_email_body' => "Le Serveur '%LABEL%' est de nouveau OK, it was down for %LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK',
'on_pushover_message' => "Le Serveur '%LABEL%' est de nouveau OK, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Serveur: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_pushover_message' => "Le Serveur '%LABEL%' est de nouveau OK, it was down for %LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Bonjour %user_name%',
@ -295,7 +295,7 @@ $sm_lang = array(
'password_forgot' => 'Mot de passe oublié ?',
'password_reset' => 'Réinitialiser le mot de passe',
'password_reset_email_subject' => 'Réinitialisation du mot de passe pour PHP Server Monitor',
'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe. Veuillez noter qu\'il expire dans une heure.<br/><br/>%link%',
'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe. Veuillez noter qu\'il expire dans une heure.<br><br>%link%',
'error_user_incorrect' => 'Nom d\'utilisateur invalide.',
'error_login_incorrect' => 'Informations incorrectes.',
'error_login_passwords_nomatch' => 'Mot de passe invalide.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Livello',
'level_10' => 'Amministratore',
'level_20' => 'Utente',
'level_description' => 'Gli <b>Amministratori</b> hanno pieno accesso: possono gestire server, utenti e modificare la configurazione globale.<br/>Gli <b>Utenti</b> possono solo visualizzare ed eseguire l\'aggiornamento per i server a cui sono assegnati.',
'level_description' => 'Gli <b>Amministratori</b> hanno pieno accesso: possono gestire server, utenti e modificare la configurazione globale.<br>Gli <b>Utenti</b> possono solo visualizzare ed eseguire l\'aggiornamento per i server a cui sono assegnati.',
'mobile' => 'Cellulare',
'email' => 'Email',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Prima di poter usare Pushover, devi <a href="%1$s" target="_blank" rel="noopener">registrare un\'App</a> nel loro sito web ed inserire la \'App API Token\' qui.',
'alert_type' => 'Seleziona quando vuoi essere notificato',
'alert_type_description' => '<b>Cambio di Stato:</b> '.
'Riceverai una notifica solo quando un server cambierà stato. Quindi da online -> offline oppure da offline -> online.<br/>'.
'Riceverai una notifica solo quando un server cambierà stato. Quindi da online -> offline oppure da offline -> online.<br>'.
'<br /><b>Fuori linea:</b> '.
'Riceverai una notifica solo quando un server andrà offline *SOLO LA PRIMA VOLTA*. Per esempio, '.
'Se il tuo cronjob è impostato per controllare ogni 15 min e il tuo server andrà offline dalle 2AM alle 6AM. '.
'Riceverai una sola notifica alle 2AM e nient\'altro.<br/>'.
'Riceverai una sola notifica alle 2AM e nient\'altro.<br>'.
'<br><b>Sempre:</b> '.
'Riceverai una notifica ogni volta che lo script troverà un server down anche se è stato offline per ore.',
'alert_type_status' => 'Cambio di Stato',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Impostazioni Log',
'auto_refresh' => 'Auto-Aggiornamento',
'auto_refresh_servers' =>
'Auto-Aggiornamento pagina servers.<br/>'.
'Auto-Aggiornamento pagina servers.<br>'.
'<span class="small">'.
'Tempo in secondi, se impostato a 0 la pagina non si aggiornerà.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Numero di giorni per la conservazione dei log delle notifiche e risultati monitoraggio. Inserire 0 (zero) per disabilitare la cancellazione dei log.',
'log_retention_days' => 'giorni',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' INATTIVO: ip=%IP%, porta=%PORT%. Errore=%ERROR%',
'off_email_subject' => 'IMPORTANTE: Il Server \'%LABEL%\' è INATTIVO',
'off_email_body' => "Impossibile connettersi al seguente server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Errore: %ERROR%<br/>Data: %DATE%",
'off_email_body' => "Impossibile connettersi al seguente server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Errore: %ERROR%<br>Data: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' INATTIVO',
'off_pushover_message' => "Impossibile connettersi al seguente server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Errore: %ERROR%<br/>Data: %DATE%",
'off_pushover_message' => "Impossibile connettersi al seguente server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Errore: %ERROR%<br>Data: %DATE%",
'on_sms' => 'Server \'%LABEL%\' ATTIVO: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANTE: Server \'%LABEL%\' è ATTIVO',
'on_email_body' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Data: %DATE%",
'on_email_body' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Data: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' ATTIVO',
'on_pushover_message' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Data: %DATE%",
'on_pushover_message' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Data: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Benvenuto, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Password dimenticata?',
'password_reset' => 'Reimposta password',
'password_reset_email_subject' => 'Reimpossta la tua password per PHP Server Monitor',
'password_reset_email_body' => 'Usa il seguente link per reimpostare la tua password. Ricordati che scade tra un ora.<br/><br/>%link%',
'password_reset_email_body' => 'Usa il seguente link per reimpostare la tua password. Ricordati che scade tra un ora.<br><br>%link%',
'error_user_incorrect' => 'Il nome utente inserito non è staot trovato.',
'error_login_incorrect' => 'Le informazioni sono errate.',
'error_login_passwords_nomatch' => 'Le password inserite non sono valide.',

View File

@ -80,7 +80,7 @@ $sm_lang = array(
'level' => 'レベル',
'level_10' => '管理者(Administrator)',
'level_20' => 'ユーザー(User)',
'level_description' => '<b>管理者(Administrator)</b> はフルアクセス権があります:サーバーの管理、 ユーザーとグローバル設定を変更できます。<br/><b>ユーザー(Users)</b>は、割り当てられたサーバーのアップデータのみを表示して実行できます。',
'level_description' => '<b>管理者(Administrator)</b> はフルアクセス権があります:サーバーの管理、 ユーザーとグローバル設定を変更できます。<br><b>ユーザー(Users)</b>は、割り当てられたサーバーのアップデータのみを表示して実行できます。',
'mobile' => 'モバイル',
'email' => 'メールアドレス',
'pushover' => 'プッシュオーバー',
@ -124,7 +124,8 @@ $sm_lang = array(
'domain' => 'ドメイン/IP',
'timeout' => 'タイムアウト',
'timeout_description' => '指定した秒数、サーバーのレスポンスを待ちます。',
'authentication_settings' => '認証設定(オプション)',
'authentication_settings' => '認証設定',
'optional' => 'オプション',
'website_username' => 'ユーザー名',
'website_username_description' => 'ユーザー名でウェブサイトにアクセスします。 (サポートはApache認証のみです。)',
'website_password' => 'パスワード',
@ -219,18 +220,18 @@ $sm_lang = array(
'pushover_api_token_description' => 'プッシュオーバーを使用するには、事前にウェブサイトで<a href="%1$s" target="_blank" rel="noopener">アプリを登録</a>してApp APIトークンを入力する必要があります。',
'alert_type' => '通知するタイミングを選択',
'alert_type_description' => '<b>状態の変化:</b> '.
'サーバーのステータスが変更されたときに通知を受け取ります。 だからオンライン -> オフラインまたはオフライン -> オンライン。<br/>'.
'サーバーのステータスが変更されたときに通知を受け取ります。 だからオンライン -> オフラインまたはオフライン -> オンライン。<br>'.
'<br /><b>オフライン:</b> '.
'サーバーが*初めての間*オフラインになったときに通知を受け取ります。 例えば、'.
'あなたのcronの仕事は15分ごとです。あなたのサーバーは午前1時にダウンし、午前6時まで停止します。 '.
'午前1時に1つの通知が届きます。<br/>'.
'午前1時に1つの通知が届きます。<br>'.
'<br><b>常に:</b> '.
'サイトが数時間にわたってオフラインになっていても、スクリプトが実行され、サイトが停止するたびに通知を受け取ります。',
'alert_type_status' => '状況の変化',
'alert_type_offline' => 'オフライン',
'alert_type_always' => '常に',
'alert_proxy' => '有効にしても、プロキシはサービスに使用されません',
'alert_proxy_url' => '<b>フォーマット:</b> ホスト:ポート',
'alert_proxy_url' => 'フォーマット: ホスト:ポート',
'log_status' => 'ログステータス',
'log_status_description' => 'ログステータスがTRUEに設定されている場合、モニターは通知設定が渡されるたびにイベントを記録します。',
'log_email' => 'スクリプトによって送信された電子メールを記録する',
@ -248,7 +249,7 @@ $sm_lang = array(
'settings_proxy' => 'プロキシ設定',
'auto_refresh' => '自動更新',
'auto_refresh_servers' =>
'サーバーページを自動更新します。<br/>'.
'サーバーページを自動更新します。<br>'.
'<span class="small">'.
'時間を秒で指定し、0に設定すると更新しません。'.
'</span>',
@ -273,18 +274,18 @@ $sm_lang = array(
'log_retention_period_description' => '通知のログおよびサーバー稼働時間のアーカイブを保持する日数。 ログのクリーンアップを無効にするには、0を入力します。',
'log_retention_days' => '日',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'サーバー \'%LABEL%\' はダウンしています: ip=%IP%, ポート=%PORT%. エラー=%ERROR%',
'off_email_subject' => '重要: サーバー \'%LABEL%\' がダウンしています!',
'off_email_body' => "サーバーへの接続に失敗しました:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>ポート: %PORT%<br/>エラー: %ERROR%<br/>日時: %DATE%",
'off_email_body' => "サーバーへの接続に失敗しました:<br><br>Server: %LABEL%<br>IP: %IP%<br>ポート: %PORT%<br>エラー: %ERROR%<br>日時: %DATE%",
'off_pushover_title' => 'サーバー \'%LABEL%\' がダウンしています!',
'off_pushover_message' => "サーバーへの接続に失敗しました:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>ポート: %PORT%<br/>エラー: %ERROR%<br/>日時: %DATE%",
'off_pushover_message' => "サーバーへの接続に失敗しました:<br><br>Server: %LABEL%<br>IP: %IP%<br>ポート: %PORT%<br>エラー: %ERROR%<br>日時: %DATE%",
'on_sms' => 'サーバー \'%LABEL%\' は動作しています: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => '重要: サーバー \'%LABEL%\' は動作しています',
'on_email_body' => "サーバー '%LABEL%' は動作中です, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>サーバー: %LABEL%<br/>IP: %IP%<br/>ポート: %PORT%<br/>日時: %DATE%",
'on_email_body' => "サーバー '%LABEL%' は動作中です, it was down for %LAST_OFFLINE_DURATION%:<br><br>サーバー: %LABEL%<br>IP: %IP%<br>ポート: %PORT%<br>日時: %DATE%",
'on_pushover_title' => 'サーバー \'%LABEL%\' は動作しています',
'on_pushover_message' => "サーバー '%LABEL%' は動作中です, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>サーバー: %LABEL%<br/>IP: %IP%<br/>ポート: %PORT%<br/>日時: %DATE%",
'on_pushover_message' => "サーバー '%LABEL%' は動作中です, it was down for %LAST_OFFLINE_DURATION%:<br><br>サーバー: %LABEL%<br>IP: %IP%<br>ポート: %PORT%<br>日時: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'ようこそ、 %user_name%',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Level',
'level_10' => 'Administrator',
'level_20' => 'User',
'level_description' => '<b>Administrators</b> have full access: they can manage servers, users and edit the global configuration.<br/><b>Users</b> can only view and run the updater for the servers that have been assigned to them.',
'level_description' => '<b>Administrators</b> have full access: they can manage servers, users and edit the global configuration.<br><b>Users</b> can only view and run the updater for the servers that have been assigned to them.',
'mobile' => '휴대폰',
'email' => 'Email',
'pushover' => 'Pushover',
@ -214,12 +214,12 @@ $sm_lang = array(
'pushover_api_token' => 'Pushover App API Token',
'pushover_api_token_description' => 'Before you can use Pushover, you need to <a href="%1$s" target="_blank" rel="noopener">register an App</a> at their website and enter the App API Token here.',
'alert_type' => '알림을 원하면 다음과 같이 변경하십시오.',
'alert_type_description' => '<b>상태 변경: </b><br/>'.
'서버 상태가 변경이되면 알림을 받습니다. online -> offline -> online.<br/>'.
'<br/><b>오프라인: </b><br/>'.
'alert_type_description' => '<b>상태 변경: </b><br>'.
'서버 상태가 변경이되면 알림을 받습니다. online -> offline -> online.<br>'.
'<br><b>오프라인: </b><br>'.
'서버가 첫번째로 오프라인이 되었을 때 알림을 받습니다. 예를들어, '.
'cron이 매 15분이고 오전1시 부터 오전6시까지 다운되었을때 오전1시에 한번 알림을 받습니다.<br />'.
'<br/><b>항상: </b><br/>'.
'<br><b>항상: </b><br>'.
'사이트가 다운되었을 때 매시간 알림을 받습니다.',
'alert_type_status' => '상태 변경',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => '로그 설정',
'auto_refresh' => 'Auto-refresh',
'auto_refresh_servers' =>
'서버페이지를 자동으로 새로고침.<br/>'.
'서버페이지를 자동으로 새로고침.<br>'.
'<span class="small">'.
'시간은 초(sec)로 설정을 하고, 0은 새로고침을 하지 않습니다.'.
'</span>',
@ -266,18 +266,18 @@ $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',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => '서버(\'%LABEL%\')가 다운되었습니다. : ip=%IP%, port=%PORT%. Error=%ERROR%',
'off_email_subject' => '중요: 서버(\'%LABEL%\')가 다운되었습니다.',
'off_email_body' => "서버 접속을 실패하였습니다.<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_email_body' => "서버 접속을 실패하였습니다.<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'off_pushover_title' => '서버(\'%LABEL%\')가 다운되었습니다.',
'off_pushover_message' => "서버 접속을 실패하였습니다.<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Error: %ERROR%<br/>Date: %DATE%",
'off_pushover_message' => "서버 접속을 실패하였습니다.<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%",
'on_sms' => '서버(\'%LABEL%\') 가동중: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => '중요: 서버(\'%LABEL%\')가 가동중입니다.',
'on_email_body' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_email_body' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
'on_pushover_title' => '서버(\'%LABEL%\')가 가동중입니다.',
'on_pushover_message' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Date: %DATE%",
'on_pushover_message' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Welcome, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Forgot password?',
'password_reset' => 'Reset password',
'password_reset_email_subject' => 'Reset your password for PHP Server Monitor',
'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.<br/><br/>%link%',
'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.<br><br>%link%',
'error_user_incorrect' => 'The provided username could not be found.',
'error_login_incorrect' => 'The information is incorrect.',
'error_login_passwords_nomatch' => 'The provided passwords do not match.',

View File

@ -53,6 +53,8 @@ $sm_lang = array(
'ok' => 'OK',
'bad' => 'niet goed',
'cancel' => 'Cancel',
'none' => 'Geen',
'activate' => 'Activeer',
'short_day_format' => '%B %e',
'long_day_format' => '%B %e, %Y',
'yesterday_format' => 'Gisteren om %k:%M',
@ -64,18 +66,20 @@ $sm_lang = array(
'a_minute_ago' => 'een minuut geleden',
'seconds_ago' => '%d seconden geleden',
'a_second_ago' => 'een seconde geleden',
'year' => 'year',
'years' => 'years',
'month' => 'month',
'months' => 'months',
'day' => 'day',
'days' => 'days',
'hour' => 'hour',
'hours' => 'hours',
'minute' => 'minute',
'minutes' => 'minutes',
'second' => 'second',
'seconds' => 'seconds',
'year' => 'jaar',
'years' => 'jaren',
'month' => 'maand',
'months' => 'maanden',
'day' => 'dag',
'days' => 'dagen',
'hour' => 'uur',
'hours' => 'uren',
'minute' => 'minuut',
'minutes' => 'minuten',
'second' => 'seconde',
'seconds' => 'seconden',
'current' => 'huidig',
'settings' => 'Instellingen',
),
'menu' => array(
'config' => 'Configuratie',
@ -96,7 +100,7 @@ $sm_lang = array(
'level' => 'Level',
'level_10' => 'Beheerder',
'level_20' => 'Gebruiker',
'level_description' => '<b>Beheerders</b> hebben volledige toegang: ze kunnen servers en gebruiker beheren en de globale configuratie aanpassen.<br/><b>Gebruikers</b> kunnen alleen de servers bekijken en op fouten testen die aan hun zijn toegewezen.',
'level_description' => '<b>Beheerders</b> hebben volledige toegang: ze kunnen servers en gebruiker beheren en de globale configuratie aanpassen.<br><b>Gebruikers</b> kunnen alleen de servers bekijken en op fouten testen die aan hun zijn toegewezen.',
'mobile' => 'Mobiel',
'email' => 'Email',
'pushover' => 'Pushover',
@ -104,6 +108,12 @@ $sm_lang = array(
'pushover_key' => 'Pushover Key',
'pushover_device' => 'Pushover Device',
'pushover_device_description' => 'Apparaat waar de berichten naar toe gaan. Laat leeg voor alle apparaten.',
'telegram' => 'Telegram',
'telegram_chat_id' => 'Telegram chat id',
'telegram_get_chat_id' => 'Klik hier om je chat id te vinden',
'activate_telegram' => 'Activeer Telegram notificaties',
'telegram_bot_username_found' => 'De Telegram bot is gevonden! <br><a href="%s" target="_blank" rel="noopener"><button class="btn btn-primary">Volgende stap</button></a> <br>Dit zal een chat met de bot openen. Klik vervolgens op start of typ /start.',
'telegram_bot_error' => 'Er is een error voorgekomen tijdens de activatie van Telegram notificaties: %s',
'delete_title' => 'Verwijder gebruiker',
'delete_message' => 'Weet je zeker dat je deze gebruiker wilt verwijderen: \'%1\'?',
'deleted' => 'Gebruiker verwijderd.',
@ -128,6 +138,7 @@ $sm_lang = array(
'email' => 'Email',
'sms' => 'SMS',
'pushover' => 'Pushover',
'telegram' => 'Telegram',
'no_logs' => 'Geen logs',
'clear' => 'Logboek opschonen',
'delete_title' => 'Logboek opschonen',
@ -140,19 +151,35 @@ $sm_lang = array(
'domain' => 'Domein/IP',
'timeout' => 'Timeout',
'timeout_description' => 'Aantal seconden te wachten op een reactie van de server.',
'authentication_settings' => 'Authenticatie instellingen',
'optional' => 'Optioneel',
'website_username' => 'Gebruikersnaam',
'website_password' => 'Wachtwoord',
'port' => 'Poort',
'custom_port' => 'Aangepaste poort',
'popular_ports' => 'Populaire poorten',
'post_field' => 'POST veld',
'please_select' => 'Selecteer',
'type' => 'Type',
'type_website' => 'Website',
'type_service' => 'Service',
'type_ping' => 'Ping',
'pattern' => 'Zoek voor tekst/regex',
'pattern_description' => 'Als dit patroon niet gevonden wordt op de website, zal de server als offline gemarkeerd worden. Regular expressions zijn toegestaan.',
'redirect_check' => 'Omleiden naar een ander domein is',
'redirect_check_description' => 'Een omleiding naar een ander domein is meestal een slecht teken.',
'allow_http_status' => 'Sta HTTP status code toe',
'allow_http_status_description' => 'Markeer website als online. HTTP status code lager dan 400 worden standaard als online gemarkeerd. Scheiden met |. Bijvoorbeeld: 401|403.',
'allow_http_status_description' => 'Markeer website als online. HTTP status code lager dan 400 worden standaard als online gemarkeerd. Scheiden met |.',
'header_name' => 'Header naam',
'header_value' => 'Header waarde',
'header_name_description' => 'Hoofdlettergevoelig',
'last_check' => 'Laatst gecontroleerd',
'last_online' => 'Laatst online',
'last_offline' => 'Laatst offline',
'last_output' => 'Laatste succesvole uitvoer',
'last_error' => 'Laatste error',
'last_error_output' => 'Laatste error uitvoer',
'output' => 'Uitvoer',
'monitoring' => 'Monitoring',
'no_monitoring' => 'Geen monitoring',
'email' => 'Email',
@ -160,6 +187,9 @@ $sm_lang = array(
'sms' => 'SMS',
'send_sms' => 'Stuur SMS',
'pushover' => 'Pushover',
'send_pushover' => 'Stuur Pushover notificatie',
'telegram' => 'Telegram',
'send_telegram' => 'Stuur Telegram notificatie',
'users' => 'Gebruikers',
'delete_title' => 'Verwijder server',
'delete_message' => 'Weet je zeker dat je deze server wilt verwijderen: \'%1\'?',
@ -170,13 +200,15 @@ $sm_lang = array(
'latency_max' => 'Latency (maximum)',
'latency_min' => 'Latency (minimum)',
'latency_avg' => 'Latency (gemiddeld)',
'online' => 'online',
'offline' => 'offline',
'uptime' => 'Uptime',
'year' => 'Jaar',
'month' => 'Maand',
'week' => 'Week',
'day' => 'Dag',
'hour' => 'Uur',
'warning_threshold' => 'Warning threshold',
'warning_threshold' => 'Waarschuwingsdrempel',
'warning_threshold_description' => 'Aantal mislukte pogingen voordat de server als offline gemarkeerd wordt.',
'chart_last_week' => 'Afgelopen week',
'chart_history' => 'Geschiedenis',
@ -187,6 +219,7 @@ $sm_lang = array(
'warning_notifications_disabled_sms' => 'SMS notificaties zijn uitgeschakeld.',
'warning_notifications_disabled_email' => 'Email notificaties zijn uitgeschakeld.',
'warning_notifications_disabled_pushover' => 'Pushover notificaties zijn uitgeschakeld.',
'warning_notifications_disabled_telegram' => 'Telegram notificaties zijn uitgeschakeld.',
'error_server_no_match' => 'Server niet gevonden.',
'error_server_label_bad_length' => 'Het label moet tussen de 1 en 255 karakters lang zijn.',
'error_server_ip_bad_length' => 'Het domein / IP moet tussen de 1 en 255 karakters lang zijn.',
@ -220,27 +253,35 @@ $sm_lang = array(
'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" target="_blank" rel="noopener">App registreren</a> via hun website, en daarvan de App API Token hier invullen.',
'telegram_status' => 'Sta Telegram berichten toe?',
'telegram_api_token' => 'Telegram API Token',
'alert_type' => 'Selecteer wanneer je een notificatie wilt',
'alert_type_description' => '<b>Status verandert:</b> Je ontvangt alleen bericht wanneer een server van status verandert. Dus van online -> offline of offline -> online.<br/><br /><b>Offline:</b> Je ontvangt bericht wanneer een server offline gaat voor de *EERSTE KEER*. Bijvoorbeeld, je cronjob draait iedere 15 min en je server gaat down om 01:00 en blijft offline tot 06:00. Je krijgt 1 bericht om 01:00 en dat is het.<br/><br/><b>Altijd:</b> Je krijgt een bericht elke keer dat het script draait en een website is down, ook al is de site al een paar uur offline.',
'alert_type_description' => '<b>Status verandert:</b> Je ontvangt alleen bericht wanneer een server van status verandert. Dus van online -> offline of offline -> online.<br><br /><b>Offline:</b> Je ontvangt bericht wanneer een server offline gaat voor de *EERSTE KEER*. Bijvoorbeeld, je cronjob draait iedere 15 min en je server gaat down om 01:00 en blijft offline tot 06:00. Je krijgt 1 bericht om 01:00 en dat is het.<br><br><b>Altijd:</b> Je krijgt een bericht elke keer dat het script draait en een website is down, ook al is de site al een paar uur offline.',
'alert_type_status' => 'Status verandering',
'alert_type_offline' => 'Offline',
'alert_type_always' => 'Altijd',
'combine_notifications' => 'Combineer notificaties',
'alert_proxy_url' => 'Formaat: host:poort',
'log_status' => 'Log status',
'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 berichten verstuurd bij het script?',
'log_telegram' => 'Log Telegram berichten verstuurd bij het script?',
'updated' => 'De configuratie is gewijzigd.',
'tab_email' => 'Email',
'tab_sms' => 'SMS',
'tab_pushover' => 'Pushover',
'tab_telegram' => 'Telegram',
'settings_email' => 'Email instellingen',
'settings_sms' => 'SMS instellingen',
'settings_pushover' => 'Pushover instellingen',
'settings_telegram' => 'Telegram instellingen',
'settings_notification' => 'Notificatie instellingen',
'settings_log' => 'Log instellingen',
'auto_refresh' => 'Auto-refresh',
'auto_refresh_servers' => 'Auto-herladen servers pagina.<br/><span class="small">Tijd in seconden, als de tijd 0 is wordt de pagina niet ververst.</span>',
'settings_proxy' => 'Proxy instellingen',
'auto_refresh' => 'Herlaad automatisch',
'auto_refresh_servers' => '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.',
@ -258,6 +299,10 @@ $sm_lang = array(
'pushover_error' => 'De volgende fout is opgetreden bij het versturen van de Pushover notificatie: %s',
'pushover_error_noapp' => 'Kan test notificatie niet verzenden: er is geen Pushover App API token gevonden in de algemene configuratie.',
'pushover_error_nokey' => 'Kan test notificatie niet verzenden: er is geen Pushover key gevonden in je profiel.',
'telegram_sent' => 'Telegram notificatie verstuurd',
'telegram_error' => 'Er is een error voorgekomen tijdens het versturen van de Telegram notificatie: %s',
'telegram_error_notoken' => 'Niet mogelijk on test notificatie te versturen: Telegram API token niet gevonden in globale instellingen.',
'telegram_error_noid' => 'Niet mogelijk on test notificatie te versturen: chat id niet gevonden op profiel.',
'log_retention_period' => 'Log retentie periode',
'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',
@ -265,14 +310,15 @@ $sm_lang = array(
'notifications' => 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:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Poort: %PORT%<br/>Fout: %ERROR%<br/>Datum: %DATE%',
'off_email_body' => 'De server kon niet worden bereikt:<br><br>Server: %LABEL%<br>IP: %IP%<br>Poort: %PORT%<br>Fout: %ERROR%<br>Datum: %DATE%',
'off_pushover_title' => 'Server %LABEL% is DOWN',
'off_pushover_message' => 'De server kon niet worden bereikt:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Poort: %PORT%<br/>Fout: %ERROR%<br/>Datum: %DATE%',
'off_pushover_message' => 'De server kon niet worden bereikt:<br><br>Server: %LABEL%<br>IP: %IP%<br>Poort: %PORT%<br>Fout: %ERROR%<br>Datum: %DATE%',
'off_telegram_message' => 'De server kon niet worden bereikt:<br><br>Server: %LABEL%<br>IP: %IP%<br>Poort: %PORT%<br>Fout: %ERROR%<br>Datum: %DATE%',
'on_sms' => 'Server %LABEL% is RUNNING: ip=%IP%, poort=%PORT%, tijd offline=%LAST_OFFLINE_DURATION%',
'on_email_subject' => 'BELANGRIJK: Server %LABEL% is RUNNING',
'on_email_body' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Poort: %PORT%<br/>Datum: %DATE%',
'on_email_body' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:<br><br>Server: %LABEL%<br>IP: %IP%<br>Poort: %PORT%<br>Datum: %DATE%',
'on_pushover_title' => 'Server %LABEL% is RUNNING',
'on_pushover_message' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Poort: %PORT%<br/>Datum: %DATE%',
'on_pushover_message' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:<br><br>Server: %LABEL%<br>IP: %IP%<br>Poort: %PORT%<br>Datum: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Welkom, %user_name%',
@ -289,7 +335,7 @@ $sm_lang = array(
'password_forgot' => 'Wachtwoord vergeten?',
'password_reset' => 'Wachtwoord herstellen',
'password_reset_email_subject' => 'Wijzig je wachtwoord voor PHP Server Monitor',
'password_reset_email_body' => 'Gebruik de onderstaande link om je wachtwoord te wijzigen. Let op, deze link verloopt na 1 uur.<br/><br/>%link%',
'password_reset_email_body' => 'Gebruik de onderstaande link om je wachtwoord te wijzigen. Let op, deze link verloopt na 1 uur.<br><br>%link%',
'error_user_incorrect' => 'De opgegeven gebruikersnaam is onjuist.',
'error_login_incorrect' => 'De informatie is niet juist.',
'error_login_passwords_nomatch' => 'De ingevulde wachtwoorden komen niet overeen.',

View File

@ -73,8 +73,6 @@ $sm_lang = array(
'minutes' => 'minutter',
'second' => 'sekund',
'seconds' => 'sekunder',
'online' => 'online',
'offline' => 'offline',
),
'menu' => array(
'config' => 'Konfig',
@ -95,7 +93,7 @@ $sm_lang = array(
'level' => 'Level',
'level_10' => 'Administrator',
'level_20' => 'Bruker',
'level_description' => '<b>Administratorer</b> har full tilgang: de kan administrere servere, brukere og redigere den globale konfigurasjonen.<br/><b>Brukere</b> kan bare vise og kjøre oppdatering for serverne som er tildelt dem.',
'level_description' => '<b>Administratorer</b> har full tilgang: de kan administrere servere, brukere og redigere den globale konfigurasjonen.<br><b>Brukere</b> kan bare vise og kjøre oppdatering for serverne som er tildelt dem.',
'mobile' => 'Mobil',
'email' => 'E-post',
'pushover' => 'Pushover',
@ -150,7 +148,8 @@ $sm_lang = array(
'domain' => 'Domene/IP',
'timeout' => 'Timeout',
'timeout_description' => 'Antall sekunder å vente på at serveren skal svare.',
'authentication_settings' => 'Autentiseringsinnstillinger (ValgfrittF)',
'authentication_settings' => 'Autentiseringsinnstillinger',
'optional' => 'ValgfrittF',
'website_username' => 'Brukernavn',
'website_username_description' => 'Brukernavn for å få tilgang til nettstedet. (Kun Apache-godkjenning støttes.)',
'website_password' => 'Password',
@ -169,9 +168,10 @@ $sm_lang = array(
'pattern_description' => 'Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket online/offline. Vanlige uttrykk er tillatt.',
'pattern_online' => 'Mønster indikerer at nettstedet er',
'pattern_online_description' => 'Online: Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket online. Offline: Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket offline.',
'header' => 'Overskrift',
'header_name_description' => 'Overskriftnavn (versalsensitivt)',
'header_value_description' => 'Overskriftsverdi. Vanlige uttrykk er tillatt.',
'header_name' => 'Overskriftnavn',
'header_value' => 'Overskriftsverdi',
'header_name_description' => 'Versalsensitivt.',
'header_value_description' => 'Vanlige uttrykk er tillatt.',
'last_check' => 'Siste sjekk',
'last_online' => 'Sist online',
'last_offline' => 'Sist offline',
@ -195,6 +195,8 @@ $sm_lang = array(
'latency_max' => 'Ventetid (maximum)',
'latency_min' => 'Ventetid (minimum)',
'latency_avg' => 'Ventetid (gjennomsnitt)',
'online' => 'online',
'offline' => 'offline',
'uptime' => 'Oppetid',
'year' => 'År',
'month' => 'Måned',
@ -259,18 +261,18 @@ $sm_lang = array(
'telegram_api_token_description' => 'Før du kan bruke Telegram, må du få en API-token. Gå til <a href="http://docs.phpservermonitor.org/">dokumentasjonen</a> for å få hjelp.',
'alert_type' => 'Velg når du vil bli varslet.',
'alert_type_description' => '<b>Statusendring:</b> '.
'Du vil motta et varsel når en server har endret status. Så fra online -> offline eller offline -> online.<br/>'.
'Du vil motta et varsel når en server har endret status. Så fra online -> offline eller offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Du vil motta et varsel når en server går offline for *FØRSTE GANG BARE*. For eksempel,'.
'din cronjob er hver 15 minutter og serveren din går ned klokken 01:00 og holder seg ned til 06:00. '.
'Du får 1 melding klokken 01:00 og det er det.<br/>'.
'Du får 1 melding klokken 01:00 og det er det.<br>'.
'<br><b>Alltid:</b> '.
'Du vil motta et varsel hver gang scriptet kjører, og et nettsted er nede, selv om nettstedet har vært offline i flere timer.',
'alert_type_status' => 'Statusendring',
'alert_type_offline' => 'Offline',
'alert_type_always' => 'Alltid',
'alert_proxy' => 'Selv om aktivert, blir proxy aldri brukt for tjenester',
'alert_proxy_url' => '<b>Format:</b> Vert:Port',
'alert_proxy_url' => 'Format: Vert:Port',
'log_status' => 'Logg status',
'log_status_description' => 'Hvis loggstatus er satt til SANT, logger monitoren på hendelsen når meldingsinnstillingene er bestått.',
'log_email' => 'Logg e-post sendt av skriptet',
@ -291,7 +293,7 @@ $sm_lang = array(
'settings_proxy' => 'Proxy innstillinger',
'auto_refresh' => 'Auto-refresh',
'auto_refresh_servers' =>
'Auto-refresh server side.<br/>'.
'Auto-refresh server side.<br>'.
'<span class="small">'.
'Tid i sekunder, hvis 0 siden ikke blir oppdatert.'.
'</span>',
@ -321,20 +323,20 @@ $sm_lang = array(
'log_retention_period_description' => 'Antall dager for å holde logger over varsler og arkiver av serveroppetid. Skriv 0 for å deaktivere loggopprydding.',
'log_retention_days' => 'dager',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Feil=%ERROR%',
'off_email_subject' => 'VIKTIG: Serveren \'%LABEL%\' er NEDE',
'off_email_body' => "Kunne ikke koble til følgende server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Feil: %ERROR%<br/>Dato: %DATE%",
'off_email_body' => "Kunne ikke koble til følgende server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Feil: %ERROR%<br>Dato: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' er NEDE',
'off_pushover_message' => "Kunne ikke koble til følgende server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Feil: %ERROR%<br/>Dato: %DATE%",
'off_telegram_message' => "Kunne ikke koble til følgende server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Feil: %ERROR%<br/>Dato: %DATE%",
'off_pushover_message' => "Kunne ikke koble til følgende server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Feil: %ERROR%<br>Dato: %DATE%",
'off_telegram_message' => "Kunne ikke koble til følgende server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Feil: %ERROR%<br>Dato: %DATE%",
'on_sms' => 'Server \'%LABEL%\' er OPPE igjen: ip=%IP%, port=%PORT%, det var nede i %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'VIKTIG: Server \'%LABEL%\' er OPPE',
'on_email_body' => "Server '%LABEL%' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dato: %DATE%",
'on_email_body' => "Server '%LABEL%' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dato: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' er OPPE',
'on_pushover_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dato: %DATE%',
'on_telegram_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dato: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dato: %DATE%',
'on_telegram_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dato: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Velkommen, %user_name%',
@ -351,7 +353,7 @@ $sm_lang = array(
'password_forgot' => 'Glemt passordet?',
'password_reset' => 'Tilbakestille passord',
'password_reset_email_subject' => 'Tilbakestill passordet ditt for PHP Server Monitor',
'password_reset_email_body' => 'Vennligst bruk følgende link for å tilbakestille passordet ditt. Vær oppmerksom på at det utløper om 1 time.<br/><br/>%link%',
'password_reset_email_body' => 'Vennligst bruk følgende link for å tilbakestille passordet ditt. Vær oppmerksom på at det utløper om 1 time.<br><br>%link%',
'error_user_incorrect' => 'Det oppgitte brukernavnet ble ikke funnet.',
'error_login_incorrect' => 'Informasjonen er feil.',
'error_login_passwords_nomatch' => 'De oppgitte passordene stemmer ikke overens.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Poziom',
'level_10' => 'Administrator',
'level_20' => 'Użytkownik',
'level_description' => '<b>Administratorzy</b> posiadają pełny dostęp: mogą zarządzać serwerami, użytkownikami oraz edytować konfigurację globalną.<br/><b>Użytkownicy</b> mogą podejrzeć serwer oraz uruchomić aktualizację statusu dla serwerów do nich przypisanych.',
'level_description' => '<b>Administratorzy</b> posiadają pełny dostęp: mogą zarządzać serwerami, użytkownikami oraz edytować konfigurację globalną.<br><b>Użytkownicy</b> mogą podejrzeć serwer oraz uruchomić aktualizację statusu dla serwerów do nich przypisanych.',
'mobile' => 'Telefon',
'email' => 'Email',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Zanim zaczniesz używać Pushover, musisz <a href="%1$s" target="_blank" rel="noopener"> zarejestrować aplikację</a> na ich stronie internetowej i wpisać tutaj App API Token.',
'alert_type' => 'Wybierz kiedy chcesz być powiadomiony.',
'alert_type_description' => '<b>Zmiana statusu:</b> '.
'Otrzymasz powiadomienie gdy serwer zmieni status. Z online -> offline lub offline -> online.<br/>'.
'Otrzymasz powiadomienie gdy serwer zmieni status. Z online -> offline lub offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Otrzymasz powiadomienie gdy serwer zmieni status na offline po raz pierwszy. Na przykład, '.
'Twój cronjob uruchamia się co 15 minut, a Twój serwer przestaje odpowiadać o 13 i nie działa do 18. '.
'Otrzymasz *TYLKO* jedno powiadomienie o 13.<br/>'.
'Otrzymasz *TYLKO* jedno powiadomienie o 13.<br>'.
'<br><b>Zawsze:</b> '.
'Otrzymasz powiadomienie za każdym razem gdy skrypt zostanie uruchomiony a strona będzie niedostępna.',
'alert_type_status' => 'Zmiana statusu',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Ustawienia Logowania',
'auto_refresh' => 'Auto-odświeżanie',
'auto_refresh_servers' =>
'Auto-odświeżanie strony serwera.<br/>'.
'Auto-odświeżanie strony serwera.<br>'.
'<span class="small">'.
'Czas w sekundach, dla czasu 0 strona nie będzie odświeżana.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Liczba dni przez którą należy przetrzymywać logi powiadomień i archiwizować uptime serwera. Wpisz 0 aby wyłączyć czyszczenie logów.',
'log_retention_days' => 'dni',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Serwer \'%LABEL%\' przestał odpowiadać: ip=%IP%, port=%PORT%. Błąd=%ERROR%',
'off_email_subject' => 'Uwaga: Serwer \'%LABEL%\' nie odpowiada',
'off_email_body' => "Błąd połączenia do serwera:<br/><br/>Serwer: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Błąd: %ERROR%<br/>Data: %DATE%",
'off_email_body' => "Błąd połączenia do serwera:<br><br>Serwer: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Błąd: %ERROR%<br>Data: %DATE%",
'off_pushover_title' => 'Serwer \'%LABEL%\' nie odpowiada',
'off_pushover_message' => "Błąd połączenia do serwera:<br/><br/>Serwer: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Błąd: %ERROR%<br/>Data: %DATE%",
'off_pushover_message' => "Błąd połączenia do serwera:<br><br>Serwer: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Błąd: %ERROR%<br>Data: %DATE%",
'on_sms' => 'Serwer \'%LABEL%\' działa poprawnie: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'Uwaga: Serwer \'%LABEL%\' działa poprawnie',
'on_email_body' => "Serwer '%LABEL%' znów odpowiada, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Serwer: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Data: %DATE%",
'on_email_body' => "Serwer '%LABEL%' znów odpowiada, it was down for %LAST_OFFLINE_DURATION%:<br><br>Serwer: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Data: %DATE%",
'on_pushover_title' => 'Serwer \'%LABEL%\' działa poprawnie',
'on_pushover_message' => 'Serwer \'%LABEL%\' znów działa poprawnie, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Serwer: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Data: %DATE%',
'on_pushover_message' => 'Serwer \'%LABEL%\' znów działa poprawnie, it was down for %LAST_OFFLINE_DURATION%:<br><br>Serwer: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Data: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Witaj, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Zapomniałeś hasła?',
'password_reset' => 'Zresetuj hasło',
'password_reset_email_subject' => 'Zresetuj hasło do monitoringu',
'password_reset_email_body' => 'Aby zresetować hasło użyj tego linku. Ważność linku to jedna godzina.<br/><br/>%link%',
'password_reset_email_body' => 'Aby zresetować hasło użyj tego linku. Ważność linku to jedna godzina.<br><br>%link%',
'error_user_incorrect' => 'Brak użytkownika o takim loginie.',
'error_login_incorrect' => 'Login lub hasło jest błędne.',
'error_login_passwords_nomatch' => 'Podane hasła nie pasują do siebie.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Nível',
'level_10' => 'Administrador',
'level_20' => 'Usuário',
'level_description' => '<b>Administradores</b> Tem total acesso: podem gerenciar servidores, usuários e configurações globais.<br/><b>Usuários</b> só podem executar atualizações para servidores que lhe foram atribuídos.',
'level_description' => '<b>Administradores</b> Tem total acesso: podem gerenciar servidores, usuários e configurações globais.<br><b>Usuários</b> só podem executar atualizações para servidores que lhe foram atribuídos.',
'mobile' => 'Celular',
'email' => 'Email',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Before you can use Pushover, you need to <a href="%1$s" target="_blank" rel="noopener">register an App</a> at their website and enter the App API Token here.',
'alert_type' => 'Selecione como você gostaria de ser notificado.',
'alert_type_description' => '<b>Mudança de Status:</b> '.
'Você receberá uma notificação quando o seridor tive uma mudança de status. De online -> offline ou offline -> online.<br/>'.
'Você receberá uma notificação quando o seridor tive uma mudança de status. De online -> offline ou offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Você receberá uma notificação quando o servidor fica OFFLINE (Pela primeira vez). Por exemplo, '.
'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<br/>'.
'Você receberá uma notificação a 1:00 apenas<br>'.
'<br><b>Sempre:</b> '.
'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',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Configuração de Logs',
'auto_refresh' => 'Atualizar automaticamente',
'auto_refresh_servers' =>
'Atualizar automaticamente a página de servidores.<br/>'.
'Atualizar automaticamente a página de servidores.<br>'.
'<span class="small">'.
'Tempo em segundos, Se 0 a página não será atualizada.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Número de dias para manter os registros de notificações e arquivos de tempo de atividade do servidor. Digite 0 para desativar a limpeza de registro.',
'log_retention_days' => 'dias',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => 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:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Erro: %ERROR%<br/>Data: %DATE%",
'off_email_body' => "Falha ao conectar ao servidor:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Erro: %ERROR%<br>Data: %DATE%",
'off_pushover_title' => 'Servidor \'%LABEL%\' está OFFLINE',
'off_pushover_message' => "Falha ao conectar ao servidor:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Erro: %ERROR%<br/>Data: %DATE%",
'off_pushover_message' => "Falha ao conectar ao servidor:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Erro: %ERROR%<br>Data: %DATE%",
'on_sms' => 'Servidor \'%LABEL%\' esta ONLINE: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' esta ONLINE',
'on_email_body' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Data: %DATE%",
'on_email_body' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Data: %DATE%",
'on_pushover_title' => 'Servidor \'%LABEL%\' esta ONLINE',
'on_pushover_message' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Servidor: %LABEL%<br/>IP: %IP%<br/>Porta: %PORT%<br/>Data: %DATE%",
'on_pushover_message' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:<br><br>Servidor: %LABEL%<br>IP: %IP%<br>Porta: %PORT%<br>Data: %DATE%",
),
'login' => array(
'welcome_usermenu' => 'Bem vindo, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Perdeu a senha?',
'password_reset' => 'Redefinir senha',
'password_reset_email_subject' => 'Redefinir sua senha para PHP Server Monitor',
'password_reset_email_body' => 'Por favor use o link para redefinir sua senha. Este link irá expirar em 1 hora.<br/><br/>%link%',
'password_reset_email_body' => 'Por favor use o link para redefinir sua senha. Este link irá expirar em 1 hora.<br><br>%link%',
'error_user_incorrect' => 'O username não pode ser encontrado.',
'error_login_incorrect' => 'As informações são incorretas.',
'error_login_passwords_nomatch' => 'A senha informada não é válida.',

View File

@ -74,8 +74,6 @@ $sm_lang = array(
'minutes' => 'минут',
'second' => 'секунда',
'seconds' => 'секунд',
'online' => 'онлайн',
'offline' => 'оффлайн',
),
'menu' => array(
'config' => 'Параметры',
@ -96,7 +94,7 @@ $sm_lang = array(
'level' => 'Уровень',
'level_10' => 'Администратор',
'level_20' => 'Пользователь',
'level_description' => '<b>Администраторы</b> имеют полный доступ: они могут управлять серверами, пользователями и изменять общую конфигурацию.<br/><b>Пользователи</b> могут только просматривать и запускать проверку для серверов, которые были к ним прикреплены.',
'level_description' => '<b>Администраторы</b> имеют полный доступ: они могут управлять серверами, пользователями и изменять общую конфигурацию.<br><b>Пользователи</b> могут только просматривать и запускать проверку для серверов, которые были к ним прикреплены.',
'mobile' => 'Телефон',
'email' => 'E-mail',
'pushover' => 'Pushover',
@ -151,7 +149,8 @@ $sm_lang = array(
'domain' => 'Домен/IP',
'timeout' => 'Тайм-аут',
'timeout_description' => 'Количество секунд ожидания ответа сервера.',
'authentication_settings' => 'Настройки аутентификации (необязательно)',
'authentication_settings' => 'Настройки аутентификации',
'optional' => 'необязательно',
'website_username' => 'Имя пользователя',
'website_username_description' => 'Имя пользователя для доступа к сайту. (Поддерживается только Apache authentication.)',
'website_password' => 'Пароль',
@ -170,9 +169,10 @@ $sm_lang = array(
'pattern_description' => 'Если текст по шаблону не найден на сайте, сервер будет помечен как Оффлайн. Регулярные выражения допустимы.',
'pattern_online' => 'Шаблон указывает что вебсайт:',
'pattern_online_description' => 'Online: Если этот шаблон не найден на веб-сайте, сервер будет отмечен Онлайн. Offline: Если этот шаблон не найден на веб-сайте, сервер будет отмечен как Оффлайн.',
'header' => 'Заголовок',
'header_name_description' => 'Название заголовка (с учетом регистра)',
'header_value_description' => 'Значение заголовка. Разрешены регулярные выражения.',
'header_name' => 'Название заголовка',
'header_value' => 'Значение заголовка',
'header_name_description' => 'с учетом регистра.',
'header_value_description' => 'Разрешены регулярные выражения.',
'last_check' => 'Последняя проверка',
'last_online' => 'Был онлайн',
'last_offline' => 'Был оффлайн',
@ -196,6 +196,8 @@ $sm_lang = array(
'latency_max' => 'Задержка (максимальная)',
'latency_min' => 'Задержка (минимальная)',
'latency_avg' => 'Задержка (средняя)',
'online' => 'онлайн',
'offline' => 'оффлайн',
'uptime' => 'Аптайм',
'year' => 'Год',
'month' => 'Месяц',
@ -260,18 +262,18 @@ $sm_lang = array(
'telegram_api_token_description' => 'Прежде чем вы сможете начать пользоваться Telegram, вам необходимо получить API Token. Посетите <a href="http://docs.phpservermonitor.org/">раздел документации</a> для получения помощи.',
'alert_type' => 'Тип уведомлений',
'alert_type_description' => '<b>Изменение статуса:</b> '.
'Вы получите уведомление об изменение статуса. Для онлайн -> оффлайн или офлайн -> онлайн.<br/>'.
'Вы получите уведомление об изменение статуса. Для онлайн -> оффлайн или офлайн -> онлайн.<br>'.
'<br /><b>Оффлайн:</b> '.
'Вы получите уведомление только когда сервер перейдет в статус оффлайн. Например, '.
'задание Cron выставлено на каждые 15 минут. Сервер перейдет в статус оффлайн в 1:00 и не измениться до 6:00. '.
'Вы получите 1 уведомление только в 1:00<br/>'.
'Вы получите 1 уведомление только в 1:00<br>'.
'<br><b>Всегда:</b> '.
'Вы будете получать уведомление при каждом запуске скрипта проверки, как только сервер перейдет в статус оффлайн, даже если сервер находится в этом статусе несколько часов.',
'alert_type_status' => 'Изменение статуса',
'alert_type_offline' => 'Оффлайн',
'alert_type_always' => 'Всегда',
'alert_proxy' => 'Даже если включено, прокси никогда не используется для сервисов',
'alert_proxy_url' => '<b>Формат:</b> адрес:порт',
'alert_proxy_url' => 'Формат: адрес:порт',
'log_status' => 'Лог статусов',
'log_status_description' => 'Если лог статусов включен, монитор будет логировать все события выбранные в типе уведомлений.',
'log_email' => 'Логировать уведомления отправленые по E-mail',
@ -292,7 +294,7 @@ $sm_lang = array(
'settings_proxy' => 'Настройка прокси',
'auto_refresh' => 'Авто-обновление',
'auto_refresh_servers' =>
'Авто-обновление страницы статуса серверов.<br/>'.
'Авто-обновление страницы статуса серверов.<br>'.
'<span class="small">'.
'Время в секундах. Если указано 0, то страница не будет обновляться.'.
'</span>',
@ -322,20 +324,20 @@ $sm_lang = array(
'log_retention_period_description' => 'Количество дней хранения логов уведомлений и архива аптайма серверов. Введите 0 для выключения очистки логов.',
'log_retention_days' => 'дней',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: IP=%IP%, Порт=%PORT%. Ошибка=%ERROR%',
'off_email_subject' => 'ВАЖНО: сервер \'%LABEL%\' сейчас НЕДОСТУПЕН',
'off_email_body' => "Невозможно подключиться к следующему серверу:<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Ошибка: %ERROR%<br/>Дата: %DATE%",
'off_email_body' => "Невозможно подключиться к следующему серверу:<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Ошибка: %ERROR%<br>Дата: %DATE%",
'off_pushover_title' => 'Cервер \'%LABEL%\' сейчас НЕДОСТУПЕН',
'off_pushover_message' => "Невозможно подключиться к следующему серверу:<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Ошибка: %ERROR%<br/>Дата: %DATE%",
'off_telegram_message' => "Невозможно подключиться к следующему серверу:<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Ошибка: %ERROR%<br/>Дата: %DATE%",
'off_pushover_message' => "Невозможно подключиться к следующему серверу:<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Ошибка: %ERROR%<br>Дата: %DATE%",
'off_telegram_message' => "Невозможно подключиться к следующему серверу:<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Ошибка: %ERROR%<br>Дата: %DATE%",
'on_sms' => 'Сервер \'%LABEL%\' снова ДОСТУПЕН: IP=%IP%, Порт=%PORT%. Был недоступен: %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'ВАЖНО: Сервер \'%LABEL%\' сейчас ДОСТУПЕН',
'on_email_body' => "Сервер '%LABEL%' снова доступен.<br/>Был недоступен: %LAST_OFFLINE_DURATION%<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Дата: %DATE%",
'on_email_body' => "Сервер '%LABEL%' снова доступен.<br>Был недоступен: %LAST_OFFLINE_DURATION%<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Дата: %DATE%",
'on_pushover_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН',
'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.<br/>Был недоступен: %LAST_OFFLINE_DURATION%<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Дата: %DATE%',
'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.<br/>Был недоступен: %LAST_OFFLINE_DURATION%<br/><br/>Сервер: %LABEL%<br/>IP: %IP%<br/>Порт: %PORT%<br/>Дата: %DATE%',
'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.<br>Был недоступен: %LAST_OFFLINE_DURATION%<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Дата: %DATE%',
'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.<br>Был недоступен: %LAST_OFFLINE_DURATION%<br><br>Сервер: %LABEL%<br>IP: %IP%<br>Порт: %PORT%<br>Дата: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Здравствуйте, %user_name%',
@ -352,7 +354,7 @@ $sm_lang = array(
'password_forgot' => 'Забыли пароль?',
'password_reset' => 'Сбросить пароль',
'password_reset_email_subject' => 'Сброс пароля для PHP Server Monitor',
'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку для сброса пароля. Ссылка действительна 1 час.<br/><br/>%link%',
'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку для сброса пароля. Ссылка действительна 1 час.<br><br>%link%',
'error_user_incorrect' => 'Пользователь с указаными данными не найден.',
'error_login_incorrect' => 'Информация указана неверно.',
'error_login_passwords_nomatch' => 'Пароль указан неверно.',

View File

@ -80,7 +80,7 @@ $sm_lang = array(
'level' => 'Oprávnenie',
'level_10' => 'Administrátor',
'level_20' => 'Užívateľ',
'level_description' => '<b>Administrátor</b> má plný prístup: môže spravovať servery, užívateľov a upraviť globálnu konfiguráciu.<br/><b>Uživatel</b> má práva len na čítanie a spustiť aktualizáciu serverov, ktoré má priradené.',
'level_description' => '<b>Administrátor</b> má plný prístup: môže spravovať servery, užívateľov a upraviť globálnu konfiguráciu.<br><b>Uživatel</b> má práva len na čítanie a spustiť aktualizáciu serverov, ktoré má priradené.',
'mobile' => 'Mobil',
'email' => 'E-mail',
'pushover' => 'Pushover',
@ -124,7 +124,8 @@ $sm_lang = array(
'domain' => 'Doména/IP',
'timeout' => 'Časový limit',
'timeout_description' => 'Počet sekúnd čakania na odpoveď serveru.',
'authentication_settings' => 'Nastavenie autentizacie (voliteľný)',
'authentication_settings' => 'Nastavenie autentizacie',
'optional' => 'voliteľný',
'website_username' => 'Užívateľské meno',
'website_username_description' => 'Užívateľské meno pre prístup na stránku. (Len Apache autorizácia je podporovaná.)',
'website_password' => 'Heslo',
@ -214,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Pred použitím Pushoveru sa musíte <a href="%1$s" target="_blank" rel="noopener">registrovať</a> a získať API Token.',
'alert_type' => 'Zvoľte kedy si prajete byť upozornení.',
'alert_type_description' => '<b>Zmena stavu:</b> '.
'Obdržíte upozornenie pri zmene stavu, teda: online -> offline alebo offline -> online.<br/>'.
'Obdržíte upozornenie pri zmene stavu, teda: online -> offline alebo offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Obdržíte upozornenie, keď server prejde *PO PRVÝ KRÁT* do offline stavu. Napríklad, '.
'pokiaľ je cron nastavený na 15 minút a sledovaný server bude offline mezi 01:00 a 06:00, '.
'tak obdržíte upozornenie iba o 01:00.<br/>'.
'tak obdržíte upozornenie iba o 01:00.<br>'.
'<br><b>Vždy:</b> '.
'Obdržíte upozornenie pri každom spustení kontroly, teda aj pokiaľ bude server offline niekoľko hodín.',
'alert_type_status' => 'Zmena stavu',
@ -240,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Nastavenie logu',
'auto_refresh' => 'Automaticky obnoviť',
'auto_refresh_servers' =>
'Automaticky obnoviť stránku Servery.<br/>'.
'Automaticky obnoviť stránku Servery.<br>'.
'<span class="small">'.
'Čas v sekundách, 0 pre vypnutie automatického obnovenia.'.
'</span>',
@ -265,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Počet dní po které budú uchované logy upozornení. Vložte 0 pre vypnutie autorotáce.',
'log_retention_days' => 'dní',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%',
'off_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je offline',
'off_email_body' => 'Nebolo možné spojiť sa so serverom:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Chyba: %ERROR%<br/>Dátum: %DATE%',
'off_email_body' => 'Nebolo možné spojiť sa so serverom:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Chyba: %ERROR%<br>Dátum: %DATE%',
'off_pushover_title' => 'Server \'%LABEL%\' je offline',
'off_pushover_message' => 'Nebolo možné spojiť sa so serverom:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Chyba: %ERROR%<br/>Dátum: %DATE%',
'off_pushover_message' => 'Nebolo možné spojiť sa so serverom:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Chyba: %ERROR%<br>Dátum: %DATE%',
'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je online',
'on_email_body' => "Server '%LABEL%' je opäť online, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dátum: %DATE%",
'on_email_body' => "Server '%LABEL%' je opäť online, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dátum: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' je online',
'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Dátum: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Dátum: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Vitajte, %user_name%',
@ -293,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Zabudnuté heslo?',
'password_reset' => 'Obnoviť heslo',
'password_reset_email_subject' => 'Obnoviť heslo pre PHP Server Monitor',
'password_reset_email_body' => 'Použite následujúci odkaz pre obnovenie hesla. Odkaz je platný jednu hodinu.<br/><br/>%link%',
'password_reset_email_body' => 'Použite následujúci odkaz pre obnovenie hesla. Odkaz je platný jednu hodinu.<br><br>%link%',
'error_user_incorrect' => 'Zadané užívateľské meno nebolo nájdené.',
'error_login_incorrect' => 'Prihlásenie nebolo úspešné.',
'error_login_passwords_nomatch' => 'Zadané heslá sa nezhodujú.',

View File

@ -78,7 +78,7 @@ $sm_lang = array(
'level' => 'Nivo dostopa',
'level_10' => 'Administrator',
'level_20' => 'Uporabnik',
'level_description' => '<b>Administratorji</b> imajo poln dostop: lahko upravljajo strežnike, uporabnike in urejajo globalne nastavitve.<br/><b>Uporabniki</b> lahko samo vidijo status in poganjajo posodobitev statusa za strežnike, ki so jim bili dodeljeni.',
'level_description' => '<b>Administratorji</b> imajo poln dostop: lahko upravljajo strežnike, uporabnike in urejajo globalne nastavitve.<br><b>Uporabniki</b> lahko samo vidijo status in poganjajo posodobitev statusa za strežnike, ki so jim bili dodeljeni.',
'mobile' => 'Mobilni telefon',
'email' => 'E-pošta',
'pushover' => 'Pushover',
@ -200,11 +200,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Pred uporabo storitve Pushover, morate na njihovi spletni strani <a href="%1$s" target="_blank" rel="noopener">registrirati aplikacijo</a>, tukaj pa vnesti API žeton.',
'alert_type' => 'Izberite kdaj naj se vam pošljejo obvestila.',
'alert_type_description' => '<b>Sprememba statusa:</b> '.
'Obvestilo boste dobili ob vsaki spremembi statusa, torej iz delujoč -> nedelujoč ter nedelujoč -> delujoč.<br/>'.
'Obvestilo boste dobili ob vsaki spremembi statusa, torej iz delujoč -> nedelujoč ter nedelujoč -> delujoč.<br>'.
'<br /><b>Nedelujoč:</b> '.
'Obvestilo boste dobili samo, ko se bo strežnik PRVIKRAT prenehal odzivati. Na primer:'.
'nastavljeno imate preverjanje strežnikov vsakih 15 minut. Strežnik preneha delovati ob 13h in ostane nedelujoč do 18h. '.
'Dobili boste obvestilo samo ob 13h.<br/>'.
'Dobili boste obvestilo samo ob 13h.<br>'.
'<br><b>Vedno:</b> '.
'Obvestilo boste dobili vedno, ko se izvede skripta za preverjanje in strežnik ne deluje, pa čeprav bo strežnik nedelujoč več ur.',
'alert_type_status' => 'Sprememba statusa',
@ -226,7 +226,7 @@ $sm_lang = array(
'settings_log' => 'Hramba dnevniških zapisov',
'auto_refresh' => 'Samodejno posodabljanje',
'auto_refresh_servers' =>
'Samodejno posodabljanje pregleda statusa strežnikov.<br/>'.
'Samodejno posodabljanje pregleda statusa strežnikov.<br>'.
'<span class="small">'.
'Čas v sekundah. Če je vrednost 0 se stran ne bo samodejno posodabljala.'.
'</span>',
@ -251,18 +251,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Število dni, ko naj se hranijo podatki o obvestilih in statusu strežnikov. Če želite podatke hraniti trajno, vnesite 0.',
'log_retention_days' => 'dni',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Streznik \'%LABEL%\' NE deluje: IP=%IP%, vrata=%PORT%. Napaka=%ERROR%',
'off_email_subject' => 'POMEMBNO: Strežnik \'%LABEL%\' NE deluje',
'off_email_body' => "Pri povezovanju na streznik je prislo do napake:<br/><br/>Streznik: %LABEL%<br/>IP: %IP%<br/>vrata: %PORT%<br/>Napaka: %ERROR%<br/>Datum: %DATE%",
'off_email_body' => "Pri povezovanju na streznik je prislo do napake:<br><br>Streznik: %LABEL%<br>IP: %IP%<br>vrata: %PORT%<br>Napaka: %ERROR%<br>Datum: %DATE%",
'off_pushover_title' => 'Streznik \'%LABEL%\' NE deluje',
'off_pushover_message' => "Ni se mogoče povezati na naslednji streznik:<br/><br/>Streznik: %LABEL%<br/>IP: %IP%<br/>Vrata: %PORT%<br/>Error: %ERROR%<br/>Datum: %DATE%",
'off_pushover_message' => "Ni se mogoče povezati na naslednji streznik:<br><br>Streznik: %LABEL%<br>IP: %IP%<br>Vrata: %PORT%<br>Error: %ERROR%<br>Datum: %DATE%",
'on_sms' => 'Streznik \'%LABEL%\' deluje: IP=%IP%, vrata=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'OBVESTILO: Streznik \'%LABEL%\' ponovno deluje',
'on_email_body' => "Streznik '%LABEL%' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Strežnik: %LABEL%<br/>IP: %IP%<br/>Vrata: %PORT%<br/>Datum: %DATE%",
'on_email_body' => "Streznik '%LABEL%' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:<br><br>Strežnik: %LABEL%<br>IP: %IP%<br>Vrata: %PORT%<br>Datum: %DATE%",
'on_pushover_title' => 'Streznik \'%LABEL%\' deluje',
'on_pushover_message' => 'Streznik \'%LABEL%\' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Vrata: %PORT%<br/>Datum: %DATE%',
'on_pushover_message' => 'Streznik \'%LABEL%\' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Vrata: %PORT%<br>Datum: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Pozdravljeni, %user_name%',
@ -279,7 +279,7 @@ $sm_lang = array(
'password_forgot' => 'Pozabljeno geslo?',
'password_reset' => 'Ponastavitev gesla',
'password_reset_email_subject' => 'Ponastavite svoje geslo za PHP Server Monitor',
'password_reset_email_body' => 'Za ponastavitev gesla uporabite spodnjo povezavo. Pomembno: povezava poteče v 1 uri.<br/><br/>%link%',
'password_reset_email_body' => 'Za ponastavitev gesla uporabite spodnjo povezavo. Pomembno: povezava poteče v 1 uri.<br><br>%link%',
'error_user_incorrect' => 'Vpisanega uporabniškega imena ne najdem.',
'error_login_incorrect' => 'Podatki so napačni.',
'error_login_passwords_nomatch' => 'Vneseno geslo ni pravilno.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Nivå',
'level_10' => 'Administratör',
'level_20' => 'Användare',
'level_description' => '<b>Administratörer</b> har fulla rättigheter: de kan hantera servrar, användare och redigera gemensamma inställningar.<br/><b>Användare</b> kan bara se och köra uppdateraren för de servrar som de blivit tilldelade.',
'level_description' => '<b>Administratörer</b> har fulla rättigheter: de kan hantera servrar, användare och redigera gemensamma inställningar.<br><b>Användare</b> kan bara se och köra uppdateraren för de servrar som de blivit tilldelade.',
'mobile' => 'Mobilnummer',
'email' => 'Email',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Innan du kan använda Pushover behöver du <a href="%1$s" target="_blank" rel="noopener">registrera en App</a> på deras webbsida och skriva in App API Token här.',
'alert_type' => 'Välj när du vill bli meddelad.',
'alert_type_description' => '<b>Statusförändring:</b> '.
'Du får ett meddelande när status ändras. Så från online -> offline eller offline -> online.<br/>'.
'Du får ett meddelande när status ändras. Så från online -> offline eller offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Du får ett meddelande när en server går offline *FÖR FÖRSTA GÅNGEN* Exempelvis, '.
'ditt cronjob körs var 15 minut och din server går ned kl 1 och är nere till kl 6. '.
'Du kommer få 1 meddelande kl 1 och inga mer.<br/>'.
'Du kommer få 1 meddelande kl 1 och inga mer.<br>'.
'<br><b>Alltid:</b> '.
'Du kommer få ett meddelande varje gång kontrollen görs, även om servern har varit offline under en längre tid.',
'alert_type_status' => 'Statusförändring',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Logg-inställningar',
'auto_refresh' => 'Auto-uppdatera',
'auto_refresh_servers' =>
'Auto-uppdatera status-sidan.<br/>'.
'Auto-uppdatera status-sidan.<br>'.
'<span class="small">'.
'Tid i sekunder, om "0" så uppdateras sidan inte automatiskt.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Antal dagar loggar över meddelande och uptime sparas. 0 innebär att loggrensning är avstängd.',
'log_retention_days' => 'dagar',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' är NERE: ip=%IP%, port=%PORT%. Fel=%ERROR%',
'off_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är NERE',
'off_email_body' => "Kunde inte ansluta till följande server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fel: %ERROR%<br/>Tid: %DATE%",
'off_email_body' => "Kunde inte ansluta till följande server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fel: %ERROR%<br>Tid: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' är NERE',
'off_pushover_message' => "Kunde inte ansluta till följande server:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Fel: %ERROR%<br/>Tid: %DATE%",
'off_pushover_message' => "Kunde inte ansluta till följande server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Fel: %ERROR%<br>Tid: %DATE%",
'on_sms' => 'Server \'%LABEL%\' är UPPE: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är UPPE',
'on_email_body' => "Server '%LABEL%' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Tid: %DATE%",
'on_email_body' => "Server '%LABEL%' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Tid: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' är UPPE',
'on_pushover_message' => 'Server \'%LABEL%\' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Tid: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Tid: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Välkommen, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Glömt lösenord?',
'password_reset' => 'Återställ lösenord',
'password_reset_email_subject' => 'Password reset for PHP Server Monitor',
'password_reset_email_body' => 'Anv&auml;nd f&ouml;ljande l&auml;nk f&ouml;r att &aring;terst&auml;lla ditt l&ouml;senord. T&auml;nk p&aring; att l&auml;nken bara &auml;r giltig 1 timme.<br/><br/>%link%',
'password_reset_email_body' => 'Anv&auml;nd f&ouml;ljande l&auml;nk f&ouml;r att &aring;terst&auml;lla ditt l&ouml;senord. T&auml;nk p&aring; att l&auml;nken bara &auml;r giltig 1 timme.<br><br>%link%',
'error_user_incorrect' => 'Användaren kunde inte hittas.',
'error_login_incorrect' => 'Informationen är felaktig.',
'error_login_passwords_nomatch' => 'Lösenorden stämmer inte överens.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => 'Seviye',
'level_10' => 'Yönetici',
'level_20' => 'Kullanıcı',
'level_description' => '<b>Yöneticiler</b> tüm yetkilere sahiptir: Onlar sunucuları, kullanıcıları yönetebilir genel ayarlamaları düzenleyebilirler.<br/> <b>Kullanıcılar</b> sadece görüntüleyebilir ve onlara atanmış sunucu güncelleyicileri çalıştırabilirler.',
'level_description' => '<b>Yöneticiler</b> tüm yetkilere sahiptir: Onlar sunucuları, kullanıcıları yönetebilir genel ayarlamaları düzenleyebilirler.<br> <b>Kullanıcılar</b> sadece görüntüleyebilir ve onlara atanmış sunucu güncelleyicileri çalıştırabilirler.',
'mobile' => 'Mobil',
'email' => 'E-posta',
'pushover' => 'Pushover',
@ -215,11 +215,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Pushover kullanmadan önce, <a href="%1$s" target="_blank" rel="noopener">Pushover sitesi üzerinden</a> bir uygulama oluşturmalısınız ve API Token bilgilerini buraya yazmalısınız.',
'alert_type' => 'Ne zaman uyarılmak istediğinizi seçin.',
'alert_type_description' => '<b>Durum değişikliği:</b> '.
'Sunucu durumu değişiklik durumunda bildirim alacaksınız. Sunucu çevrimiçi durumundan çevrimdışı durumuna veya çevrimdışı durumundan çevrim için durumuna geçtiğinde.<br/>'.
'Sunucu durumu değişiklik durumunda bildirim alacaksınız. Sunucu çevrimiçi durumundan çevrimdışı durumuna veya çevrimdışı durumundan çevrim için durumuna geçtiğinde.<br>'.
'<br /><b>Çevrimdışı:</b> '.
'Sunucu çevrim dışı duruma geçtiğinde bildirim alırsınız. *SADECE İLK GEÇTİĞİNDE*. Örneğin, '.
'Cronjob her 15 dakikada bir çalışıyorsa ve sunucu 1\'de gidip 6\'ya kadar kapalı kalırsa. '.
'Sadece size saat 1\'de bildirim gönderilecektir.<br/>'.
'Sadece size saat 1\'de bildirim gönderilecektir.<br>'.
'<br><b>Daima:</b> '.
'Site çevrimdışı olduğu her zaman size bildirim gönderilecektir, site saatler boyunca kapalı kalse bile.',
'alert_type_status' => 'Durum değişikliği',
@ -241,7 +241,7 @@ $sm_lang = array(
'settings_log' => 'Log ayarları',
'auto_refresh' => 'Otomatik Yenileme',
'auto_refresh_servers' =>
'Otomatik yenileme sunucu sayfası<br/>'.
'Otomatik yenileme sunucu sayfası<br>'.
'<span class="small">'.
'Eğer sayfa yenilenmez ise.'.
'</span>',
@ -266,18 +266,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Bildirim loglarının ve sunucunun çalışma zamanlarının arşivinin saklanması için gün sayısı. Logların temizlenmesini kapatmak için 0 giriniz.',
'log_retention_days' => 'gün',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => '\'%LABEL%\' isimli sunucu KAPANDI: ip=%IP%, port=%PORT%. Error=%ERROR%',
'off_email_subject' => 'ÖNEMLİ: \'%LABEL%\' isimli sunucu KAPANDI.',
'off_email_body' => "Aşağıdaki sunuculara erişim sağlanamıyor:<br/><br/>Sunucu: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Hata: %ERROR%<br/>Tarih: %DATE%",
'off_email_body' => "Aşağıdaki sunuculara erişim sağlanamıyor:<br><br>Sunucu: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Hata: %ERROR%<br>Tarih: %DATE%",
'off_pushover_title' => '\'%LABEL%\' isimli sunucu KAPANDI.',
'off_pushover_message' => "Aşağıdaki nuculara erişim sağlanamıyor:<br/><br/>Sunucu: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Hata: %ERROR%<br/>Tarih: %DATE%",
'off_pushover_message' => "Aşağıdaki nuculara erişim sağlanamıyor:<br><br>Sunucu: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Hata: %ERROR%<br>Tarih: %DATE%",
'on_sms' => '\'%LABEL%\' isimli sunucu YAYINDA: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'ÖNEMLİ:\'%LABEL%\' isimli sunucu YAYINDA.',
'on_email_body' => "'%LABEL%' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Sunucu: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Tarih: %DATE%",
'on_email_body' => "'%LABEL%' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:<br><br>Sunucu: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Tarih: %DATE%",
'on_pushover_title' => '\'%LABEL%\' isimli sunucu YAYINDA',
'on_pushover_message' => '\'%LABEL%\' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Sunucu: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>Tarih: %DATE%',
'on_pushover_message' => '\'%LABEL%\' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:<br><br>Sunucu: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Tarih: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Hoşgeldin, %user_name%',
@ -294,7 +294,7 @@ $sm_lang = array(
'password_forgot' => 'Şifreni mi unuttun?',
'password_reset' => 'Şifreni yenile',
'password_reset_email_subject' => 'PHP Server Monitor için şifreni yenile',
'password_reset_email_body' => 'Aşağıdaki bağlantıyı kullanarak şifrenizi güncelleyiniz. Bağlantı 1 saat sonra geçerliliğini kaybedecektir.<br/><br/>%link%',
'password_reset_email_body' => 'Aşağıdaki bağlantıyı kullanarak şifrenizi güncelleyiniz. Bağlantı 1 saat sonra geçerliliğini kaybedecektir.<br><br>%link%',
'error_user_incorrect' => 'Kullanıcı adı bulunamadı.',
'error_login_incorrect' => 'Bilgi yanlış.',
'error_login_passwords_nomatch' => 'Şifreleriniz uyuşmuyor.',

View File

@ -78,7 +78,7 @@ $sm_lang = array(
'level' => 'Cấp độ',
'level_10' => 'Administrator',
'level_20' => 'User',
'level_description' => '<b>Administrators</b> có toàn quyền: họ có thể quản lý server, người dùng và chỉnh sửa cấu hình.<br/><b>Users</b> chỉ xem và chạy cập nhật cho servers được giao cho họ.',
'level_description' => '<b>Administrators</b> có toàn quyền: họ có thể quản lý server, người dùng và chỉnh sửa cấu hình.<br><b>Users</b> chỉ xem và chạy cập nhật cho servers được giao cho họ.',
'mobile' => 'Di động',
'email' => 'Email',
'pushover' => 'Pushover',
@ -200,11 +200,11 @@ $sm_lang = array(
'pushover_api_token_description' => 'Trước khi bạn có thể sử dụng Pushover, bạn cần phải <a href="%1$s" target="_blank" rel="noopener">đăng ký một ứng dụng</a> tại trang web của họ và nhập Token App API ở đây.',
'alert_type' => 'Chọn khi bạn muốn được thông báo.',
'alert_type_description' => '<b>Thay đổi trạng thái:</b> '.
'Bạn sẽ nhận được thông báo khi một máy chủ có một sự thay đổi trạng thái. Từ online -> offline hoặc offline -> online.<br/>'.
'Bạn sẽ nhận được thông báo khi một máy chủ có một sự thay đổi trạng thái. Từ online -> offline hoặc offline -> online.<br>'.
'<br /><b>Offline:</b> '.
'Bạn sẽ nhận được thông báo khi một máy chủ offline *MỘT LẦN DUY NHẤT*. Ví dụ, '.
'cronjob của bạn hoạt động mỗi 15 phút và server của bạn down tại 01h00 cho đến 6h00. '.
'Bạn sẽ nhận được 1 thông báo lúc 01h00 và đó là nó.<br/>'.
'Bạn sẽ nhận được 1 thông báo lúc 01h00 và đó là nó.<br>'.
'<br><b>Always:</b> '.
'Bạn sẽ nhận được thông báo mỗi khi chạy đoạn script và một trang web tắt, ngay cả khi trang web đã được offline trong nhiều giờ.',
'alert_type_status' => 'Thay đổi trạng thái',
@ -226,7 +226,7 @@ $sm_lang = array(
'settings_log' => 'Thiết lặp Log',
'auto_refresh' => 'Tự động làm mới',
'auto_refresh_servers' =>
'Tự động làm mới servers page.<br/>'.
'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>',
@ -251,18 +251,18 @@ $sm_lang = array(
'log_retention_period_description' => 'Số ngày để giữ các bản ghi của các thông báo và tài liệu lưu trữ của thời gian hoạt động máy chủ. Nhập 0 để vô hiệu hóa dọn dẹp log.',
'log_retention_days' => 'ngày',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, cổng=%PORT%. Lỗi=%ERROR%',
'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN',
'off_email_body' => "Không thể kết nối đến máy chủ sau:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Cổng: %PORT%<br/>Lỗi: %ERROR%<br/>Thời gian: %DATE%",
'off_email_body' => "Không thể kết nối đến máy chủ sau:<br><br>Server: %LABEL%<br>IP: %IP%<br>Cổng: %PORT%<br>Lỗi: %ERROR%<br>Thời gian: %DATE%",
'off_pushover_title' => 'Server \'%LABEL%\' is DOWN',
'off_pushover_message' => "Không thể kết nối đến máy chủ:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Cổng: %PORT%<br/>Lỗi: %ERROR%<br/>Thời gian: %DATE%",
'off_pushover_message' => "Không thể kết nối đến máy chủ:<br><br>Server: %LABEL%<br>IP: %IP%<br>Cổng: %PORT%<br>Lỗi: %ERROR%<br>Thời gian: %DATE%",
'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' hoạt động',
'on_email_body' => "Server '%LABEL%' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Cổng: %PORT%<br/>Thời gian: %DATE%",
'on_email_body' => "Server '%LABEL%' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Cổng: %PORT%<br>Thời gian: %DATE%",
'on_pushover_title' => 'Server \'%LABEL%\' hoạt động',
'on_pushover_message' => 'Server \'%LABEL%\' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>Server: %LABEL%<br/>IP: %IP%<br/>Cổng: %PORT%<br/>Thời gian: %DATE%',
'on_pushover_message' => 'Server \'%LABEL%\' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Cổng: %PORT%<br>Thời gian: %DATE%',
),
'login' => array(
'welcome_usermenu' => 'Chào mừng, %user_name%',
@ -279,7 +279,7 @@ $sm_lang = array(
'password_forgot' => 'Quên mật khẩu?',
'password_reset' => 'Khôi phục mật khẩu',
'password_reset_email_subject' => 'Khôi phục lại mật khẩu của bạn cho PHP Server Monitor',
'password_reset_email_body' => 'Vui lòng sử dụng liên kết sau đây để thiết lập lại mật khẩu của bạn. Xin lưu ý nó hết hạn trong 1 giờ.<br/><br/>%link%',
'password_reset_email_body' => 'Vui lòng sử dụng liên kết sau đây để thiết lập lại mật khẩu của bạn. Xin lưu ý nó hết hạn trong 1 giờ.<br><br>%link%',
'error_user_incorrect' => 'Tên người dùng cung cấp không thể tìm thấy.',
'error_login_incorrect' => 'Thông tin không đúng.',
'error_login_passwords_nomatch' => 'Mật khẩu được cung cấp không phù hợp.',

View File

@ -92,7 +92,7 @@ $sm_lang = array(
'level' => '等级',
'level_10' => '超级管理员',
'level_20' => '普通用户',
'level_description' => '<b>超级管理员</b> 拥有所有权限: 管理服务器, 用户 以及修改设置.<br/><b>普通用户</b> 只能查看及更新自己名下所属的服务器.',
'level_description' => '<b>超级管理员</b> 拥有所有权限: 管理服务器, 用户 以及修改设置.<br><b>普通用户</b> 只能查看及更新自己名下所属的服务器.',
'mobile' => '手机',
'email' => '邮件',
'pushover' => 'Pushover',
@ -136,7 +136,8 @@ $sm_lang = array(
'domain' => 'URL/IP',
'timeout' => '超时时间',
'timeout_description' => '等待服务器响应的时间.',
'authentication_settings' => '访问权限设置 (可选)',
'authentication_settings' => '访问权限设置',
'optional' => '可选',
'website_username' => '用户名',
'website_username_description' => '网站分配的用户名.',
'website_password' => '密码',
@ -231,18 +232,18 @@ $sm_lang = array(
'pushover_api_token_description' => '请先 <a href="%1$s" target="_blank" rel="noopener">注册Pushover</a> 并获取 Api Token.',
'alert_type' => '如果想要收到提醒请选中此项.',
'alert_type_description' => '<b>状态变化:</b> '.
'业务 online -> offline 或 offline -> online 的状态变化将会收到提醒.<br/>'.
'业务 online -> offline 或 offline -> online 的状态变化将会收到提醒.<br>'.
'<br /><b>离线状态:</b> '.
'服务器首次发生离线状态将会收到提醒 ,如:'.
'cronjob 设定为15分钟执行一次 服务器从1:00-6:00一直处于当状态'.
'那么你将于1:00首次发现脱机时收到一条提醒之后不会重复提醒.<br/>'.
'那么你将于1:00首次发现脱机时收到一条提醒之后不会重复提醒.<br>'.
'<br><b>总是提醒:</b> '.
'每次脚本执行或站点离线(即使站点离线很久已提醒过)均发送提醒.',
'alert_type_status' => '状态变化',
'alert_type_offline' => '离线状态',
'alert_type_always' => '总是提醒',
'alert_proxy' => '代理只用于 URL 监控,如没有用户名密码,请留空',
'alert_proxy_url' => '<b>格式:</b> Host:Port',
'alert_proxy_url' => '格式: Host:Port',
'log_status' => '状态记录',
'log_status_description' => '如果状态记录设置为开, 提醒发送时均会保存记录.',
'log_email' => '记录脚本所发邮件?',
@ -260,7 +261,7 @@ $sm_lang = array(
'settings_proxy' => '代理设置',
'auto_refresh' => '自动刷新',
'auto_refresh_servers' =>
'自动刷新服务器页.<br/>'.
'自动刷新服务器页.<br>'.
'<span class="small">'.
'单位为秒, 设置为 0 则不自动刷新.'.
'</span>',
@ -285,18 +286,18 @@ $sm_lang = array(
'log_retention_period_description' => '日志存档保留时间0为禁用日志清理',
'log_retention_days' => '天',
),
// for newlines in the email messages use <br/>
// for newlines in the email messages use <br>
'notifications' => array(
'off_sms' => '监控项 \'%LABEL%:%PORT%\' 异常. %ERROR% %IP%',
'off_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 宕机',
'off_email_body' => "无法连接到以下服务器:<br/><br/>服务器: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>错误: %ERROR%<br/>日期: %DATE%",
'off_email_body' => "无法连接到以下服务器:<br><br>服务器: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>错误: %ERROR%<br>日期: %DATE%",
'off_pushover_title' => '服务器 \'%LABEL%\' 宕机',
'off_pushover_message' => "无法连接到以下服务器:<br/><br/>服务器: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>错误: %ERROR%<br/>日期: %DATE%",
'off_pushover_message' => "无法连接到以下服务器:<br><br>服务器: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>错误: %ERROR%<br>日期: %DATE%",
'on_sms' => '服务器 \'%LABEL%\' 运行中: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 运行中',
'on_email_body' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>服务器: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>日期: %DATE%",
'on_email_body' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:<br><br>服务器: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>日期: %DATE%",
'on_pushover_title' => '服务器 \'%LABEL%\' 运行中',
'on_pushover_message' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:<br/><br/>服务器: %LABEL%<br/>IP: %IP%<br/>Port: %PORT%<br/>日期: %DATE%",
'on_pushover_message' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:<br><br>服务器: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>日期: %DATE%",
),
'login' => array(
'welcome_usermenu' => '欢迎, %user_name%',
@ -313,7 +314,7 @@ $sm_lang = array(
'password_forgot' => '忘记密码?',
'password_reset' => '重设密码',
'password_reset_email_subject' => '重设你的密码',
'password_reset_email_body' => '点击以下链接重设密码. 链接1小时内有效.<br/><br/>%link%',
'password_reset_email_body' => '点击以下链接重设密码. 链接1小时内有效.<br><br>%link%',
'error_user_incorrect' => '该用户不存在.',
'error_login_incorrect' => '登录信息不正确.',
'error_login_passwords_nomatch' => '密码不符.',

View File

@ -266,6 +266,7 @@ abstract class AbstractController implements ControllerInterface {
'label_logout' => psm_get_lang('login', 'logout'),
'url_profile' => psm_build_url(array('mod' => 'user_profile')),
'url_logout' => psm_build_url(array('logout' => 1)),
'label_current' => psm_get_lang('system', 'current'),
);
switch ($ulvl) {
@ -350,26 +351,30 @@ abstract class AbstractController implements ControllerInterface {
/**
* Add one or multiple message to the stack to be displayed to the user
* @param string|array $msg
* @param string $shortcode info/success/warning/error
* @param string $shortcode primary/success/warning/danger
* @return \psm\Module\ControllerInterface
* @see getMessages()
*/
public function addMessage($msg, $shortcode = 'info') {
public function addMessage($msg, $shortcode = 'primary') {
if (!is_array($msg)) {
$msg = array($msg);
}
$class= $shortcode;
switch ($shortcode) {
case 'error':
$icon = 'exclamation-sign';
$icon = 'exclamation-circle';
$class= 'danger';
break;
case 'success':
$icon = 'ok-sign';
$icon = 'check-circle';
break;
case 'warning':
$icon = 'question-sign';
$icon = 'exclamation-triangle';
break;
case 'primary':
default:
$icon = 'info-sign';
$icon = 'info-circle';
$shortcode = 'info';
break;
}
@ -377,6 +382,7 @@ abstract class AbstractController implements ControllerInterface {
$this->messages[] = array(
'message' => $m,
'shortcode' => $shortcode,
'class' => $class,
'icon' => $icon,
);
}

View File

@ -120,23 +120,42 @@ class ConfigController extends AbstractController {
// generate sms_gateway array
$sms_gateways = psm_get_sms_gateways();
$tpl_data['sms_gateway_current'] = (isset($config['sms_gateway']))
? $config['sms_gateway']
: current($sms_gateways);
$tpl_data['sms_gateways'] = array();
$tpl_data['sms_gateway'] = array();
foreach ($sms_gateways as $sms_gateway => $label) {
$tpl_data['sms_gateways'][] = array(
$tpl_data['sms_gateway'][] = array(
'value' => $sms_gateway,
'label' => $label,
);
}
// @todo these selected values can easily be rewritten in the template using twig
$tpl_data['alert_type_selected_'.$config['alert_type']] = 'selected="selected"';
$smtp_sec = isset($config['email_smtp_security']) ? $config['email_smtp_security'] : '';
$tpl_data['email_smtp_security_selected_'.$smtp_sec] = 'selected="selected"';
$tpl_data['auto_refresh_servers'] = (isset($config['auto_refresh_servers'])) ? $config['auto_refresh_servers'] : '0';
$tpl_data['log_retention_period'] = (isset($config['log_retention_period'])) ? $config['log_retention_period'] : '365';
$tpl_data['password_encrypt_key'] = (isset($config['password_encrypt_key'])) ? $config['password_encrypt_key'] : sha1(microtime());
foreach (array("status", "offline", "always") as $alert_type) {
$tpl_data['alert_type'][] = array(
'value' => $alert_type,
'label' => psm_get_lang('config', 'alert_type_'.$alert_type),
);
}
$tpl_data['email_smtp_security'] = array(
array(
'value' => '',
'label' => psm_get_lang('config', 'email_smtp_security_none')
),
array(
'value' => 'ssl',
'label' => 'SSL'
),
array(
'value' => 'tls',
'label' => 'TLS'
)
);
$tpl_data['sms_gateway_selected'] = isset($config['sms_gateway']) ? $config['sms_gateway'] : current($sms_gateways);
$tpl_data['alert_type_selected'] = isset($config['alert_type']) ? $config['alert_type'] : '';
$tpl_data['email_smtp_security_selected'] = isset($config['email_smtp_security']) ? $config['email_smtp_security'] : '';
$tpl_data['auto_refresh_servers'] = isset($config['auto_refresh_servers']) ? $config['auto_refresh_servers'] : '0';
$tpl_data['log_retention_period'] = isset($config['log_retention_period']) ? $config['log_retention_period'] : '365';
$tpl_data['password_encrypt_key'] = isset($config['password_encrypt_key']) ? $config['password_encrypt_key'] : sha1(microtime());
foreach ($this->checkboxes as $input_key) {
$tpl_data[$input_key.'_checked'] =
@ -369,7 +388,6 @@ class ConfigController extends AbstractController {
'label_email_smtp_host' => psm_get_lang('config', 'email_smtp_host'),
'label_email_smtp_port' => psm_get_lang('config', 'email_smtp_port'),
'label_email_smtp_security' => psm_get_lang('config', 'email_smtp_security'),
'label_email_smtp_security_none' => psm_get_lang('config', 'email_smtp_security_none'),
'label_email_smtp_username' => psm_get_lang('config', 'email_smtp_username'),
'label_email_smtp_password' => psm_get_lang('config', 'email_smtp_password'),
'label_email_smtp_noauth' => psm_get_lang('config', 'email_smtp_noauth'),
@ -393,9 +411,6 @@ class ConfigController extends AbstractController {
'label_telegram_api_token_description' => psm_get_lang('config', 'telegram_api_token_description'),
'label_alert_type' => psm_get_lang('config', 'alert_type'),
'label_alert_type_description' => psm_get_lang('config', 'alert_type_description'),
'label_alert_type_status' => psm_get_lang('config', 'alert_type_status'),
'label_alert_type_offline' => psm_get_lang('config', 'alert_type_offline'),
'label_alert_type_always' => psm_get_lang('config', 'alert_type_always'),
'label_combine_notifications' => psm_get_lang('config', 'combine_notifications'),
'label_combine_notifications_description' => psm_get_lang('config', 'combine_notifications_description'),
'label_log_status' => psm_get_lang('config', 'log_status'),
@ -414,6 +429,8 @@ class ConfigController extends AbstractController {
'label_log_retention_period' => psm_get_lang('config', 'log_retention_period'),
'label_log_retention_period_description' => psm_get_lang('config', 'log_retention_period_description'),
'label_log_retention_days' => psm_get_lang('config', 'log_retention_days'),
'label_days' => psm_get_lang('config', 'log_retention_days'),
);
}
}

View File

@ -76,7 +76,8 @@ class InstallController extends AbstractController {
$this->addMessage('PHP version: '.$phpv, 'success');
}
if (version_compare(PHP_RELEASE_VERSION, '7', '<')) {
$this->addMessage('PHP 5 reaches the end of life (January 1, 2019), please update to PHP 7. PHP supported versions can be found <a href="https://secure.php.net/supported-versions.php">here</a>.', 'warning');
// TODO PHP 5 has reached the end of life. Add warning for those who still use it.
$this->addMessage('PHP 5 reaches the end of life (January 1, 2019), please update to PHP 7. PHP supported versions can be found <a href="https://secure.php.net/supported-versions.php" target="_blank" rel="noopener">here</a>.', 'warning');
}
if (!function_exists('curl_init')) {
$this->addMessage('PHP is installed without the cURL module. Please install cURL.', 'warning');
@ -88,7 +89,7 @@ class InstallController extends AbstractController {
$this->addMessage('The PDO MySQL driver needs to be installed.', 'error');
}
if (!ini_get('date.timezone')) {
$this->addMessage('You should set a timezone in your php.ini file (e.g. \'date.timezone = UTC\'). See <a href="http://www.php.net/manual/en/timezones.php" target="_blank">this page</a> for more info.', 'warning');
$this->addMessage('You should set a timezone in your php.ini file (e.g. \'date.timezone = UTC\'). See <a href="http://www.php.net/manual/en/timezones.php" target="_blank" rel="noopener">this page</a> for more info.', 'warning');
}
if ($errors > 0) {
@ -172,11 +173,18 @@ class InstallController extends AbstractController {
if ($this->db->status()) {
if ($this->isUpgrade()) {
// upgrade
if (version_compare($this->getPreviousVersion(), '3.0.0', '<')) {
$version_from = $this->getPreviousVersion();
if (version_compare($version_from, '3.0.0', '<')) {
// upgrade from before 3.0, does not have passwords yet.. create new user first
$this->addMessage('Your current version does not have an authentication system, but since v3.0 access to the monitor is restricted by user accounts. Please set up a new account to be able to login after the upgrade, and which you can use to change the passwords for your other accounts.', 'info');
$this->addMessage('Your current version does not have an authentication system, but since v3.0 access to the monitor is restricted by user accounts. Please set up a new account to be able to login after the upgrade, and which you can use to change the passwords for your other accounts.');
$tpl_name = 'module/install/config_new_user.tpl.html';
} else {
}
elseif (version_compare($version_from, PSM_VERSION, '=')) {
$this->addMessage('Your installation is already at the latest version.', 'success');
$tpl_name = 'module/install/success.tpl.html';
}
else {
$this->addMessage('We have discovered a previous version.');
$tpl_name = 'module/install/config_upgrade.tpl.html';
$tpl_data['version'] = PSM_VERSION;
}
@ -226,7 +234,7 @@ class InstallController extends AbstractController {
$installer = new \psm\Util\Install\Installer($this->db, $logger);
if ($this->isUpgrade()) {
$this->addMessage('Upgrade process started.', 'info');
$this->addMessage('Upgrade process started.');
$version_from = $this->getPreviousVersion();
if ($version_from === false) {
@ -237,7 +245,7 @@ class InstallController extends AbstractController {
} elseif (version_compare($version_from, PSM_VERSION, '>')) {
$this->addMessage('This installer does not support downgrading, sorry.', 'error');
} else {
$this->addMessage('Upgrading from '.$version_from.' to '.PSM_VERSION, 'info');
$this->addMessage('Upgrading from '.$version_from.' to '.PSM_VERSION);
$installer->upgrade($version_from, PSM_VERSION);
}

View File

@ -118,11 +118,6 @@ abstract class AbstractServerController extends AbstractController {
null : "(".$server['last_offline_duration'].")";
}
$server['last_check'] = psm_timespan($server['last_check']);
$server['active'] = psm_get_lang('system', $server['active']);
$server['email'] = psm_get_lang('system', $server['email']);
$server['sms'] = psm_get_lang('system', $server['sms']);
$server['pushover'] = psm_get_lang('system', $server['pushover']);
$server['telegram'] = psm_get_lang('system', $server['telegram']);
if ($server['status'] == 'on' && $server['warning_threshold_counter'] > 0) {
$server['status'] = 'warning';

View File

@ -59,17 +59,28 @@ class LogController extends AbstractServerController {
'label_date' => psm_get_lang('system', 'date'),
'label_users' => ucfirst(psm_get_lang('menu', 'user')),
'label_no_logs' => psm_get_lang('log', 'no_logs'),
'label_clear_log' => psm_get_lang('log', 'clear'),
'tabs' => array(),
);
$sidebar = new \psm\Util\Module\Sidebar($this->twig);
$this->setSidebar($sidebar);
if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) {
$modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER);
$this->addModal($modal);
$modal->setTitle(psm_get_lang('log', 'delete_title'));
$modal->setMessage(psm_get_lang('log', 'delete_message'));
$modal->setOKButtonLabel(psm_get_lang('system', 'delete'));
$tpl_data['has_admin_actions'] = true;
$sidebar->addButton(
'clear_logn',
psm_get_lang('log', 'clear'),
psm_build_url(array('mod' => 'server_log', 'action' => 'delete')),
'trash',
'danger show-modal',
psm_get_lang('log', 'delete_title'),
'delete'
);
}
$log_types = array('status', 'email', 'sms', 'pushover', 'telegram');
@ -80,6 +91,7 @@ class LogController extends AbstractServerController {
$tab_data = array(
'id' => $key,
'label' => psm_get_lang('log', $key),
'has_users' => ($key == 'status') ? false : true,
'no_logs' => ($log_count == 0) ? true : false,
'tab_active' => ($key == 'status') ? 'active' : '',
@ -87,10 +99,9 @@ class LogController extends AbstractServerController {
for ($x = 0; $x < $log_count; $x++) {
$record = &$records[$x];
$record['class'] = ($x & 1) ? 'odd' : 'even';
$record['users'] = '';
$record['server'] = $record['label'];
$record['type_icon'] = ($record['server_type'] == 'website') ? 'icon-globe' : 'icon-cog';
$record['type_icon'] = ($record['server_type'] == 'website') ? 'globe-americas' : 'cogs';
$record['type_title'] = psm_get_lang('servers', 'type_'.$record['server_type']);
$ip = '('.$record['ip'];
if (!empty($record['port']) && (($record['server_type'] != 'website') || ($record['port'] != 80))) {
@ -113,10 +124,6 @@ class LogController extends AbstractServerController {
}
$tab_data['entries'] = $records;
$tpl_data['tabs'][] = $tab_data;
$tpl_data['url_delete'] = psm_build_url(array(
'mod' => 'server_log',
'action' => 'delete',
));
}
return $this->twig->render('module/server/log.tpl.html', $tpl_data);
}

View File

@ -77,7 +77,9 @@ class ServerController extends AbstractServerController {
'add_new',
psm_get_lang('system', 'add_new'),
psm_build_url(array('mod' => 'server', 'action' => 'edit')),
'plus icon-white', 'success'
'plus',
'success',
psm_get_lang('system', 'add_new')
);
}
@ -85,7 +87,9 @@ class ServerController extends AbstractServerController {
'update',
psm_get_lang('menu', 'server_update'),
psm_build_url(array('mod' => 'server_update')),
'refresh'
'sync-alt',
'primary',
psm_get_lang('menu', 'server_update')
);
$icons = array(
@ -99,32 +103,14 @@ class ServerController extends AbstractServerController {
$server_count = count($servers);
for ($x = 0; $x < $server_count; $x++) {
$servers[$x]['class'] = ($x & 1) ? 'odd' : 'even';
if ($servers[$x]['type'] == 'website') {
$servers[$x]['type_icon'] = 'icon-globe';
// add link to label
$ip = $servers[$x]['ip'];
if (!empty($servers[$x]['port']) && ($servers[$x]['port'] != 80)) {
$ip .= ' : '.$servers[$x]['port'];
}
$servers[$x]['ip'] = '<a href="'.$servers[$x]['ip'].'" target="_blank">'.$ip.'</a>';
$servers[$x]['ip_short'] = $ip;
} else {
$servers[$x]['type_icon'] = 'icon-cog';
$servers[$x]['ip_short'] = $servers[$x]['ip'].' : '.$servers[$x]['port'];
$servers[$x]['ip'] = '<a href="'.$servers[$x]['ip'].'" target="_blank" rel="noopener">'.$ip.'</a>';
}
if (($servers[$x]['active'] == 'yes')) {
$servers[$x]['active_icon'] = 'icon-eye-open';
$servers[$x]['active_title'] = psm_get_lang('servers', 'monitoring');
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');
}
@ -178,7 +164,11 @@ class ServerController extends AbstractServerController {
$user_idc_selected = $this->getServerUsers($this->server_id);
foreach ($tpl_data['users'] as &$user) {
if (in_array($user['user_id'], $user_idc_selected)) {
$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"';
}
}
@ -199,7 +189,6 @@ class ServerController extends AbstractServerController {
'edit_value_request_method' => $edit_server['request_method'],
'edit_value_post_field' => $edit_server['post_field'],
'edit_value_timeout' => $edit_server['timeout'],
'default_value_timeout' => PSM_CURL_TIMEOUT,
'edit_value_pattern' => $edit_server['pattern'],
'edit_pattern_selected_'.$edit_server['pattern_online'] => 'selected="selected"',
'edit_redirect_check_selected_'.$edit_server['redirect_check'] => 'selected="selected"',
@ -210,11 +199,11 @@ class ServerController extends AbstractServerController {
'edit_website_username' => $edit_server['website_username'],
'edit_website_password' => empty($edit_server['website_password']) ? '' : sha1($edit_server['website_password']),
'edit_type_selected_'.$edit_server['type'] => 'selected="selected"',
'edit_active_selected_'.$edit_server['active'] => 'selected="selected"',
'edit_email_selected_'.$edit_server['email'] => 'selected="selected"',
'edit_sms_selected_'.$edit_server['sms'] => 'selected="selected"',
'edit_pushover_selected_'.$edit_server['pushover'] => 'selected="selected"',
'edit_telegram_selected_'.$edit_server['telegram'] => 'selected="selected"',
'edit_active_selected' => $edit_server['active'],
'edit_email_selected' => $edit_server['email'],
'edit_sms_selected' => $edit_server['sms'],
'edit_pushover_selected' => $edit_server['pushover'],
'edit_telegram_selected' => $edit_server['telegram'],
));
}
@ -222,7 +211,6 @@ class ServerController extends AbstractServerController {
foreach ($notifications as $notification) {
if (psm_get_conf($notification.'_status') == 0) {
$tpl_data['warning_'.$notification] = true;
$tpl_data['control_class_'.$notification] = 'warning';
$tpl_data['label_warning_'.$notification] = psm_get_lang(
'servers', 'warning_notifications_disabled_'.$notification
);
@ -277,7 +265,6 @@ class ServerController extends AbstractServerController {
'allow_http_status' => psm_POST('allow_http_status', ''),
'header_name' => psm_POST('header_name', ''),
'header_value' => psm_POST('header_value', ''),
'rtime' => psm_POST('rtime', '0.0000000'),
'warning_threshold' => intval(psm_POST('warning_threshold', 0)),
'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no',
'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no',
@ -421,6 +408,20 @@ class ServerController extends AbstractServerController {
$history = new \psm\Util\Server\HistoryGraph($this->db, $this->twig);
$tpl_data['html_history'] = $history->createHTML($this->server_id);
$sidebar = new \psm\Util\Module\Sidebar($this->twig);
$this->setSidebar($sidebar);
// check which module the user came from, and add a link accordingly
$back_to = isset($_GET['back_to']) && $_GET['back_to'] == 'server_status' ? $_GET['back_to'] : 'server';
$sidebar->addButton(
'go_back',
psm_get_lang('system', 'go_back'),
psm_build_url(array('mod' => $back_to)),
'angle-left',
'link',
psm_get_lang('system', 'go_back')
);
// add edit/delete buttons for admins
if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) {
$tpl_data['has_admin_actions'] = true;
@ -431,6 +432,15 @@ class ServerController extends AbstractServerController {
$modal->setTitle(psm_get_lang('servers', 'delete_title'));
$modal->setMessage(psm_get_lang('servers', 'delete_message'));
$modal->setOKButtonLabel(psm_get_lang('system', 'delete'));
$sidebar->addButton(
'edit',
psm_get_lang('system', 'edit'),
psm_build_url(array('mod' => 'server', 'action' => 'edit', 'id' => $this->server_id, 'back_to' => 'view')),
'edit',
'primary',
psm_get_lang('system', 'edit')
);
}
// add all available servers to the menu
@ -443,19 +453,6 @@ class ServerController extends AbstractServerController {
'label' => $server_available['label'],
);
}
$sidebar = new \psm\Util\Module\Sidebar($this->twig);
$this->setSidebar($sidebar);
// check which module the user came from, and add a link accordingly
$back_to = isset($_GET['back_to']) && $_GET['back_to'] == 'server_status' ? $_GET['back_to'] : 'server';
$sidebar->addButton(
'go_back',
psm_get_lang('system', 'go_back'),
psm_build_url(array('mod' => $back_to)),
'th-list'
);
return $this->twig->render('module/server/server/view.tpl.html', $tpl_data);
}
@ -467,12 +464,14 @@ class ServerController extends AbstractServerController {
'label_timeout' => psm_get_lang('servers', 'timeout'),
'label_timeout_description' => psm_get_lang('servers', 'timeout_description'),
'label_authentication_settings' => psm_get_lang('servers', 'authentication_settings'),
'label_optional' => psm_get_lang('servers', 'optional'),
'label_website_username' => psm_get_lang('servers', 'website_username'),
'label_website_username_description' => psm_get_lang('servers', 'website_username_description'),
'label_website_password' => psm_get_lang('servers', 'website_password'),
'label_website_password_description' => psm_get_lang('servers', 'website_password_description'),
'label_fieldset_monitoring' => psm_get_lang('servers', 'fieldset_monitoring'),
'label_fieldset_permissions' => psm_get_lang('servers', 'fieldset_permissions'),
'label_permissions' => psm_get_lang('servers', 'permissions'),
'label_port' => psm_get_lang('servers', 'port'),
'label_custom_port' => psm_get_lang('servers', 'custom_port'),
'label_popular_ports' => psm_get_lang('servers', 'popular_ports'),
@ -495,7 +494,8 @@ class ServerController extends AbstractServerController {
'label_redirect_check_description' => psm_get_lang('servers', 'redirect_check_description'),
'label_allow_http_status' => psm_get_lang('servers', 'allow_http_status'),
'label_allow_http_status_description' => psm_get_lang('servers', 'allow_http_status_description'),
'label_header' => psm_get_lang('servers', 'header'),
'label_header_name' => psm_get_lang('servers', 'header_name'),
'label_header_value' => psm_get_lang('servers', 'header_value'),
'label_header_name_description' => psm_get_lang('servers', 'header_name_description'),
'label_header_value_description' => psm_get_lang('servers', 'header_value_description'),
'label_last_check' => psm_get_lang('servers', 'last_check'),
@ -510,8 +510,10 @@ 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_pushover' => psm_get_lang('servers', 'pushover'),
'label_send_pushover' => psm_get_lang('servers', 'send_pushover'),
'label_telegram' => psm_get_lang('servers', 'telegram'),
'label_pushover' => psm_get_lang('servers', 'pushover'),
'label_send_telegram' => psm_get_lang('servers', 'send_telegram'),
'label_users' => psm_get_lang('servers', 'users'),
'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'),
'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'),
@ -520,14 +522,19 @@ class ServerController extends AbstractServerController {
'label_go_back' => psm_get_lang('system', 'go_back'),
'label_edit' => psm_get_lang('system', 'edit'),
'label_delete' => psm_get_lang('system', 'delete'),
'label_view' => psm_get_lang('system', 'view'),
'label_yes' => psm_get_lang('system', 'yes'),
'label_no' => psm_get_lang('system', 'no'),
'label_add_new' => psm_get_lang('system', 'add_new'),
'label_advanced' => psm_get_lang('system', 'advanced'),
'label_online' => psm_get_lang('system', 'online'),
'label_offline' => psm_get_lang('system', 'offline'),
'label_seconds' => psm_get_lang('config', 'seconds'),
'label_online' => psm_get_lang('servers', 'online'),
'label_offline' => psm_get_lang('servers', 'offline'),
'label_ok' => psm_get_lang('system', 'ok'),
'label_bad' => psm_get_lang('system', 'bad'),
'default_value_timeout' => PSM_CURL_TIMEOUT,
'label_settings' => psm_get_lang('system', 'settings'),
'label_output' => psm_get_lang('servers', 'output'),
'label_search' => psm_get_lang('system', 'search'),
);
}

View File

@ -53,9 +53,12 @@ class StatusController extends AbstractServerController {
// add header accessories
$layout = $this->getUser()->getUserPref('status_layout', 0);
$layout_data = array(
'label_none' => psm_get_lang('system', 'none'),
'label_last_check' => psm_get_lang('servers', 'last_check'),
'label_last_online' => psm_get_lang('servers', 'last_online'),
'label_last_offline' => psm_get_lang('servers', 'last_offline'),
'label_online' => psm_get_lang('servers', 'online'),
'label_offline' => psm_get_lang('servers', 'offline'),
'label_rtime' => psm_get_lang('servers', 'latency'),
'block_layout_active' => ($layout == 0) ? 'active' : '',
'list_layout_active' => ($layout != 0) ? 'active' : '',

View File

@ -35,7 +35,7 @@ class ProfileController extends AbstractController {
* Editable fields for the profile
* @var array $profile_fields
*/
protected $profile_fields = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'telegram_id', 'email');
protected $profile_fields = array('name', 'user_name', 'email', 'mobile', 'pushover_key', 'pushover_device', 'telegram_id');
function __construct(Database $db, \Twig_Environment $twig) {
parent::__construct($db, $twig);
@ -54,13 +54,14 @@ class ProfileController extends AbstractController {
$this->twig->addGlobal('subtitle', psm_get_lang('users', 'profile'));
$user = $this->getUser()->getUser(null, true);
$modal = new \psm\Util\Module\Modal($this->twig, 'activate'.ucfirst('telegram'), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL);
$modal = new \psm\Util\Module\Modal($this->twig, 'activate' . ucfirst('telegram'), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL);
$this->addModal($modal);
$modal->setTitle(psm_get_lang('users', 'activate_telegram'));
$modal->setMessage(psm_get_lang('users', 'activate_telegram_description'));
$modal->setOKButtonLabel(psm_get_lang('system', 'activate'));
$tpl_data = array(
'label_general' => psm_get_lang('config', 'general'),
'label_name' => psm_get_lang('users', 'name'),
'label_user_name' => psm_get_lang('users', 'user_name'),
'label_password' => psm_get_lang('users', 'password'),
@ -85,7 +86,7 @@ class ProfileController extends AbstractController {
'mod' => 'user_profile',
'action' => 'save',
)),
'level' => psm_get_lang('users', 'level_'.$user->level),
'level' => psm_get_lang('users', 'level_' . $user->level),
'placeholder_password' => psm_get_lang('users', 'password_leave_blank'),
);
foreach ($this->profile_fields as $field) {
@ -127,7 +128,7 @@ class ProfileController extends AbstractController {
$validator->password($clean['password'], $clean['password_repeat']);
}
} catch (\InvalidArgumentException $e) {
$this->addMessage(psm_get_lang('users', 'error_'.$e->getMessage()), 'error');
$this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error');
return $this->executeIndex();
}
if (!empty($clean['password'])) {
@ -136,7 +137,7 @@ class ProfileController extends AbstractController {
unset($clean['password']);
unset($clean['password_repeat']);
$this->db->save(PSM_DB_PREFIX.'users', $clean, array('user_id' => $this->getUser()->getUserId()));
$this->db->save(PSM_DB_PREFIX . 'users', $clean, array('user_id' => $this->getUser()->getUserId()));
$this->container->get('event')->dispatch(
\psm\Module\User\UserEvents::USER_EDIT,
new \psm\Module\User\Event\UserEvent($this->getUser()->getUserId())
@ -161,22 +162,24 @@ class ProfileController extends AbstractController {
if (empty($apiToken)) {
$this->addMessage(psm_get_lang('config', 'telegram_error_notoken'), 'error');
} else {
$result = $telegram->getBotUsername();
if (isset($result['ok']) && $result['ok'] != false) {
$url = "https://t.me/".$result["result"]["username"];
$this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_username_found'), $url), 'success');
} else {
if (isset($result['error_code']) && $result['error_code'] == 401) {
$error = psm_get_lang('users', 'telegram_bot_username_error_token');
} elseif (isset($result['description'])) {
$error = $result['description'];
} else {
$error = 'Unknown';
}
$this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_error'), $error), 'error');
}
return;
}
$result = $telegram->getBotUsername();
if (isset($result['ok']) && $result['ok'] != false) {
$url = "https://t.me/" . $result["result"]["username"];
$this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_username_found'), $url), 'success');
return;
}
if (isset($result['error_code']) && $result['error_code'] == 401) {
$error = psm_get_lang('users', 'telegram_bot_username_error_token');
} elseif (isset($result['description'])) {
$error = $result['description'];
} else {
$error = 'Unknown';
}
$this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_error'), $error), 'error');
}
}

View File

@ -34,7 +34,7 @@ use psm\Service\Database;
* servers to users.
*/
class UserController extends AbstractController {
public $servers;
public $servers = array();
function __construct(Database $db, \Twig_Environment $twig) {
parent::__construct($db, $twig);
@ -71,7 +71,9 @@ class UserController extends AbstractController {
'add_new',
psm_get_lang('system', 'add_new'),
psm_build_url(array('mod' => 'user', 'action' => 'edit')),
'plus icon-white', 'success'
'plus icon-white',
'success',
psm_get_lang('system', 'add_new')
);
$modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER);
@ -342,12 +344,12 @@ class UserController extends AbstractController {
'label_telegram_id_description' => psm_get_lang('users', 'telegram_chat_id_description'),
'label_email' => psm_get_lang('users', 'email'),
'label_servers' => psm_get_lang('menu', 'server'),
'label_action' => psm_get_lang('system', 'action'),
'label_save' => psm_get_lang('system', 'save'),
'label_go_back' => psm_get_lang('system', 'go_back'),
'label_edit' => psm_get_lang('system', 'edit'),
'label_delete' => psm_get_lang('system', 'delete'),
'label_add_new' => psm_get_lang('system', 'add_new'),
'label_search' => psm_get_lang('system', 'search'),
);
}

View File

@ -230,6 +230,7 @@ class Router {
);
$twig->addGlobal('direction_current', psm_get_lang('locale_dir'));
$twig->addGlobal('language_current', psm_get_lang('locale_tag'));
$twig->addGlobal('language', psm_get_lang('locale')[1]);
return $twig;
}

View File

@ -111,20 +111,19 @@ class Sidebar implements SidebarInterface {
* @param boolean $url_is_onclick if you want onclick rather than url, change this to true
* @return \psm\Util\Module\Sidebar
*/
public function addButton($id, $label, $url, $icon = null, $btn_class = null, $url_is_onclick = false) {
public function addButton($id, $label, $url, $icon = null, $btn_class = 'link', $title = '', $modal_id = null) {
if (!isset($this->items['button'])) {
$this->items['button'] = array();
}
if (!$url_is_onclick) {
$url = "psm_goTo('".$url."');";
}
$this->items['button'][$id] = array(
'id' => $id,
'label' => $label,
'onclick' => str_replace('"', '\"', $url),
'url' => str_replace('"', '\"', $url),
'icon' => $icon,
'btn_class'=> $btn_class,
'title'=> $title,
'modal_id'=> $modal_id
);
return $this;
}

View File

@ -82,21 +82,14 @@ class HistoryGraph {
continue;
}
$graph['info'][] = array(
'label' => psm_get_lang('servers', $field),
'label' => psm_get_lang('servers', $field),
'value' => sprintf($format, $graph[$field]),
);
}
}
$tpl_data = array(
'graphs' => $graphs,
'label_server' => psm_get_lang('servers', 'server'),
'day_format' => psm_get_lang('servers', 'chart_day_format'),
'long_date_format' => psm_get_lang('servers', 'chart_long_date_format'),
'short_date_format' => psm_get_lang('servers', 'chart_short_date_format'),
'short_time_format' => psm_get_lang('servers', 'chart_short_time_format'),
);
return $this->twig->render('module/server/history.tpl.html', $tpl_data);
}
@ -108,24 +101,27 @@ class HistoryGraph {
* @return array
*/
public function generateGraphUptime($server_id, $start_time, $end_time) {
$lines = array(
'latency' => array(),
);
$cb_if_up = function($uptime_record) {
return ($uptime_record['status'] == 1);
};
$hour = new \DateTime('-1 hour');
$day = new \DateTime('-1 day');
$week = new \DateTime('-1 week');
$records = $this->getRecords('uptime', $server_id, $start_time, $end_time);
$data = $this->generateGraphLines($records, $lines, $cb_if_up, 'latency', $start_time, $end_time, true);
$data = $this->generateGraphLines($records, $lines, 'latency', $hour, $end_time, true);
$data['title'] = psm_get_lang('servers', 'chart_last_week');
$data['plotmode'] = 'hour';
$data['id'] = 'history_short';
$data['unit'] = 'minute';
$data['buttons'] = array();
$data['buttons'][] = array('mode' => 'hour', 'label' => psm_get_lang('servers', 'hour'), 'class_active' => 'btn-info');
$data['buttons'][] = array('mode' => 'day', 'label' => psm_get_lang('servers', 'day'));
$data['buttons'][] = array('mode' => 'week', 'label' => psm_get_lang('servers', 'week'));
// make sure to add chart id after buttons so its added to those tmeplates as well
$data['chart_id'] = $server_id.'_uptime';
$data['button_name'] = 'timeframe_short';
$data['buttons'][] = array('unit' => 'minute', 'time' => $hour->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'hour'), 'class_active' => 'active');
$data['buttons'][] = array('unit' => 'hour', 'time' => $day->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'day'));
$data['buttons'][] = array('unit' => 'day', 'time' => $week->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'week'));
return $data;
}
@ -139,28 +135,27 @@ class HistoryGraph {
*/
public function generateGraphHistory($server_id, $start_time, $end_time) {
$lines = array(
'latency_min' => array(),
'latency_avg' => array(),
'latency_max' => array(),
'latency_min' => array(),
);
$server = $this->db->selectRow(PSM_DB_PREFIX.'servers', array('server_id' => $server_id), array('warning_threshold'));
$cb_if_up = function($uptime_record) use($server) {
return ($uptime_record['checks_failed'] < $server['warning_threshold']);
};
$records = $this->getRecords('history', $server_id, $start_time, $end_time);
$week = new \DateTime('-2 week 0:0:0');
$month = new \DateTime('-1 month -1 week 0:0:0');
$year = new \DateTime('-1 year -1 week 0:0:0');
$records = $this->getRecords('history', $server_id, $month, $end_time);
// dont add uptime for now because we have no way to calculate accurate uptimes for archived records
$data = $this->generateGraphLines($records, $lines, $cb_if_up, 'latency_avg', $start_time, $end_time, false);
$data = $this->generateGraphLines($records, $lines, 'latency_avg', $start_time, $end_time, false);
$data['title'] = psm_get_lang('servers', 'chart_history');
$data['plotmode'] = 'month';
$data['id'] = 'history_long';
$data['unit'] = 'week';
$data['buttons'] = array();
$data['buttons'][] = array('mode' => 'week2', 'label' => psm_get_lang('servers', 'week'));
$data['buttons'][] = array('mode' => 'month', 'label' => psm_get_lang('servers', 'month'), 'class_active' => 'btn-info');
$data['buttons'][] = array('mode' => 'year', 'label' => psm_get_lang('servers', 'year'));
// make sure to add chart id after buttons so its added to those tmeplates as well
$data['chart_id'] = $server_id.'_history';
$data['button_name'] = 'timeframe_long';
$data['buttons'][] = array('unit' => 'day', 'time' => $week->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'week'));
$data['buttons'][] = array('unit' => 'week', 'time' => $month->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'month'), 'class_active' => 'active');
$data['buttons'][] = array('unit' => 'month', 'time' => $year->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'year'));
return $data;
}
@ -201,73 +196,99 @@ class HistoryGraph {
* @param boolean $add_uptime add uptime calculation?
* @return array
*/
protected function generateGraphLines($records, $lines, $cb_if_up, $latency_avg_key, $start_time, $end_time, $add_uptime = false) {
protected function generateGraphLines($records, $lines, $latency_avg_key, $start_time, $end_time, $add_uptime = false) {
$now = new \DateTime();
$data = array();
// PLEASE NOTE: all times are in microseconds! because of javascript.
$last_date = 0;
$latency_avg = 0;
$series = array();
// number of microseconds of downtime
$time_down = 0;
$down = array();
$downtime = array();
$prev_down = false;
$prev_up = array();
$prev_up['status'] = false;
$prev_up['value'] = 0.0;
$line_type = 'unknown';
// Create the list of points and server down zones
foreach ($records as $uptime) {
$time = strtotime($uptime['date']) * 1000;
foreach ($records as $record) {
$time = strtotime($record['date']);
// use the first line to calculate average latency
$latency_avg += (float) $uptime[$latency_avg_key];
$latency_avg += (float) $record[$latency_avg_key];
if ($cb_if_up($uptime)) {
// The server is up
foreach ($lines as $key => $value) {
// add the value for each of the different lines
if (isset($uptime[$key])) {
$lines[$key][] = '['.number_format($time, 0, '', '').','.round((float) $uptime[$key], 4).']';
foreach ($lines as $key => $value) {
// add the value for each of the different lines
if (isset($record[$key])) {
if (isset($record['status'])){
$line_type = 'short';
// down
if ($record['status'] == 0){
$lines['online'][] = $prev_up['status']
// Previous datapoint was online
? '{ x: '.($time*1000).', y: '.$prev_up['value'].'}'
// Previous datapoint was offline
: '{ x: '.($time*1000).', y: null}';
$lines['offline'][] = '{ x: '.($time*1000).', y:0.1}';
$prev_up['status'] = false;
}
// up
else {
$lines['offline'][] = $prev_up['status']
// Previous datapoint was online
? '{ x: '.($time*1000).', y:null}'
// Previous datapoint was offline
: '{ x: '.($time*1000).', y:0.1}';
$lines['online'][] = '{ x: '.($time*1000).', y: '.round((float) $record[$key], 4).'}';
$prev_up['status'] = true;
$prev_up['value'] = round((float) $record[$key], 4);
}
}
else {
$lines[$key][] = '{ x: \''.$record['date'].'\', y: '.$record[$key].'}';
}
}
if ($last_date) {
// Was down before.
// Record the first and last date as a string in the down array
$down[] = '['.number_format($last_date, 0, '', '').','.number_format($time, 0, '', '').']';
// add the number of microseconds of downtime to counter for %
$time_down += ($time - $last_date);
$last_date = 0;
}
} else {
// The server is down
if (!$last_date) {
$last_date = $time;
}
}
}
if (!$prev_up['status'] && $line_type == 'short') {
// Was down before.
// Record the first and last date as a string in the down array
$lines['offline'][] = '{ x: '.($now->getTimestamp()*1000).', y:0.1}';
// TODO
// add the number of microseconds of downtime to counter for %
//$time_down += ($time - $now->getTimestamp());
}
$lines_merged = array();
$lines_merged = array();
foreach ($lines as $line_key => $line_value) {
if (empty($line_value)) {
continue;
}
$lines_merged[] = '['.implode(',', $line_value).']';
$series[] = "{label: '".psm_get_lang('servers', $line_key)."'}";
$lines_merged[$line_key]['value'] = implode(', ', $line_value);
$lines_merged[$line_key]['name'] = psm_get_lang('servers', $line_key);
}
if ($last_date) {
// TODO
/*if (isset($last_date)) {
// if last_date is still set, the last check was "down" and we are still in down mode
$down[] = '['.number_format($last_date, 0, '', '').',0]';
$time_down += (($end_time->getTimestamp() * 1000) - $last_date);
$downtime[] = '{ x: '.($last_date*1000).', y:0.0}';
$time_down += ($end_time->getTimestamp() - $last_date);
}
if ($add_uptime) {
$data['uptime'] = 100 - (($time_down / ($end_time->getTimestamp() - $start_time->getTimestamp())) / 10);
}
}*/
$data['latency_avg'] = count($records) > 0 ? ($latency_avg / count($records)) : 0;
$data['server_lines'] = sizeof($lines_merged) ? '['.implode(',', $lines_merged).']' : '';
$data['server_down'] = sizeof($down) ? '['.implode(',', $down).']' : '';
$data['series'] = sizeof($series) ? '['.implode(',', $series).']' : '';
$data['end_timestamp'] = number_format($end_time->getTimestamp() * 1000, 0, '', '');
$data['lines'] = sizeof($lines_merged) ? $lines_merged : '';
$data['end_timestamp'] = number_format($end_time->getTimestamp(), 0, '', '')*1000;
$data['start_timestamp'] = number_format($start_time->getTimestamp(), 0, '', '')*1000;
return $data;
}
}

View File

@ -334,7 +334,6 @@ class StatusNotifier {
* @return string|null
*/
protected function createCombiSubject($method, $user_id){
//die(var_dump($GLOBALS['sm_lang_default']['notifications']['combi_'.$method.'_subject']));
$vars = array('DOWN' => $this->combiNotification['count'][$user_id]['off'], 'UP' => $this->combiNotification['count'][$user_id]['on']);
$translation = isset($GLOBALS['sm_lang_default']['notifications']['combi_'.$method.'_subject']) ?
psm_parse_msg(null, $method.'_subject', $vars, true) :

View File

@ -1,79 +1,84 @@
{% block header %}
<!DOCTYPE html>
<!doctype html>
<html lang="{{ language_current }}" dir="{{ direction_current }}" class="{{ direction_current }}">
<head>
<meta charset="utf-8">
<title>{{ title }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, minimum-scale=1">
<meta name="description" content="">
<meta name="robots" content="noindex" />
<meta name="theme-color" content="#424242">
<head>
<meta charset="utf-8">
<title>{{ title }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="PHP Server Monitor - {{ subtitle }}">
<meta name="robots" content="noindex" />
<meta name="theme-color" content="#424242">
<link rel="icon" type="image/x-icon" href="favicon.ico" />
<link rel="icon" type="image/png" href="favicon.png" />
<link rel="apple-touch-icon" href="favicon.png" />
<!-- Le styles -->
<link href="static/plugin/twitter-bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="static/plugin/twitter-bootstrap/css/bootstrap-responsive.min.css" rel="stylesheet">
<link href="static/plugin/bootstrap-multiselect/bootstrap-multiselect.min.css" rel="stylesheet">
<link href="static/css/style.css" rel="stylesheet">
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<link href="static/css/bootstrap.min.css" rel="stylesheet">
<link href="static/plugin/bootstrap-select/dist/css/bootstrap-select.min.css" rel="stylesheet">
<link href="static/css/style.min.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script type="text/javascript" src="static/plugin/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="static/plugin/twitter-bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="static/plugin/bootstrap-multiselect/bootstrap-multiselect.min.js"></script>
<script type="text/javascript" src="static/js/scripts.js"></script>
</head>
{% endblock %}
<body data-spy="scroll" data-target=".subnav" data-offset="50" class="{{ body_class }}">
<!-- navbar -->
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="index.php">{{ title }}</a>
{{ html_menu|raw }}
</div>
</div>
</div>
<!-- /navbar -->
</head>
<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="collapse navbar-collapse" id="navbar">
{{ html_menu|raw }}
</div>
</nav>
{{ html_modal|raw }}
<!-- container -->
<div id="main-container">
<div class="page-header">
<div class="header-label"><h1>{{ subtitle }}</h1></div>
<div class="header-accessories">{{ header_accessories|raw }}</div>
</div>
<div id="main-content">
{{ html_sidebar|raw }}
<div id="page-container">
<div id="flashmessage" class="hide">
{% for msg in messages %}
<div class="alert alert-{{ msg.shortcode }}">
<p class="pull-left span1"><i class="icon-{{ msg.icon }}"></i></p>
<p>{{ msg.message|raw }}</p>
</div>
{% endfor %}
</div>
{{ html_content|raw }}
<main role="main" class="container">
<noscript>
<div class="alert alert-danger" role="alert">
<b>Javascript is disabled!</b> For PHP Server Monitor to work properly enabling javascript is required!
</div>
</noscript>
{% if not user_level %}<h1>{{ subtitle }}</h1>{% endif %}
<div class="container">{{ 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>
{% if add_footer %}
{% block footer %}
<footer class="footer">
<p class="pull-right"><a href="#">{{ label_back_to_top }}</a></p>
<p class="powered"><small>Powered by <a href="http://www.phpservermonitor.org/" target="_blank">PHP Server Monitor {{ version }}</a>.<br/>{{ update_available }}</small></p>
</footer>
{% endblock %}
{% endif %}
</div>
<!-- /container -->
</body>
</html>
{% endfor %}
<div class="container">
<div class="row">{{ html_sidebar|raw }}</div>
<div class="row">{{ html_content|raw }}</div>
</div>
</main>
{% if add_footer %}
{% block footer %}
<footer class="footer">
<div class="container">
<span class="text-muted">
Powered by
<a href="http://www.phpservermonitor.org/" target="_blank" rel="noopener">
PHP Server Monitor {{ version }}.
</a>
{{ update_available }} <a href="#" class="float-right">{{ label_back_to_top }}</a>
</span>
</div>
</footer>
{% endblock %}
{% endif %}
<script src="static/plugin/jquery/jquery-3.3.1.min.js"></script>
<script src="static/plugin/popper.js/popper.min.js"></script>
<script src="static/plugin/bootstrap/js/dist/index.js"></script>
<script src="static/plugin/bootstrap/js/dist/util.js"></script>
<script src="static/plugin/bootstrap/js/dist/tab.js"></script>
<script src="static/plugin/bootstrap/js/dist/dropdown.js"></script>
<script src="static/plugin/bootstrap/js/dist/collapse.js"></script>
<script src="static/plugin/bootstrap/js/dist/button.js"></script>
{% if html_modal|raw %}<script src="static/plugin/bootstrap/js/dist/modal.js"></script>{% endif %}
<script type="text/javascript" src="static/plugin/bootstrap-select/dist/js/bootstrap-select.min.js"></script>
<script type="text/javascript" src="static/plugin/bootstrap-select/dist/js/i18n/defaults-{{ language }}.min.js"></script>
<script defer src="static/plugin/font-awesome/js/solid.min.js"></script>
<script defer src="static/plugin/font-awesome/js/fontawesome.min.js" data-auto-replace-svg="nest"></script>
<script type="text/javascript" src="static/js/scripts.js"></script>
</body>
</html>

View File

@ -1,3 +1,114 @@
{% macro csrf_input() %}
<input type="hidden" name="csrf" value="{{ csrf_token(csrf_key|default('')) }}" />
{% endmacro %}
{% macro input_csrf() %}
<input type="hidden" name="csrf" value="{{ csrf_token(csrf_key|default('')) }}" />
{% endmacro input_csrf %}
{% macro input_checkbox(id, name, label, checked, help, help_label) %}
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="{{ id }}" name="{{ name }}"
{% if help %}aria-describedby="{{ help }}"{% endif %} {{ checked }}>
<label class="custom-control-label" for="{{ id }}">{{ label }}</label>
{% if help %}
<small id="{{ help }}" class="form-text text-muted">{{
help_label|striptags('<a>,<b>,<br>')|raw }}</small>
{% endif %}
</div>
</div>
{% endmacro input_checkbox %}
{% macro input_select(id, name, label, options, current, help, help_label) %}
<div class="form-group">
<label for="{{ id }}">{{ label }}</label>
<select id="{{ id }}" name="{{ name }}" class="custom-select" {% if help %}aria-describedby="{{ help }}"{% endif %}>
{% for option in options %}
<option value="{{ option.value }}" {% if option.value == current %} selected="selected" {% endif %}>
{{ option.label }}
</option>
{% endfor %}
</select>
{% if help %}
<small id="{{ help }}" class="form-text text-muted">{{
help_label|striptags('<a>,<b>,<br>')|raw }}</small>
{% endif %}
</div>
{% endmacro input_select %}
{% macro input_select_multiple(id, name, label, placeholder, options, select_message) %}
<div class="form-group">
<label for="{{ id }}">{{ label }}</label>
<select class="selectpicker" id="{{ id }}" name="{{ name }}" data-select-on-tab="true" data-live-search="true"
data-live-search-placeholder="{{ placeholder }}" data-selected-text-format="count > 3" data-actions-box="true"
data-none-selected-text="{{ select_message }}" multiple>
{% for option in options %}
<option value="{{ option.id }}" {{ option.edit_selected|raw }}> {{ option.label }}</option>
{% endfor %}
</select>
</div>
{% endmacro input_select_multiple %}
{% macro input_select_monitoring(id, name, label, current, label_yes, label_no, warning, warning_label) %}
<div class="form-group form-row">
{% if warning %}
<div class="alert alert-warning col-md-12" role="alert">
<i class="fas fa-exclamation-triangle" title="Warning"></i> {{ warning_label }}
</div>
{% endif %}
<label for="{{ id }}" class="col-form-label col-md-3">{{ label }}</label>
<div class="col-md-9 p-0">
<select id="{{ id }}" name="{{ name }}" class="custom-select">
<option value="yes" {% if current == "yes" %} selected="selected" {% endif %}>{{ label_yes }}</option>
<option value="no" {% if current == "no" %} selected="selected" {% endif %}>{{ label_no }}</option>
</select>
</div>
</div>
{% endmacro %}
{% macro input_field(type, id, class, name, label, value, placeholder, max, help, help_label, side_label, readonly, required, autofocus, autocomplete, disabled) %}
<div class="form-group {% if class %}{{ class }}{% endif %}">
<label for="{{ id }}">{{ label }}</label>
{% if side_label and help %}
<div class="input-group">
{% endif %}
<input type="{{ type }}" class="form-control" id="{{ id }}"
{% if name %}name="{{ name }}"{% endif %}
{% if placeholder != null %}placeholder="{{ placeholder }}"{% endif %}
{% if value != null %}value="{{ value }}"{% endif %}
{% if max != null %}maxlength="{{ max }}"{% endif %}
{% if help %}aria-describedby="{{ help }}"{% endif %}
{% if readonly %}readonly onfocus="this.removeAttribute('readonly');"{% endif %}
{% if required %}required{% endif %}
{% if disabled %}disabled{% endif %}
{% if autocomplete %}autocomplete="{{ autocomplete }}"{% endif %}
{% if autofocus %}autofocus{% endif %}>
{% if help %}
{% if help_label %}
<small id="{{ help }}" class="form-text text-muted">{{ help_label|striptags('<a>,<b>,<br>')|raw }}</small>
{% endif %}
{% if side_label %}
<div class="input-group-prepend">
<span class="input-group-text" id="{{ help }}">{{ side_label }}</span>
</div>
</div>
{% endif %}
{% endif %}
</div>
{% endmacro input_field %}
{% macro input_hidden(name, value) %}
<input type="hidden" name="{{ name }}" value="{{ value }}">
{% endmacro input_hidden %}
{% macro button_test(data_modal_id, label) %}
<button class="btn btn-primary show-modal" data-toggle="modal" data-modal-id="{{ data_modal_id }}">{{ label }}</button>
{% endmacro button_test %}
{% macro button_save(name, label) %}
<button class="btn btn-success" type="submit" {% if name %}name="{{ name }}"{% endif %}>{{ label }}</button>
{% endmacro button_save %}
{% macro table_search(label) %}
<div class="searchbar mb-3">
<input class="search_input" type="search" name="" maxlength="255" placeholder="{{ label }}..." aria-label="{{ label }}">
<a href="#" class="search_icon"><i class="fas fa-search"></i><p>0</p></a>
</div>
{% endmacro table_search %}

View File

@ -1,22 +1,24 @@
<div class="nav-collapse">
<ul class="nav">
{% for item in menu %}
<li class="{{ item.active }}"><a href="{{ item.url|raw }}">{{ item.label }}</a></li>
{% endfor %}
<li id="nav_option_help">
<a href="http://www.phpservermonitor.org/support" target="_blank" rel="noopener">{{ label_help }}</a>
</li>
</ul>
<ul class="nav pull-right">
<li class="dropdown visible-desktop">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ label_usermenu }} <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="{{ url_profile|raw }}"><i class="icon-cog"></i>&nbsp;{{ label_profile }}</a></li>
<li><a href="{{ url_logout|raw }}"><i class="icon-off"></i>&nbsp;{{ label_logout }}</a></li>
</ul>
<ul class="navbar-nav mr-auto">
{% for item in menu %}
<li class="nav-item {{ item.active }}">
<a class="nav-link" href="{{ item.url|raw }}">{{ item.label }}{% if item.active %}<span class="sr-only"> ({{ label_current }})</span>{% endif %}</a>
</li>
<li class="hidden-desktop divider"></li>
<li class="hidden-desktop"><a href="{{ url_profile|raw }}">{{ label_profile }}</a></li>
<li class="hidden-desktop"><a href="{{ url_logout|raw }}">{{ label_logout }}</a></li>
</ul>
</div>
{% endfor %}
</ul>
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ label_usermenu }}
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ url_profile|raw }}">{{ label_profile }} </a>
<a class="dropdown-item" href="{{ url_logout|raw }}">{{ label_logout }} </a>
</div>
</li>
<!--
<li class="nav-item">
<i class="text-white fas fa-universal-access fa-lg nav-link"></i>
</li>
-->
</ul>

View File

@ -1,326 +1,157 @@
{% import 'main/macros.tpl.html' as macro %}
<form class="form-horizontal" name="edit_config" action="index.php?mod=config&amp;action=save" id="edit_config" method="post">
<ul class="nav nav-tabs">
<li class="{{ general_active }}"><a href="#config-general" data-toggle="tab">{{ label_general }}</a></li>
<li class="{{ email_active }}"><a href="#config-email" data-toggle="tab">{{ label_tab_email }}</a></li>
<li class="{{ sms_active }}"><a href="#config-sms" data-toggle="tab">{{ label_tab_sms }}</a></li>
<li class="{{ pushover_active }}"><a href="#config-pushover" data-toggle="tab">{{ label_tab_pushover }}</a></li>
<li class="{{ telegram_active }}"><a href="#config-telegram" data-toggle="tab">{{ label_tab_telegram }}</a></li>
<form name="edit_config" class="col-md-6 pl-0 pr-0" action="index.php?mod=config&action=save" id="edit_config" method="post">
<!-- Nav tabs -->
<ul class="nav nav-tabs" id="config_tab" role="tablist">
<li class="nav-item">
<a class="nav-link {{ general_active }}" id="config-general-tab" data-toggle="tab" href="#config-general"
role="tab" aria-controls="config-general" aria-selected="{% if general_active %}true{% else %}false{% endif %}">{{
label_general }}</a>
</li>
<li class="nav-item">
<a class="nav-link {{ email_active }}" id="config-email-tab" data-toggle="tab" href="#config-email" role="tab"
aria-controls="config-email" aria-selected="{% if email_active %}true{% else %}false{% endif %}">{{
label_tab_email }}</a>
</li>
<li class="nav-item">
<a class="nav-link {{ sms_active }}" id="config-sms-tab" data-toggle="tab" href="#config-sms" role="tab"
aria-controls="config-sms" aria-selected="{% if sms_active %}true{% else %}false{% endif %}">{{
label_tab_sms }}</a>
</li>
<li class="nav-item">
<a class="nav-link {{ pushover_active }}" id="config-pushover-tab" data-toggle="tab" href="#config-pushover"
role="tab" aria-controls="config-pushover" aria-selected="{% if pushover_active %}true{% else %}false{% endif %}">{{
label_tab_pushover }}</a>
</li>
<li class="nav-item">
<a class="nav-link {{ telegram_active }}" id="config-telegram-tab" data-toggle="tab" href="#config-telegram"
role="tab" aria-controls="config-telegram" aria-selected="{% if telegram_active %}true{% else %}false{% endif %}">{{
label_tab_telegram }}</a>
</li>
</ul>
<div class="tab-content well">
<div id="config-general" class="tab-pane {{ general_active }}">
<!-- Tab panes -->
<div class="tab-content">
<div class="tab-pane {{ general_active }}" id="config-general" role="tabpanel" aria-labelledby="config-general-tab">
<!-- General settings -->
<fieldset>
<legend>{{ label_general }}</legend>
<div class="control-group">
<label class="control-label" for="language">{{ label_language }}</label>
<div class="controls">
<select id="language" name="language">
{% for language in languages %}
<option value="{{ language.value }}" {% if language.value == language_current %} selected="selected" {% endif %}>{{
language.label }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="show_update"><input type="checkbox" id="show_update" name="show_update[]"
{{ show_update_checked|raw }} /> {{ label_show_update }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="auto_refresh_servers">{{ label_auto_refresh }}</label>
<div class="controls">
<input type="text" class="input-mini" id="auto_refresh_servers" name="auto_refresh_servers" value="{{ auto_refresh_servers }}"
maxlength="10" data-toggle="tooltip" title="{{ label_auto_refresh_servers }}" />&nbsp;{{
label_seconds }}
</div>
</div>
<div class="control-group">
<label class="control-label" for="password_encrypt_key">
{{ label_password_encrypt_key }}
</label>
<div class="controls">
<input type="text" class="input-xxlarge" id="password_encrypt_key" name="password_encrypt_key" value="{{ password_encrypt_key }}"
maxlength="40" data-toggle="tooltip" title="{{ label_password_encrypt_key_note }}" />
</div>
</div>
<!-- Update check -->
{{ macro.input_checkbox("show_update", "show_update[]", label_show_update, show_update_checked) }}
<!-- Language -->
{{ macro.input_select("language", "language", label_language, languages, language_current) }}
<!-- Auto refresh -->
{{ macro.input_field("text", "auto_refresh", null, "auto_refresh", label_auto_refresh, auto_refresh, "0", "10", "auto_refresh_help", null, label_seconds) }}
<!-- 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) }}
</fieldset>
<!-- Notification settings -->
<fieldset>
<legend>{{ label_settings_notification }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="combine_notifications" name="combine_notifications[]" {{ combine_notifications_checked|raw }} data-toggle="tooltip" /> {{ label_combine_notifications }}</label>
<p class="help-block">{{ label_combine_notifications_description }}</p>
</div>
</div>
<div class="control-group">
<label class="control-label" for="alert_type">{{ label_alert_type }}</label>
<div class="controls">
<select id="alert_type" name="alert_type">
<option value="status" {{ alert_type_selected_status|raw }}>{{ label_alert_type_status }}</option>
<option value="offline" {{ alert_type_selected_offline|raw }}>{{ label_alert_type_offline }}</option>
<option value="always" {{ alert_type_selected_always|raw }}>{{ label_alert_type_always }}</option>
</select>
<p class="help-block">{{ label_alert_type_description|raw }}</p>
</div>
</div>
<!-- Combine notifications -->
{{ macro.input_checkbox("combine_notifications", "combine_notifications[]", label_combine_notifications, combine_notifications_checked, "combine_notifications_help", label_combine_notifications_description) }}
<!-- Alert type -->
{{ macro.input_select("alert_type", "alert_type", label_alert_type, alert_type, alert_type_selected, "alert_type_help", label_alert_type_description) }}
</fieldset>
<!-- Log settings -->
<fieldset>
<legend>{{ label_settings_log }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="log_status" name="log_status[]" {{ log_status_checked|raw
}} data-toggle="tooltip" title="{{ label_log_status_description }}" /> {{ label_log_status }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="log_retention_period">{{ label_log_retention_period }}</label>
<div class="controls">
<input type="text" class="input-mini" id="log_retention_period" name="log_retention_period" value="{{ log_retention_period }}"
data-toggle="tooltip" title="{{ label_log_retention_period_description }}" />&nbsp;{{
label_log_retention_days }}
</div>
</div>
<!-- log_enabled -->
{{ macro.input_checkbox("log_status", "log_status[]", label_log_status, log_status_checked, "log_status_help", label_log_status_description ) }}
<!-- log retention period -->
{{ macro.input_field("text", "log_retention_period", null, "log_retention_period", label_log_retention_period, log_retention_period, "0", "3", "log_retention_period_help", null, label_days) }}
</fieldset>
<!-- Proxy settings -->
<fieldset>
<legend>{{ label_settings_proxy }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="proxy"><input type="checkbox" id="proxy" name="proxy[]" {{ proxy_checked|raw
}} />{{ label_proxy }}</label>
<p class="help-block">{{ label_alert_proxy|raw }}</p>
</div>
</div>
<div class="control-group">
<label class="control-label" for="proxy_url">{{ label_proxy_url }}</label>
<div class="controls">
<input type="text" id="proxy_url" name="proxy_url" value="{{ proxy_url }}" maxlength="100" placeholder="{{ label_proxy_url }}"
/>
<p class="help-block">{{ label_alert_proxy_url|raw }}</p>
</div>
</div>
<div class="control-group">
<label class="control-label" for="proxy_user">{{ label_proxy_user }}</label>
<div class="controls">
<input type="text" id="proxy_user" name="proxy_user" value="{{ proxy_user }}" maxlength="100" placeholder="{{ label_proxy_user }}"
/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="proxy_password">{{ label_proxy_password }}</label>
<div class="controls">
<input type="password" id="proxy_password" name="proxy_password" value="{{ proxy_password }}" maxlength="100" placeholder="{{ label_proxy_password }}"
/>
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit" name="general_submit">{{ label_save }}</button>
</div>
<!-- enable proxy -->
{{ macro.input_checkbox("proxy", "proxy[]", label_proxy, proxy_checked, "proxy_help", label_alert_proxy ) }}
<!-- proxy url -->
{{ macro.input_field("text", "proxy_url", null, "proxy_url", label_proxy_url, proxy_url, label_proxy_url, null, "proxy_url_help", label_alert_proxy_url) }}
<!-- proxy user -->
{{ macro.input_field("text", "proxy_user", null, "proxy_user", label_proxy_user, proxy_user, label_proxy_user, null, null, null, null, true) }}
<!-- proxy password -->
{{ macro.input_field("password", "proxy_password", null, "proxy_password", label_proxy_password, proxy_password, label_proxy_password, null, null, null, null, true) }}
{{ macro.button_save("general_submit", label_save) }}
</fieldset>
</div>
<div id="config-email" class="tab-pane {{ email_active }}">
<div class="tab-pane {{ email_active }}" id="config-email" role="tabpanel" aria-labelledby="config-email-tab">
<fieldset>
<legend>{{ label_settings_email }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="email_status"><input type="checkbox" id="email_status" name="email_status[]"
{{ email_status_checked|raw }} /> {{ label_email_status }}</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="log_email" name="log_email[]" {{ log_email_checked|raw
}} /> {{ label_log_email }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_from_name">{{ label_email_from_name }}</label>
<div class="controls">
<input type="text" id="email_from_name" name="email_from_name" value="{{ email_from_name }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_from_email">{{ label_email_from_email }}</label>
<div class="controls">
<input type="text" id="email_from_email" name="email_from_email" value="{{ email_from_email }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="email_smtp"><input type="checkbox" id="email_smtp" name="email_smtp[]"
{{ email_smtp_checked|raw }} />{{ label_email_smtp }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_smtp_host">{{ label_email_smtp_host }}</label>
<div class="controls">
<input type="text" id="email_smtp_host" name="email_smtp_host" value="{{ email_smtp_host }}" maxlength="100" placeholder="{{ label_email_smtp_host }}"
/>
<input type="text" class="input-small" id="email_smtp_port" name="email_smtp_port" value="{{ email_smtp_port }}" maxlength="10"
placeholder="{{ label_email_smtp_port }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_smtp_security">{{ label_email_smtp_security }}</label>
<div class="controls">
<select id="email_smtp_security" name="email_smtp_security">
<option value="" {{ email_smtp_security_selected_|raw }}>{{ label_email_smtp_security_none }}</option>
<option value="ssl" {{ email_smtp_security_selected_ssl|raw }}>SSL</option>
<option value="tls" {{ email_smtp_security_selected_tls|raw }}>TLS</option>
</select>
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_smtp_username">{{ label_email_smtp_username }}</label>
<div class="controls">
<input type="text" id="email_smtp_username" name="email_smtp_username" value="{{ email_smtp_username }}" maxlength="100"
placeholder="{{ label_email_smtp_noauth }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email_smtp_password">{{ label_email_smtp_password }}</label>
<div class="controls">
<input type="password" id="email_smtp_password" name="email_smtp_password" value="{{ email_smtp_password }}" maxlength="100"
placeholder="{{ label_email_smtp_noauth }}" />
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-primary show-modal" data-modal-id="testEmail">{{ label_test }}</button>
<input type="hidden" name="test_email" value="0" />
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit" name="email_submit">{{ label_save }}</button>
</div>
<!-- enable email -->
{{ macro.input_checkbox("email_status", "email_status[]", label_email_status, email_status_checked) }}
<!-- enable email log -->
{{ macro.input_checkbox("log_email", "log_email[]", label_log_email, log_email_checked) }}
<!-- email name -->
{{ macro.input_field("text", "email_from_name", null, "email_from_name", label_email_from_name, email_from_name, label_email_from_name, "255") }}
<!-- email address -->
{{ macro.input_field("email", "email_from_email", null, "email_from_email", label_email_from_email, email_from_email, label_email_from_email, "255") }}
</fieldset>
<fieldset>
<legend>SMTP</legend>
<!-- enable smtp -->
{{ macro.input_checkbox("email_smtp", "email_smtp[]", label_email_smtp, email_smtp_checked) }}
<!-- smtp host -->
{{ macro.input_field("text", "email_smtp_host", null, "email_smtp_host", label_email_smtp_host, email_smtp_host, label_email_smtp_host, "255") }}
<!-- smtp security -->
{{ macro.input_select("email_smtp_security", "email_smtp_security", label_email_smtp_security, email_smtp_security, email_smtp_security_selected) }}
<!-- email user -->
{{ macro.input_field("text", "email_smtp_username", null, "email_smtp_username", label_email_smtp_username, email_smtp_username, label_email_smtp_username, "255") }}
<!-- email password -->
{{ macro.input_field("password", "email_smtp_password", null, "email_smtp_password", label_email_smtp_password, email_smtp_password, label_email_smtp_password, "255", null, null, null, true) }}
{{ macro.button_test("testEmail", label_test) }}
{{ macro.input_hidden("test_email", "0") }}
{{ macro.button_save("email_submit", label_save) }}
</fieldset>
</div>
<div id="config-sms" class="tab-pane {{ sms_active }}">
<div class="tab-pane {{ sms_active }}" id="config-sms" role="tabpanel" aria-labelledby="config-sms-tab">
<fieldset>
<legend>{{ label_settings_sms }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="sms_status"><input type="checkbox" id="sms_status" name="sms_status[]"
{{ sms_status_checked|raw }} /> {{ label_sms_status }}</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="log_sms" name="log_sms[]" {{ log_sms_checked|raw
}} /> {{ label_log_sms }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="sms_gateway">{{ label_sms_gateway }}</label>
<div class="controls">
<select id="sms_gateway" name="sms_gateway">
{% for sms_gateway in sms_gateways %}
<option value="{{ sms_gateway.value }}" {% if sms_gateway.value==sms_gateway_current %} selected="selected" {% endif %}>{{
sms_gateway.label }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="control-group">
<label class="control-label" for="sms_gateway_username">{{ label_sms_gateway_username }}</label>
<div class="controls">
<input type="text" id="sms_gateway_username" name="sms_gateway_username" value="{{ sms_gateway_username }}" maxlength="255"
/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="sms_gateway_password">{{ label_sms_gateway_password }}</label>
<div class="controls">
<input type="password" id="sms_gateway_password" name="sms_gateway_password" value="{{ sms_gateway_password }}" maxlength="255"
/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="sms_from">{{ label_sms_from }}</label>
<div class="controls">
<input type="text" id="sms_from" name="sms_from" value="{{ sms_from }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-primary show-modal" data-modal-id="testSms">{{ label_test }}</button>
<input type="hidden" name="test_sms" value="0" />
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit" name="sms_submit">{{ label_save }}</button>
</div>
<!-- enable sms -->
{{ macro.input_checkbox("sms_status", "sms_status[]", label_sms_status, sms_status_checked) }}
<!-- enable sms log -->
{{ macro.input_checkbox("log_sms", "log_sms", label_log_sms, log_sms_checked) }}
<!-- sms gateway -->
{{ macro.input_select("sms_gateway", "sms_gateway", label_sms_gateway, sms_gateway, sms_gateway_selected) }}
<!-- sms user -->
{{ macro.input_field("text", "sms_gateway_username", null, "sms_gateway_username", label_sms_gateway_username, sms_gateway_username, label_sms_gateway_username, "255") }}
<!-- sms password / API key-->
{{ macro.input_field("text", "sms_gateway_password", null, "sms_gateway_password", label_sms_gateway_password, sms_gateway_password, label_sms_gateway_password, "255") }}
<!-- sms sender number-->
{{ macro.input_field("text", "sms_from", null, "sms_from", label_sms_from, sms_from, "+31123456789", "255") }}
{{ macro.button_test("testSms", label_test) }}
{{ macro.input_hidden("test_sms", "0") }}
{{ macro.button_save("sms_submit", label_save) }}
</fieldset>
</div>
<div id="config-pushover" class="tab-pane {{ pushover_active }}">
<div class="tab-pane {{ pushover_active }}" id="config-pushover" role="tabpanel" aria-labelledby="config-telegram-tab">
<fieldset>
<legend>{{ label_settings_pushover }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="pushover_status"><input type="checkbox" id="pushover_status" name="pushover_status[]"
{{ pushover_status_checked|raw }} /> {{ label_pushover_status }}</label>
<p class="help-block">{{ label_pushover_description|raw }}</p>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="log_pushover" name="log_pushover[]" {{ log_pushover_checked|raw
}} /> {{ label_log_pushover }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="pushover_api_token">{{ label_pushover_api_token }}</label>
<div class="controls">
<p><button class="btn btn-primary" onclick="window.open('{{ pushover_clone_url }}');return false;">{{
label_pushover_clone_app }}</button></p>
<input type="text" id="pushover_api_token" name="pushover_api_token" value="{{ pushover_api_token }}" maxlength="255" />
<p class="help-block">{{ label_pushover_api_token_description|raw }}</p>
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-primary show-modal" data-modal-id="testPushover">{{ label_test }}</button>
<input type="hidden" name="test_pushover" value="0" />
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit" name="pushover_submit">{{ label_save }}</button>
</div>
<!-- enable pushover -->
{{ macro.input_checkbox("pushover_status", "pushover_status", label_pushover_status, log_pushover_status) }}
<!-- enable pushover log -->
{{ macro.input_checkbox("log_pushover", "log_pushover", label_log_pushover, log_pushover_checked) }}
<!-- pushover key -->
{{ macro.input_field("text", "pushover_api_token", null, "pushover_api_token", label_pushover_api_token, pushover_api_token, label_pushover_api_token, "255", "pushover_api_token_help", label_pushover_api_token_description) }}
{{ macro.button_test("testPushover", label_test) }}
{{ macro.input_hidden("test_pushover", "0") }}
{{ macro.button_save("pushover_submit", label_save) }}
</fieldset>
</div>
<div id="config-telegram" class="tab-pane {{ telegram_active }}">
<div class="tab-pane {{ telegram_active }}" id="config-telegram" role="tabpanel" aria-labelledby="config-pushover-tab">
<fieldset>
<legend>{{ label_settings_telegram }}</legend>
<div class="control-group">
<div class="controls">
<label class="checkbox" for="telegram_status"><input type="checkbox" id="telegram_status" name="telegram_status[]"
{{ telegram_status_checked|raw }} /> {{ label_telegram_status }}</label>
<p class="help-block">{{ label_telegram_description|raw }}</p>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox"><input type="checkbox" id="log_telegram" name="log_telegram[]" {{ log_telegram_checked|raw
}} /> {{ label_log_telegram }}</label>
</div>
</div>
<div class="control-group">
<label class="control-label" for="telegram_api_token">{{ label_telegram_api_token }}</label>
<div class="controls">
<input type="text" id="telegram_api_token" name="telegram_api_token" value="{{ telegram_api_token }}" maxlength="255" />
<p class="help-block">{{ label_telegram_api_token_description|raw }}</p>
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-primary show-modal" data-modal-id="testTelegram">{{ label_test }}</button>
<input type="hidden" name="test_telegram" value="0" />
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit" name="telegram_submit">{{ label_save }}</button>
</div>
<!-- enable telegram -->
{{ macro.input_checkbox("telegram_status", "telegram_status[]", label_telegram_status, telegram_status_checked) }}
<!-- enable telegram log -->
{{ macro.input_checkbox("log_telegram", "log_telegram[]", label_log_telegram, log_telegram_checked) }}
<!-- telegram key -->
{{ macro.input_field("text", "telegram_api_token", null, "telegram_api_token", label_telegram_api_token, telegram_api_token, label_telegram_api_token, "255", "telegram_api_token_help", label_telegram_api_token_description) }}
{{ macro.button_test("testTelegram", label_test) }}
{{ macro.input_hidden("test_telegram", "0") }}
{{ macro.button_save("telegram_submit", label_save) }}
</fieldset>
</div>
</div>
{{ macro.csrf_input() }}
{{ macro.input_csrf() }}
</form>

View File

@ -1,2 +1,3 @@
<h2>{{ label_title }}</h2>
<div class="w-100"></div>
<p>{{ label_description }}</p>

View File

@ -3,73 +3,57 @@
{% import 'main/macros.tpl.html' as macro %}
{% block install %}
<div class="row-fluid">
<div class="span12">{{ block('results') }}</div>
<div class="row">
<div class="col-md-12">{{ block('results') }}</div>
</div>
<div class="row-fluid">
<div class="span6">
<form id="psm_config" class="form-horizontal" action="install.php?action=config" method="post">
{{ macro.csrf_input() }}
<div class="row">
<div class="col-md-6">
<form id="psm_config" action="install.php?action=config" method="post">
{{ macro.input_csrf() }}
<p>Please enter the application url:</p>
<div class="control-group">
<label class="control-label" for="base_url">Application base url</label>
<div class="controls">
<input type="text" id="base_url" name="base_url" value="{{ base_url }}" />
</div>
<div class="form-group">
<label class="col-form-label" for="base_url">Application base url</label>
<input type="text" id="base_url" name="base_url" value="{{ base_url }}" />
</div>
<p>Please enter your database info:</p>
<div class="control-group">
<label class="control-label" for="host">Database host</label>
<div class="controls">
<input type="text" id="host" name="db_host" value="{{ db_host }}" />
</div>
<div class="form-group">
<label class="col-form-label" for="host">Database host</label>
<input type="text" id="host" name="db_host" value="{{ db_host }}" />
</div>
<div class="control-group">
<label class="control-label" for="host">Database port</label>
<div class="controls">
<input type="text" id="port" name="db_port" value="{{ db_port }}" placeholder="3306 most likely, may be empty" />
</div>
<div class="form-group">
<label class="col-form-label" for="host">Database port</label>
<input type="text" id="port" name="db_port" value="{{ db_port }}" placeholder="3306 most likely, may be empty" />
</div>
<div class="control-group">
<label class="control-label" for="name">Database name</label>
<div class="controls">
<input type="text" id="name" name="db_name" value="{{ db_name }}" placeholder="db name" />
</div>
<div class="form-group">
<label class="col-form-label" for="name">Database name</label>
<input type="text" id="name" name="db_name" value="{{ db_name }}" placeholder="db name" />
</div>
<div class="control-group">
<label class="control-label" for="user">Database user</label>
<div class="controls">
<input type="text" id="user" name="db_user" value="{{ db_user }}" placeholder="db user" />
</div>
<div class="form-group">
<label class="col-form-label" for="user">Database user</label>
<input type="text" id="user" name="db_user" value="{{ db_user }}" placeholder="db user" />
</div>
<div class="control-group">
<label class="control-label" for="pass">Database password</label>
<div class="controls">
<input type="password" id="pass" name="db_pass" value="{{ db_pass }}" placeholder="db password" />
</div>
<div class="form-group">
<label class="col-form-label" for="pass">Database password</label>
<input type="password" id="pass" name="db_pass" value="{{ db_pass }}" placeholder="db password" />
</div>
<div class="control-group">
<label class="control-label" for="prefix">Table prefix</label>
<div class="controls">
<input type="text" id="prefix" name="db_prefix" value="{{ db_prefix }}" />
</div>
<div class="form-group">
<label class="col-form-label" for="prefix">Table prefix</label>
<input type="text" id="prefix" name="db_prefix" value="{{ db_prefix }}" />
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn">Save configuration</button>
</div>
<div class="form-group">
<button type="submit" class="btn">Save configuration</button>
</div>
</form>
</div>
{% if include_config_new_copy %}
<div class="span6">
<div class="col-md-6">
<h3>Your config file:</h3>
<div class="alert alert-error">Unable to save your configuration.</div>
<div class="alert alert-danger">Unable to save your configuration.</div>
<p>Your database information is valid, however we are unable to create the configuration file automatically.
Please create a new file in the project directory called "config.php" and copy the information below.</p>
<p>After you have copied the configuration, press the button to continue.</p>
<p class="pull-left"><textarea rows="10">{{ php_config }}</textarea></p>
<p class="offset2"><input type="submit" class="btn btn-primary" value="I have saved the configuration" onclick="location.reload(true);" /></p>
<p class="col-md-offset-2"><input type="submit" class="btn btn-primary" value="I have saved the configuration" onclick="location.reload(true);" /></p>
</div>
{% endif %}
</div>

View File

@ -7,40 +7,35 @@
<p>Next, please set up a new account to access your monitor:</p>
{{ block('results') }}
<p>&nbsp;</p>
<div class="row-fluid">
<div class="span6">
<form id="psm_config" class="form-horizontal" action="install.php?action=install" method="post">
{{ macro.csrf_input() }}
<div class="control-group">
<label class="control-label" for="username">Username</label>
<div class="controls">
<input type="text" id="username" name="username" value="{{ username }}">
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">Password</label>
<div class="controls">
<input type="password" id="password" name="password" value="">
</div>
</div>
<div class="control-group">
<label class="control-label" for="password_repeat">Password repeat</label>
<div class="controls">
<input type="password" id="password_repeat" name="password_repeat" value="">
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">Email</label>
<div class="controls">
<input type="text" id="email" name="email" value="{{ email }}" />
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-primary btn-large">Install</button>
</div>
</div>
</form>
</div>
</div>
<form name="psm_config" class="col-md-6 pl-0 pr-0" action="install.php?action=install" id="psm_config" method="post">
{{ macro.input_csrf() }}
<fieldset>
<legend>Administrator</legend>
<div class="col">
<!-- Username -->
<div class="form-group">
<label for="username">Username</label>
<input type="text" class="form-control" autocomplete="nickname" name="username" id="username" maxlength="255"
required autofocus>
</div>
<!-- Password -->
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password" maxlength="255"
required>
</div>
<!-- Password repeat -->
<div class="form-group">
<label for="password_repeat">Password repeat</label>
<input type="password" class="form-control" name="password_repeat" id="password_repeat" maxlength="255"
required>
</div>
<!-- Email -->
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" autocomplete="email" name="email" id="email" maxlength="255"
required>
</div>
<button class="btn btn-success btn-lg" type="submit">Install</button>
</fieldset>
{% endblock %}

View File

@ -1,8 +1,9 @@
{% extends "module/install/main.tpl.html" %}
{% use "module/install/results.tpl.html" %}
{% block install %}
<p>We have discovered a previous version.</p>
{{ block('results') }}
<p>In the next step we will upgrade your database to the latest version.</p>
<p>&nbsp;</p>
<p><a class="btn btn-primary btn-large" href="install.php?action=install">Upgrade to {{ version }}</a></p>
<p><a class="btn btn-primary btn-lg" href="install.php?action=install">Upgrade to {{ version }}</a></p>
{% endblock %}

View File

@ -8,8 +8,5 @@
It is recommended you fix any errors before continuing.
</p>
{{ block('results') }}
<p>&nbsp;</p>
<p>
<a class="btn btn-primary btn-large" href="install.php?action=config">Let's go</a>
</p>
<a class="btn btn-primary btn-lg" href="install.php?action=config">Let's go</a>
{% endblock %}

View File

@ -1,8 +1,9 @@
<div class="hero-unit">
<div class="install_header">
<p class="pull-left"><a href="http://www.phpservermonitor.org/"><img class="pull-left" src="static/phpservermon.png" alt="" /></a></p>
<h2>&nbsp;PHP Server Monitor</h2>
<p class="clearfix"></p>
</div>
<div class="jumbotron w-100">
<div class="row">
<a href="http://www.phpservermonitor.org/">
<img class="img-responsive" src="static/phpservermon.png" alt="PHPServerMonitor logo" />
</a>
<h2>&nbsp;PHP Server Monitor</h2>
</div>
{% block install %} {% endblock %}
</div>

View File

@ -1,12 +1,13 @@
{% block results %}
{% if messages %}
{% for msg in messages %}
<div>
<p class="pull-left"><span class="label label-{{ msg.shortcode }}">{{ msg.shortcode }}</span></p>
{% autoescape false %}
<p class="offset1">{{ msg.message }}</p>
{% endautoescape %}
</div>
<div class="row">
<div class="col-md-1"><span class="badge badge-{{ msg.class }}">{{ msg.shortcode }}</span></div>
{% autoescape false %}
<div class="col-md-11">{{ msg.message }}</div>
{% endautoescape %}
</div>
{% endfor %}
<div class="w-100 mb-4"></div>
{% endif %}
{% endblock %}

View File

@ -2,19 +2,18 @@
{% use "module/install/results.tpl.html" %}
{% block install %}
<div class="row-fluid">
<div class="span12">{{ block('results') }}</div>
<div class="row">
<div class="col-md-12">{{ block('results') }}</div>
</div>
<div class="row-fluid">
<div class="span12">
<div class="row">
<div class="col-md-12">
<p>&nbsp;</p>
<p>The installation is complete. Please check above if errors have occurred.<br>
If no errors have occurred, you are good to go.<br><br></p>
<p>
<a class="btn btn-primary btn-large" href="index.php">Go to your monitor</a>
<a class="btn btn-large" target="_blank" href="http://www.phpservermonitor.org/">PHP Server Monitor</a>
<a class="btn btn-large" target="_blank" href="http://docs.phpservermonitor.org/">Documentation</a>
</p>
If no errors have occurred, you are good to go.</p>
<div class="w-100 mb-4"></div>
<a class="btn btn-primary btn-lg" href="index.php">Go to your monitor</a>
<a class="btn btn-secondary btn-lg" target="_blank" rel="noopener" href="http://www.phpservermonitor.org/">PHP Server Monitor</a>
<a class="btn btn-secondary btn-lg" target="_blank" rel="noopener" href="http://docs.phpservermonitor.org/">Documentation</a>
</div>
</div>
{% endblock %}

View File

@ -1,55 +1,142 @@
<link href="static/plugin/jqplot/jquery.jqplot.min.css" rel="stylesheet" >
<!--[if lt IE 9]><script type="text/javascript" src="static/plugin/excanvas.js"></script><![endif]-->
<script type="text/javascript" src="static/plugin/jqplot/jquery.jqplot.min.js"></script>
<script type="text/javascript" src="static/plugin/jqplot/jqplot.canvasOverlay.min.js"></script>
<script type="text/javascript" src="static/plugin/jqplot/jqplot.cursor.min.js"></script>
<script type="text/javascript" src="static/plugin/jqplot/jqplot.dateAxisRenderer.min.js"></script>
<script type="text/javascript" src="static/plugin/jqplot/jqplot.highlighter.min.js"></script>
<link href="static/css/history.css" rel="stylesheet" >
<script type="text/javascript">
var day_format = '{{ day_format }}';
var long_date_format = '{{ long_date_format }}';
var short_date_format = '{{ short_date_format }}';
var short_time_format = '{{ short_time_format }}';
</script>
<script type="text/javascript" src="static/js/history.js"></script>
<div id="history-panel">
<script type="text/javascript" src="static/plugin/momentjs/moment.js"></script>
<script type="text/javascript" src="static/plugin/chartjs/chart-2.7.3.min.js"></script>
{% for graph in graphs %}
<div class="chart-row">
<div class="chart-container">
<div class="chart-content">
<div id="chart{{ graph.chart_id }}" class="chart" data-title="{{ graph.title }}" data-plotMode="{{ graph.plotmode }}" data-endTime="{{ graph.end_timestamp }}" data-series="{{ graph.series|raw }}" data-lines="{{ graph.server_lines }}" data-down="{{ graph.server_down }}"></div>
</div>
</div>
<div class="info-container">
<div class="info-content">
<div class="info-dropdown btn-group">
<button class="btn dropdown-toggle" data-toggle="dropdown"><i class="icon-info-sign"></i></button>
<ul class="dropdown-menu">
{% for record in graph.info %}
<li><span>{{ record.label }}: {{ record.value }}</span></li>
{% endfor %}
</ul>
</div>
<div class="server-info">
<ul>
{% for record in graph.info %}
<li><span>{{ record.label }}: {{ record.value }}</span></li>
{% endfor %}
</ul>
</div>
</div>
<div class="chart-selector">
<div class="btn-group">
{% for button in graph.buttons %}
<button class="btn {{ button.class_active }}" data-chartId="{{ graph.chart_id }}" data-chartMode="{{ button.mode }}" >{{ button.label }}</button>
{% endfor %}
</div>
</div>
</div>
<div class="chart-container col-10" style="position: relative; width:60vw">
<canvas id="{{ graph.id }}">Your browser does not support the canvas element.</canvas>
</div>
<div style="clear: both;">&nbsp;</div>
<div class="col-md-2">
<div class="btn-group btn-group-toggle" data-toggle="buttons">
{% for button in graph.buttons %}
<label class="btn btn-secondary {{ button.class_active }}">
<input type="radio" name="{{ graph.button_name }}" value="{{ button.time }}" id="{{ button.unit }}" autocomplete="off" {% if button.class_active %} checked {% endif %}> {{ button.label }}
</label>
{% endfor %}
</div>
</div>
{% if graph.id == 'history_short' %}
<script>
var historyShort = new Chart(document.getElementById("{{ graph.id }}").getContext('2d'), {
type: 'line',
data: {
datasets: [
{
data: [{{ graph.lines.offline.value }}],
label: '{{ graph.lines.offline.name }}',
backgroundColor: '#dc3545',
borderColor: '#dc3545',
borderWidth: 2,
radius: 0,
pointStyle: 'crossRot',
fill: true,
spanGaps: false,
},
{
data: [{{ graph.lines.online.value }}],
label: '{{graph.lines.online.name }}',
fill: false,
spanGaps: false,
backgroundColor: '#28a745',
borderColor: '#28a745',
lineTension: 0,
steppedLine: true
},
]
},
options: {
scales: {
yAxes: [{
ticks: {
min: 0.0
}
}],
xAxes: [{
type: 'time',
time: {
unit: '{{ graph.unit }}',
minUnit: 'hour',
min: {{ graph.start_timestamp }},
max: {{ graph.end_timestamp }},
},
distribution: 'linear',
ticks: {
source: 'auto',
}
}]
}
}
});
</script>
{% elseif graph.id == 'history_long' %}
<script>
var colors = {
/*
ChartJS example colors
red: 'rgb(255, 99, 132)',
orange: 'rgb(255, 159, 64)',
yellow: 'rgb(255, 205, 86)',
green: 'rgb(75, 192, 192)',
blue: 'rgb(54, 162, 235)',
purple: 'rgb(153, 102, 255)',
grey: 'rgb(201, 203, 207)'
*/
latency_min: 'rgb(255, 99, 132)',
latency_avg: 'rgb(54, 162, 235)',
latency_max: 'rgb(255, 205, 86)'
}
var historyLong = new Chart(document.getElementById("{{ graph.id }}").getContext('2d'), {
type: 'line',
data: {
datasets: [
{% for key,line in graph.lines %}
{
data: [{{ line.value|raw }}],
label: '{{ line.name }}',
backgroundColor: colors['{{key}}'],
borderColor: colors['{{key}}'],
},
{% endfor %}
]
},
options: {
animation: {
easing: 'easeInOutExpo',
},
tooltips: {
mode: 'index'
},
scales: {
yAxes: [{
ticks: {
min: 0.0
}
}],
xAxes: [{
type: 'time',
time: {
unit: '{{ graph.unit }}',
minUnit: 'day',
min: {{ graph.start_timestamp }},
max: {{ graph.end_timestamp }},
},
distribution: 'linear',
ticks: {
source: 'auto',
}
}]
}
}
});
</script>
{% else %}
<script>
alert('Graph is missing the \'javascript part\'.');
</script>
{% endif %}
{% endfor %}
</div>
<script>
document.onreadystatechange = function () {
if (document.readyState === 'interactive') {
$.getScript("static/js/history.js");
}
}
</script>

View File

@ -1,67 +1,41 @@
{% if has_admin_actions %}
<a class="btn btn-danger show-modal" href="{{ url_delete|raw }}" title="Delete" data-modal-id="delete" data-modal-param="{{ label }}">
<i class="icon-trash icon-white"></i>&nbsp;{{ label_clear_log }}
</a>
<br><br>
{% endif %}
<div class="tabbable">
<ul class="nav nav-tabs">
<li class="active"><a href="#log_status_content" data-toggle="tab">{{ label_status }}</a></li>
<li><a href="#log_email_content" data-toggle="tab">{{ label_email }}</a></li>
<li><a href="#log_sms_content" data-toggle="tab">{{ label_sms }}</a></li>
<li><a href="#log_pushover_content" data-toggle="tab">{{ label_pushover }}</a></li>
<li><a href="#log_telegram_content" data-toggle="tab">{{ label_telegram }}</a></li>
</ul>
<div class="tab-content well">
{% for tab in tabs %}
<div class="tab-pane {{ tab.tab_active }}" id="log_{{ tab.id }}_content">
<table class="table table-bordered table-striped">
<!-- Nav tabs -->
<ul class="nav nav-tabs" style="width:100%" id="log_tab" role="tablist">
{% for tab in tabs %}
<li class="nav-item">
<a class="nav-link {{ tab.tab_active }}" id="log-{{ tab.id }}-tab" data-toggle="tab" href="#log-{{ tab.id }}" role="tab" aria-controls="log-{{ tab.id }}" aria-selected="{% if tab.tab_active %}true{% else %}false{% endif %}">{{ tab.label }}</a>
</li>
{% endfor %}
</ul>
<div class="tab-content">
{% for tab in tabs %}
<div class="tab-pane {{ tab.tab_active }}" id="log-{{ tab.id }}" role="tabpanel" aria-labelledby="log-{{ tab.id }}-tab">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="hidden-phone">{{ label_server }}</th>
<th class="hidden-phone">{{ label_message }}</th>
<th class="hidden-phone">{{ label_date }}</th>
{% if tab.has_users %} <th class="hidden-phone">{{ label_users }}</th> {% endif %}
<th scope="col">{{ label_server }}</th>
<th scope="col">{{ label_message }}</th>
<th scope="col">{{ label_date }}</th>
{% if tab.has_users %}<th scope="col">{{ label_users }}</th>{% endif %}
</tr>
</thead>
<tbody>
{% for entry in tab.entries %}
<tr class="{{ entry.class }}">
<td>
<div class="table-body">
<div class="table-cell">
<div class="visible-phone pull-right">
&nbsp;{{ entry.datetime_format }}
</div>
<i class="{{ entry.type_icon }}" title="{{ entry.type_title }}"></i> <span class="title">{{ entry.server }}</span> {{ entry.ip }}
</div>
</div>
<div class="visible-phone">
<div class="table-separator"/></div>
<div class="table-body">
<div class="table-cell-details">{{ entry.message|raw }}</div>
</div>
</div>
{% if tab.has_users %}<div class="visible-phone">
<div class="table-separator"/></div>
<div class="table-body">
<div class="table-cell-details">{{ label_users }}: {{ entry.user_list|raw }}</div>
</div>
</div>{% endif %}
</td>
<td class="hidden-phone">{{ entry.message|raw }}</td>
<td class="hidden-phone tight">{{ entry.datetime_format }}</td>
{% if tab.has_users %}<td class="hidden-phone tight">{{ entry.users|raw }}</td>{% endif %}
<tr>
<th scope="row"><i class="fas fa-{{ entry.type_icon }}" title="{{ entry.type_title }}"></i> {{ entry.server }} {{ entry.ip }}</th>
<td>{{ entry.message|raw }}</td>
<td>{{ entry.datetime_format }}</td>
{% if tab.has_users %}<td>{{ entry.user_list|raw }}</td>{% endif %}
</tr>
{% endfor %}
{% if tab.no_logs %}
<tr class="{{ class }}">
<tr>
<td colspan="4" class="cell-center">{{ label_no_logs }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
</div>

View File

@ -1,81 +1,94 @@
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="hidden-phone">&nbsp;</th>
<th class="hidden-phone">{{ label_label }}</th>
<th class="hidden-phone">{{ label_domain }}</th>
<th class="visible-desktop">{{ label_port }}</th>
<th class="visible-desktop">{{ label_type }}</th>
<th class="hidden-phone">{{ label_rtime }}</th>
<th class="hidden-phone">{{ label_last_online }}</th>
<th class="hidden-phone">{{ label_last_offline }}</th>
<th class="hidden-phone">{{ label_monitoring }}</th>
<th class="hidden-phone">{{ label_action }}</th>
</tr>
</thead>
<tbody>
{% for server in servers %}
<tr>
<td class="hidden-phone"><div class="table-cell-title"><span class="label label-status-{{ server.status }}"><a href="{{ server.url_view|raw }}" title="{{ server.error }}">{{ server.status }}</a></span></div></td>
<td class="hidden-phone"><div class="table-cell-title"><a href="{{ server.url_view|raw }}">{{ server.label }}</a></div></td>
<td class="nowrap visible-tablet"><div class="table-cell-title"><i class="{{ server.type_icon }}" title="{{ server.type }}"></i> {{ server.ip_short|raw }}</div></td>
<td class="nowrap visible-desktop"><div class="table-cell-title">{{ server.ip|raw }}</div></td>
<td class="nowrap visible-desktop"><div class="table-cell-title">{{ server.port }}</div></td>
<td class="nowrap visible-desktop"><div class="table-cell-title">{{ server.type }}</div></td>
<td class="nowrap hidden-phone"><div class="table-cell-title">{{ server.rtime }} s</div></td>
<td class="nowrap hidden-phone"><div class="table-cell-title">{{ server.last_online }}</div></td>
<td class="nowrap hidden-phone"><div class="table-cell-title">{{ server.last_offline }} {{ server.last_offline_duration }}</div></td>
<td class="tight hidden-phone">
<div class="table-cell-title">
<i class="{{ server.active_icon }}" title="{{ server.active_title }}"></i>
<i class="{{ server.email_icon }}" title="{{ label_email }}"></i>
<i class="{{ server.sms_icon }}" title="{{ label_sms }}"></i>
<i class="{{ server.pushover_icon }}" title="Pushover"></i>
<i class="{{ server.telegram_icon }}" title="Telegram"></i>
</div>
</td>
<td class="tight hidden-phone">
<div class="table-cell-title">
<a class="btn btn-small" href="{{ server.url_view|raw }}"><i class="icon-chart"></i></a>
{% if user_level == 10 %}
<a class="btn btn-small" href="{{ server.url_edit|raw }}" title="{{ label_edit }}"><i class="icon-pencil"></i></a>
<a class="btn btn-small btn-danger show-modal" href="{{ server.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete" data-modal-param="{{ server.label }}"><i class="icon-remove icon-white"></i></a>
{% import 'main/macros.tpl.html' as macro %}
{{ macro.table_search(label_search) }}
<div class="table-responsive">
<table class="table table-striped table-hover table-bordered">
<thead>
<tr>
<!--class="d-none d-lg-table-cell"-->
<th scope="col">{{ label_label }}</th>
<th scope="col">{{ label_domain }}</th>
<th scope="col">{{ label_port }}</th>
<th scope="col">{{ label_type }}</th>
<th scope="col">{{ label_rtime }}</th>
<th scope="col">{{ label_last_online }}</th>
<th scope="col">{{ label_last_offline }}</th>
<th scope="col">{{ label_monitoring }}</th>
{% if user_level == 10 %}
<th scope="col">&#32</th>
{% endif %}
</tr>
<tr class="warning no-result">
<td colspan="4"><i class="fas fa-exclamation-triangle"></i> No result</td>
</tr>
</thead>
<tbody>
{% for server in servers %}
<tr>
<th scope="row">
{% if server.status|lower == 'on' %}
<i class="fas fa-check-circle" title="{{ server.status }}"></i>&nbsp;
{% elseif server.status|lower == 'warning' %}
<i class="fas fa-exclamation-triangle" title="{{ server.status }}"></i>&nbsp;
{% elseif server.status|lower == 'off' %}
<i class="fas fa-times-circle" title="{{ server.status }}"></i>&nbsp;
{% endif %}
</div>
</td>
<td class="visible-phone">
<div class="table-body">
<div class="table-cell-title">
<span class="label label-status-{{ server.status }}"><a href="{{ server.url_view|raw }}" title="{{ server.error }}">{{ server.status }}</a></span>
<a class="title" href="{{ server.url_view|raw }}">{{ server.label }}</a>
</div>
<div class="table-cell tight">
&nbsp;<a class="btn btn-small" href="{{ server.url_view|raw }}"><i class="icon-chart"></i></a>
{% if user_level == 10 %}
<a class="btn btn-small" href="{{ server.url_edit|raw }}" title="{{ label_edit }}"><i class="icon-pencil"></i></a>
<a class="btn btn-small btn-danger show-modal" href="{{ server.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete" data-modal-param="{{ server.label }}"><i class="icon-remove icon-white"></i></a>
{% endif %}
</div>
</div>
<div class="table-body">
<div class="table-row">
<div class="table-cell"><i class="{{ server.type_icon }}" title="{{ server.type }}"></i> {{ server.ip_short|raw }}</div>
<div class="table-cell tight">
<i class="{{ server.active_icon }}" title="{{ server.active_title }}"></i>
<i class="{{ server.email_icon }}" title="{{ label_email }}"></i>
<i class="{{ server.sms_icon }}" title="{{ label_sms }}"></i>
<i class="{{ server.pushover_icon }}" title="Pushover"></i>
<i class="{{ server.telegram_icon }}" title="Telegram"></i>
<a href="{{ server.url_view|raw }}" title="{{ label_view }}">
{{ server.label }}
</a>
</th>
<td>{{ server.ip|raw }}</td>
<td>{{ server.port }}</td>
<td>{{ server.type }}</td>
<td>{{ server.rtime }}</td>
<td>{{ server.last_online }}</td>
<td>{{ server.last_offline }}</td>
<td>
{% if server.active|lower == 'yes'%}
<i class="fas fa-eye" title="{{ server.active_title }}"></i>
{% else %}
<i class="fas fa-eye-slash" title="{{ server.active_title }}"></i>
{% endif %}
{% if server.email|lower == 'yes'%}
<i class="fas fa-envelope" title="{{ label_email }}"></i>
{% endif %}
{% if server.sms|lower == 'yes'%}
<i class="fas fa-sms" title="{{ label_sms }}"></i>
{% endif %}
{% if server.pushover|lower == 'yes'%}
<span class="fa-layers">
<i class="fas fa-circle" title="{{ label_pushover }}"></i>
<span class="fa-layers-text fa-inverse" style="font-weight:400; font-size:75%">P</span>
</span>
{% endif %}
{% if server.telegram|lower == 'yes'%}
<span class="fa-layers">
<i class="fas fa-circle" title="{{ label_telegram }}"></i>
<span class="fa-layers-text fa-inverse" style="font-weight:400; font-size:75%">T</span>
</span>
{% endif %}
</td>
{% if user_level == 10 %}
<td>
<div class="item-action dropdown">
<a data-toggle="dropdown" class="icon"><i class="fas fa-ellipsis-v"></i></a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{ server.url_view|raw }}" title="{{ label_view }}">
<i class="fas fa-eye"></i> {{ label_view }}
</a>
<a class="dropdown-item" href="{{ server.url_edit|raw }}" title="{{ label_edit }}">
<i class="fas fa-edit"></i> {{ label_edit }}
</a>
<a class="dropdown-item show-modal" href="{{ server.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete"
data-modal-param="{{ server.server_name }}">
<i class="fas fa-trash"></i> {{ label_delete }}
</a>
</div>
</div>
</div>
<div class="table-body">
<div class="table-row"><div class="table-cell-details tight">{{ label_rtime }}: &nbsp;</div><div class="table-cell-details">{{ server.rtime }} s</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_last_online }}: &nbsp;</div><div class="table-cell-details">{{ server.last_online }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_last_offline }}: &nbsp;</div><div class="table-cell-details">{{ server.last_offline }} {{ server.last_offline_duration }}</div></div>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>

View File

@ -1,235 +1,153 @@
{% import 'main/macros.tpl.html' as macro %}
<form class="form-horizontal well" action="{{ url_save|raw }}" method="post" autocomplete="off">
{{ macro.csrf_input() }}
<form name="edit_server" action="{{ url_save|raw }}" class="col-md-6 pl-0 pr-0" id="edit_server" method="post"
autocomplete="off">
<fieldset>
<legend>{{ titlemode }}</legend>
<div class="control-group">
<label class="control-label" for="label">{{ label_label }}</label>
<div class="controls">
<input type="text" id="label" name="label" value="{{ edit_value_label }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="ip">{{ label_domain }}</label>
<div class="controls">
<input type="text" id="ip" name="ip" value="{{ edit_value_ip }}" maxlength="500" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="type">{{ label_type }}</label>
<div class="controls">
<select id="type" name="type">
<div class="col">
<!-- Label -->
{{ macro.input_field("text", "label", null, "label", label_label, edit_value_label, null, "255", null, null, null, null, true, true) }}
<!-- IP -->
{{ macro.input_field("text", "ip", null, "ip", label_domain, edit_value_ip, null, "255", null, null, null, null, true) }}
<!-- Type -->
<div class="form-group">
<label for="type">{{ label_type }}</label>
<select id="type" name="type" class="custom-select" required>
<option value="">{{ label_please_select }}</option>
<option value="ping" {{ edit_type_selected_ping|raw }}>{{ label_ping }}</option>
<option value="service" {{ edit_type_selected_service|raw }}>{{ label_service }}</option>
<option value="website" {{ edit_type_selected_website|raw }}>{{ label_website }}</option>
</select>
</div>
</div>
<div class="control-group popularPortsGroup types typeService">
<label class="control-label" for="popularPorts">{{ label_port }}</label>
<div class="controls">
<select id="popularPorts" name="popularPorts">
<option value="">{{ label_please_select }}</option>
<option value="custom">{{ label_custom_port }}</option>
<optgroup label="{{ label_popular_ports }}">
<option value="80">HTTP (80)</option>
<option value="443">HTTPS (443)</option>
<option value="21">FTP (21)</option>
<option value="25">SMTP (25)</option>
<option value="465">SMTP Secure (465)</option>
<option value="110">POP3 (110)</option>
<option value="995">POP3 Secure (995)</option>
<option value="143">IMAP (143)</option>
<option value="993">IMAP over SSL (993)</option>
<option value="22">SSH (22)</option>
<option value="389">LDAP (389)</option>
<option value="3306">MySQL (3306)</option>
<option value="115">SFTP (115)</option>
<option value="43">WHOIS (43)</option>
<option value="53">BIND (53)</option>
<option value="3389">RDP (3389)</option>
</optgroup>
</select>
</div>
</div>
<div class="control-group portGroup types typeService">
<label class="control-label" for="port">{{ label_custom_port }}</label>
<div class="controls">
<input class="input-mini" type="text" id="port" name="port" value="{{ edit_value_port }}" maxlength="5" />
</div>
</div>
<div class="control-group popularRequestMethodsGroup types typeWebsite">
<label class="control-label" for="popularRequestMethods">{{ label_request_method }}</label>
<div class="controls">
<select id="popularRequestMethods" name="popularRequestMethods">
<option value="">{{ label_none }}</option>
<optgroup label="{{ label_popular_request_methods }}">
<option value="GET">GET</option>
<option value="HEAD">HEAD</option>
<option value="POST">POST</option>
<option value="PUT">PUT</option>
<option value="DELETE">DELETE</option>
<option value="CONNECT">CONNECT</option>
<option value="OPTIONS">OPTIONS</option>
<option value="TRACE">TRACE</option>
<option value="PATCH">PATCH</option>
<!-- Port -->
<div class="form-group types typeService">
<label for="popular_ports">{{ label_port }}</label>
<select id="popular_ports" name="popular_ports" class="custom-select">
<option {% if not edit_value_port %}selected {% endif %} disabled>{{ label_please_select }}</option>
<option {% if edit_value_port not in [0, 80, 443, 21, 25, 465, 110, 995, 143, 993, 22, 389, 3306, 115, 43, 53,
3389] %} selected {% endif %} value="custom">{{ label_custom_port }}</option>
<optgroup label="{{ label_popular_ports }}">
<option {% if edit_value_port==80 %}selected {% endif %}value="80">HTTP (80)</option>
<option {% if edit_value_port==443 %}selected {% endif %}value="443">HTTPS (443)</option>
<option {% if edit_value_port==21 %}selected {% endif %}value="21">FTP (21)</option>
<option {% if edit_value_port==25 %}selected {% endif %}value="25">SMTP (25)</option>
<option {% if edit_value_port==465 %}selected {% endif %}value="465">SMTP Secure (465)</option>
<option {% if edit_value_port==110 %}selected {% endif %}value="110">POP3 (110)</option>
<option {% if edit_value_port==995 %}selected {% endif %}value="995">POP3 Secure (995)</option>
<option {% if edit_value_port==143 %}selected {% endif %}value="143">IMAP (143)</option>
<option {% if edit_value_port==993 %}selected {% endif %}value="993">IMAP over SSL (993)</option>
<option {% if edit_value_port==22 %}selected {% endif %}value="22">SSH (22)</option>
<option {% if edit_value_port==389 %}selected {% endif %}value="389">LDAP (389)</option>
<option {% if edit_value_port==3306 %}selected {% endif %}value="3306">MySQL (3306)</option>
<option {% if edit_value_port==115 %}selected {% endif %}value="115">SFTP (115)</option>
<option {% if edit_value_port==43 %}selected {% endif %}value="43">WHOIS (43)</option>
<option {% if edit_value_port==53 %}selected {% endif %}value="53">BIND (53)</option>
<option {% if edit_value_port==3389 %}selected {% endif %}value="3389">RDP (3389)</option>
</optgroup>
<option value="custom">{{ label_custom_request_method }}</option>
</select>
</div>
</div>
<div class="control-group requestMethodGroup types typeWebsite">
<label class="control-label" for="requestMethod">{{ label_custom_request_method }}</label>
<div class="controls">
<input class="input" type="text" id="requestMethod" name="request_method" value="{{ edit_value_request_method }}" maxlength="50" />
</div>
</div>
<div class="control-group postGroup types typeWebsite">
<label class="control-label" for="postField">{{ label_post_field }}</label>
<div class="controls">
<input class="input" type="text" id="postField" name="post_field" value="{{ edit_value_post_field }}" maxlength="255" data-toggle="tooltip" title="{{ label_post_field_description}}"/>
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="pattern">{{ label_pattern }}</label>
<div class="controls">
<input type="text" id="pattern" name="pattern" value="{{ edit_value_pattern }}" maxlength="255" data-toggle="tooltip" title="{{ label_pattern_description }}" />
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="pattern_online">{{ label_pattern_online }}</label>
<div class="controls">
<select id="pattern_online" name="pattern_online" data-toggle="tooltip" title="{{ label_pattern_online_description}}">
<option value="yes" {{ edit_pattern_selected_yes|raw }}>{{ label_online }}</option>
<option value="no" {{ edit_pattern_selected_no|raw }}>{{ label_offline }}</option>
<!-- Custom port -->
{{ macro.input_field("number", "port", "port types typeService", "port", label_custom_port, edit_value_port, null, "5") }}
<!-- Request method -->
<div class="form-group types typeWebsite">
<label for="popular_request_methods">{{ label_request_method }}</label>
<select id="popular_request_methods" name="popular_request_methods" class="custom-select">
<option value="">{{ label_none }}</option>
<optgroup label="{{ label_popular_request_methods }}">
<option {% if edit_value_request_method|upper=='GET' %}selected {% endif %}value="GET">GET</option>
<option {% if edit_value_request_method|upper=='HEAD' %}selected {% endif %}value="HEAD">HEAD</option>
<option {% if edit_value_request_method|upper=='POST' %}selected {% endif %}value="POST">POST</option>
<option {% if edit_value_request_method|upper=='PUT' %}selected {% endif %}value="PUT">PUT</option>
<option {% if edit_value_request_method|upper=='DELETE' %}selected {% endif %}value="DELETE">DELETE</option>
<option {% if edit_value_request_method|upper=='CONNECT' %}selected {% endif %}value="CONNECT">CONNECT</option>
<option {% if edit_value_request_method|upper=='OPTIONS' %}selected {% endif %}value="OPTIONS">OPTIONS</option>
<option {% if edit_value_request_method|upper=='TRACE' %}selected {% endif %}value="TRACE">TRACE</option>
<option {% if edit_value_request_method|upper=='PATCH' %}selected {% endif %}value="PATCH">PATCH</option>
</optgroup>
<option {% if edit_value_request_method|upper not in ['', 'GET' , 'HEAD' , 'POST' , 'PUT' , 'DELETE' , 'CONNECT' ,
'OPTIONS' , 'TRACE' , 'PATCH' ] %} selected {% endif %} value="custom">{{ label_custom_request_method }}</option>
</select>
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="redirect_check">{{ label_redirect_check }}</label>
<div class="controls">
<select id="redirect_check" name="redirect_check" data-toggle="tooltip" title="{{ label_redirect_check_description}}">
<option value="ok" {{ edit_redirect_check_selected_ok|raw }}>{{ label_ok }}</option>
<option value="bad" {{ edit_redirect_check_selected_bad|raw }}>{{ label_bad }}</option>
</select>
<!-- Custom request method -->
{{ macro.input_field("text", "request_method", "requestMethod types typeWebsite", "request_method", label_custom_request_method, edit_value_request_method, null, "50") }}
<!-- Post field -->
{{ macro.input_field("text", "post_field", "types typeWebsite typeGroup", "post_field", label_post_field, edit_value_post_field, "param1=val1&param2=val2&...", "50", 'post_field_help', label_post_field_description) }}
<!-- Pattern -->
{{ macro.input_field("text", "pattern", "types typeWebsite", "pattern", label_pattern, edit_value_pattern, null, "255", 'pattern_help', label_pattern_description) }}
<!-- Pattern online/offline (Didn't use the macro because of the custom col.) -->
<div class="form-group form-row types typeWebsite">
<label for="pattern_online" class="col-form-label col-md-6">{{ label_pattern_online }}</label>
<div class="col-md-6 p-0">
<select id="pattern_online" name="pattern_online" class="custom-select" aria-describedby="pattern_online">
<option value="yes" {{ edit_pattern_selected_yes|raw }}>{{ label_online }}</option>
<option value="no" {{ edit_pattern_selected_no|raw }}>{{ label_offline }}</option>
</select>
</div>
<small id="pattern_online_help" class="form-text text-muted p-1">{{ label_pattern_online_description }}</small>
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="allow_http_status">{{ label_allow_http_status }}</label>
<div class="controls">
<input type="text" id="allow_http_status" name="allow_http_status" value="{{ edit_value_allow_http_status }}" maxlength="255" data-toggle="tooltip" title="{{ label_allow_http_status_description }}" />
<!-- Redirect check (Didn't use the macro because of the custom col.) -->
<div class="form-group form-row types typeWebsite">
<label for="redirect_check" class="col-form-label col-md-7">{{ label_redirect_check }}</label>
<div class="col-md-5 p-0">
<select id="redirect_check" name="redirect_check" class="custom-select" aria-describedby="redirect_check_help">
<option value="ok" {{ edit_redirect_check_selected_ok|raw }}>{{ label_ok }}</option>
<option value="bad" {{ edit_redirect_check_selected_bad|raw }}>{{ label_bad }}</option>
</select>
</div>
<small id="redirect_check_help" class="form-text text-muted p-1">{{ label_redirect_check_description }}</small>
</div>
<!-- Allow HTTP codes -->
{{ macro.input_field("text", "allow_http_status", "types typeWebsite", "allow_http_status", label_allow_http_status, edit_value_allow_http_status, "401|403", "255", 'allow_http_status_help', label_allow_http_status_description) }}
<!-- Header (Didn't use the macro because of the custom col.) -->
<div class="form-group form-row types typeWebsite">
<div class="col-md-6">
<label for="header_name">{{ label_header_name }}</label>
<input type="text" class="form-control" name="header_name" id="header_name" value="{{ edit_value_header_name }}"
maxlength="255" aria-describedby="header_name_help">
<small id="header_name_help" class="form-text text-muted">{{ label_header_name_description }}</small>
</div>
<div class="col-md-6">
<label for="header_value">{{ label_header_value }}</label>
<input type="text" class="form-control" name="header_value" id="header_value" value="{{ edit_value_header_value }}"
maxlength="255" aria-describedby="header_value_help">
<small id="header_value_help" class="form-text text-muted">{{ label_header_value_description }}</small>
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="header_name">{{ label_header }}</label>
<div class="controls">
<input type="text" id="header_name" name="header_name" value="{{ edit_value_header_name }}" maxlength="255" data-toggle="tooltip" title="{{ label_header_name_description }}" />
<input type="text" id="header_value" name="header_value" value="{{ edit_value_header_value }}" maxlength="255" data-toggle="tooltip" title="{{ label_header_value_description }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="warning_threshold">{{ label_warning_threshold }}</label>
<div class="controls">
<input class="input-mini" type="text" id="warning_threshold" name="warning_threshold" value="{{ edit_value_warning_threshold }}" maxlength="5" data-toggle="tooltip" title="{{ label_warning_threshold_description }}" />
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="timeout">{{ label_timeout }}</label>
<div class="controls">
<input class="input-mini" type="text" id="timeout" name="timeout" value="{{ edit_value_timeout }}" placeholder="{{ default_value_timeout }}" maxlength="10" data-toggle="tooltip" title="{{ label_timeout_description }}" /> s
</div>
<!-- Warning threshold -->
{{ macro.input_field("number", "warning_threshold", null, "warning_threshold", label_warning_threshold, edit_value_warning_threshold, "0", "5", 'warning_threshold_help', label_warning_threshold_description) }}
<!-- Timeout -->
{{ macro.input_field("number", "timeout", null, "timeout", label_timeout, edit_value_timeout, null, "10", 'timeout_help', label_timeout_description) }}
</div>
</fieldset>
<fieldset>
<legend class="types typeWebsite">{{ label_authentication_settings}}</legend>
<div class="control-group types typeWebsite">
<label class="control-label" for="website_username">{{ label_website_username }}</label>
<div class="controls">
<input type="text" id="website_username" name="website_username" value="{{ edit_website_username }}" data-toggle="tooltip" title="{{ label_website_username_description }}" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');"/>
</div>
</div>
<div class="control-group types typeWebsite">
<label class="control-label" for="website_password">{{ label_website_password }}</label>
<div class="controls">
<input type="password" id="website_password" name="website_password" value="{{ edit_website_password }}" data-toggle="tooltip" title="{{ label_website_password_description }}" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');"/>
</div>
<fieldset class="types typeWebsite">
<legend>{{ label_authentication_settings }} ({{ label_optional }})</legend>
<div class="col">
<!-- Website username -->
{{ macro.input_field("text", "website_username", null, "website_username", label_website_username, edit_value_website_username, null, "255", 'website_username_help', label_website_username_description, null, true, null, null, true) }}
<!-- website password -->
{{ macro.input_field("password", "website_password", null, "website_password", label_website_password, edit_value_website_password, null, "10", 'website_password_help', label_website_password_description, null, true, null, null, true) }}
</div>
</fieldset>
<fieldset>
<legend>{{ label_fieldset_monitoring }}</legend>
<div class="control-group">
<label class="control-label" for="active">{{ label_monitoring }}</label>
<div class="controls">
<select id="active" name="active">
<option value="yes" {{ edit_active_selected_yes|raw }}>{{ label_yes }}</option>
<option value="no" {{ edit_active_selected_no|raw }}>{{ label_no }}</option>
</select>
</div>
</div>
<div class="control-group {{ control_class_email }}">
<label class="control-label" for="email">{{ label_send_email }}
{% if warning_email %} <p class="help-inline"><i class="icon-warning-sign" data-toggle="tooltip" title="{{ label_warning_email }}"></i></p> {% endif %}
</label>
<div class="controls">
<select id="email" name="email">
<option value="yes" {{ edit_email_selected_yes|raw }}>{{ label_yes }}</option>
<option value="no" {{ edit_email_selected_no|raw }}>{{ label_no }}</option>
</select>
</div>
</div>
<div class="control-group {{ control_class_sms }}">
<label class="control-label" for="sms">{{ label_send_sms }}
{% if warning_sms %} <p class="help-inline"><i class="icon-warning-sign" data-toggle="tooltip" title="{{ label_warning_sms }}"></i></p> {% endif %}
</label>
<div class="controls">
<select id="sms" name="sms">
<option value="yes" {{ edit_sms_selected_yes|raw }}>{{ label_yes }}</option>
<option value="no" {{ edit_sms_selected_no|raw }}>{{ label_no }}</option>
</select>
</div>
</div>
<div class="control-group {{ control_class_pushover }}">
<label class="control-label" for="pushover">{{ label_pushover }}
{% if warning_pushover %} <p class="help-inline"><i class="icon-warning-sign" data-toggle="tooltip" title="{{ label_warning_pushover }}"></i></p> {% endif %}
</label>
<div class="controls">
<select id="pushover" name="pushover">
<option value="yes" {{ edit_pushover_selected_yes|raw }}>{{ label_yes }}</option>
<option value="no" {{ edit_pushover_selected_no|raw }}>{{ label_no }}</option>
</select>
</div>
</div>
<div class="control-group {{ control_class_telegram }}">
<label class="control-label" for="telegram">{{ label_telegram }}
{% if warning_telegram %} <p class="help-inline"><i class="icon-warning-sign" data-toggle="tooltip" title="{{ label_warning_telegram }}"></i></p> {% endif %}
</label>
<div class="controls">
<select id="telegram" name="telegram">
<option value="yes" {{ edit_telegram_selected_yes|raw }}>{{ label_yes }}</option>
<option value="no" {{ edit_telegram_selected_no|raw }}>{{ label_no }}</option>
</select>
</div>
<div class="col">
<!-- Monitor -->
{{ macro.input_select_monitoring("active", "active", label_monitoring, edit_active_selected, label_yes, label_no) }}
<!-- Email -->
{{ macro.input_select_monitoring("email", "email", label_send_email, edit_email_selected, label_yes, label_no, warning_email, label_warning_email) }}
<!-- SMS -->
{{ macro.input_select_monitoring("sms", "sms", label_send_sms, edit_sms_selected, label_yes, label_no, warning_sms, label_warning_sms) }}
<!-- Pushover -->
{{ macro.input_select_monitoring("pushover", "pushover", label_send_pushover, edit_pushover_selected, label_yes, label_no, warning_pushover, label_warning_pushover) }}
<!-- Telegram -->
{{ macro.input_select_monitoring("telegram", "telegram", label_send_telegram, edit_telegram_selected, label_yes, label_no, warning_telegram, label_warning_telegram) }}
</div>
</fieldset>
<fieldset>
<legend>{{ label_fieldset_permissions }}</legend>
<div class="control-group">
<label class="control-label" for="user_id">{{ label_users }}</label>
<div class="controls">
<select class="multiselect" multiple="multiple" id="user_id" name="user_id[]">
{% for user in users %}
<option value="{{ user.user_id }}" {{ user.edit_selected|raw }}> {{ user.name }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit">{{ label_save }}</button>
<a class="btn" href="{{ url_go_back|raw }}" >{{ label_go_back }}</a>
</div>
<!-- Permissions -->
{{ macro.input_select_multiple("user_id", "user_id[]", label_permissions, label_search, users, label_please_select) }}
{{ macro.button_save(null, label_save) }}
<a class="btn" href="{{ url_go_back|raw }}">{{ label_go_back }}</a>
</fieldset>
</form>
{{ macro.input_csrf() }}
</form>

View File

@ -1,127 +1,302 @@
<table class="table table-bordered">
<colgroup>
<col class="oce-first" />
<col />
</colgroup>
<thead>
<tr class="head">
<th colspan="2">
<div class="btn-group">
<button class="btn btn-success dropdown-toggle" data-toggle="dropdown">
<i class="icon-th icon-white"></i>&nbsp;{{ label }}
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
{% for option in options %}
<li class="{{ option.class_active }}"><a href="{{ option.url|raw }}">{{ option.label }}</a>
{% endfor %}
</ul>
</div>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ label_status }}:</td>
<td>
<span class="label label-status-{{ status }}">
<a href="#" title="{{ error }}">{{ status }}</a>
</span>&nbsp;{{ error }}
</td>
</tr>
<tr>
<td>{{ label_type }}:</td>
<td>{{ type }}</td>
</tr>
<tr>
<td>{{ label_domain }}:</td>
<td>{{ ip|raw }}</td>
</tr>
<tr>
<td>{{ label_port }}:</td>
<td>{{ port }}</td>
</tr>
<tr>
<td>{{ label_last_check }}:</td>
<td>{{ last_check }}</td>
</tr>
<tr>
<td>{{ label_last_online }}:</td>
<td>{{ last_online }}</td>
</tr>
<tr>
<td>{{ label_last_offline }}:</td>
<td>{{ last_offline }} {{ last_offline_duration }}</td>
</tr>
<tr>
<td>{{ label_rtime }}:</td>
<td>{{ rtime }} s</td>
</tr>
<tr>
<td>{{ label_monitoring }}:</td>
<td>{{ active }}</td>
</tr>
<tr>
<td>{{ label_email }}:</td>
<td>{{ email }}</td>
</tr>
<tr>
<td>{{ label_sms }}:</td>
<td>{{ sms }}</td>
</tr>
<tr>
<td>{{ label_pushover }}:</td>
<td>{{ pushover }}</td>
</tr>
<tr>
<td>{{ label_telegram }}:</td>
<td>{{ telegram }}</td>
</tr>
<tr>
<td>{{ label_timeout }}:</td>
<td>{{ timeout }} s</td>
</tr>
<tr>
<td>{{ label_website_username }}:</td>
<td>{{ website_username }}</td>
</tr>
<tr>
<td>{{ label_website_password }}:</td>
<td>
{% if (website_password is not empty) %}
******
<div class="container">
<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">
{% if status|lower == 'on' %}
<i class="fas fa-check-circle fa-6x"></i>
{% elseif status|lower == 'warning' %}
<i class="fas fa-exclamation-triangle fa-6x"></i>
{% elseif status|lower == 'off' %}
<i class="fas fa-times-circle fa-6x"></i>
{% else %}
<i class="fas fa-question-circle fa-6x"></i>
{% endif %}
</td>
</tr>
<tr>
<td id="advanced">{{ label_advanced }}&nbsp;<i class="icon-expand-arrow"></i></td>
<td>&nbsp;</td>
</tr>
<tr class="advanced">
<td>{{ label_last_error }}:</td>
<td>{{ last_error }}</td>
</tr>
<tr class="advanced">
<td>{{ label_last_output }}:</td>
<td>{{ last_output }}</td>
</tr>
<tr class="advanced">
<td>{{ label_last_error_output }}:</td>
<td>{{ last_error_output }}</td>
</tr>
{% if has_admin_actions %}
<tr>
<td class="hidden-small">&nbsp;</td>
<td class="action-small" colspan="2">
<a class="btn btn-success" href="{{ url_edit|raw }}">
<i class="icon-edit icon-white"></i>&nbsp;{{ label_edit }}
</a>
<a class="btn btn-danger show-modal" href="{{ url_delete|raw }}" data-modal-id="delete" data-modal-param="{{ label }}">
<i class="icon-remove icon-white"></i>&nbsp;{{ label_delete }}
</a>
</td>
</tr>
{% endif %}
</tbody>
</table>
{{ html_history|raw }}
</div>
</div>
<div class="card col-md-5 ml-auto pl-0 pr-0 mb-4">
<div class="card-header">
{{ label }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_domain }}:</dt>
<dd class="col-md-8">{{ ip|raw }}</dd>
</dl>
</li>
{% if type|lower == 'service' %}
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_port }}:</dt>
<dd class="col-md-8">{{ port }}</dd>
</dl>
</li>
{% endif %}
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_status }}:</dt>
<dd class="col-md-8">{{ status }}</dd>
</dl>
</li>
<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>
</dl>
</li>
</ul>
</div>
<div class="card col-md-4 ml-auto pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_type }}:</dt>
<dd class="col-md-6">{{ type }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_warning_threshold }}:</dt>
<dd class="col-md-6">{{ warning_threshold }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_timeout }}:</dt>
<dd class="col-md-6">{{ timeout }} {{ label_seconds }}</dd>
</dl>
</li>
</ul>
</div>
<!--
{% if type|lower == 'website' %}
<div class="card col-md-3 pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_authentication_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_website_username }}:</dt>
<dd class="col-md-6">{% if website_username is not empty %}{{ website_username }}{% else %}-{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_website_password }}:</dt>
<dd class="col-md-6">{% if website_password is not empty %}******{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div><div class="card col-md-4 pl-0 pr-0 mb-4 ml-auto">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_header_name }}:</dt>
<dd class="col-md-6">{% if header_name is not empty %}{{ header_name }}{% else %}-{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_header_value }}:</dt>
<dd class="col-md-6">{% if header_value is not empty %}{{ header_value }}{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-4 pl-0 pr-0 mb-4 ml-auto">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_request_method }}:</dt>
<dd class="col-md-6">{% if request_method is not empty %}{{ request_method }}{% else %}-{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_post_field }}:</dt>
<dd class="col-md-6">{% if post_field is not empty %}{{ post_field }}{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-4 pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_pattern_online }}:</dt>
<dd class="col-md-6">{% if pattern_online == 'yes' %}{{ label_online }}{% else %}{{ label_offline }}{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_pattern }}:</dt>
<dd class="col-md-6">{% if pattern is not empty %}{{ pattern }}{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-3 pl-0 pr-0 mb-4 ml-auto">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_request_method }}:</dt>
<dd class="col-md-6">{% if request_method is not empty %}{{ request_method }}{% else %}-{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_post_field }}:</dt>
<dd class="col-md-6">{% if post_field is not empty %}{{ post_field }}{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-4 pl-0 pr-0 mb-4 ml-auto">
<div class="card-header">
{{ label_settings }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_redirect_check }}:</dt>
<dd class="col-md-6">{% if redirect_check is not empty %}{{ redirect_check }}{% else %}-{% endif %}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_allow_http_status }}:</dt>
<dd class="col-md-6">{% if allow_http_status is not empty %}{{ allow_http_status }}{% else %}-{% endif %}</dd>
</dl>
</li>
</ul>
</div>
{% endif %}
-->
<div class="card col-md-3 pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_status }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_online }}:</dt>
<dd class="col-md-6">{{ last_online }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_offline }}:</dt>
<dd class="col-md-6">{{ last_offline }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_check }}:</dt>
<dd class="col-md-6">{{ last_check }}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-6 ml-auto pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_output }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-3">{{ label_last_error }}:</dt>
<dd class="col-md-9">{{ last_error }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-3">{{ label_last_output }}:</dt>
<dd class="col-md-9">{{ last_output }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-3">{{ label_last_error_output }}:</dt>
<dd class="col-md-9">{{ last_error_output }}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-2 ml-auto pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_fieldset_monitoring }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
{{ label_monitoring }}:
{% if active|lower == 'yes' %}
<i class="fas fa-eye float-right"></i>
{% elseif active|lower == 'no' %}
<i class="fas fa-eye-slash float-right"></i>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
{% endif %}
</li>
<li class="list-group-item">
{{ label_email }}:
{% if email|lower == 'yes' %}
<i class="fas fa-bell float-right"></i>
{% elseif email|lower == 'no' %}
<i class="fas fa-bell-slash float-right"></i>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
{% endif %}
</li>
<li class="list-group-item">
{{ label_sms }}:
{% if sms|lower == 'yes' %}
<i class="fas fa-bell float-right"></i>
{% elseif sms|lower == 'no' %}
<i class="fas fa-bell-slash float-right"></i>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
{% endif %}
</li>
<li class="list-group-item">
{{ label_pushover }}:
{% if pushover|lower == 'yes' %}
<i class="fas fa-bell float-right"></i>
{% elseif pushover|lower == 'no' %}
<i class="fas fa-bell-slash float-right"></i>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
{% endif %}
</li>
<li class="list-group-item">
{{ label_telegram }}:
{% if telegram|lower == 'yes' %}
<i class="fas fa-bell float-right"></i>
{% elseif telegram|lower == 'no' %}
<i class="fas fa-bell-slash float-right"></i>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
{% endif %}
</li>
</ul>
</div>
</div>
<div class="row">
{{ html_history|raw }}
</div>
</div>

View File

@ -1,4 +1,14 @@
<div class="btn-group" data-toggle="buttons-radio">
<button class="btn {{ block_layout_active }}" data-toggle="tab" data-target="#flow-layout" onclick="psm_saveLayout(0)"><i class="icon-th-large"></i></button>
<button class="btn {{ list_layout_active }}" data-toggle="tab" data-target="#list-layout" onclick="psm_saveLayout(1)"><i class="icon-th-list"></i></button>
<div class="row">
<div class="float-right btn-group btn-group-sm mb-3" role="group">
<button type="button" class="btn btn-secondary {% if block_layout_active %} active {% endif %}"
id="block-layout" aria-label="Block layout"
onclick="psm_saveLayout(0)">
<i class="fas fa-th"></i>
</button>
<button type="button" class="btn btn-secondary {% if list_layout_active %} active {% endif %}"
id="table-layout" aria-label="List layout"
onclick="psm_saveLayout(1)">
<i class="fas fa-bars"></i>
</button>
</div>
</div>

View File

@ -1,66 +1,89 @@
<div class="tab-content">
<div class="container">
<input type="hidden" name="saveLayout_csrf" value="{{ csrf_token(csrf_key|default('')) }}" />
<div id="flow-layout" class="tab-pane {{ block_layout_active }}">
<div class="entity-container">
<div id="flow-layout" class="{{ block_layout_active }}" aria-labelledby="block-layout">
<div class="row">
{% for server in servers_offline %}
<div class="offline">
<div class="entity {{ server.class_warning }}" onclick="window.location.href='{{ server.url_view|raw }}'">
<h2>{{ server.label }}</h2>
<p>{{ label_last_online }}: {{ server.last_online_nice }}</p>
<p>{{ label_last_check }}: {{ server.last_checked_nice }}</p>
<div class="col-sm-4 col-md-3">
<div class="card text-white bg-danger mb-3" onclick="window.location.href='{{ server.url_view|raw }}'">
<div class="card-header">{{ server.label }}<span class="sr-only"> ({{ label_offline }})</span></div>
<div class="card-body">
<p class="card-text">
{{ label_last_online }}: {{ server.last_online_nice }}<br>
{{ label_last_check }}: {{ server.last_checked_nice }}
</p>
</div>
</div>
</div>
{% endfor %}
{% for server in servers_online %}
<div class="online">
<div class="entity" onclick="window.location.href='{{ server.url_view|raw }}'">
<h2>{{ server.label }}</h2>
<p>{{ label_last_online }}: {{ server.last_online_nice }}</p>
<p>{{ label_last_offline }}: {{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}</p>
<p>{{ label_rtime }}: {{ server.rtime }}s</p>
<div class="col-sm-4 col-md-3">
<div class="card text-white bg-success mb-3" onclick="window.location.href='{{ server.url_view|raw }}'">
<div class="card-header">{{ server.label }}<span class="sr-only"> ({{ label_online }})</span></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 }}
</p>
</div>
</div>
</div>
{% endfor %}
{% if not servers_offline and not servers_online %}
{{ label_none }}
<!-- TODO knop om nieuwe server toe te voegen -->
{% endif %}
</div>
</div>
<div id="list-layout" class="tab-pane {{ list_layout_active }}">
<div class="entity-container">
<table class="table table-bordered">
<div id="list-layout" class="{{ list_layout_active }}" aria-labelledby="block-layout">
<div class="row table-responsive">
{% if servers_offline or servers_online %}
<table class="table table-bordered table-hover">
{% if servers_offline %}
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">{{ label_last_online }}</th>
<th scope="col">{{ label_last_check }}</th>
<th scope="col">{{ label_rtime }}</th>
</tr>
</thead>
<tbody>
{% for server in servers_offline %}
<tr class="row-offline" onclick="window.location.href='{{ server.url_view|raw }}'">
<td class="{{ server.class_warning }}"><div class="server-name">{{ server.label }}</div>
<div class="visible-phone">
<div class="table-body">
<div class="table-row"><div class="table-cell-details tight">{{ label_last_online }}: &nbsp;</div><div class="table-cell-details">{{ server.last_online_nice }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_last_check }}: &nbsp;</div><div class="table-cell-details">{{ server.last_checked_nice }}</div></div>
<div class="table-row"><div class="table-cell-details tight">&nbsp;</div><div class="table-cell-details">&nbsp;</div></div>
</div>
</div>
</td>
<td class="{{ server.class_warning }} hidden-phone">{{ label_last_online }}: {{ server.last_online_nice }}</td>
<td class="{{ server.class_warning }} hidden-phone">{{ label_last_check }}: {{ server.last_checked_nice }}</td>
<td class="{{ server.class_warning }} hidden-phone"></td>
</tr>
{% endfor %}
{% for server in servers_online %}
<tr class="row-online" onclick="window.location.href='{{ server.url_view|raw }}'">
<td><div class="server-name">{{ server.label }}</div>
<div class="visible-phone">
<div class="table-body">
<div class="table-row"><div class="table-cell-details tight">{{ label_last_online }}: &nbsp;</div><div class="table-cell-details">{{ server.last_online_nice }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_last_offline }}: &nbsp;</div><div class="table-cell-details">{{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_rtime }}: &nbsp;</div><div class="table-cell-details">{{ server.rtime }}</div></div>
</div>
</div>
</td>
<td class="hidden-phone">{{ label_last_online }}: {{ server.last_online_nice }}</td>
<td class="hidden-phone">{{ label_last_offline }}: {{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}</td>
<td class="hidden-phone">{{ label_rtime }}: {{ server.rtime }}s</td>
<tr class="bg-danger text-white" onclick="window.location.href='{{ server.url_view|raw }}'">
<th>{{ server.label }}<span class="sr-only"> ({{ label_offline }})</span></th>
<td>{{ server.last_online_nice }}</td>
<td>{{ server.last_checked_nice }}</td>
<td></td>
</tr>
{% endfor %}
</tbody>
{% endif %}
{% if servers_online %}
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">{{ label_last_online }}</th>
<th scope="col">{{ label_last_offline }}</th>
<th scope="col">{{ label_rtime }}</th>
</tr>
</thead>
<tbody>
{% for server in servers_online %}
<tr class="bg-success text-white" onclick="window.location.href='{{ server.url_view|raw }}'">
<th>{{ server.label }}<span class="sr-only"> ({{ label_online }})</span></th>
<td>{{ server.last_online_nice }}</td>
<td>{{ server.last_offline_nice }} {{ server.last_offline_duration_nice }}</td>
<td>{{ server.rtime }}s</td>
</tr>
{% endfor %}
</tbody>
{% endif %}
</table>
{% else %}
{{ label_none }}
<!-- TODO knop om nieuwe server toe te voegen -->
{% endif %}
</div>
</div>
</div>

View File

@ -1,10 +1,9 @@
{% import 'main/macros.tpl.html' as macro %}
<div class="container">
<form class="form-signin" method="post">
{{ macro.csrf_input() }}
<h3 class="form-signin-heading">{{ title_forgot }}</h3>
<input type="text" name="user_name" class="input-block-level" placeholder="{{ label_username }}" value="{{ value_user_name }}" required>
<button class="btn btn-primary" type="submit">{{ label_submit }}</button>
<a class="btn" href="?">{{ label_go_back }}</a>
</form>
</div>
<form class="form-forgot text-center" method="POST">
{{ macro.input_csrf() }}
<h1 class="h3 mb-3 font-weight-normal">{{ title_forgot }}</h1>
<label for="input-username" class="sr-only">{{ label_username }}</label>
<input type="text" name="user_name" id="input-username" class="form-control mb-3" value="{{ value_user_name }}" placeholder="{{ label_username }}" required autofocus>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{ label_submit }}</button>
<a class="btn" href="?">{{ label_go_back }}</a>
</form>

View File

@ -1,15 +1,16 @@
{% import 'main/macros.tpl.html' as macro %}
<div class="container">
<form class="form-signin" method="post">
{{ macro.csrf_input() }}
<h3 class="form-signin-heading">{{ title_sign_in }}</h3>
<input type="text" name="user_name" class="input-block-level" placeholder="{{ label_username }}" value="{{ value_user_name }}" required>
<input type="password" name="user_password" class="input-block-level" placeholder="{{ label_password }}" required>
<input type="hidden" name="action" value="login">
<label class="checkbox">
<input type="checkbox" name="user_rememberme" value="1" {{ value_rememberme }}> {{ label_remember_me }}
</label>
<button class="btn btn-primary" type="submit">{{ label_login }}</button>
<a class="btn" href="?action=forgot">{{ label_password_forgot }}</a>
</form>
</div>
<form class="form-signin text-center" method="POST">
{{ macro.input_csrf() }}
<h1 class="h3 mb-3 font-weight-normal">{{ title_sign_in }}</h1>
<label for="input-username" class="sr-only">{{ label_username }}</label>
<input type="text" name="user_name" id="input-username" class="form-control" value="{{ value_user_name }}" placeholder="{{ label_username }}" required autofocus>
<label for="input-password" class="sr-only">{{ label_password }}</label>
<input type="password" id="input-password" name="user_password" class="form-control" placeholder="{{ label_password }}" required>
<input type="hidden" name="action" value="login">
<div class="custom-control custom-checkbox my-1 mr-sm-2">
<input type="checkbox" name="user_rememberme" value="1" class="custom-control-input" id="input-rememberme" {{ value_rememberme }}>
<label class="custom-control-label" for="input-rememberme">{{ label_remember_me }}</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{ label_login }}</button>
<a class="btn" href="?action=forgot">{{ label_password_forgot }}</a>
</form>

View File

@ -1,12 +1,13 @@
{% import 'main/macros.tpl.html' as macro %}
<div class="container">
<form class="form-signin" method="post">
{{ macro.csrf_input() }}
<h3 class="form-signin-heading">{{ title_reset }}</h3>
<input type="text" name="user_name" class="input-block-level" placeholder="{{ label_username }}" value="{{ value_user_name }}" required disabled="disabled">
<input type="password" name="user_password_new" class="input-block-level" placeholder="{{ label_password }}" required autocomplete="off">
<input type="password" name="user_password_repeat" class="input-block-level" placeholder="{{ label_password_repeat }}" required autocomplete="off">
<button class="btn btn-primary" type="submit">{{ label_reset }}</button>
<a class="btn" href="?">{{ label_go_back }}</a>
</form>
</div>
<form class="form-reset text-center" method="POST">
{{ macro.input_csrf() }}
<h1 class="h3 mb-3 font-weight-normal">{{ title_reset }}</h1>
<label for="input-username" class="sr-only">{{ label_username }}</label>
<input type="text" name="user_name" id="input-username" class="form-control" value="{{ value_user_name }}" required disabled>
<label for="input-password" class="sr-only">{{ label_password }}</label>
<input type="password" id="input-password" name="user_password_new" class="form-control" placeholder="{{ label_password }}" required autofocus>
<label for="input-password-repeat" class="sr-only">{{ label_password_repeat }}</label>
<input type="password" id="input-password-repeat" name="user_password_repeat" class="form-control mb-3" placeholder="{{ label_password_repeat }}" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">{{ label_reset }}</button>
<a class="btn" href="?">{{ label_go_back }}</a>
</form>

View File

@ -1,92 +1,42 @@
{% import 'main/macros.tpl.html' as macro %}
<form class="form-horizontal well" action="{{ form_action|raw }}" method="post">
{{ macro.csrf_input() }}
<form name="edit_profile" class="col-md-6 pl-0 pr-0" action="{{ form_action|raw }}" id="edit_profile" method="post">
{{ macro.input_csrf() }}
<!-- General settings -->
<fieldset>
<div class="row-fluid">
<div class="span6">
<div class="control-group">
<label class="control-label" for="user_name">{{ label_user_name }}</label>
<div class="controls">
<input type="text" id="user_name" name="user_name" value="{{ user_name }}" maxlength="64" required autofocus=>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">{{ label_name }}</label>
<div class="controls">
<input type="text" id="name" name="name" value="{{ name }}" maxlength="255" required>
</div>
</div>
<div class="control-group">
<label class="control-label" for="level">{{ label_level }}</label>
<div class="controls"><input type="text" value="{{ level }}" disabled="disabled" /></div>
</div>
<div class="control-group">
<label class="control-label" for="password">{{ label_password }}</label>
<div class="controls">
<input type="password" id="password" name="password" maxlength="255" placeholder="{{ placeholder_password }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="password_repeat">{{ label_password_repeat }}</label>
<div class="controls">
<input type="password" id="password_repeat" name="password_repeat" maxlength="255" placeholder="{{ placeholder_password }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">{{ label_email }}</label>
<div class="controls">
<input type="text" id="email" name="email" value="{{ email }}" maxlength="255" required>
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">{{ label_mobile }}</label>
<div class="controls">
<input type="text" id="mobile" name="mobile" value="{{ mobile }}" maxlength="15" />
</div>
</div>
<legend>{{ label_general }}</legend>
<!-- Username -->
{{ macro.input_field("text", "user_name", null, "user_name", label_user_name, user_name, label_user_name, "64", null, null, null, null, true, true, "username") }}
<!-- Name -->
{{ macro.input_field("text", "name", null, "name", label_name, name, label_name, "255", null, null, null, null, true, null, "name") }}
<!-- Level -->
{{ macro.input_field("text", "level", null, "level", label_level, level, label_level, null, null, null, null, null, null, null, null, true) }}
<!-- Password -->
{{ macro.input_field("password", "password", null, "password", label_password, null, placeholder_password, "255", null, null, null, null, null, null, "new-password") }}
<!-- Password repeat -->
{{ macro.input_field("password", "password_repeat", null, "password_repeat", label_password_repeat, null, placeholder_password, "255", null, null, null, null, null, null, "new-password") }}
<!-- Email -->
{{ macro.input_field("email", "email", null, "email", label_email, email, label_email, "255", null, null, null, null, true, null, "email") }}
<!-- Mobile -->
{{ macro.input_field("tel", "mobile", null, "mobile", label_mobile, mobile, label_mobile, "15", null, null, null, null, null, null, "tel") }}
</fieldset>
<!-- Pushover settings -->
<fieldset>
<legend>{{ label_pushover }}</legend>
<!-- pushover key -->
{{ macro.input_field("text", "pushover_key", null, "pushover_key", label_pushover_key, pushover_key, label_pushover_key, "255", "pushover_key_help", pushover_key_description) }}
<!-- pushover device -->
{{ macro.input_field("text", "pushover_device", null, "pushover_device", label_pushover_device, pushover_device, label_pushover_device, "255", "pushover_device_help", pushover_device_description) }}
</fieldset>
<!-- Telegram settings -->
<fieldset>
<legend>{{ label_telegram }}</legend>
<!-- telegram id -->
<div class="form-group">
<a class="btn btn-primary mb-2" href="{{ telegram_get_chat_id_url }}">{{ label_telegram_get_chat_id }}</a>
</div>
<div class="span6">
<div class="control-group">
<label class="control-label">{{ label_pushover }}</label>
<div class="controls">{{ label_pushover_description|raw }} </div>
</div>
<div class="control-group">
<label class="control-label" for="mobile">{{ label_pushover_key }}</label>
<div class="controls">
<input type="text" id="pushover_key" name="pushover_key" value="{{ pushover_key }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="mobile">{{ label_pushover_device }}</label>
<div class="controls">
<input type="text" id="pushover_device" name="pushover_device" value="{{ pushover_device }}" maxlength="255" data-toggle="tooltip" title="{{ label_pushover_device_description }}" />
</div>
</div>
<div class="control-group">
</div>
<div class="control-group">
<label class="control-label">{{ label_telegram }}</label>
<div class="controls">{{ label_telegram_description|raw }} <br><p><button class="btn btn-primary" onclick="window.open('{{ telegram_get_chat_id_url }}');return false;">{{ label_telegram_get_chat_id }}</button></p></div>
</div>
<div class="control-group">
<label class="control-label" for="mobile">{{ label_telegram_chat_id }}</label>
<div class="controls">
<input type="text" id="telegram_id" name="telegram_id" value="{{ telegram_id }}" maxlength="255" data-toggle="tooltip" title="{{ label_telegram_chat_id_description }}" />
</div>
</div>
<div class="control-group">
<div class="controls">
<button class="btn btn-primary show-modal" data-modal-id="activateTelegram">{{ label_activate_telegram }}</button>
<input type="hidden" name="activate_telegram" value="0" />
</div>
</div>
</div>
</div>
<div class="row-fluid">
<div class="form-actions">
<button class="btn btn-success" type="submit">{{ label_save }}</button>
</div>
</div>
</fieldset>
</form>
{{ macro.input_field("text", "telegram_id", null, "telegram_id", label_telegram_chat_id, telegram_id, label_telegram_chat_id, "255", "telegram_id_help", telegram_id_description) }}
<button class="btn btn-primary show-modal" data-toggle="modal" data-modal-id="activateTelegram">{{ label_activate_telegram }}</button>
{{ macro.input_hidden("activate_telegram", "0") }}
{{ macro.button_save(null, label_save) }}
</fieldset>
</form>

View File

@ -1,66 +1,49 @@
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="hidden-phone">{{ label_user }}</th>
<th class="visible-desktop">{{ label_name }}</th>
<th class="visible-desktop">{{ label_level }}</th>
<th class="hidden-phone">{{ label_email }}</th>
<th class="hidden-phone">{{ label_mobile }}</th>
<th class="hidden-phone">{{ label_servers }}</th>
<th class="hidden-phone tight">{{ label_action }}</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>
<div class="table-body">
<div class="table-cell-title">
<span class="nowrap">
<span class="hidden-desktop">
{% if user.level == '10' %}
<i class="icon-admin" title="{{ user.level_text }}"></i>&nbsp;
{% elseif user.level == '20' %}
<i class="icon-user" title="{{ user.level_text }}"></i>&nbsp;
{% endif %}
</span>
<span class="title">{{ user.user_name }}</span>
</span>
<span class="hidden-desktop">({{ user.name }})</span>
</div>
<div class="table-cell tight">
<div class="visible-phone">
<a class="btn btn-small" href="{{ user.url_edit|raw }}" title="{{ user.label_edit }}">
<i class="icon-pencil"></i>
</a>
<a class="btn btn-small btn-danger show-modal" href="{{ user.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete" data-modal-param="{{ user.user_name }}">
<i class="icon-remove icon-white"></i>
</a>
{% import 'main/macros.tpl.html' as macro %}
{{ macro.table_search(label_search) }}
<div class="table-responsive">
<table class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col">{{ label_user }}</th>
<th scope="col" class="d-none d-lg-table-cell">{{ label_name }}</th>
<th scope="col" class="d-none d-lg-table-cell">{{ label_level }}</th>
<th scope="col">{{ label_email }}</th>
<th scope="col">{{ label_mobile }}</th>
<th scope="col">{{ label_servers }}</th>
<th scope="col">&#32</th>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<th scope="row">
{% if user.level == '10' %}
<i class="fas fa-user-astronaut d-lg-none" title="{{ user.level_text }}"></i>&nbsp;
{% elseif user.level == '20' %}
<i class="fas fa-user d-lg-none" title="{{ user.level_text }}"></i>&nbsp;
{% endif %}
{{ user.user_name }} <span class="d-lg-none">({{ user.name }})</span></th>
<td class="d-none d-lg-table-cell">{{ user.name }}</td>
<td class="d-none d-lg-table-cell">{{ user.level_text }}</td>
<td>{{ user.email }}</td>
<td>{{ user.mobile }}</td>
<td>{% for server in user.emp_servers %} {{ server.label }}<br /> {% endfor %}</td>
<td>
<div class="item-action dropdown">
<a data-toggle="dropdown" class="icon"><i class="fas fa-ellipsis-v"></i></a>
<div class="dropdown-menu">
<a class="dropdown-item" href="{{ user.url_edit|raw }}" title="{{ label_edit }}">
<i class="fas fa-edit"></i> {{ label_edit }}
</a>
<a class="dropdown-item show-modal" href="{{ user.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete"
data-modal-param="{{ user.user_name }}">
<i class="fas fa-trash"></i> {{ label_delete }}
</a>
</div>
</div>
</div>
</div>
<div class="visible-phone">
<div class="table-body">
<div class="table-row"><div class="table-cell-details tight">{{ label_email }}:&nbsp;</div><div class="table-cell-details">{{ user.email }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_mobile }}:&nbsp;</div><div class="table-cell-details">{{ user.mobile }}</div></div>
<div class="table-row"><div class="table-cell-details tight">{{ label_servers }}:&nbsp;</div><div class="table-cell-details">{% for server in user.emp_servers %} {{ server.label }}<br/> {% endfor %}</div></div>
</div>
</div>
</td>
<td class="visible-desktop nowrap"><div class="table-cell-title">{{ user.name }}</div></td>
<td class="visible-desktop tight"><div class="table-cell-title">{{ user.level_text }}</div></td>
<td class="hidden-phone tight"><div class="table-cell-title">{{ user.email }}</div></td>
<td class="hidden-phone tight"><div class="table-cell-title">{{ user.mobile }}</div></td>
<td class="hidden-phone"><div class="table-cell-title">{% for server in user.emp_servers %} {{ server.label }}<br/> {% endfor %}</div></td>
<td class="hidden-phone tight">
<a class="btn btn-small" href="{{ user.url_edit|raw }}" title="{{ label_edit }}">
<i class="icon-pencil"></i>
</a>
<a class="btn btn-small btn-danger show-modal" href="{{ user.url_delete|raw }}" title="{{ label_delete }}" data-modal-id="delete" data-modal-param="{{ user.user_name }}">
<i class="icon-remove icon-white"></i>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

View File

@ -1,94 +1,33 @@
{% import 'main/macros.tpl.html' as macro %}
<form class="form-horizontal well" action="{{ url_save|raw }}" method="post">
{{ macro.csrf_input() }}
<form name="edit_user" action="{{ url_save|raw }}" class="col-md-6 pl-0 pr-0" id="edit_user" method="post" autocomplete="off">
<fieldset>
<legend>{{ titlemode }}</legend>
<div class="control-group">
<label class="control-label" for="user_name">{{ label_user_name }}</label>
<div class="controls">
<input type="text" id="user_name" name="user_name" value="{{ edit_value_user_name }}" maxlength="64" required>
</div>
<legend>{{ titlemode }}</legend>
<div class="col">
<!-- Username -->
{{ macro.input_field("text", "user_name", null, "user_name", label_user_name, edit_value_user_name, null, "255", null, null, null, true, true) }}
<!-- Name -->
{{ macro.input_field("text", "name", null, "name", label_name, edit_value_name, null, "255", null, null, null, true) }}
<!-- Level -->
{{ macro.input_select("level", "level", label_level, levels, user_level) }}
<!-- Password -->
{{ macro.input_field("password", "password", null, "password", label_password, edit_value_password, placeholder_password, "255") }}
<!-- Password repeat -->
{{ macro.input_field("password", "password_repeat", null, "password_repeat", label_password_repeat, edit_value_password_repeat, placeholder_password, "255") }}
<!-- Email -->
{{ macro.input_field("email", "email", null, "email", label_email, edit_value_email, null, "255") }}
<!-- Mobile -->
{{ macro.input_field("tel", "mobile", null, "mobile", label_mobile, edit_value_mobile, null, "20") }}
<!-- Pushover_key -->
{{ macro.input_field("text", "pushover_key", null, "pushover_key", label_pushover_key, edit_value_pushover_key, null, "255") }}
<!-- Pushover_device -->
{{ macro.input_field("text", "pushover_device", null, "pushover_device", label_pushover_device, edit_value_pushover_device, null, "255") }}
<!-- Telegram_id -->
{{ macro.input_field("text", "telegram_id", null, "telegram_id", label_telegram_id, edit_value_telegram_id, null, "255") }}
<!-- Servers -->
{{ macro.input_select_multiple("server_id", "server_id[]", label_servers, label_search, servers, label_please_select) }}
</div>
<div class="control-group">
<label class="control-label" for="name">{{ label_name }}</label>
<div class="controls">
<input type="text" id="name" name="name" value="{{ edit_value_name }}" maxlength="255" required>
</div>
</div>
<div class="control-group">
<label class="control-label" for="level">{{ label_level }}</label>
<div class="controls">
<select id="level" name="level">
{% for level in levels %}
<option value="{{ level.value }}" {% if level.value == user_level %} selected="selected" {% endif %}>{{ level.label }}</option>
{% endfor %}
</select>
<p class="help-block">{{ label_level_description|raw }}</p>
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">{{ label_password }}</label>
<div class="controls">
<input type="password" id="password" name="password" maxlength="255" placeholder="{{ placeholder_password }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="password_repeat">{{ label_password_repeat }}</label>
<div class="controls">
<input type="password" id="password_repeat" name="password_repeat" maxlength="255" placeholder="{{ placeholder_password }}" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">{{ label_email }}</label>
<div class="controls">
<input type="text" id="email" name="email" value="{{ edit_value_email }}" maxlength="255" required>
</div>
</div>
<div class="control-group">
<label class="control-label" for="mobile">{{ label_mobile }}</label>
<div class="controls">
<input type="text" id="mobile" name="mobile" value="{{ edit_value_mobile }}" maxlength="15" />
</div>
</div>
<div class="control-group">
<label class="control-label">{{ label_pushover }}</label>
<div class="controls">{{ label_pushover_description|raw }} </div>
</div>
<div class="control-group">
<label class="control-label" for="pushover_key">{{ label_pushover_key }}</label>
<div class="controls">
<input type="text" id="pushover_key" name="pushover_key" value="{{ edit_value_pushover_key }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="pushover_device">{{ label_pushover_device }}</label>
<div class="controls">
<input type="text" id="pushover_device" name="pushover_device" value="{{ edit_value_pushover_device }}" maxlength="255" data-toggle="tooltip" title="{{ label_pushover_device_description }}" />
</div>
</div>
<div class="control-group">
<label class="control-label">{{ label_telegram }}</label>
<div class="controls">{{ label_telegram_description|raw }} </div>
</div>
<div class="control-group">
<label class="control-label" for="telegram_id">{{ label_telegram_id }}</label>
<div class="controls">
<input type="text" id="telegram_id" name="telegram_id" value="{{ edit_value_telegram_id }}" maxlength="255" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="server_id">{{ label_servers }}</label>
<div class="controls">
<select class="multiselect" multiple="multiple" id="server_id" name="server_id[]">
{% for server in servers %}
<option value="{{ server.server_id }}" {{ server.edit_selected }}> {{ server.label }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-actions">
<button class="btn btn-success" type="submit">{{ label_save }}</button>
<button class="btn" onclick="history.back();return false;" >{{ label_go_back }}</button>
</div>
</fieldset>
</form>
{{ macro.button_save(null, label_save) }}
<a class="btn" href="{{ url_go_back|raw }}">{{ label_go_back }}</a>
</fieldset>
{{ macro.input_csrf() }}
</form>

View File

@ -1,14 +1,18 @@
<div id="{{ modal_id }}Modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="{{ modal_id }}ModalLabel" aria-hidden="true">
<div class="modal-header">
<h3 id="{{ modal_id }}ModalLabel">{{ modal_title }}</h3>
<div class="modal fade" id="{{ modal_id }}Modal" tabindex="-1" role="dialog" aria-labelledby="{{ modal_id }}ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="{{ modal_id }}ModalLabel">{{ modal_title }}</h5>
</div>
<div class="modal-body">
{{ modal_body|raw }}
</div>
<div class="modal-footer">
{% if has_cancel %}
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ label_cancel }}</button>
{% endif %}
<button type="button" class="btn btn-{{ modal_button_type }} modalOKButton">{{ modal_button_label }}</button>
</div>
</div>
</div>
<div class="modal-body">
<p>{{ modal_body|raw }}</p>
</div>
<div class="modal-footer">
{% if has_cancel %}
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true">{{ label_cancel }}</button>
{% endif %}
<button class="btn btn-{{ modal_button_type }} modalOKButton" >{{ modal_button_label }}</button>
</div>
</div>
</div>

View File

@ -1,26 +1,15 @@
<div id="sidebar-container">
<div class="sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">{{ subtitle }}</li>
{% for item in items %}
<li class="{{ item.class_active }}">
{% for item in items %}
{% if item.type == 'link' %}
<a href="{{ item.url|raw }}"><i class="icon-{{ item.icon }}"></i>&nbsp;{{ item.label }}</a>
<a class="nav-link {{ item.url|raw }} {{ item.class_active }}"><i class="fas fa-{{ item.icon }}"></i>&nbsp;{{ item.label }}</a>
{% elseif item.type == 'button' %}
<button class="btn btn-{{ item.btn_class }}" onclick="{{ item.onclick|raw }}"><i class="icon-{{ item.icon }}"></i>&nbsp;{{ item.label }}</button>
<a class="btn btn-{{ item.btn_class }} mr-2 mb-3 {{ item.class_active }}" title="{{ item.title }}" href="{{ item.url|raw }}" {% if item.modal_id != null %}data-toggle="modal" data-modal-id="{{ item.modal_id }}"{% endif %}><i class="fas fa-{{ item.icon }}"></i>&nbsp;{{ item.label }}</a>
{% elseif item.type == 'dropdown' %}
<div class="btn-group">
<button class="btn btn-{{ item.btn_class }} dropdown-toggle" data-toggle="dropdown"><i class="icon-{{ item.icon }}"></i>&nbsp;{{ item.label }} <span class="caret"></span></button>
<ul class="dropdown-menu">
{% for option in item.options %}
<li class="{{ option.class_active }}"><a href="{{ option.url|raw }}">{{ option.label }}</a></li>
{% endfor %}
</ul>
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" aria-haspopup="true" aria-expanded="false"><i class="fas fa-{{ item.icon }}"></i>&nbsp;{{ item.label }}</a>
<div class="dropdown-menu">
{% for option in item.options %}
<a class="dropdown-item" href="{{ option.url|raw }}">{{ option.label }}</a>
{% endfor %}
</div>
{% endif %}
</li>
{% endfor %}
</ul>
<div class="clearfix"></div>
</div>
</div>
{% endfor %}
<div class="w-100"></div>

2
static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,81 +0,0 @@
#main-container {
overflow: hidden;
}
#history-panel {
width: 100%;
max-width: 1100px;
}
.chart-row {
margin-bottom: 20px;
}
.chart-row:after {
clear:both;
}
.chart-container {
float: left;
width: 100%;
margin-right: -260px;
}
.chart-content {
margin-right: 260px;
}
.info-container {
float: right;
width: 250px;
}
.info-dropdown {
display: none;
}
.chart {
height: 300px;
width: 100%;
}
.server-info {
padding-top: 40px;
height: 200px;
}
.server-info ul {
list-style: none;
margin: 0;
}
.chart-selector {
}
@media (max-width: 767px) {
.chart-container {
margin-right: 0;
}
.chart-content {
margin-right: 0;
}
.info-container {
float: none;
clear: both;
width: 100%;
}
.info-dropdown {
display: block;
float: left;
}
.server-info {
display: none;
}
.chart-selector {
float: right;
}
}

2
static/css/search.min.css vendored Normal file
View File

@ -0,0 +1,2 @@
.search_input{color:white;border:0;outline:0;background:none;max-width:386px;width:0;caret-color:transparent;line-height:44px;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.search_input:not(:placeholder-shown){padding:0 10px;width:100%;max-width:450px;caret-color:red;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.searchbar{height:66px;max-width:450px;background-color:#353b48;border-radius:40px;padding:10px}.searchbar:hover>.search_icon{background:white;color:#e74c3c}.searchbar:hover>.search_input{padding:0 10px;max-width:450px;width:80%;min-width:100px;caret-color:red;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.search_icon{height:44px;width:44px;float:right;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:50%;color:white}.search_icon p{height:0.6em;font-weight:bold}
/*# sourceMappingURL=search.min.css.map */

View File

@ -0,0 +1,9 @@
{
"version": 3,
"mappings": "AAAA,AAAA,aAAa,AAAA,CACT,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CACV,UAAU,CAAE,IAAI,CAChB,SAAS,CAAE,KAAK,CAChB,KAAK,CAAE,CAAC,CACR,WAAW,CAAC,WAAW,CACvB,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,iBAAiB,CAQhC,AAjBD,AAUI,aAVS,AAUR,IAAK,CAAA,kBAAkB,CAAE,CACtB,OAAO,CAAE,MAAM,CACf,KAAK,CAAE,IAAI,CACX,SAAS,CAAE,KAAK,CAChB,WAAW,CAAC,GAAG,CACf,UAAU,CAAE,iBAAiB,CAChC,AAGL,AAAA,UAAU,AAAC,CACP,MAAM,CAAE,IAAI,CACZ,SAAS,CAAE,KAAK,CAChB,gBAAgB,CAAE,OAAO,CACzB,aAAa,CAAE,IAAI,CACnB,OAAO,CAAE,IAAI,CAehB,AApBD,AAOQ,UAPE,AAML,MAAM,CACD,YAAY,AAAA,CACV,UAAU,CAAE,KAAK,CACjB,KAAK,CAAE,OAAO,CACjB,AAVT,AAWQ,UAXE,AAML,MAAM,CAKD,aAAa,AAAA,CACX,OAAO,CAAE,MAAM,CACf,SAAS,CAAE,KAAK,CAChB,KAAK,CAAE,GAAG,CACV,SAAS,CAAE,KAAK,CAChB,WAAW,CAAC,GAAG,CACf,UAAU,CAAE,iBAAiB,CAChC,AAIT,AAAA,YAAY,AAAA,CACR,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,MAAM,CACvB,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,GAAG,CAClB,KAAK,CAAC,KAAK,CAKd,AAbD,AASI,YATQ,CASR,CAAC,AAAC,CACE,MAAM,CAAE,KAAK,CACb,WAAW,CAAE,IAAI,CACpB",
"sources": [
"../scss/search.scss"
],
"names": [],
"file": "search.min.css"
}

View File

@ -1,681 +0,0 @@
body {
padding-top: 40px;
padding-left: 0px;
padding-right: 0px;
-webkit-text-size-adjust: none;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: moz-none;
-ms-user-select: none;
user-select: none;
}
body.black_background {
background: black;
}
body.black_background .page-header {
border-bottom: 0;
}
body.black_background .page-header h1 {
color: #888;
}
.navbar-fixed-top {
position: fixed;
margin: 0;
}
.navbar-fixed-top .navbar-inner {
padding-left: 0;
padding-right: 0;
}
.sidebar-nav .btn {
margin: 5px 0;
min-width: 100px;
}
.navbar .nav .divider {
height: 1px;
overflow: hidden;
background-color: #444;
}
#main-container {
padding-left: 20px;
padding-right: 20px;
}
#main-content {
display: table;
width: 100%;
}
#sidebar-container {
display: table-cell;
vertical-align: top;
width: 1px;
white-space: nowrap;
}
#page-container {
display: table-cell;
vertical-align: top;
}
.powered {
display: inline-block;
white-space: nowrap;
}
.page-header {
display: table;
width: 100%;
}
.header-label {
display: table-cell;
}
.header-accessories {
display: table-cell;
white-space: nowrap;
text-align: right;
}
.header-accessories .btn-group {
display: inline-block;
vertical-align: bottom;
}
table {
background-color: white;
}
.tab-content {
display: block;
width: auto;
padding-top: 0;
padding-bottom: 0;
}
.tab-content.well {
padding-top: 19px;
}
.nav-tabs {
position: relative;
top: 1px;
margin-left: 10px;
margin-bottom: 0;
border: 0;
}
.nav-tabs > .active > a, .nav-tabs > .active > a:hover {
background-color: #f5f5f5;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}
.nav-tabs > li > a, .nav-tabs > li > a:hover {
padding: 8px 8px;
}
/** Rtl language Style */
.rtl{
direction:rtl;
}
.rtl body,.rtl p,.rtl input,.rtl button,.rtl select,.rtl textarea,.rtl .jqplot-target{
font-family:sans-serif;
}
.rtl .navbar .brand{
float:right;
}
.rtl .navbar .nav{
float:right;
}
.rtl .navbar .nav.pull-right{
float:left;
}
.rtl .pull-right{
float:left;
}
.rtl .pull-left{
float:right;
}
.rtl .navbar .nav>li{
float:right;
}
.rtl .header-accessories{
text-align:left;
}
.rtl .form-horizontal .control-label{
float:right;
}
.rtl .btn-group .btn{
float:right;
}
.rtl .nav-tabs>li,.rtl .nav-pills>li{
float:right;
}
.rtl .form-horizontal .controls{
margin-right:190px;
}
.rtl .radio input[type="radio"],
.rtl .checkbox input[type="checkbox"]{
float:right;
margin-right:-18px;
}
.rtl .radio,
.rtl .checkbox{
padding-right:18px;
}
.rtl .entity{
text-align: right;
margin-left:20px;
margin-right:0;
}
.rtl .btn-group .btn:last-child{
margin-left:0;
-webkit-border-top-left-radius:4px;
-moz-border-radius-topleft:4px;
border-top-left-radius:4px;
-webkit-border-bottom-left-radius:4px;
-moz-border-radius-bottomleft:4px;
border-bottom-left-radius:4px;
-webkit-border-top-right-radius:0;
-moz-border-radius-topright:0;
border-top-right-radius:0;
-webkit-border-bottom-right-radius:0;
-moz-border-radius-bottomright:0;
border-bottom-right-radius:0;
}
.rtl .btn-group .btn:first-child{
-webkit-border-top-right-radius:4px;
-moz-border-radius-topright:4px;
border-top-right-radius:4px;
-webkit-border-bottom-right-radius:4px;
-moz-border-radius-bottomright:4px;
border-bottom-right-radius:4px;
-webkit-border-top-left-radius:0;
-moz-border-radius-topleft:0;
border-top-left-radius:0;
-webkit-border-bottom-left-radius:0;
-moz-border-radius-bottomleft:0;
border-bottom-left-radius:0;
}
.rtl .table th, .rtl .table td {
text-align:right;
}
.rtl .dropdown-menu{
right:0;
left:inherit;
}
/* Tables */
.align-middle {
vertical-align: middle;
}
.tight {
width: 10px;
white-space: nowrap;
}
.nowrap {
white-space: nowrap;
}
.table-body {
display: table;
width: 100%;
}
.table-row {
display: table-row
}
.table-cell {
display: table-cell;
vertical-align: top;
}
.table-cell-title {
display: table-cell;
vertical-align: middle;
height: 32px;
}
.table-cell-title .label {
position: relative;
top: -2px;
}
.table-separator {
margin: 4px 0;
border-top: 1px solid #EEE;
border-bottom: 1px solid #FFF;
}
td.cell-center {
text-align: center;
}
@media (max-width: 767px) {
.table-cell .title, .table-cell-title .title {
font-size: 1.1em;
font-weight: bold;
}
}
.table-cell-details {
display: table-cell;
font-size: 11px;
font-style: italic;
line-height: 13px;
}
/* Form */
legend {
margin-top: 0px;
margin-bottom: 0px;
}
.form-horizontal .control-label {
width: 180px;
}
.form-horizontal .controls {
margin-left: 190px;
}
.form-horizontal .form-actions {
padding-left: 190px;
margin-bottom: 0;
}
.form-horizontal label {
font-weight: bold;
}
.help-block {
font-style: italic;
color: #666;
}
/* Status page */
h2 {
font-size: 16px;
line-height: 12px;
}
h2 small {
font-size: 18px;
}
.offline, .online {
display: inline-block;
width: 100%;
max-width: 320px;
}
.entity {
text-align: left;
padding: 10px;
box-shadow: 0px 0px 5px #666;
border-radius: 3px;
margin-right: 20px;
margin-bottom: 20px;
cursor: pointer;
}
.entity h2 {
margin-bottom: 10px;
}
.entity p {
margin: 0;
padding: 0;
}
.offline .entity {
background: #a00000;
color: #f7cece;
border: 2px solid #f7cece;
}
.offline .entity.warning {
background: #FAA732;
color: #F3F3B1;
border: 2px solid #F3F3B1;
}
.online .entity {
background: #53a000;
color: #d8f7ce;
border: 2px solid #d8f7ce;
}
.entity-container table td {
padding: 6px 8px;
vertical-align: middle;
}
.row-offline, .row-online {
cursor: pointer;
}
.row-offline td, .row-offline tr:hover td {
background: #a00000 !important;
color: #f7cece;
}
.row-offline td.warning, .row-offline tr:hover tr.warning {
background: #FAA732 !important;
color: #F3F3B1;
}
.row-online td, .row-online tr:hover td {
background: #53a000 !important;
color: #d8f7ce;
}
.entity-container .server-name {
display: inline-block;
font-size: 1.15em;
line-height: 18px;
font-weight: bold;
white-space: nowrap;
}
.visible-small {
display: none;
}
td.visible-desktop, th.visible-desktop,
td.hidden-phone, th.hidden-phone,
td.hidden-tablet, th.hidden-tablet {
display: table-cell;
}
span.visible-desktop, span.visible-desktop,
span.hidden-phone, span.hidden-phone,
span.hidden-tablet, span.hidden-tablet {
display: inline-block;
}
span.visible-phone, span.visible-phone,
span.visible-tablet, span.visible-tablet,
span.hidden-desktop, span.hidden-desktop {
display: none;
}
@media (min-width: 980px) {
.hidden-desktop {
display: none !important;
}
}
@media (max-width: 979px) {
#sidebar-container {
display: table-row;
}
#page-container {
display: table-row;
}
.sidebar-nav .nav-list {
padding: 0;
}
.sidebar-nav li.nav-header {
display: none;
}
.sidebar-nav li {
float: left;
margin-right: 15px;
}
.navbar .brand {
margin-left: -10px;
}
.visible-desktop {
display: none !important;
}
.tab-content.well {
padding-left: 10px;
padding-right: 10px;
}
}
@media (max-width: 767px) {
td.visible-phone, th.visible-phone,
td.hidden-desktop, th.hidden-desktop {
display: table-cell;
}
span.visible-phone, span.visible-phone,
span.hidden-desktop, span.hidden-desktop {
display: inline-block;
}
td.hidden-phone, th.hidden-phone,
td.visible-desktop, th.visible-desktop {
display: none;
}
span.hidden-phone, span.hidden-phone,
span.visible-desktop, span.visible-desktop {
display: none;
}
}
@media (min-width: 768px) and (max-width: 979px) {
td.visible-tablet, th.visible-tablet,
td.hidden-desktop, th.hidden-desktop {
display: table-cell;
}
span.visible-tablet, span.visible-tablet,
span.hidden-desktop, span.hidden-desktop {
display: inline-block;
}
td.hidden-tablet, th.hidden-tablet,
td.visible-desktop, th.visible-desktop {
display: none;
}
span.hidden-tablet, span.hidden-tablet,
span.visible-desktop, span.visible-desktop {
display: none;
}
}
@media (max-width: 479px) {
#main-container, .container-fluid {
padding-left: 10px;
padding-right: 10px;
}
.form-horizontal .controls {
margin-left: 0px;
}
.form-horizontal .form-actions {
padding-left: 10px;
text-align: center;
}
.entity-container {
text-align: center;
}
.entity {
margin: 0 10px 20px 10px;
}
.hidden-small {
display: none !important;
}
.action-small {
text-align: center !important;
background-color: white;
}
.visible-small {
display: block;
}
td.visible-small {
display: table-cell;
}
}
body.install{
padding-top:20px;
}
.install_header h2 {
line-height: 100px;
}
.install_header img {
height: 100px;
}
.label-status-on, .label-status-off, .label-status-warning {
vertical-align: baseline;
}
.label-status-on {
background-color: #468847;
}
.label-status-off,
.label-error {
background-color: #B94A48;
}
.label-status-warning {
background-color: #FAA732;
}
.label a{
color:#FFF;
text-decoration:none;
}
.footer{
margin-top:20px;
border-top:1px solid #EEEEEE;
padding-top:10px;
}
.footer a{
font-weight:bold;
}
div.tabbable ul.nav-tabs li{
font-weight:bold;
}
legend{
border-color: -moz-use-text-color -moz-use-text-color #CCCCCC;
margin-bottom: 10px;
}
.form-actions {
background-color: transparent;
}
.form-signin {
max-width: 300px;
padding: 19px 29px 29px;
margin: 0 auto 20px;
background-color: #fff;
border: 1px solid #e5e5e5;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05);
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.05);
box-shadow: 0 1px 2px rgba(0,0,0,.05);
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin input[type="text"],
.form-signin input[type="password"] {
font-size: 16px;
height: auto;
margin-bottom: 15px;
padding: 7px 9px;
}
.dropdown-menu span {
display: block;
padding: 3px 15px;
clear: both;
font-weight: normal;
line-height: 18px;
color: #333333;
white-space: nowrap;
}
#flashmessage {
max-width: 350px;
margin: auto;
margin-bottom: 18px;
}
.oce-first{
background-color:#eee;
}
/* Bootstrap 2.3.2 added icons */
.icon-hdd {
background-position: 0 -144px;
}
.icon-bullhorn {
background-position: -24px -144px;
}
.icon-bell {
background-position: -48px -144px;
}
.icon-certificate {
background-position: -72px -144px;
}
.icon-thumbs-up {
background-position: -96px -144px;
}
.icon-thumbs-down {
background-position: -120px -144px;
}
.icon-hand-right {
background-position: -144px -144px;
}
.icon-hand-left {
background-position: -168px -144px;
}
.icon-hand-up {
background-position: -192px -144px;
}
.icon-hand-down {
background-position: -216px -144px;
}
.icon-circle-arrow-right {
background-position: -240px -144px;
}
.icon-circle-arrow-left {
background-position: -264px -144px;
}
.icon-circle-arrow-up {
background-position: -288px -144px;
}
.icon-circle-arrow-down {
background-position: -312px -144px;
}
.icon-globe {
background-position: -336px -144px;
}
.icon-wrench {
background-position: -360px -144px;
}
.icon-tasks {
background-position: -384px -144px;
}
.icon-filter {
background-position: -408px -144px;
}
.icon-briefcase {
background-position: -432px -144px;
}
.icon-fullscreen {
background-position: -456px -144px;
}
/* personal added icons */
.icon-chart {
background-position: 0px -168px;
}
.icon-mobile {
background-position: -24px -168px;
}
.icon-admin {
background-position: -48px -168px;
}
.icon-pushover {
background-position: -72px -168px;
}
.icon-telegram {
background-position: -96px -168px;
}
.icon-expand-arrow {
background-position: -312px -120px;
}

2
static/css/style.min.css vendored Normal file
View File

@ -0,0 +1,2 @@
html{position:relative;min-height:100%}html[dir='rtl'] #auto_refresh_servers,html[dir='rtl'] #log_retention_period{border-left-width:0px}html[dir='rtl'] #auto_refresh_servers_input,html[dir='rtl'] #log_retention_period_input{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0;border-bottom-right-radius:0}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}#auto_refresh_servers,#log_retention_period{border-right-width:0px}#auto_refresh_servers_input,#log_retention_period_input{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-top-left-radius:0;border-bottom-left-radius:0}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 tr[visible='false'],.no-result{display:none}table tr[visible='true']{display:table-row}.search_input{color:white;border:0;outline:0;background:none;width:0;caret-color:transparent;line-height:44px;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.search_input:not(:placeholder-shown){padding:0 10px;width:100%;max-width:450px;caret-color:red;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.searchbar{height:66px;background-color:#353b48;border-radius:40px;padding:10px}.searchbar:hover>.search_icon{background:white;color:#e74c3c}.searchbar:hover>.search_input{padding:0 10px;width:100%;max-width:450px;caret-color:red;-webkit-transition:width 0.4s linear;transition:width 0.4s linear}.search_icon{height:44px;width:44px;float:right;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:50%;color:white}.search_icon p{height:0.6em;font-weight:bold}
/*# sourceMappingURL=style.min.css.map */

View File

@ -0,0 +1,9 @@
{
"version": 3,
"mappings": "AAAA,AAAA,IAAI,AAAC,CACJ,QAAQ,CAAE,QAAQ,CAClB,UAAU,CAAE,IAAI,CAChB,AACD,AACI,IADA,CAAA,AAAA,GAAC,CAAI,KAAK,AAAT,EACD,qBAAqB,CADzB,IAAI,CAAA,AAAA,GAAC,CAAI,KAAK,AAAT,EAED,qBAAqB,AAAC,CAClB,iBAAiB,CAAE,GACvB,CAAC,AAJL,AAKI,IALA,CAAA,AAAA,GAAC,CAAI,KAAK,AAAT,EAKD,2BAA2B,CAL/B,IAAI,CAAA,AAAA,GAAC,CAAI,KAAK,AAAT,EAMD,2BAA2B,AAAC,CACxB,sBAAsB,CAAE,MAAM,CAC9B,yBAAyB,CAAE,MAAM,CACjC,uBAAuB,CAAE,CAAC,CAC1B,0BAA0B,CAAE,CAAC,CAChC,AAEL,AAAA,IAAI,AAAC,CACJ,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,IAAI,CACnB,AACD,AAAA,OAAO,AAAC,CACP,QAAQ,CAAE,QAAQ,CAClB,MAAM,CAAE,CAAC,CACT,KAAK,CAAE,IAAI,CACX,MAAM,CAAE,IAAI,CACZ,WAAW,CAAE,IAAI,CACjB,gBAAgB,CAAE,OAAO,CACzB,AACD,AAAA,YAAY,CAAC,WAAW,CAAC,SAAS,AAAC,CAC/B,KAAK,CAAE,sBAAqB,CAK/B,AAND,AAEI,YAFQ,CAAC,WAAW,CAAC,SAAS,AAE7B,MAAM,CAFX,YAAY,CAAC,WAAW,CAAC,SAAS,AAG7B,MAAM,AAAC,CACJ,KAAK,CAAE,sBAAqB,CAC/B,AAEL,AAAA,EAAE,CAAE,EAAE,CAAE,EAAE,AAAA,CACN,aAAa,CAAE,CAAC,CACnB,AACD,AAAA,MAAM,CAAC,WAAW,AAAC,CACf,KAAK,CAAE,OAAO,CAAA,UAAU,CAC3B,AACD,AAAA,CAAC,CACD,MAAM,CACN,SAAS,AAAC,CACT,UAAU,CAAE,IAAI,CAAA,UAAU,CAC1B,SAAS,CAAE,IAAI,CAAA,UAAU,CACzB,AACD,AAAA,CAAC,AAAA,KAAK,AAAC,CACH,eAAe,CAAE,IAAI,CACrB,MAAM,CAAE,OAAO,CACf,YAAY,CAAE,IAAI,CACrB,AACD,AAAA,qBAAqB,CACrB,qBAAqB,AAAC,CACrB,kBAAkB,CAAE,GACrB,CAAC,AACD,AAAA,2BAA2B,CAC3B,2BAA2B,AAAC,CAC3B,uBAAuB,CAAE,MAAM,CAC/B,0BAA0B,CAAE,MAAM,CAClC,sBAAsB,CAAE,CAAC,CACzB,yBAAyB,CAAE,CAAC,CAC5B,AACD,AAAA,IAAI,AAAA,YAAY,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,EACvB,IAAI,AAAA,WAAW,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,MAAM,AAAX,CAAa,CAClC,yBAAyB,CAAE,CAAC,CAC5B,0BAA0B,CAAE,CAAC,CAC7B,AACD,AAAA,IAAI,AAAA,YAAY,CAAC,KAAK,CAAA,AAAA,IAAC,CAAK,UAAU,AAAf,CAAiB,CACvC,sBAAsB,CAAE,CAAC,CACzB,uBAAuB,CAAE,CAAC,CAC1B,AACD,AACI,IADA,AAAA,WAAW,CACX,KAAK,AAAA,eAAe,AAAE,CAClB,aAAa,CAAE,CAAC,CACnB,AAHL,AAII,IAJA,AAAA,WAAW,CAIX,KAAK,AAAA,sBAAsB,AAAC,CACxB,sBAAsB,CAAE,CAAC,CACzB,uBAAuB,CAAE,CAAC,CAC7B,AAEL,AAAA,IAAI,AAAA,YAAY,CAChB,IAAI,AAAA,YAAY,CAChB,IAAI,AAAA,WAAW,AAAC,CACf,MAAM,CAAE,IAAI,CACZ,AACD,AAAA,KAAK,CAAC,EAAE,CAAA,AAAA,OAAC,CAAQ,OAAO,AAAf,EACT,UAAU,AAAA,CACR,OAAO,CAAC,IAAI,CACb,AACD,AAAA,KAAK,CAAC,EAAE,CAAA,AAAA,OAAC,CAAQ,MAAM,AAAd,CAAe,CACtB,OAAO,CAAC,SAAS,CAClB,AAED,AAAA,aAAa,AAAA,CACT,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,CAAC,CACT,OAAO,CAAE,CAAC,CACV,UAAU,CAAE,IAAI,CAChB,KAAK,CAAE,CAAC,CACR,WAAW,CAAC,WAAW,CACvB,WAAW,CAAE,IAAI,CACjB,UAAU,CAAE,iBAAiB,CAQhC,AAhBD,AASI,aATS,AASR,IAAK,CAAA,kBAAkB,CAAE,CACtB,OAAO,CAAE,MAAM,CACf,KAAK,CAAE,IAAI,CACX,SAAS,CAAE,KAAK,CAChB,WAAW,CAAC,GAAG,CACf,UAAU,CAAE,iBAAiB,CAChC,AAGL,AAAA,UAAU,AAAC,CACP,MAAM,CAAE,IAAI,CACZ,gBAAgB,CAAE,OAAO,CACzB,aAAa,CAAE,IAAI,CACnB,OAAO,CAAE,IAAI,CAchB,AAlBD,AAMQ,UANE,AAKL,MAAM,CACD,YAAY,AAAA,CACV,UAAU,CAAE,KAAK,CACjB,KAAK,CAAE,OAAO,CACjB,AATT,AAUQ,UAVE,AAKL,MAAM,CAKD,aAAa,AAAA,CACX,OAAO,CAAE,MAAM,CACf,KAAK,CAAE,IAAI,CACX,SAAS,CAAE,KAAK,CAChB,WAAW,CAAC,GAAG,CACf,UAAU,CAAE,iBAAiB,CAChC,AAIT,AAAA,YAAY,AAAA,CACR,MAAM,CAAE,IAAI,CACZ,KAAK,CAAE,IAAI,CACX,KAAK,CAAE,KAAK,CACZ,OAAO,CAAE,IAAI,CACb,eAAe,CAAE,MAAM,CACvB,WAAW,CAAE,MAAM,CACnB,aAAa,CAAE,GAAG,CAClB,KAAK,CAAC,KAAK,CAKd,AAbD,AASI,YATQ,CASR,CAAC,AAAC,CACE,MAAM,CAAE,KAAK,CACb,WAAW,CAAE,IAAI,CACpB",
"sources": [
"../scss/style.scss"
],
"names": [],
"file": "style.min.css"
}

View File

@ -1,164 +1,13 @@
$().ready(function()
{
$('.chart').each(function() {
var $this = $(this);
create_plot($this);
});
$(window).resize(function(){
$('.chart').each(function() {
var plot = $(this).data('psm_plot');
if(plot)
plot.replot( );
});
});
$('.chart-selector .btn').click(function(){
var $btn = $(this);
var chartID = $btn.attr('data-chartId');
var chartMode = $btn.attr('data-chartMode');
create_plot($('#chart' + chartID), chartMode);
$btn.siblings('.btn-info').removeClass('btn-info');
$btn.addClass('btn-info');
});
});
function create_plot($this, mode)
{
if(!$this) return;
var plot = $this.data('psm_plot');
if(plot) {
plot.destroy();
$this.removeData('psm_plot');
}
if($this.attr('data-endTime')) {
var d = new Date(parseInt($this.attr('data-endTime')));
} else {
var d = new Date();
}
var time = d.getTime();
var lines = $this.attr('data-lines');
if(!lines) {
lines = [[[0, 0]]];
}
else if(typeof(lines) == 'string') {
lines = eval(lines);
}
mode = mode || $this.attr('data-plotMode') || 'hour';
$this.attr('data-plotMode', mode);
var timeStamp, tickFormat;
var showMarker = false;
var showLegend = true;
switch(mode)
{
case 'year':
timeStamp = 1000 * 60 * 60 * 24 * 365.25;
tickFormat = day_format;
break;
case 'month':
timeStamp = 1000 * 60 * 60 * 24 * 30;
tickFormat = day_format;
break;
case 'week':
case 'week2':
timeStamp = 1000 * 60 * 60 * 24 * 7;
tickFormat = short_date_format;
showMarker = (mode == 'week2');
break;
case 'day':
timeStamp = 1000 * 60 * 60 *24;
tickFormat = short_time_format;
break;
case 'hour':
default:
showMarker = true;
timeStamp = 1000 * 60 * 60;
tickFormat = short_time_format;
break;
}
var downArray = new Array();
var down = $this.attr('data-down');
if(down) {
if(typeof(down) == 'string') {
down = eval(down);
}
for (var index = 0; index < down.length; ++index) {
var interval = down[index];
var d = new $.jsDate(interval[0]);
downArray.push({rectangle: {
xmin: interval[0],
xmax: interval[1] || time,
yOffset: '1px',
color: '#fe5d5d',
showTooltip: true,
showTooltipPrecision: 1.0,
tooltipFormatString: "&darr; " + d.strftime(long_date_format)
}});
}
}
var series = eval($this.attr('data-series'));
if(Array.isArray(series)) {
for (var i=0; i<series.length; i++)
{
$.extend(true, series[i], {
markerOptions: {
show: showMarker
},
lineWidth: 1
});
}
} else {
series = [{}];
showLegend = false;
}
plot = $.jqplot($this.attr('id'), lines, {
title: $this.attr('data-title'),
series: series,
legend: {
show: showLegend,
placement: 'insideGrid',
location: 'nw'
},
axes : {
xaxis:{
renderer:$.jqplot.DateAxisRenderer,
tickOptions : { formatString: tickFormat },
min: time - timeStamp,
max: time
},
yaxis:{
min: 0
}
},
highlighter: {
show: true,
sizeAdjust: 7.5,
useAxesFormatters: false,
tooltipContentEditor: function(str, seriesIndex, pointIndex, plot)
{
var point = plot.series[seriesIndex].data[pointIndex];
var d = new $.jsDate(point[0]);
return "&uarr; " + d.strftime(long_date_format) + ' - ' + $.jqplot.sprintf('%.3fs', point[1]);
}
},
canvasOverlay: {
show: true,
objects: downArray
},
cursor:{
show: true,
zoom: true,
showTooltip:false,
dblClickReset: true,
constrainZoomTo: 'x'
}
});
$this.data('psm_plot', plot);
function updateScale(chart, min, unit) {
chart.options.scales.xAxes[0].time.min = min;
chart.options.scales.xAxes[0].time.unit = unit;
// 0 to disable animation
chart.update(0);
}
$('input[name=timeframe_short]').change(function() {
updateScale(historyShort, parseInt($('input[name=timeframe_short]:checked').val()), $('input[name=timeframe_short]:checked')[0].id);
});
$('input[name=timeframe_long]').change(function() {
updateScale(historyLong, parseInt($('input[name=timeframe_long]:checked').val()), $('input[name=timeframe_long]:checked')[0].id);
});

View File

@ -1,4 +1,4 @@
$().ready(function() {
$().ready(function () {
$('.show-modal').click(function (e) {
var $this = $(this);
if ($this.is('a')) {
@ -14,11 +14,10 @@ $().ready(function() {
var ary = param.split(',');
for (var index = 0; index < ary.length && index < 9; ++index) {
var value = ary[index];
$($modal).find('span.modalP' + (index+1)).text(value);
$($modal).find('span.modalP' + (index + 1)).text(value);
}
}
scroll(0, 0);
$modal.modal('show');
$modal.modal();
} else {
// Just in case we forgot the dialog box
var conf = confirm("Are you sure?");
@ -29,142 +28,83 @@ $().ready(function() {
return false;
});
$('.modalOKButton').click(function(e) {
var $this = $(this);
var $origin = $this.data('modal-origin');
$('.modalOKButton').click(function (e) {
var $origin = $(this).data('modal-origin');
if ($origin.is('a')) {
window.location = $origin.attr('href');
} else {
}
else {
$origin.next('input[type=hidden]').attr('value', 1);
$origin.closest('form').submit();
}
return false;
});
$('select.multiselect').multiselect({
includeSelectAllOption: true,
maxHeight: 400,
enableCaseInsensitiveFiltering: true
});
psm_flash_message();
psm_tooltips();
// popularPorts
// initial
$('.portGroup').hide();
var portInput = $('#port').val();
if (portInput != '') {
var findPopularPorts = $('#popularPorts').find('option[value=' + portInput + ']');
if (findPopularPorts.length) {
$(findPopularPorts).attr("selected", "selected");
} else {
$('#popularPorts').find('option[value=custom]').attr("selected", "selected");
$('.portGroup').slideDown();
}
if ($('#list-layout').length > 0) {
$("#list-layout").hide();
$("#flow-layout").hide();
if ($("#list-layout").hasClass('active')) {
$("#list-layout").show();
}
if ($("#flow-layout").hasClass('active')) {
$("#flow-layout").show();
}
}
$('#popularPorts').change(function () {
changePopular($(this).val(), $('#type').val());
});
// popularRequestMethods
// initial
$('.requestMethodGroup').hide();
var requestMethodInput = $('#requestMethod').val();
if (requestMethodInput != '') {
var findPopularRequestMethods = $('#popularRequestMethods').find('option[value=' + requestMethodInput + ']');
if (findPopularRequestMethods.length) {
$(findPopularRequestMethods).attr("selected", "selected");
} else {
$('#popularRequestMethods').find('option[value=custom]').attr("selected", "selected");
$('.requestMethodGroup').slideDown();
}
}
$('#popularRequestMethods').change(function () {
changePopular($(this).val(), $('#type').val());
});
// server type
$('.types').hide();
changeTypeSwitch($('#type').val());
$('#type').change(function () {
changeTypeSwitch($('#type').val());
});
// advanced information
$(".advanced").hide();
var advanced = 0;
$("#advanced").click(
function() {
advancedSwitch((advanced += 1) % 2);
});
$('#label').focus();
});
function advancedSwitch(statusInput) {
switch (statusInput) {
case 0:
$(".advanced").slideUp();
break;
case 1:
$(".advanced").slideDown();
break;
default:
$(".advanced").hide();
}
}
function changeTypeSwitch(typeInput) {
switch (typeInput) {
case 'service':
$('.types').slideUp();
$('.typeService').slideDown();
changePopular($('#popularPorts').val(), typeInput, true);
break;
case 'website':
$('.types').slideUp();
$("#type").change(function () {
switch ($("select#type option:checked").val()) {
case "website":
$('.typeService').slideUp();
$('.typeWebsite').slideDown();
changePopular($('#popularRequestMethods').val(), typeInput, true);
$("select#popular_request_methods").change();
break;
case "service":
$('.typeWebsite').slideUp();
$('.typeService').slideDown();
$("select#popular_ports").change();
break;
default:
$('.types').slideUp();
}
}
}).change();
function changePopular(inputValue, typeInput, changedType = false) {
if (typeInput === 'website') {
htmlClass = '.requestMethodGroup';
htmlID = '#requestMethod';
postClass = '.postGroup';
} else if (typeInput === 'service') {
htmlClass = '.portGroup';
htmlID = '#port';
}
if (typeInput === 'website' && inputValue === '') {
changedType ? $(postClass).hide() : $(postClass).slideUp();
} else {
$(postClass).slideDown();
}
if (inputValue === 'custom') {
$(htmlClass).slideDown();
return;
$("select#popular_request_methods").change(function () {
if ($("select#type option:checked").val() != "website") return;
switch ($("select#popular_request_methods option:checked").val()) {
case "":
$('.requestMethod').slideUp();
$('#request_method').val($("select#popular_request_methods option:checked").val());
break;
case "custom":
$('.requestMethod').slideDown();
$('#request_method').focus();
break;
default:
$('#request_method').val($("select#popular_request_methods option:checked").val());
$('.requestMethod').slideUp();
}
}).change();
changedType ? $(htmlClass).hide() : $(htmlClass).slideUp();
$(htmlID).val(inputValue);
$("select#popular_ports").change(function () {
if ($("select#type option:checked").val() != "service") return;
switch ($("select#popular_ports option:checked").val()) {
case "0":
case "":
$('#port').val($("select#popular_ports option:checked").val());
$('.port').slideUp();
break;
case "custom":
$('.port').slideDown();
$('#port').focus();
break;
default:
$('#port').val($("select#popular_ports option:checked").val());
$('.port').slideUp();
}
}).change();
}
function psm_xhr(mod, params, method, on_complete, options) {
method = (typeof method === 'undefined') ? 'GET' : method;
@ -172,7 +112,7 @@ function psm_xhr(mod, params, method, on_complete, options) {
data: params,
type: method,
success: on_complete,
error: function(jqjqXHR, textStatus, errorThrown) {
error: function (jqjqXHR, textStatus, errorThrown) {
psm_flash_message(errorThrown);
}
};
@ -184,6 +124,20 @@ function psm_xhr(mod, params, method, on_complete, options) {
}
function psm_saveLayout(layout) {
if (layout) {
$("#list-layout").show();
$("#flow-layout").hide();
$("#block-layout").removeClass('active');
$("#table-layout").addClass('active');
}
else {
$("#list-layout").hide();
$("#flow-layout").show();
$("#block-layout").addClass('active');
$("#table-layout").removeClass('active');
}
var params = {
action: 'saveLayout',
csrf: $("input[name=saveLayout_csrf]").val(),
@ -192,47 +146,13 @@ function psm_saveLayout(layout) {
psm_xhr('server_status', params, 'POST');
}
function psm_tooltips() {
$('input[data-toggle="tooltip"]').tooltip({
'trigger':'hover',
'placement': 'right',
'container': 'body'
});
$('i[data-toggle="tooltip"]').tooltip({
'trigger':'hover',
'placement': 'bottom'
});
}
function psm_goTo(url) {
window.location = url;
}
function trim(str) {
return str.replace(/^\s+|\s+$/g,"");
}
//left trim
function ltrim(str) {
return str.replace(/^\s+/,"");
}
//right trim
function rtrim(str) {
return str.replace(/\s+$/,"");
}
function psm_flash_message(message) {
var flashmessage = $('#flashmessage');
if(flashmessage.length){
if(typeof message !== 'undefined') {
flashmessage.html(message);
}
var t = flashmessage.html();
var c = trim(t);
var t = c.replace('&nbsp;', '');
if (t) {
flashmessage.slideDown();
}
}
if ($(".search_input").length > 0) {
$.getScript("static/js/search.js");
$('<link>')
.appendTo('head')
.attr({
type: 'text/css',
rel: 'stylesheet',
href: 'static/css/search.min.css'
});
}

36
static/js/search.js Normal file
View File

@ -0,0 +1,36 @@
$('.search_icon p').hide();
$(".search_input").keyup(function () {
var searchTerm = $(".search_input").val().toLowerCase();
$("table tbody tr").each(function (e) {
col1 = this.cells[0].innerText.toLowerCase().indexOf(searchTerm);
col2 = this.cells[1].innerText.toLowerCase().indexOf(searchTerm);
if (col1 >= 0) {
$(this).attr('visible', 'true');
}
else if (col2 >= 0) {
$(this).attr('visible', 'true');
}
else {
$(this).attr('visible', 'false');
}
});
var jobCount = $('table tbody tr[visible="true"]').length;
if($(".search_input").is(":placeholder-shown")){
$('.search_icon i').show();
$('.search_icon p').hide();
}
else{
$('.search_icon i').hide();
$('.search_icon p').show();
}
$('.search_icon p').text(jobCount);
if (jobCount == '0') {
$('.no-result').show();
}
else {
$('.no-result').hide();
}
});

View File

@ -1 +0,0 @@
span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2012-2018 SnapAppointments, LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,394 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
select.bs-select-hidden,
.bootstrap-select > select.bs-select-hidden,
select.selectpicker {
display: none !important;
}
.bootstrap-select {
width: 220px \0;
/*IE9 and below*/
vertical-align: middle;
}
.bootstrap-select > .dropdown-toggle {
position: relative;
width: 100%;
z-index: 1;
text-align: right;
white-space: nowrap;
}
.bootstrap-select > .dropdown-toggle.bs-placeholder,
.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
color: #999;
}
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active,
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active {
color: rgba(255, 255, 255, 0.5);
}
.bootstrap-select > select {
position: absolute !important;
bottom: 0;
left: 50%;
display: block !important;
width: 0.5px !important;
height: 100% !important;
padding: 0 !important;
opacity: 0 !important;
border: none;
}
.bootstrap-select > select.mobile-device {
top: 0;
left: 0;
display: block !important;
width: 100% !important;
z-index: 2;
}
.has-error .bootstrap-select .dropdown-toggle,
.error .bootstrap-select .dropdown-toggle,
.bootstrap-select.is-invalid .dropdown-toggle,
.was-validated .bootstrap-select .selectpicker:invalid + .dropdown-toggle {
border-color: #b94a48;
}
.bootstrap-select.is-valid .dropdown-toggle,
.was-validated .bootstrap-select .selectpicker:valid + .dropdown-toggle {
border-color: #28a745;
}
.bootstrap-select.fit-width {
width: auto !important;
}
.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
width: 220px;
}
.bootstrap-select > select.mobile-device:focus + .dropdown-toggle,
.bootstrap-select .dropdown-toggle:focus {
outline: thin dotted #333333 !important;
outline: 5px auto -webkit-focus-ring-color !important;
outline-offset: -2px;
}
.bootstrap-select.form-control {
margin-bottom: 0;
padding: 0;
border: none;
}
:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) {
width: 100%;
}
.bootstrap-select.form-control.input-group-btn {
z-index: auto;
}
.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.bootstrap-select:not(.input-group-btn),
.bootstrap-select[class*="col-"] {
float: none;
display: inline-block;
margin-left: 0;
}
.bootstrap-select.dropdown-menu-right,
.bootstrap-select[class*="col-"].dropdown-menu-right,
.row .bootstrap-select[class*="col-"].dropdown-menu-right {
float: right;
}
.form-inline .bootstrap-select,
.form-horizontal .bootstrap-select,
.form-group .bootstrap-select {
margin-bottom: 0;
}
.form-group-lg .bootstrap-select.form-control,
.form-group-sm .bootstrap-select.form-control {
padding: 0;
}
.form-group-lg .bootstrap-select.form-control .dropdown-toggle,
.form-group-sm .bootstrap-select.form-control .dropdown-toggle {
height: 100%;
font-size: inherit;
line-height: inherit;
border-radius: inherit;
}
.bootstrap-select.form-control-sm .dropdown-toggle,
.bootstrap-select.form-control-lg .dropdown-toggle {
font-size: inherit;
line-height: inherit;
border-radius: inherit;
}
.bootstrap-select.form-control-sm .dropdown-toggle {
padding: 0.25rem 0.5rem;
}
.bootstrap-select.form-control-lg .dropdown-toggle {
padding: 0.5rem 1rem;
}
.form-inline .bootstrap-select .form-control {
width: 100%;
}
.bootstrap-select.disabled,
.bootstrap-select > .disabled {
cursor: not-allowed;
}
.bootstrap-select.disabled:focus,
.bootstrap-select > .disabled:focus {
outline: none !important;
}
.bootstrap-select.bs-container {
position: absolute;
top: 0;
left: 0;
height: 0 !important;
padding: 0 !important;
}
.bootstrap-select.bs-container .dropdown-menu {
z-index: 1060;
}
.bootstrap-select .dropdown-toggle:before {
content: '';
display: inline-block;
}
.bootstrap-select .dropdown-toggle .filter-option {
position: absolute;
top: 0;
left: 0;
padding-top: inherit;
padding-right: inherit;
padding-bottom: inherit;
padding-left: inherit;
height: 100%;
width: 100%;
text-align: left;
}
.bootstrap-select .dropdown-toggle .filter-option-inner {
padding-right: inherit;
}
.bootstrap-select .dropdown-toggle .filter-option-inner-inner {
overflow: hidden;
}
.bootstrap-select .dropdown-toggle .caret {
position: absolute;
top: 50%;
right: 12px;
margin-top: -2px;
vertical-align: middle;
}
.input-group .bootstrap-select.form-control .dropdown-toggle {
border-radius: inherit;
}
.bootstrap-select[class*="col-"] .dropdown-toggle {
width: 100%;
}
.bootstrap-select .dropdown-menu {
min-width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.bootstrap-select .dropdown-menu > .inner:focus {
outline: none !important;
}
.bootstrap-select .dropdown-menu.inner {
position: static;
float: none;
border: 0;
padding: 0;
margin: 0;
border-radius: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
.bootstrap-select .dropdown-menu li {
position: relative;
}
.bootstrap-select .dropdown-menu li.active small {
color: rgba(255, 255, 255, 0.5) !important;
}
.bootstrap-select .dropdown-menu li.disabled a {
cursor: not-allowed;
}
.bootstrap-select .dropdown-menu li a {
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.bootstrap-select .dropdown-menu li a.opt {
position: relative;
padding-left: 2.25em;
}
.bootstrap-select .dropdown-menu li a span.check-mark {
display: none;
}
.bootstrap-select .dropdown-menu li a span.text {
display: inline-block;
}
.bootstrap-select .dropdown-menu li small {
padding-left: 0.5em;
}
.bootstrap-select .dropdown-menu .notify {
position: absolute;
bottom: 5px;
width: 96%;
margin: 0 2%;
min-height: 26px;
padding: 3px 5px;
background: #f5f5f5;
border: 1px solid #e3e3e3;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
pointer-events: none;
opacity: 0.9;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.bootstrap-select .no-results {
padding: 3px;
background: #f5f5f5;
margin: 0 5px;
white-space: nowrap;
}
.bootstrap-select.fit-width .dropdown-toggle .filter-option {
position: static;
display: inline;
padding: 0;
}
.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,
.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner {
display: inline;
}
.bootstrap-select.fit-width .dropdown-toggle .caret {
position: static;
top: auto;
margin-top: -1px;
}
.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark {
position: absolute;
display: inline-block;
right: 15px;
top: 5px;
}
.bootstrap-select.show-tick .dropdown-menu li a span.text {
margin-right: 34px;
}
.bootstrap-select .bs-ok-default:after {
content: '';
display: block;
width: 0.5em;
height: 1em;
border-style: solid;
border-width: 0 0.26em 0.26em 0;
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle,
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle {
z-index: 1061;
}
.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before {
content: '';
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid rgba(204, 204, 204, 0.2);
position: absolute;
bottom: -4px;
left: 9px;
display: none;
}
.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after {
content: '';
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid white;
position: absolute;
bottom: -4px;
left: 10px;
display: none;
}
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before {
bottom: auto;
top: -4px;
border-top: 7px solid rgba(204, 204, 204, 0.2);
border-bottom: 0;
}
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after {
bottom: auto;
top: -4px;
border-top: 6px solid white;
border-bottom: 0;
}
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before {
right: 12px;
left: auto;
}
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after {
right: 13px;
left: auto;
}
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before,
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before,
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after,
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after {
display: block;
}
.bs-searchbox,
.bs-actionsbox,
.bs-donebutton {
padding: 4px 8px;
}
.bs-actionsbox {
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.bs-actionsbox .btn-group button {
width: 50%;
}
.bs-donebutton {
float: left;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.bs-donebutton .btn-group button {
width: 100%;
}
.bs-searchbox + .bs-actionsbox {
padding: 0 8px 4px;
}
.bs-searchbox .form-control {
margin-bottom: 0;
width: 100%;
float: none;
}
/*# sourceMappingURL=bootstrap-select.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,45 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'ምንም አልተመረጠም',
noneResultsText: 'ከ{0} ጋር ተመሳሳይ ውጤት የለም',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} ምርጫ ተመርጧል' : '{0} ምርጫዎች ተመርጠዋል';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'ገደብ ላይ ተደርሷል (ቢበዛ {n} ምርጫ)' : 'ገደብ ላይ ተደርሷል (ቢበዛ {n} ምርጫዎች)',
(numGroup == 1) ? 'የቡድን ገደብ ላይ ተደርሷል (ቢበዛ {n} ምርጫ)' : 'የቡድን ገደብ ላይ ተደርሷል (ቢበዛ {n} ምርጫዎች)'
];
},
selectAllText: 'ሁሉም ይመረጥ',
deselectAllText: 'ሁሉም አይመረጥ',
multipleSeparator: ' ፣ '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"\u121d\u1295\u121d \u12a0\u120d\u1270\u1218\u1228\u1320\u121d",noneResultsText:"\u12a8{0} \u130b\u122d \u1270\u1218\u1233\u1233\u12ed \u12cd\u1324\u1275 \u12e8\u1208\u121d",countSelectedText:function(e,t){return 1==e?"{0} \u121d\u122d\u132b \u1270\u1218\u122d\u1327\u120d":"{0} \u121d\u122d\u132b\u12ce\u127d \u1270\u1218\u122d\u1320\u12cb\u120d"},maxOptionsText:function(e,t){return[1==e?"\u1308\u12f0\u1265 \u120b\u12ed \u1270\u12f0\u122d\u1237\u120d (\u1262\u1260\u12db {n} \u121d\u122d\u132b)":"\u1308\u12f0\u1265 \u120b\u12ed \u1270\u12f0\u122d\u1237\u120d (\u1262\u1260\u12db {n} \u121d\u122d\u132b\u12ce\u127d)",1==t?"\u12e8\u1261\u12f5\u1295 \u1308\u12f0\u1265 \u120b\u12ed \u1270\u12f0\u122d\u1237\u120d (\u1262\u1260\u12db {n} \u121d\u122d\u132b)":"\u12e8\u1261\u12f5\u1295 \u1308\u12f0\u1265 \u120b\u12ed \u1270\u12f0\u122d\u1237\u120d (\u1262\u1260\u12db {n} \u121d\u122d\u132b\u12ce\u127d)"]},selectAllText:"\u1201\u1209\u121d \u12ed\u1218\u1228\u1325",deselectAllText:"\u1201\u1209\u121d \u12a0\u12ed\u1218\u1228\u1325",multipleSeparator:" \u1363 "}});

View File

@ -0,0 +1,50 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
/*!
* Translated default messages for bootstrap-select.
* Locale: AR (Arabic)
* Author: Yasser Lotfy <y_l@alive.com>
*/
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'لم يتم إختيار شئ',
noneResultsText: 'لا توجد نتائج مطابقة لـ {0}',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} خيار تم إختياره' : '{0} خيارات تمت إختيارها';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'تخطى الحد المسموح ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح ({n} خيارات بحد أقصى)',
(numGroup == 1) ? 'تخطى الحد المسموح للمجموعة ({n} خيار بحد أقصى)' : 'تخطى الحد المسموح للمجموعة ({n} خيارات بحد أقصى)'
];
},
selectAllText: 'إختيار الجميع',
deselectAllText: 'إلغاء إختيار الجميع',
multipleSeparator: '، '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"\u0644\u0645 \u064a\u062a\u0645 \u0625\u062e\u062a\u064a\u0627\u0631 \u0634\u0626",noneResultsText:"\u0644\u0627 \u062a\u0648\u062c\u062f \u0646\u062a\u0627\u0626\u062c \u0645\u0637\u0627\u0628\u0642\u0629 \u0644\u0640 {0}",countSelectedText:function(e,t){return 1==e?"{0} \u062e\u064a\u0627\u0631 \u062a\u0645 \u0625\u062e\u062a\u064a\u0627\u0631\u0647":"{0} \u062e\u064a\u0627\u0631\u0627\u062a \u062a\u0645\u062a \u0625\u062e\u062a\u064a\u0627\u0631\u0647\u0627"},maxOptionsText:function(e,t){return[1==e?"\u062a\u062e\u0637\u0649 \u0627\u0644\u062d\u062f \u0627\u0644\u0645\u0633\u0645\u0648\u062d ({n} \u062e\u064a\u0627\u0631 \u0628\u062d\u062f \u0623\u0642\u0635\u0649)":"\u062a\u062e\u0637\u0649 \u0627\u0644\u062d\u062f \u0627\u0644\u0645\u0633\u0645\u0648\u062d ({n} \u062e\u064a\u0627\u0631\u0627\u062a \u0628\u062d\u062f \u0623\u0642\u0635\u0649)",1==t?"\u062a\u062e\u0637\u0649 \u0627\u0644\u062d\u062f \u0627\u0644\u0645\u0633\u0645\u0648\u062d \u0644\u0644\u0645\u062c\u0645\u0648\u0639\u0629 ({n} \u062e\u064a\u0627\u0631 \u0628\u062d\u062f \u0623\u0642\u0635\u0649)":"\u062a\u062e\u0637\u0649 \u0627\u0644\u062d\u062f \u0627\u0644\u0645\u0633\u0645\u0648\u062d \u0644\u0644\u0645\u062c\u0645\u0648\u0639\u0629 ({n} \u062e\u064a\u0627\u0631\u0627\u062a \u0628\u062d\u062f \u0623\u0642\u0635\u0649)"]},selectAllText:"\u0625\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u062c\u0645\u064a\u0639",deselectAllText:"\u0625\u0644\u063a\u0627\u0621 \u0625\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u062c\u0645\u064a\u0639",multipleSeparator:"\u060c "}});

View File

@ -0,0 +1,45 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'Нищо избрано',
noneResultsText: 'Няма резултат за {0}',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} избран елемент' : '{0} избрани елемента';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'Лимита е достигнат ({n} елемент максимум)' : 'Лимита е достигнат ({n} елемента максимум)',
(numGroup == 1) ? 'Груповия лимит е достигнат ({n} елемент максимум)' : 'Груповия лимит е достигнат ({n} елемента максимум)'
];
},
selectAllText: 'Избери всички',
deselectAllText: 'Размаркирай всички',
multipleSeparator: ', '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"\u041d\u0438\u0449\u043e \u0438\u0437\u0431\u0440\u0430\u043d\u043e",noneResultsText:"\u041d\u044f\u043c\u0430 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442 \u0437\u0430 {0}",countSelectedText:function(e,t){return 1==e?"{0} \u0438\u0437\u0431\u0440\u0430\u043d \u0435\u043b\u0435\u043c\u0435\u043d\u0442":"{0} \u0438\u0437\u0431\u0440\u0430\u043d\u0438 \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430"},maxOptionsText:function(e,t){return[1==e?"\u041b\u0438\u043c\u0438\u0442\u0430 \u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0430\u0442 ({n} \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c)":"\u041b\u0438\u043c\u0438\u0442\u0430 \u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0430\u0442 ({n} \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c)",1==t?"\u0413\u0440\u0443\u043f\u043e\u0432\u0438\u044f \u043b\u0438\u043c\u0438\u0442 \u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0430\u0442 ({n} \u0435\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c)":"\u0413\u0440\u0443\u043f\u043e\u0432\u0438\u044f \u043b\u0438\u043c\u0438\u0442 \u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0430\u0442 ({n} \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c)"]},selectAllText:"\u0418\u0437\u0431\u0435\u0440\u0438 \u0432\u0441\u0438\u0447\u043a\u0438",deselectAllText:"\u0420\u0430\u0437\u043c\u0430\u0440\u043a\u0438\u0440\u0430\u0439 \u0432\u0441\u0438\u0447\u043a\u0438",multipleSeparator:", "}});

View File

@ -0,0 +1,38 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'Nic není vybráno',
noneResultsText: 'Žádné výsledky {0}',
countSelectedText: 'Označeno {0} z {1}',
maxOptionsText: ['Limit překročen ({n} {var} max)', 'Limit skupiny překročen ({n} {var} max)', ['položek', 'položka']],
multipleSeparator: ', ',
selectAllText: 'Vybrat Vše',
deselectAllText: 'Odznačit Vše'
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,n){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&module.exports?module.exports=n(require("jquery")):n(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"Nic nen\xed vybr\xe1no",noneResultsText:"\u017d\xe1dn\xe9 v\xfdsledky {0}",countSelectedText:"Ozna\u010deno {0} z {1}",maxOptionsText:["Limit p\u0159ekro\u010den ({n} {var} max)","Limit skupiny p\u0159ekro\u010den ({n} {var} max)",["polo\u017eek","polo\u017eka"]],multipleSeparator:", ",selectAllText:"Vybrat V\u0161e",deselectAllText:"Odzna\u010dit V\u0161e"}});

View File

@ -0,0 +1,45 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'Intet valgt',
noneResultsText: 'Ingen resultater fundet {0}',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} valgt' : '{0} valgt';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'Begrænsning nået (max {n} valgt)' : 'Begrænsning nået (max {n} valgte)',
(numGroup == 1) ? 'Gruppe-begrænsning nået (max {n} valgt)' : 'Gruppe-begrænsning nået (max {n} valgte)'
];
},
selectAllText: 'Markér alle',
deselectAllText: 'Afmarkér alle',
multipleSeparator: ', '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,n){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&module.exports?module.exports=n(require("jquery")):n(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"Intet valgt",noneResultsText:"Ingen resultater fundet {0}",countSelectedText:function(e,n){return"{0} valgt"},maxOptionsText:function(e,n){return[1==e?"Begr\xe6nsning n\xe5et (max {n} valgt)":"Begr\xe6nsning n\xe5et (max {n} valgte)",1==n?"Gruppe-begr\xe6nsning n\xe5et (max {n} valgt)":"Gruppe-begr\xe6nsning n\xe5et (max {n} valgte)"]},selectAllText:"Mark\xe9r alle",deselectAllText:"Afmark\xe9r alle",multipleSeparator:", "}});

View File

@ -0,0 +1,45 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'Bitte wählen...',
noneResultsText: 'Keine Ergebnisse für {0}',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} Element ausgewählt' : '{0} Elemente ausgewählt';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'Limit erreicht ({n} Element max.)' : 'Limit erreicht ({n} Elemente max.)',
(numGroup == 1) ? 'Gruppen-Limit erreicht ({n} Element max.)' : 'Gruppen-Limit erreicht ({n} Elemente max.)'
];
},
selectAllText: 'Alles auswählen',
deselectAllText: 'Nichts auswählen',
multipleSeparator: ', '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"Bitte w\xe4hlen...",noneResultsText:"Keine Ergebnisse f\xfcr {0}",countSelectedText:function(e,t){return 1==e?"{0} Element ausgew\xe4hlt":"{0} Elemente ausgew\xe4hlt"},maxOptionsText:function(e,t){return[1==e?"Limit erreicht ({n} Element max.)":"Limit erreicht ({n} Elemente max.)",1==t?"Gruppen-Limit erreicht ({n} Element max.)":"Gruppen-Limit erreicht ({n} Elemente max.)"]},selectAllText:"Alles ausw\xe4hlen",deselectAllText:"Nichts ausw\xe4hlen",multipleSeparator:", "}});

View File

@ -0,0 +1,45 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'Nothing selected',
noneResultsText: 'No results match {0}',
countSelectedText: function (numSelected, numTotal) {
return (numSelected == 1) ? '{0} item selected' : '{0} items selected';
},
maxOptionsText: function (numAll, numGroup) {
return [
(numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
(numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
];
},
selectAllText: 'Select All',
deselectAllText: 'Deselect All',
multipleSeparator: ', '
};
})(jQuery);
}));

View File

@ -0,0 +1,8 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){e.fn.selectpicker.defaults={noneSelectedText:"Nothing selected",noneResultsText:"No results match {0}",countSelectedText:function(e,t){return 1==e?"{0} item selected":"{0} items selected"},maxOptionsText:function(e,t){return[1==e?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==t?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",multipleSeparator:", "}});

View File

@ -0,0 +1,38 @@
/*!
* Bootstrap-select v1.13.5 (https://developer.snapappointments.com/bootstrap-select)
*
* Copyright 2012-2018 SnapAppointments, LLC
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
*/
(function (root, factory) {
if (root === undefined && window !== undefined) root = window;
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module unless amdModuleId is set
define(["jquery"], function (a0) {
return (factory(a0));
});
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require("jquery"));
} else {
factory(root["jQuery"]);
}
}(this, function (jQuery) {
(function ($) {
$.fn.selectpicker.defaults = {
noneSelectedText: 'No hay selección',
noneResultsText: 'No hay resultados {0}',
countSelectedText: 'Seleccionados {0} de {1}',
maxOptionsText: ['Límite alcanzado ({n} {var} max)', 'Límite del grupo alcanzado({n} {var} max)', ['elementos', 'element']],
multipleSeparator: ', ',
selectAllText: 'Seleccionar Todos',
deselectAllText: 'Desmarcar Todos'
};
})(jQuery);
}));

Some files were not shown because too many files have changed in this diff Show More