diff --git a/.gitignore b/.gitignore index 7ac59805..abc62ecc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ __MACOSX/ .buildpath .settings/ /.vscode +/.vs diff --git a/composer.lock b/composer.lock index 9120ac1c..3988beba 100644 --- a/composer.lock +++ b/composer.lock @@ -521,6 +521,11 @@ "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" diff --git a/cron/status.cron.php b/cron/status.cron.php index 64a1bbac..22e573cb 100644 --- a/cron/status.cron.php +++ b/cron/status.cron.php @@ -41,7 +41,7 @@ namespace { // define won't accept array before php 7.0.0 // check if data is serialized (not needed when using php 7.0.0 and higher) - $data = @unserialize(PSM_CRON_ALLOW); + $data = (defined('PHP_MAJOR_VERSION') && PHP_MAJOR_VERSION >= 7) ? false : @unserialize(PSM_CRON_ALLOW); $allow = $data === false ? PSM_CRON_ALLOW : $data; if (!in_array($_SERVER['REMOTE_ADDR'], $allow) && !in_array($_SERVER["HTTP_X_FORWARDED_FOR"], $allow) diff --git a/provision.yaml b/provision.yaml index e67df7e2..d90c7fb4 100644 --- a/provision.yaml +++ b/provision.yaml @@ -43,7 +43,7 @@ - name: install php7.4-mysql apt: name=php7.4-mysql state=latest - - name: ensure gpupg2 is at the latest version + - name: ensure gnupg2 is at the latest version apt: name=gnupg2 state=latest - name: ensure percona-server-57 is installed diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index bcc548c0..83711300 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -1150,7 +1150,7 @@ namespace { * Send Webhook * * @return bool|string - * @var array $replacements an array of the replacements + * @var array $replacements should be an array of key value as strings where key is the placeholder name to replace in json template with the value * */ @@ -1159,8 +1159,13 @@ namespace { $error = ""; $success = 1; + $jsonMessage = $this->json; + $replacements['#message'] = $this->stripTagsFromMessage($replacements['#message']); - $jsonMessage = strtr($this->json, $replacements); + + foreach($replacements as $key => $val) { + $jsonMessage = str_replace($key, $val, $jsonMessage); + } $curl = curl_init($this->url); curl_setopt($curl, CURLOPT_POST, 1); diff --git a/src/lang/cs_CZ.lang.php b/src/lang/cs_CZ.lang.php index fff3a945..e644d8d9 100644 --- a/src/lang/cs_CZ.lang.php +++ b/src/lang/cs_CZ.lang.php @@ -21,9 +21,10 @@ * @package phpservermon * @author Simon Berka * @author Pavel Laupe Dvorak + * @author OUBRECHT.com * @copyright Copyright (c) 2008-2017 Pepijn Over * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ + * @version Release: v3.5.2 * @link http://www.phpservermonitor.org/ **/ @@ -68,13 +69,27 @@ $sm_lang = array( 'a_minute_ago' => 'cca před minutou', 'seconds_ago' => 'před %d vteřinami', 'a_second_ago' => 'před chvílí', - 'seconds' => 'sekunder', + 'year' => 'rok', + 'years' => 'roky', + 'month' => 'měsíc', + 'months' => 'měsíce', + 'day' => 'den', + 'days' => 'dny', + 'hour' => 'hodina', + 'hours' => 'hodiny', + 'minute' => 'minuta', + 'minutes' => 'munuty', + 'second' => 'vteřina', + 'seconds' => 'vteřiny', + 'current' => 'aktuální', + 'settings' => 'Nastavení', + 'search' => 'Hledat', ), 'menu' => array( 'config' => 'Konfigurace', 'server' => 'Servery', 'server_log' => 'Log', - 'server_status' => 'Status', + 'server_status' => 'Stav', 'server_update' => 'Aktualizace', 'user' => 'Uživatelé', 'help' => 'Nápověda', @@ -127,7 +142,7 @@ $sm_lang = array( 'sms' => 'SMS', 'pushover' => 'Pushover', 'no_logs' => 'Žádné záznamy', - 'clear' => 'Jasný protokol', + 'clear' => 'Smazat log', 'delete_title' => 'Odstranit protokol', 'delete_message' => 'Opravdu chcete odstranit protokoly všechny?', ), @@ -147,6 +162,7 @@ $sm_lang = array( 'website_password_description' => 'Heslo pro přístup na stránku. Heslo je v databázi šifrované.', 'fieldset_monitoring' => 'Monitoring', 'fieldset_permissions' => 'Oprávnění', + 'permissions' => 'Servery budou viditelné pro tyto uživatele', 'port' => 'Port', 'custom_port' => 'Uživatelský Port', 'popular_ports' => 'Populární Porty', @@ -160,13 +176,22 @@ $sm_lang = array( 'last_check' => 'Poslední kontrola', 'last_online' => 'Naposledy online', 'last_offline' => 'Naposledy offline', + 'last_output' => 'Poslední pozitivní výstup', + 'last_error' => 'Poslední chyba', + 'last_error_output' => 'Poslední chyba - výstup', + 'output' => 'Výstup', 'monitoring' => 'Monitoring', 'no_monitoring' => 'Žádné monitorované služby', 'email' => 'E-mail', 'send_email' => 'Odeslat e-mail', 'sms' => 'SMS', - 'send_sms' => 'Odeslat SMS', + 'send_sms' => 'Odeslat SMS upozornění', 'pushover' => 'Pushover', + 'send_pushover' => 'Odeslat Pushover upozornění', + 'telegram' => 'Telegram', + 'send_telegram' => 'Odeslat Telegram upozornění', + 'jabber' => 'Jabber', + 'send_jabber' => 'Odeslat Jabber upozornění', 'users' => 'Uživatelé', 'delete_title' => 'Smazat server', 'delete_message' => 'Opravdu si přejete smazat \'%1\'?', @@ -205,6 +230,10 @@ $sm_lang = array( 'config' => array( 'general' => 'Obecné', 'language' => 'Jazyk', + 'proxy' => 'Zapnout proxy', + 'proxy_url' => 'Proxy URL', + 'proxy_user' => 'Proxy uživatelské jméno', + 'proxy_password' => 'Proxy heslo', 'show_update' => 'Kontrolovat aktualizace?', 'password_encrypt_key' => 'Šifrovací klíč pro hesla', 'password_encrypt_key_note' => 'Tímto klíčem se šifrují hesla, která se ukládají u serverů pro @@ -243,6 +272,11 @@ $sm_lang = array( 'alert_type_status' => 'Změna stavu', 'alert_type_offline' => 'Offline', 'alert_type_always' => 'Vždy', + 'combine_notifications' => 'Kombinovat upozornění', + 'combine_notifications_description' => 'Snižuje množství oznámení tím, že je spojuje do + 1 jediné oznámení. (Toto nemá vliv na oznámení SMS.)', + 'alert_proxy' => 'Proxy server se nikdy nepoužívá pro služby, i když je povolen.', + 'alert_proxy_url' => 'Formát: server:port', 'log_status' => 'Log', 'log_status_description' => 'Pokud je Log nastaven na hodnotu TRUE, systém do něj zapíše veškerá provedená upozornění.', @@ -258,9 +292,11 @@ $sm_lang = array( 'settings_pushover' => 'Nastavení Pushover', 'settings_notification' => 'Nastavení upozornění', 'settings_log' => 'Nastavení logu', + 'settings_proxy' => 'Proxy nastavení', 'auto_refresh' => 'Automaticky obnovit', 'auto_refresh_description' => 'Automaticky obnovit stránku Servery.
Čas v sekundách, 0 pro vypnutí automatického obnovení.', + 'seconds' => 'sekund', 'test' => 'Test', 'test_email' => 'E-mail bude odeslán na adresu uvedenou v uživatelském profilu.', 'test_sms' => 'SMS bude odeslána na telefonní číslo uvedené v uživatelském profilu.', @@ -289,16 +325,14 @@ $sm_lang = array( '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:

Server: %LABEL%
IP: %IP%
Port: - %PORT%
Chyba: %ERROR%
Datum: %DATE%', + 'off_email_body' => 'Nebylo možné se spojit se serverem:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Chyba: %ERROR%
Datum: %DATE%', 'off_pushover_title' => 'Server \'%LABEL%\' je offline', - 'off_pushover_message' => 'Nebylo možné spojit se se serverem:

Server: %LABEL%
IP: %IP%
Port: - %PORT%
Chyba: %ERROR%
Datum: %DATE%', + 'off_pushover_message' => 'Nebylo možné se spojit se serverem:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Chyba: %ERROR%
Datum: %DATE%', + 'off_telegram_message' => 'Nebylo možné se spojit se serverem:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Chyba: %ERROR%
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%:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Datum: - %DATE%', + 'on_email_body' => 'Server \'%LABEL%\' je opět online, byl nedostupný %LAST_OFFLINE_DURATION%:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Datum: %DATE%', + 'on_telegram_message' => 'Server \'%LABEL%\' je opět online, byl nedostupný %LAST_OFFLINE_DURATION%:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Datum: %DATE%', 'on_pushover_title' => 'Server \'%LABEL%\' je online', 'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:

Server: %LABEL%
IP: %IP%
Port: diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index 25adb2c6..f414f964 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -189,7 +189,7 @@ $sm_lang = array( 'website_password_description' => 'Password to access the site. The password is encrypted in the database.', 'fieldset_monitoring' => 'Monitoring', 'fieldset_permissions' => 'Permissions', - 'permissions' => 'Users who can view and be notified about this server', + 'permissions' => 'Server will be visible for the following users', 'port' => 'Port', 'custom_port' => 'Custom Port', 'popular_ports' => 'Popular Ports', @@ -435,8 +435,6 @@ $sm_lang = array( 'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.', 'test_discord' => 'A Discord notification will be sent to the webhook specified in your user profile.', 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user profile.', - 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user - profile.', 'test_webhook' => 'A webhook notification will be sent to the given url endpoint.', 'test_telegram' => 'A Telegram notification will be sent to the chat id specified in your user profile.', 'test_jabber' => 'A Jabber notification will be sent to the jabber account specified in your user profile.', @@ -478,8 +476,6 @@ $sm_lang = array( 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', 'off_email_body' => 'Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%', 'off_discord_message' => 'Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%', - 'off_email_body' => 'Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: - %PORT%
Error: %ERROR%
Date: %DATE%', 'off_webhook_title' => 'Server \'%LABEL%\' is DOWN', 'off_webhook_message' => 'Failed to connect to the following server:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Error: %ERROR%
Date: %DATE%', diff --git a/src/lang/ru_RU.lang.php b/src/lang/ru_RU.lang.php index a055003a..40dd6137 100644 --- a/src/lang/ru_RU.lang.php +++ b/src/lang/ru_RU.lang.php @@ -43,19 +43,20 @@ $sm_lang = array( 'save' => 'Сохранить', 'edit' => 'Редактировать', 'delete' => 'Удалить', + 'view' => 'Просмотр', 'date' => 'Дата', 'message' => 'Сообщение', 'yes' => 'Да', 'no' => 'Нет', 'insert' => 'Добавить', - 'add_new' => 'Добавить новый', - 'update_available' => 'Новая версия ({version}) доступна по адресу http://www.phpservermonitor.org.', + 'add_new' => 'Добавить', + 'update_available' => 'Новая версия ({version}) доступна по адресу http://www.phpservermonitor.org.', 'back_to_top' => 'Наверх', 'go_back' => 'Вернуться', - 'ok' => 'OK', + 'ok' => 'Норма (не уведомлять)', + 'bad' => 'Не норма (уведомлять)', 'cancel' => 'Отмена', + 'none' => 'Не указано', 'activate' => 'Активировать', 'short_day_format' => '%e %B', 'long_day_format' => '%e %B %Y', @@ -80,6 +81,11 @@ $sm_lang = array( 'minutes' => 'минут', 'second' => 'секунда', 'seconds' => 'секунд', + 'millisecond' => 'мс', + 'milliseconds' => 'мс', + 'current' => 'current', + 'settings' => 'Настройки', + 'search' => 'Поиск', ), 'menu' => array( 'config' => 'Параметры', @@ -100,50 +106,39 @@ $sm_lang = array( 'level' => 'Уровень', 'level_10' => 'Администратор', 'level_20' => 'Пользователь', - 'level_description' => 'Администраторы имеют полный доступ: они - могут управлять серверами, пользователями и - изменять общую - конфигурацию.
Пользователи могут только - просматривать и запускать проверку для - серверов, которые были к ним прикреплены.', + 'level_30' => 'Анонимный', + 'level_description' => 'Администраторы имеют полный доступ: они могут управлять серверами, пользователями и изменять общую конфигурацию.
Пользователи могут только просматривать и запускать проверку для серверов, которые были к ним прикреплены.', 'mobile' => 'Телефон', 'email' => 'E-mail', 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover - это сервис, который позволяет легко - получать уведомления в режиме реального - времени. Больше информации на их веб-сайте.', + 'pushover_description' => 'Pushover - это сервис, который позволяет легко получать уведомления в режиме реального времени. Больше информации на их веб-сайте.', 'pushover_key' => 'Pushover ключ', 'pushover_device' => 'Pushover устройство', - 'pushover_device_description' => 'Имя устройства, на которое будут - отправляться уведомления. Оставьте - пустым, что бы отправлять уведомления на - все устройства.', + 'pushover_device_description' => 'Имя устройства, на которое будут отправляться уведомления. Оставьте пустым, что бы отправлять уведомления на все устройства.', + 'discord' => 'Discord', + 'discord_label' => 'Discord', + 'discord_description' => 'Укажите ваш вебхук здесь.', 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram удобный - мессенджер для получения уведомлений в - реальном времени. Посетите раздел - документации для получения доп. информации - и инструкций по установке.', + 'telegram_description' => 'Telegram удобный мессенджер для получения уведомлений в + реальном времени. Посетите раздел + документации для получения доп. информации и инструкций по установке.', 'telegram_chat_id' => 'Telegram chat id', - 'telegram_chat_id_description' => 'Сообщения будут отправляться на - указанный идентификатор чата.', + 'telegram_chat_id_description' => 'Сообщения будут отправляться на указанный идентификатор чата.', 'telegram_get_chat_id' => 'Нажмите здесь чтобы получить ваш chat id', 'activate_telegram' => 'Активировать уведомления в Telegram', - 'activate_telegram_description' => 'Разрешить отправку уведомлений на - указанный идентификатор чата. Без этого - разрешения Telegram не позволит нам - отправлять вам уведомления.', - 'telegram_bot_username_found' => 'Бот обнаружен!

Откроется чат с ботом. Здесь - вам нужно нажать кнопку Start или отправить - команду /start.', - 'telegram_bot_username_error_token' => '401 - Unauthorized. Пожалуйста укажите - действительный API токен..', - 'telegram_bot_error' => 'Произошла ошибка при активации уведомления - Telegram: %s', + 'activate_telegram_description' => 'Разрешить отправку уведомлений на указанный идентификатор чата. Без этого разрешения Telegram не позволит нам отправлять вам уведомления.', + 'telegram_bot_username_found' => 'Бот обнаружен!

Откроется чат с ботом. Здесь вам нужно нажать кнопку Start или отправить команду /start.', + 'telegram_bot_username_error_token' => '401 - Unauthorized. Пожалуйста укажите действительный API токен.', + 'telegram_bot_error' => 'Произошла ошибка при активации уведомления Telegram: %s', + 'jabber' => 'Jabber', + 'jabber_label' => 'Jabber', + 'jabber_description' => 'Ваш Jabber аккаунт', + 'webhook' => 'Вебхук', + 'webhook_description' => 'Отправить JSON вебхук на указанный URL.', + 'webhook_url' => 'URL вебхука', + 'webhook_url_description' => 'Публичный URL вебхука, должен начинаться с https://', + 'webhook_json' => 'JSON сообщение', + 'webhook_json_description' => 'Указать пользовательский JSON, например: {"Любой текст": "servermon: #server_label" "любой текст": "#server_ip is **#status**"}.
Доступные переменные: #message, #server_error, #server_ip, #server_label, #server_last_offline_duration и #status', 'delete_title' => 'Удалить пользователя', 'delete_message' => 'Вы уверены что хотите удалить пользователя \'%1\'?', 'deleted' => 'Пользователь удален.', @@ -152,26 +147,28 @@ $sm_lang = array( 'profile' => 'Профиль', 'profile_updated' => 'Ваш профиль был обновлен.', 'error_user_name_bad_length' => 'Логин должен содержать от 2 до 64 знаков.', - 'error_user_name_invalid' => 'Имя пользователя может содержать только - латинские символы (a-z, A-Z), цифры (0-9), точки (.) - и подчеркивание (_).', + 'error_user_name_invalid' => 'Имя пользователя может содержать только латинские символы (a-z, A-Z), цифры (0-9), точки (.) и подчеркивание (_).', 'error_user_name_exists' => 'Данный логин уже существует.', 'error_user_email_bad_length' => 'E-mail может содержать от 5 до 255 знаков.', 'error_user_email_invalid' => 'E-mail указан неверно.', - 'error_user_level_invalid' => 'Данный уровень пользователя - недействителен.', + 'error_user_level_invalid' => 'Данный уровень пользователя недействителен.', 'error_user_no_match' => 'Данного пользователя нет в базе данных.', 'error_user_password_invalid' => 'Пароль указан неверно.', 'error_user_password_no_match' => 'Введенные пароли не совпадают.', + 'error_user_admin_cant_be_deleted' => 'Вы не можете удалить последнего администратора.', + 'error_user_cant_be_anonymous' => 'Только пользователь \'__public__\' может иметь уровень Анонимный.' ), 'log' => array( - 'title' => 'Запись', + 'title' => 'Логи', 'type' => 'Тип', 'status' => 'Статус', 'email' => 'E-mail', 'sms' => 'SMS', + 'discord' => 'Discord', 'pushover' => 'Pushover', + 'webhook' => 'Webhook', 'telegram' => 'Telegram', + 'jabber' => 'Jabber', 'no_logs' => 'Записей нет', 'clear' => 'Очистить логи', 'delete_title' => 'Удаление логов', @@ -187,30 +184,33 @@ $sm_lang = array( 'authentication_settings' => 'Настройки аутентификации', 'optional' => 'необязательно', 'website_username' => 'Имя пользователя', - 'website_username_description' => 'Имя пользователя для доступа к сайту. - (Поддерживается только Apache authentication.)', + 'website_username_description' => 'Имя пользователя для доступа к сайту. (Поддерживается только Apache authentication.)', 'website_password' => 'Пароль', - 'website_password_description' => 'пароль для доступа к сайту. Пароль будет - храниться в зашифрованном виде.', + 'website_password_description' => 'пароль для доступа к сайту. Пароль будет храниться в зашифрованном виде.', 'fieldset_monitoring' => 'Мониторинг', 'fieldset_permissions' => 'Права доступа', + 'permissions' => 'Сервер будет доступен для просмотра указанным пользователям', 'port' => 'Порт', 'custom_port' => 'Указать порт', 'popular_ports' => 'Популярные порты', + 'request_method' => 'Метод запроса', + 'custom_request_method' => 'Пользовательский метод запроса', + 'popular_request_methods' => 'Популярные методы запроса', + 'post_field' => 'Параметры запроса', + 'post_field_description' => 'Данные, которые будут отправлены, используя тип запроса, выбранный выше.', 'please_select' => 'Выберите', 'type' => 'Тип', 'type_website' => 'Веб-сайт', 'type_service' => 'Сервис', 'type_ping' => 'Пинг', 'pattern' => 'Искать текст/шаблон', - 'pattern_description' => 'Если текст по шаблону не найден на сайте, - сервер будет помечен как Оффлайн. Регулярные - выражения допустимы.', + 'pattern_description' => 'Если текст по шаблону не найден на сайте, сервер будет помечен как Оффлайн. Регулярные выражения допустимы.', 'pattern_online' => 'Шаблон указывает что вебсайт:', - 'pattern_online_description' => 'Online: Если этот шаблон найден на веб-сайте, - сервер будет отмечен Онлайн. Offline: Если - этот шаблон не найден на веб-сайте, сервер - будет отмечен как Оффлайн.', + 'pattern_online_description' => 'Online: Если этот шаблон найден на веб-сайте, сервер будет отмечен Онлайн. Offline: Если этот шаблон не найден на веб-сайте, сервер будет отмечен как Оффлайн.', + 'redirect_check' => 'Начичите редиректа на другой домен', + 'redirect_check_description' => 'Редирект на другой домен обычно является плохим знаком.', + 'allow_http_status' => 'Разрешенные коды ответа HTTP', + 'allow_http_status_description' => 'Сайт будет считаться айт как онлайн. Сайт с HTTP кодами ответа меньше 400 считается онлайн по умолчанию. Разделять знаком |.', 'header_name' => 'Название заголовка', 'header_value' => 'Значение заголовка', 'header_name_description' => 'с учетом регистра.', @@ -220,14 +220,24 @@ $sm_lang = array( 'last_offline' => 'Был оффлайн', 'monitoring' => 'Мониторинг', 'no_monitoring' => 'Нет мониторинга', + 'last_output' => 'Последний положительный вывод', + 'last_error' => 'Последняя ошибка', + 'last_error_output' => 'Последний вывод с ошибкой', + 'output' => 'Результаты проверки', 'email' => 'E-mail', - 'send_email' => 'Отправить E-mail', + 'send_email' => 'Отправлять E-mail', 'sms' => 'CMC', - 'send_sms' => 'Отправить CMC', + 'send_sms' => 'Отправлять CMC', + 'discord' => 'Discord', + 'send_discord' => 'Отправлять уведомления в Discord', + 'webhook' => 'Вебхук', + 'send_webhook' => 'Отправлять уведомления на вебхук', 'pushover' => 'Pushover', 'send_pushover' => 'Отправлять уведомления в Pushover', 'telegram' => 'Telegram', 'send_telegram' => 'Отправлять уведомления в Telegram', + 'jabber' => 'Jabber', + 'send_jabber' => 'Отправлять Jabber уведомления', 'users' => 'Пользователи', 'delete_title' => 'Удалить сервер', 'delete_message' => 'Вы уверены что хотите удалить сервер \'%1\'?', @@ -247,9 +257,11 @@ $sm_lang = array( 'day' => 'День', 'hour' => 'Час', 'warning_threshold' => 'Порог предупреждения', - 'warning_threshold_description' => 'Количество неудачных проверок, - требуемых чтобы сервер был помечен как - Оффлайн.', + 'warning_threshold_description' => 'Количество неудачных проверок, требуемых чтобы сервер был помечен как Оффлайн.', + 'ssl_cert_expiry_days' => 'Валидность SSL сертификата', + 'ssl_cert_expiry_days_description' => 'Количество дней до истечения срока действия SSL-сертификата. Используйте 0 для отключения проверки.', + 'ssl_cert_expired' => 'Срок действия SSL-сертификата истек с', + 'ssl_cert_expiring' => 'SSL-сертификат истекает:', 'chart_last_week' => 'Прошлая неделя', 'chart_history' => 'История', 'chart_day_format' => '%d.%m.%Y', @@ -258,32 +270,33 @@ $sm_lang = array( 'chart_short_time_format' => '%H:%M', 'warning_notifications_disabled_sms' => 'SMS уведомления отключены.', 'warning_notifications_disabled_email' => 'E-mail уведомления отключены.', + 'warning_notifications_disabled_discord' => 'Уведомления в Discord отключены.', + 'warning_notifications_disabled_webhook' => 'Уведомления на вебхук отключены', 'warning_notifications_disabled_pushover' => 'Pushover уведомления отключены.', 'warning_notifications_disabled_telegram' => 'Уведомления в Telegram отключены.', + 'warning_notifications_disabled_jabber' => 'Jabber уведомления отключены.', 'error_server_no_match' => 'Сервер не найден.', - 'error_server_label_bad_length' => 'Название должно содержать от 1 до 255 - знаков.', + 'error_server_label_bad_length' => 'Название должно содержать от 1 до 255 знаков.', 'error_server_ip_bad_length' => 'Домен/IP должен содержать от 1 до 255 знаков', 'error_server_ip_bad_service' => 'IP-адрес недействителен.', 'error_server_ip_bad_website' => 'Ссылка веб-страницы недействительна.', 'error_server_type_invalid' => 'Выбраный тип сервера недействителен.', - 'error_server_warning_threshold_invalid' => 'Порог предупреждения должен иметь - значение больше 0', + 'error_server_warning_threshold_invalid' => 'Порог предупреждения должен иметь значение больше 0', + 'error_server_ssl_cert_expiry_days' => 'Оставшиеся дни срока действия сертификата SSL должны быть целым числом, большим или равным 0.', ), 'config' => array( 'general' => 'Основные', + 'site_title' => 'Заголовок сайта', 'language' => 'Язык', 'show_update' => 'Проверять обновления?', 'password_encrypt_key' => 'Ключ шифрования пароля', - 'password_encrypt_key_note' => 'Этот ключ используется для шифрования - паролей, которые указаны на серверах (для - доступа к веб-сайтам). Если ключ изменится, - сохраненный пароль будет недействителен!', + 'password_encrypt_key_note' => 'Этот ключ используется для шифрования паролей, которые указаны на серверах (для доступа к веб-сайтам). Если ключ изменится, сохраненный пароль будет недействителен!', 'proxy' => 'Использовать прокси', 'proxy_url' => 'Адрес прокси', 'proxy_user' => 'Имя пользователя прокси', 'proxy_password' => 'Пароль прокси', 'email_status' => 'Разрешить отправку email', + 'email_add_url' => 'Добавлять ссылку на мониторинг в текст сообщения', 'email_from_email' => 'Отправлять от адреса', 'email_from_name' => 'Отправлять от имени', 'email_smtp' => 'Использовать SMTP', @@ -299,87 +312,115 @@ $sm_lang = array( 'sms_gateway_username' => 'Пользователь', 'sms_gateway_password' => 'Пароль', 'sms_from' => 'Номер отправителя', + 'discord_status' => 'Разрешить отправку сообщений в Discord', + 'discord_description' => 'Discord - это сервис, который позволяет легко получать уведомления в режиме реального времени. Посетите сайт Discord для подробностей.', + 'webhook_status' => 'Разрешить отправку сообщений на вебхук', + 'webhook_description' => 'Разрешить отправку на вебхук различных сервисов, например slack. URL вебхука и формат сообщения указываются в профиле пользователя.', + 'webhook_url' => 'URL вебхука', + 'webhook_url_description' => 'URL вебхука', + 'webhook_json' => 'JSON сообщение', + 'webhook_json_description' => 'Указать пользовательский JSON. Доступные переменные: #message, #server_error, #server_ip, #server_label, #server_last_offline_duration и #status', 'pushover_status' => 'Разрешить отправку Pushover сообщений', - 'pushover_description' => 'Pushover - это сервис, который позволяет легко - получать уведомления в режиме реального - времени. Больше информации на их веб-сайте.', + 'pushover_description' => 'Pushover - это сервис, который позволяет легко получать уведомления в режиме реального времени. Больше информации на их веб-сайте.', 'pushover_clone_app' => 'Нажмите здесь чтобы создать ваш Pushover app', 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Прежде чем вы сможете начать - пользоваться Pushover, вам необходимо - зарегистрировать "App" на их веб-сайте и ввести "App - API Token" сюда.', + 'pushover_api_token_description' => 'Прежде чем вы сможете начать пользоваться Pushover, вам необходимо зарегистрировать "App" на их веб-сайте и ввести "App API Token" сюда.', 'telegram_status' => 'Разрешить отправку уведомлений в Telegram', - 'telegram_description' => 'Telegram удобный - мессенджер для получения уведомлений в - реальном времени. Посетите раздел - документации для получения доп. информации - и инструкций по установке.', + 'telegram_add_url' => 'Добавлять ссылку на мониторинг в текст сообщения', + 'telegram_description' => 'Telegram удобный мессенджер для получения уведомлений в реальном времени. Посетите раздел документации для получения доп. информации и инструкций по установке.', 'telegram_api_token' => 'Telegram API Token', - 'telegram_api_token_description' => 'Прежде чем вы сможете начать - пользоваться Telegram, вам необходимо - получить API Token. Посетите раздел - документации для получения помощи.', + 'telegram_api_token_description' => 'Прежде чем вы сможете начать пользоваться Telegram, вам необходимо получить API Token. Посетите раздел документации для получения помощи.', + 'jabber_status' => 'Разрешить отправку Jabber (XMPP) сообщений', + 'jabber_description' => 'Посетите страницу документации для получения подробностей.', + 'jabber_host' => 'Хост', + 'jabber_host_description' => 'Сервер вашего Jabber провайдера. Для аккаунта Google используйте talk.google.com.', + 'jabber_port' => 'Порт', + 'jabber_port_description' => 'Порт вашего Jabber провайдера. По умолчанию 5222. Для аккаунта Google используйте 5223.', + 'jabber_username' => 'Имя пользователя', + 'jabber_username_description' => 'Для аккаунта Google указывайте вместе с доменом, например example@google.com.', + 'jabber_domain' => 'Домен', + 'jabber_domain_description' => 'Домен вашего Jabber провайдера. Оставьте пустым для Google аккаунта.', + 'jabber_password' => 'Пароль', + 'jabber_password_description' => 'Заполняйте только для установки или изменения пароля.', + 'jabber_check' => 'Проверьте ваш аккаунт Jabber, если сообщение было получено.', + 'dirauth_status' => 'Аутентифицироваться с помощью службы каталогов', + 'authdir_host_locn' => 'Хост каталога', + 'authdir_host_port' => 'Порт каталога', + 'authdir_type' => 'Тип сервиса', + 'authdir_type_description' => 'OpenLDAP: Directory - это служба OpenLDAP.
AD DS: Directory - это доменная служба Active Directory.
AD LDS: Directory - это упрощенная служба каталогов Active Directory.', + 'authdir_type_openldap' => 'OpenLDAP', + 'authdir_type_adds' => 'AD DS', + 'authdir_type_adlds' => 'AD LDS', + 'authdir_userdomain' => 'Домен Active Directory', + 'authdir_userdomain_description' => 'Пользовательский домен для Active Directory. Обычно это домен NETBIOS для AD DS и домен DNS для AD LDS. Не используется для каталогов OpenLDAP.', + 'authdir_ldapver' => 'Версия протокола LDAP', + 'authdir_ldapver_description' => 'Версия спецификации LDAP. Обычно это Версия 3 (по умолчанию). Версия 2 устарела в 2003 году (RFC3494).', + 'authdir_ldapfollowref' => 'Следовать ссылкам', + 'authdir_ldapfollowref_description' => 'Следовать ссылкам, если указанный сервер обращается к другому серверу за необходимой информацией. Не устанавливайте флажок, если вы не знаете об этой функции.', + 'authdir_basedn' => 'Базовый DN*', + 'authdir_basedn_description' => 'Базовое отличительное имя (DN) службы каталогов. Например, dc=domain,dc=tld. Это обязательное поле.', + 'authdir_usernameattrib' => 'Атрибут имени пользователя', + 'authdir_usernameattrib_description' => 'Атрибут, используемый службой каталогов для ссылки на имя пользователя.', + 'authdir_groupnameattrib' => 'Атрибут имени группы', + 'authdir_groupnameattrib_description' => 'Атрибут, используемый службой каталогов для ссылки на имя группы в группе. Используется для проверки членства в группе.', + 'authdir_groupmemattrib' => 'Атрибут члена группы', + 'authdir_groupmemattrib_description' => 'Атрибут, используемый службой каталогов для ссылки на группу (группы), членом которых является пользователь. Используется для проверки членства в группе.', + 'authdir_usercontainerrdn' => 'Контейнер RDN для пользователя', + 'authdir_usercontainerrdn_description' => 'Относительное отличительное имя контейнера пользователей в каталоге. Например, ou=Users', + 'authdir_groupcontainerrdn' => 'Контейнер RDN для группы', + 'authdir_groupcontainerrdn_description' => 'Относительное отличительное имя контейнера групп в каталоге. Например, ou=Groups', + 'authdir_groupname' => 'Авторизованная группа каталогов', + 'authdir_groupname_description' => 'Группа каталогов, авторизованная для доступа к приложению. Пользователи каталога, не входящие в эту группу, не будут аутентифицированы (в настоящее время недоступно для AD).', + 'authdir_defaultrole' => 'Роль по умолчанию', + 'authdir_defaultrole_description' => 'Роль по умолчанию, назначаемая пользователям, входящим в систему в первый раз.', 'alert_type' => 'Тип уведомлений', - 'alert_type_description' => 'Изменение статуса: Вы получите - уведомление об изменение статуса. Для - онлайн -> оффлайн или офлайн -> онлайн.

Оффлайн: Вы получите уведомление - только когда сервер перейдет в статус - оффлайн. Например, задание Cron выставлено на - каждые 15 минут. Сервер перейдет в статус - оффлайн в 1:00 и не измениться до 6:00. Вы - получите 1 уведомление только в - 1:00

Всегда: Вы будете получать - уведомление при каждом запуске скрипта - проверки, как только сервер перейдет в - статус оффлайн, даже если сервер находится в - этом статусе несколько часов.', + 'alert_type_description' => 'Изменение статуса: Вы получите уведомление об изменение статуса. Для онлайн -> оффлайн или офлайн -> онлайн.

Оффлайн: Вы получите уведомление только когда сервер перейдет в статус оффлайн. Например, задание Cron выставлено на каждые 15 минут. Сервер перейдет в статус оффлайн в 1:00 и не измениться до 6:00. Вы получите 1 уведомление только в 1:00

Всегда: Вы будете получать уведомление при каждом запуске скрипта проверки, как только сервер перейдет в статус оффлайн, даже если сервер находится в этом статусе несколько часов.', 'alert_type_status' => 'Изменение статуса', 'alert_type_offline' => 'Оффлайн', 'alert_type_always' => 'Всегда', - 'alert_proxy' => 'Даже если включено, прокси никогда не - используется для сервисов', + 'combine_notifications' => 'Комбинировать уведомления', + 'combine_notifications_description' => 'Уменьшит количество уведомлений, объединяя их в одно уведомление. (Это не влияет на SMS-уведомления.)', + 'alert_proxy' => 'Даже если включено, прокси никогда не используется для сервисов', 'alert_proxy_url' => 'Формат: адрес:порт', 'log_status' => 'Лог статусов', - 'log_status_description' => 'Если лог статусов включен, монитор будет - логировать все события выбранные в типе - уведомлений.', - 'log_email' => 'Логировать уведомления отправленые по E-mail', - 'log_sms' => 'Логировать уведомления отправленые по SMS', + 'log_status_description' => 'Если лог статусов включен, монитор будет логировать все события выбранные в типе уведомлений.', + 'log_email' => 'Логировать E-mail уведомления', + 'log_sms' => 'Логировать SMS уведомления', + 'log_discord' => 'Логировать Discord уведомления', 'log_pushover' => 'Логировать Pushover уведомления', + 'log_webhook' => 'Логировать вебхук уведомления', 'log_telegram' => 'Логировать Telegram уведомления', + 'log_jabber' => 'Логировать Jabber уведомления', 'updated' => 'Настройки успешно сохранены.', 'tab_email' => 'Email', 'tab_sms' => 'SMS', + 'tab_discord' => 'Discord', 'tab_pushover' => 'Pushover', + 'tab_webhook' => 'Webhook', 'tab_telegram' => 'Telegram', + 'tab_jabber' => 'Jabber', + 'tab_auth' => 'Аутентификация', 'settings_email' => 'Настройка E-mail', 'settings_sms' => 'Настройка SMS', + 'settings_discord' => 'Настройка Discord', 'settings_pushover' => 'Настройка Pushover', + 'settings_webhook' => 'Настройка вебхука', 'settings_telegram' => 'Настройка Telegram', + 'settings_jabber' => 'Настройка Jabber', 'settings_notification' => 'Настройка уведомлений', 'settings_log' => 'Настройка логирования', 'settings_proxy' => 'Настройка прокси', + 'settings_dirauth' => 'Настройка LDAP', 'auto_refresh' => 'Авто-обновление', - 'auto_refresh_description' => 'Авто-обновление страницы статуса - серверов.
Время в секундах. - Если указано 0, то страница не будет - обновляться.', + 'auto_refresh_description' => 'Авто-обновление страницы статуса серверов.
Время в секундах. Если указано 0, то страница не будет обновляться.', 'test' => 'Проверка', - 'test_email' => 'Сообщение будет отправлено на адрес указаный в - профиле пользователя.', - 'test_sms' => 'SMS будет отправлено на номер телефона указаный в - профиле пользователя.', - 'test_pushover' => 'Pushover уведомление будет отправленно на - устройство указанное в профиле пользователя.', - 'test_telegram' => 'Уведомление Telegram будет отправлено на - идентификатор чата, указанный в профиле - пользователя.', + 'test_email' => 'Сообщение будет отправлено на адрес указаный в профиле пользователя.', + 'test_sms' => 'SMS будет отправлено на номер телефона, указаный в профиле пользователя.', + 'test_discord' => 'Уведомление Discord будет отправлено на вебхук, указанный в профиле пользователя.', + 'test_pushover' => 'Pushover уведомление будет отправленно на устройство, указанное в профиле пользователя.', + 'test_webhook' => 'Уведомление вебхука будет отправлено на URL, указанный в профиле пользователя', + 'test_telegram' => 'Уведомление Telegram будет отправлено на идентификатор чата, указанный в профиле пользователя.', + 'test_jabber' => 'Уведомление будет отправлено на учетную запись Jabber, указанную в профиле пользователя.', 'send' => 'Отправить', 'test_subject' => 'Проверка', 'test_message' => 'Тестовое сообщение', @@ -387,57 +428,75 @@ $sm_lang = array( 'email_error' => 'Ошибка отправки email', 'sms_sent' => 'SMS отправлено', 'sms_error' => 'При отправке SMS произошла ошибка: %s', - 'sms_error_nomobile' => 'Не удалось отправить тестовое SMS: - действительный номер телефона не найден в - вашем профиле.', + 'sms_error_nomobile' => 'Не удалось отправить тестовое SMS: действительный номер телефона не найден в вашем профиле.', + 'discord_sent' => 'Уведомление Discord отправлено', + 'discord_error' => 'Произошла ошибка во время отправки Discord уведомления: %s', + 'discord_error_nowebhook' => 'Произошла ошибка во время отправки Discord уведомления: валидный Discord вебхук не найден в вашем профиле.', + 'webhook_sent' => 'Уведомление вебхук отправлено', + 'webhook_error' => 'Произошла ошибка во время отправки вебхук уведомления: %s', + 'webhook_error_nourl' => 'Не удалось отправить тестовое уведомление: URL вебхука не найден в вашем профиле.', + 'webhook_error_nojson' => 'Не удалось отправить тестовое уведомление: JSON не найден в вашем профиле', 'pushover_sent' => 'Pushover уведомление отправлено', - 'pushover_error' => 'Произошла ошибка во время отправки Pushover - уведомления: %s', - 'pushover_error_noapp' => 'Не удалось отправить тестовое уведомление: - Pushover "App API token" не найден в основных - настройках.', - 'pushover_error_nokey' => 'Не удалось отправить тестовое уведомление: - Pushover ключ не найден в вашем профиле.', + 'pushover_error' => 'Произошла ошибка во время отправки Pushover уведомления: %s', + 'pushover_error_noapp' => 'Не удалось отправить тестовое уведомление: Pushover "App API token" не найден в основных настройках.', + 'pushover_error_nokey' => 'Не удалось отправить тестовое уведомление: Pushover ключ не найден в вашем профиле.', 'telegram_sent' => 'Уведомление в Telegram отправлено', - 'telegram_error' => 'Произошла ошибка при отправке уведомления в - Telegram: %s', - 'telegram_error_notoken' => 'Не удалось отправить тестовое уведомление: - Telegram API token не найден в основных настройках.', - 'telegram_error_noid' => 'Не удалось отправить тестовое уведомление: - идентификатор чата не найден в вашем профиле.', + 'telegram_error' => 'Произошла ошибка при отправке уведомления в Telegram: %s', + 'telegram_error_notoken' => 'Не удалось отправить тестовое уведомление: Telegram API token не найден в основных настройках.', + 'telegram_error_noid' => 'Не удалось отправить тестовое уведомление: идентификатор чата не найден в вашем профиле.', + 'jabber_sent' => 'Уведомление Jabber отправлено', + 'jabber_error' => 'Произошла ошибка при отправке Jabber уведомления: %s', + 'jabber_error_noconfig' => 'Не удалось отправить тестовое уведомление: аккаунт Jabber не найден в основных настройках', + 'jabber_error_noaccount' => 'Не удалось отправить тестовое уведомление: аккаунт Jabber не найден в вашем профиле.', 'log_retention_period' => 'Период хранения логов', - 'log_retention_period_description' => 'Количество дней хранения логов - уведомлений и архива аптайма серверов. - Введите 0 для выключения очистки логов.', + 'log_retention_period_description' => 'Количество дней хранения логов уведомлений и архива аптайма серверов. Введите 0 для выключения очистки логов.', 'log_retention_days' => 'дней', + 'user_agent' => 'User Agent', + 'user_agent_key_note' => 'Пользовательский user agent, используемый мониторингом при взаимодействии с внешними службами.', ), 'notifications' => array( - 'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: IP=%IP%, Порт=%PORT%. - Ошибка=%ERROR%', + 'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: IP=%IP%, Порт=%PORT%. Ошибка=%ERROR%', 'off_email_subject' => 'ВАЖНО: сервер \'%LABEL%\' сейчас НЕДОСТУПЕН', - 'off_email_body' => 'Невозможно подключиться к следующему - серверу:

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

Сервер: %LABEL%
IP: %IP%
Порт: - %PORT%
Ошибка: %ERROR%
Дата: %DATE%', - 'off_telegram_message' => 'Невозможно подключиться к следующему - серверу:

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

Сервер: %LABEL%
IP: %IP%
Порт: - %PORT%
Дата: %DATE%', + 'off_email_body' => 'Невозможно подключиться к следующему серверу:

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%', + 'off_discord_message' => 'Невозможно подключиться к следующему серверу:

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

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

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%', + 'off_telegram_message' => 'Невозможно подключиться к следующему серверу:

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%', + 'off_jabber_message' => 'Невозможно подключиться к следующему серверу:

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Ошибка: %ERROR%
Дата: %DATE%', + 'on_sms' => 'Сервер \'%LABEL%\' снова ДОСТУПЕН: IP=%IP%, Порт=%PORT%. Был недоступен: %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'ВАЖНО: Сервер \'%LABEL%\' снова ДОСТУПЕН', + 'on_email_body' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', + 'on_discord_message' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', + 'on_webhook_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН', + 'on_webhook_message' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%:

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', 'on_pushover_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН', - 'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.
Был - недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: - %IP%
Порт: %PORT%
Дата: %DATE%', - 'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.
Был - недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: - %IP%
Порт: %PORT%
Дата: %DATE%', + 'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', + 'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', + 'on_jabber_message' => 'Сервер \'%LABEL%\' снова доступен.
Был недоступен: %LAST_OFFLINE_DURATION%

Сервер: %LABEL%
IP: %IP%
Порт: %PORT%
Дата: %DATE%', + 'combi_off_email_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Ошибка: %ERROR%
  • Дата: %DATE%
', + 'combi_off_discord_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Ошибка: %ERROR%
- Дата: %DATE%

', + 'combi_off_webhook_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Ошибка: %ERROR%
  • Дата: %DATE%
', + 'combi_off_pushover_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Ошибка: %ERROR%
  • Дата: %DATE%
', + 'combi_off_telegram_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Ошибка: %ERROR%
- Дата: %DATE%

', + 'combi_off_jabber_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Ошибка: %ERROR%
- Дата: %DATE%

', + 'combi_on_email_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Упал: %LAST_OFFLINE_DURATION%
  • Дата: %DATE%
', + 'combi_on_webhook_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Упал: %LAST_OFFLINE_DURATION%
  • Дата: %DATE%
', + 'combi_on_discord_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Упал: %LAST_OFFLINE_DURATION%
- Дата: %DATE%

', + 'combi_on_pushover_message' => '
  • Сервер: %LABEL%
  • IP: %IP%
  • Порт: %PORT%
  • Упал: %LAST_OFFLINE_DURATION%
  • Дата: %DATE%
', + 'combi_on_telegram_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Упал: %LAST_OFFLINE_DURATION%
- Дата: %DATE%

', + 'combi_on_jabber_message' => '- Сервер: %LABEL%
- IP: %IP%
- Порт: %PORT%
- Упал: %LAST_OFFLINE_DURATION%
- Дата: %DATE%

', + 'combi_email_subject' => 'ВАЖНО: \'%UP%\' сервера снова ДОСТУПНЫ, \'%DOWN%\' сервера НЕДОСТУПНЫ', + 'combi_webhook_subject' => '\'%UP%\' сервера снова ДОСТУПНЫ, \'%DOWN%\' сервера НЕДОСТУПНЫ', + 'combi_pushover_subject' => '\'%UP%\' сервера снова ДОСТУПНЫ, \'%DOWN%\' сервера НЕДОСТУПНЫ', + 'combi_email_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', + 'combi_discord_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', + 'combi_webhook_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', + 'combi_pushover_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', + 'combi_telegram_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', + 'combi_jabber_message' => 'Следующие сервера ушли в ОФФЛАЙН:
%DOWN_SERVERS%
Следующие сервера снова ОНЛАЙН:
%UP_SERVERS%', ), 'login' => array( 'welcome_usermenu' => 'Здравствуйте, %user_name%', @@ -454,17 +513,13 @@ $sm_lang = array( 'password_forgot' => 'Забыли пароль?', 'password_reset' => 'Сбросить пароль', 'password_reset_email_subject' => 'Сброс пароля для PHP Server Monitor', - 'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку - для сброса пароля. Ссылка действительна 1 - час.

%link%', + 'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку для сброса пароля. Ссылка действительна 1 час.

%link%', 'error_user_incorrect' => 'Пользователь с указаными данными не найден.', 'error_login_incorrect' => 'Информация указана неверно.', 'error_login_passwords_nomatch' => 'Пароль указан неверно.', 'error_reset_invalid_link' => 'Ссылка для сброса пароля недействительна.', - 'success_password_forgot' => 'Вам был отправлен email, с инструкциями по - сбросу пароля.', - 'success_password_reset' => 'Ваш пароль был сброшен. Пожалуйста - авторизуйтесь.', + 'success_password_forgot' => 'Вам был отправлен email, с инструкциями по сбросу пароля.', + 'success_password_reset' => 'Ваш пароль был сброшен. Пожалуйста авторизуйтесь.', ), 'error' => array( '401_unauthorized' => 'Доступ закрыт', diff --git a/src/lang/th_TH.lang.php b/src/lang/th_TH.lang.php new file mode 100644 index 00000000..152b28a2 --- /dev/null +++ b/src/lang/th_TH.lang.php @@ -0,0 +1,126 @@ +. + * + * @package phpservermon + * @author Pepijn Over + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + **/ + +$sm_lang = array( + 'name' => 'Thai', + 'locale' => array( + '0' => 'th_TH.UTF-8', + '1' => 'th_TH', + '2' => 'thai', + '3' => 'thai-th', + ), + 'locale_tag' => 'th', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'ติดตั้ง', + 'action' => 'Action', + 'save' => 'บันทึก', + 'edit' => 'แก้ไข', + 'delete' => 'ลบ', + 'view' => 'ดู', + 'date' => 'วันที่', + 'message' => 'ข้อความ', + 'yes' => 'ใช่', + 'no' => 'ไม่ใช่', + 'insert' => 'แทรก', + 'add_new' => 'เพิ่มใหม่', + 'update_available' => 'มีเวอร์ชันใหม่ ({version}) ให้ดาวน์โหลดแล้ว คลิก ที่นี่ เพื่อดาวน์โหลดการอัปเดต', + 'back_to_top' => 'กลับไปยังด้านบน', + 'go_back' => 'ถอยกลับ', + 'ok' => 'ตกลง', + 'bad' => 'ล้มเหลว', + 'cancel' => 'ยกเลิก', + 'none' => 'ไม่มี', + 'activate' => 'เปิดใช้งาน', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Yเมื่อวานตอน %k:%M', + 'other_day_format' => '%A ตอน %k:%M', + 'never' => 'ไม่มี', + 'hours_ago' => '%d ชั่วโมงก่อน', + 'an_hour_ago' => 'ประมาณหนึ่งชั่วโมงที่แล้ว', + 'minutes_ago' => '%d นาทีที่แล้ว', + 'a_minute_ago' => 'ประมาณหนึ่งนาทีที่แล้ว', + 'seconds_ago' => '%d วินาทีที่แล้ว', + 'a_second_ago' => 'เมื่อวินาทีที่แล้ว', + 'year' => 'ปี', + 'years' => 'ปี', + 'month' => 'เดือน', + 'months' => 'เดือน', + 'day' => 'วัน', + 'days' => 'วัน', + 'hour' => 'ชั่วโมง', + 'hours' => 'ชั่วโมง', + 'minute' => 'นาที', + 'minutes' => 'นาที', + 'second' => 'วินาที', + 'seconds' => 'วินาที', + 'millisecond' => 'มิลลิวินาที', + 'milliseconds' => 'มิลลิวินาที', + 'current' => 'ปัจจุบัน', + 'settings' => 'การตั้งค่า', + 'search' => 'ค้นหา', + ), + 'menu' => array( + 'config' => 'การกำหนดค่า', + 'server' => 'เซิร์ฟเวอร์', + 'server_log' => 'Log', + 'server_status' => 'สถานะ', + 'server_update' => 'อัปเดต', + 'user' => 'ผู้ใช้', + 'help' => 'ช่วยเหลือ', + ), + 'users' => array( + 'user' => 'ผู้ใช้', + 'name' => 'ชื่อ', + 'user_name' => 'ชื่อผู้ใช้', + 'password' => 'รหัสผ่าน', + 'password_repeat' => 'รหัสผ่านอีกครั้ง', + 'password_leave_blank' => 'ปล่อยว่างไว้เพื่อไม่ให้เปลี่ยนแปลง', + 'level' => 'ระดับ', + 'level_10' => 'ผู้ดูแลระบบ', + 'level_20' => 'ผู้ใช้', + 'level_30' => 'ไม่ระบุตัวตน', + 'level_description' => 'ผู้ดูแลระบบมีสิทธิ์เข้าถึงเต็มรูปแบบ: พวกเขาสามารถจัดการเซิร์ฟเวอร์ ผู้ใช้ และแก้ไขการกำหนดค่าทั่วโลกได้
ผู้ใช้สามารถดูและเรียกใช้โปรแกรมอัปเดตสำหรับเซิร์ฟเวอร์ที่ได้รับมอบหมายให้เท่านั้น', + 'mobile' => 'มือถือ', + 'email' => 'อีเมล', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover เป็นบริการที่ช่วยให้รับการแจ้งเตือนแบบเรียลไทม์ได้อย่างง่ายดาย ดูข้อมูลเพิ่มเติมได้ที่ เว็บไซต์', + 'pushover_device_description' => 'ชื่ออุปกรณ์ที่จะส่งข้อความถึง ปล่อยว่างไว้หากต้องการส่งไปยังอุปกรณ์ทั้งหมด.', + 'discord' => 'Discord', + 'discord_label' => 'Discord', + 'discord_description' => 'วาง webhook ของคุณไว้ที่นี่', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram คือแอปแชทที่ทำให้การรับการแจ้งเตือนแบบเรียลไทม์เป็นเรื่องง่าย เยี่ยมชม เอกสาร เพื่อดูข้อมูลเพิ่มเติมและคำแนะนำในการติดตั้ง', + 'telegram_chat_id' => 'Telegram chat id', + 'telegram_chat_id_description' => 'ข้อความจะถูกส่งไปยังห้องแชทที่เกี่ยวข้อง', + 'telegram_get_chat_id' => 'คลิกที่นี่เพื่อรับ chat id ของคุณ', + 'activate_telegram_description' => 'อนุญาตให้ส่งการแจ้งเตือนของ Telegram ไปยัง ID แชทที่ระบุ หากไม่ได้รับอนุญาต Telegram จะไม่อนุญาตให้เราส่งการแจ้งเตือนถึงคุณ', + ), +); diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index fecd4eff..c4448ff6 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -470,7 +470,7 @@ class ConfigController extends AbstractController $webhook = psm_build_webhook(); $webhook->setUrl($user->webhook_url); $webhook->setJson($user->webhook_json); - $message = (psm_get_lang('config', 'test_message')); + $message = ['#message' => (psm_get_lang('config', 'test_message'))]; $result = $webhook->sendWebhook($message); if ($result==1) { $this->addMessage(psm_get_lang('config', 'webhook_sent'), 'success'); diff --git a/src/psm/Module/Install/Controller/InstallController.php b/src/psm/Module/Install/Controller/InstallController.php index c8bc5dd6..2b105b02 100644 --- a/src/psm/Module/Install/Controller/InstallController.php +++ b/src/psm/Module/Install/Controller/InstallController.php @@ -84,7 +84,7 @@ class InstallController extends AbstractController } else { $this->addMessage('PHP version: ' . $phpv, 'success'); } - if (version_compare(PHP_RELEASE_VERSION, '7', '<')) { + if (version_compare(PHP_MAJOR_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 diff --git a/src/psm/Module/Server/Controller/ServerController.php b/src/psm/Module/Server/Controller/ServerController.php index 53ab97ab..56209db8 100644 --- a/src/psm/Module/Server/Controller/ServerController.php +++ b/src/psm/Module/Server/Controller/ServerController.php @@ -140,6 +140,19 @@ class ServerController extends AbstractServerController return $this->twig->render('module/server/server/list.tpl.html', $tpl_data); } + /** + * Set default monitoring dropdown selections to configured values. + */ + private static function setDefaultMonitoringNotificationsToConfiguredValues( array &$tpl_data ): void { + $tpl_data['edit_email_selected'] = psm_get_conf('email_status') ? 'yes' : 'no'; + $tpl_data['edit_sms_selected'] = psm_get_conf('sms_status') ? 'yes' : 'no'; + $tpl_data['edit_pushover_selected'] = psm_get_conf('pushover_status') ? 'yes' : 'no'; + $tpl_data['edit_telegram_selected'] = psm_get_conf('telegram_status') ? 'yes' : 'no'; + $tpl_data['edit_jabber_selected'] = psm_get_conf('jabber_status') ? 'yes' : 'no'; + $tpl_data['edit_discord_selected'] = psm_get_conf('discord_status') ? 'yes' : 'no'; + $tpl_data['edit_webhook_selected'] = psm_get_conf('webhook_status') ? 'yes' : 'no'; + } + /** * Prepare the template to show the update screen for a single server */ @@ -154,6 +167,8 @@ class ServerController extends AbstractServerController $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); $tpl_data = $this->getLabels(); + self::setDefaultMonitoringNotificationsToConfiguredValues( $tpl_data ); + $tpl_data['edit_server_id'] = $this->server_id; $tpl_data['url_save'] = psm_build_url(array( 'mod' => 'server', diff --git a/src/psm/Module/User/Controller/LoginController.php b/src/psm/Module/User/Controller/LoginController.php index 4026ff83..1e248d00 100644 --- a/src/psm/Module/User/Controller/LoginController.php +++ b/src/psm/Module/User/Controller/LoginController.php @@ -93,7 +93,8 @@ class LoginController extends AbstractController { if (isset($_POST['user_name'])) { $user = $this->getUser()->getUserByUsername($_POST['user_name']); - + $this->addMessage(psm_get_lang('login', 'success_password_forgot'), 'success'); + if (!empty($user)) { $token = $this->getUser()->generatePasswordResetToken($user->user_id); // we have a token, send it along @@ -102,11 +103,8 @@ class LoginController extends AbstractController $user->email, $token ); - - $this->addMessage(psm_get_lang('login', 'success_password_forgot'), 'success'); + return $this->executeLogin(); - } else { - $this->addMessage(psm_get_lang('login', 'error_user_incorrect'), 'error'); } } diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index 5728007e..0cc91a83 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -207,7 +207,7 @@ class Installer `key` varchar(255) NOT NULL, `value` varchar(255) NOT NULL, PRIMARY KEY (`key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'users' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users` ( `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_name` varchar(64) NOT NULL COMMENT 'user''s name, unique', @@ -228,19 +228,19 @@ class Installer `email` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `unique_username` (`user_name`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'users_preferences' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users_preferences` ( `user_id` int(11) unsigned NOT NULL, `key` varchar(255) NOT NULL, `value` varchar(255) NOT NULL, PRIMARY KEY (`user_id`, `key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'users_servers' => "CREATE TABLE `" . PSM_DB_PREFIX . "users_servers` ( `user_id` INT( 11 ) UNSIGNED NOT NULL , `server_id` INT( 11 ) UNSIGNED NOT NULL , PRIMARY KEY ( `user_id` , `server_id` ) - ) ENGINE = MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'log' => "CREATE TABLE `" . PSM_DB_PREFIX . "log` ( `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `server_id` int(11) unsigned NOT NULL, @@ -248,12 +248,12 @@ class Installer `message` TEXT NOT NULL, `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`log_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'log_users' => "CREATE TABLE `" . PSM_DB_PREFIX . "log_users` ( `log_id` int(11) UNSIGNED NOT NULL , `user_id` int(11) UNSIGNED NOT NULL , PRIMARY KEY (`log_id`, `user_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'servers' => "CREATE TABLE `" . PSM_DB_PREFIX . "servers` ( `server_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `ip` varchar(500) NOT NULL, @@ -294,7 +294,7 @@ class Installer `last_error_output` TEXT, `last_output` TEXT, PRIMARY KEY (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'servers_uptime' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_uptime` ( `servers_uptime_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `server_id` int(11) unsigned NOT NULL, @@ -303,7 +303,7 @@ class Installer `latency` float(9,7) DEFAULT NULL, PRIMARY KEY (`servers_uptime_id`), KEY `server_id` (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", PSM_DB_PREFIX . 'servers_history' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_history` ( `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `server_id` int(11) unsigned NOT NULL, @@ -315,7 +315,7 @@ class Installer `checks_failed` int(11) unsigned NOT NULL, PRIMARY KEY (`servers_history_id`), UNIQUE KEY `server_id_date` (`server_id`,`date`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ) DEFAULT CHARSET=utf8;", ); foreach ($tables as $name => $sql) { @@ -468,7 +468,7 @@ class Installer `latency` float(9,7) DEFAULT NULL, PRIMARY KEY (`servers_uptime_id`), KEY `server_id` (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + ) DEFAULT CHARSET=utf8;"; $queries[] = "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_history` ( `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -481,7 +481,7 @@ class Installer `checks_failed` int(11) unsigned NOT NULL, PRIMARY KEY (`servers_history_id`), UNIQUE KEY `server_id_date` (`server_id`,`date`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + ) DEFAULT CHARSET=utf8;"; $queries[] = "CREATE TABLE `" . PSM_DB_PREFIX . "users_servers` ( `user_id` INT( 11 ) UNSIGNED NOT NULL , @@ -543,7 +543,7 @@ class Installer `key` varchar(255) NOT NULL, `value` varchar(255) NOT NULL, PRIMARY KEY (`user_id`, `key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + ) DEFAULT CHARSET=utf8;"; $this->execSQL($queries); } @@ -572,7 +572,7 @@ class Installer `log_id` int(11) UNSIGNED NOT NULL , `user_id` int(11) UNSIGNED NOT NULL , PRIMARY KEY (`log_id`, `user_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); + ) DEFAULT CHARSET=utf8;"); // Migrate the data $logs = $this->db->select(PSM_DB_PREFIX . 'log', null, array('log_id', 'user_id')); diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index 6951efea..e21b1acb 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -424,10 +424,12 @@ class StatusNotifier psm_parse_msg($this->status_new, 'email_subject', $this->server); $mail->Priority = 1; + $publicUrl = PSM_BASE_URL.'/public.php'; + $body = key_exists('message', $combi) ? $combi['message'] : psm_parse_msg($this->status_new, 'email_body', $this->server); - if ((bool)psm_get_conf('email_add_url')) $body .= PHP_EOL.PHP_EOL.''.PSM_BASE_URL.''; + if ((bool)psm_get_conf('email_add_url')) $body .= PHP_EOL.PHP_EOL.''.$publicUrl.''; $mail->Body = $body; $mail->AltBody = str_replace('
', "\n", $body); @@ -609,6 +611,7 @@ class StatusNotifier } $webhook = psm_build_webhook(); + $subject = key_exists('subject', $combi) ? $combi['subject'] : psm_parse_msg($this->status_new, 'email_subject', $this->server); $message = key_exists('message', $combi) ? $combi['message'] : @@ -638,7 +641,8 @@ class StatusNotifier '#server_label' => $this->server['label'], '#server_error' => $this->server['error'], '#server_last_offline_duration' => $this->status_new ? $this->server['last_offline_duration'] : '', - '#status' => $this->status_new ? 'online' : 'offline' + '#status' => $this->status_new ? 'online' : 'offline', + '#subject' => $subject ]); } } diff --git a/src/templates/default/main/body.tpl.html b/src/templates/default/main/body.tpl.html index 31b96f98..516e3f47 100644 --- a/src/templates/default/main/body.tpl.html +++ b/src/templates/default/main/body.tpl.html @@ -16,7 +16,7 @@ - + @@ -24,8 +24,9 @@ + diff --git a/src/templates/default/static/css/custom.css b/src/templates/default/static/css/custom.css new file mode 100644 index 00000000..12da06f6 --- /dev/null +++ b/src/templates/default/static/css/custom.css @@ -0,0 +1,4 @@ +/*# Used to override main styles for custom layout adjustments and colors. */ +.container-fluid { + max-width: 100%; +} \ No newline at end of file