Added support for Discord using Webhooks (#971)

* Added support for Discord using Webhooks

* Bumped version

* Fixed broken upgrade

* Moved discord below Jabber

* Fixed broken comment

* Added missing translation

* Updated version

* Typo

* Moved Discord under Jabber

* Fixed icons

* Moved Webhook and discord after Jabber

Co-authored-by: Tim <TimZ99@users.noreply.github.com>
This commit is contained in:
Daniel Krusky 2020-08-12 15:33:44 -04:00 committed by GitHub
parent fe9cdab437
commit d0f5d18fc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 336 additions and 118 deletions

View File

@ -5,7 +5,7 @@ PHP Server Monitor
:alt: Join the chat at https://gitter.im/erickrf/nlpnet :alt: Join the chat at https://gitter.im/erickrf/nlpnet
:target: https://gitter.im/phpservermon/phpservermon :target: https://gitter.im/phpservermon/phpservermon
Version 3.5.2 Version 3.6.0.beta2
PHP Server Monitor is a script that checks whether your websites and servers are up and running. PHP Server Monitor is a script that checks whether your websites and servers are up and running.
It comes with a web based user interface where you can manage your services and websites, It comes with a web based user interface where you can manage your services and websites,
@ -16,7 +16,7 @@ Features:
--------- ---------
* Monitor services and websites (see below). * Monitor services and websites (see below).
* Email, SMS, Pushover, Telegram and Jabber notifications. * Email, SMS, Discord, Pushover, Telegram and Jabber notifications.
* View history graphs of uptime and latency. * View history graphs of uptime and latency.
* User authentication with 2 levels (administrator and regular user). * User authentication with 2 levels (administrator and regular user).
* Logs of connection errors, outgoing emails and text messages. * Logs of connection errors, outgoing emails and text messages.

View File

@ -51,9 +51,9 @@ copyright = u'2008-2017, Pepijn Over'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '3.5' version = '3.6'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '3.5.2' release = '3.6.0.beta2'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View File

@ -89,6 +89,10 @@ The following people have contributed to the development of PHP Server Monitor:
* SMSAPI gateway * SMSAPI gateway
* Daniel Krusky - https://github.com/dkrusky
* Discord webhook support
Translators Translators
+++++++++++ +++++++++++
@ -196,4 +200,4 @@ The following libraries are being used by PHP Server Monitor:
* PHP-Pushover - https://github.com/kryap/php-pushover * PHP-Pushover - https://github.com/kryap/php-pushover
* Symfony - https://symfony.com * Symfony - https://symfony.com
* Random_compat - https://github.com/paragonie/random_compat * Random_compat - https://github.com/paragonie/random_compat
* Hammer.js - https://github.com/hammerjs/hammer.js * Hammer.js - https://github.com/hammerjs/hammer.js

View File

@ -30,7 +30,7 @@
/** /**
* Current PSM version * Current PSM version
*/ */
define('PSM_VERSION', '3.6.0.beta1'); define('PSM_VERSION', '3.6.0.beta2');
/** /**
* URL to check for updates. Will not be checked if turned off on config page. * URL to check for updates. Will not be checked if turned off on config page.

View File

@ -50,9 +50,7 @@ $sm_lang = array(
'no' => 'No', 'no' => 'No',
'insert' => 'Insert', 'insert' => 'Insert',
'add_new' => 'Add new', 'add_new' => 'Add new',
'update_available' => 'A new version ({version}) is available. Click <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.',
href="https://github.com/phpservermon/phpservermon/releases/latest" target="_blank"
rel="noopener">here</a> to download the update.',
'back_to_top' => 'Back to top', 'back_to_top' => 'Back to top',
'go_back' => 'Go back', 'go_back' => 'Go back',
'ok' => 'OK', 'ok' => 'OK',
@ -108,31 +106,25 @@ $sm_lang = array(
'level' => 'Level', 'level' => 'Level',
'level_10' => 'Administrator', 'level_10' => 'Administrator',
'level_20' => 'User', 'level_20' => 'User',
'level_description' => '<b>Administrators</b> have full access: they can manage servers, users and edit the '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.',
global configuration.<br><b>Users</b> can only view and run the updater for the
servers that have been assigned to them.',
'mobile' => 'Mobile', 'mobile' => 'Mobile',
'email' => 'Email', 'email' => 'Email',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See <a 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See <a href="https://pushover.net/" target="_blank">their website</a> for more info.',
href="https://pushover.net/" target="_blank">their website</a> for more info.',
'pushover_key' => 'Pushover Key', 'pushover_key' => 'Pushover Key',
'pushover_device' => 'Pushover Device', 'pushover_device' => 'Pushover Device',
'pushover_device_description' => 'Device name to send the message to. Leave empty to send it to all devices.', 'pushover_device_description' => 'Device name to send the message to. Leave empty to send it to all devices.',
'discord' => 'Discord',
'discord_label' => 'Discord',
'discord_description' => 'Put your <a href="https://discordjs.guide/popular-topics/webhooks.html" target="_blank">webhook</a> here.',
'telegram' => 'Telegram', 'telegram' => 'Telegram',
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> is a chat app that 'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> is a chat app that makes it easy to get real-time notifications. Visit the <a href="http://docs.phpservermonitor.org/" target="_blank">documentation</a> for more info and an install guide.',
makes it easy to get real-time notifications. Visit the <a
href="http://docs.phpservermonitor.org/" target="_blank">documentation</a> for more
info and an install guide.',
'telegram_chat_id' => 'Telegram chat id', 'telegram_chat_id' => 'Telegram chat id',
'telegram_chat_id_description' => 'The message will be send to the corresponding chat.', 'telegram_chat_id_description' => 'The message will be send to the corresponding chat.',
'telegram_get_chat_id' => 'Click here to get your chat id', 'telegram_get_chat_id' => 'Click here to get your chat id',
'activate_telegram' => 'Activate Telegram notifications', 'activate_telegram' => 'Activate Telegram notifications',
'activate_telegram_description' => 'Allow Telegram notifications to be sent to the specified chat id. Without 'activate_telegram_description' => 'Allow Telegram notifications to be sent to the specified chat id. Without this permission, Telegram doesn\'t allow us to send notifications to you.',
this permission, Telegram doesn\'t allow us to send notifications to you.', 'telegram_bot_username_found' => 'The bot was found!<br><a href="%s" target="_blank" rel="noopener"><button class="btn btn-primary">Next step</button></a> <br>This will open a chat with the bot. Here you need to press start or type /start.',
'telegram_bot_username_found' => 'The bot was found!<br><a href="%s" target="_blank" rel="noopener"><button
class="btn btn-primary">Next step</button></a> <br>This will open a chat
with the bot. Here you need to press start or type /start.',
'telegram_bot_username_error_token' => '401 - Unauthorized. Please make sure that the API token is valid.', 'telegram_bot_username_error_token' => '401 - Unauthorized. Please make sure that the API token is valid.',
'telegram_bot_error' => 'An error has occurred while activating Telegram notification: %s', 'telegram_bot_error' => 'An error has occurred while activating Telegram notification: %s',
'jabber' => 'Jabber', 'jabber' => 'Jabber',
@ -153,8 +145,7 @@ $sm_lang = array(
'profile' => 'Profile', 'profile' => 'Profile',
'profile_updated' => 'Your profile has been updated.', 'profile_updated' => 'Your profile has been updated.',
'error_user_name_bad_length' => 'Usernames must be between 2 and 64 characters.', 'error_user_name_bad_length' => 'Usernames must be between 2 and 64 characters.',
'error_user_name_invalid' => 'The username may only contain alphabetic characters (a-z, A-Z), digits (0-9), 'error_user_name_invalid' => 'The username may only contain alphabetic characters (a-z, A-Z), digits (0-9), dots (.) and underscores (_).',
dots (.) and underscores (_).',
'error_user_name_exists' => 'The given username already exists in the database.', 'error_user_name_exists' => 'The given username already exists in the database.',
'error_user_email_bad_length' => 'Email addresses must be between 5 and 255 characters.', 'error_user_email_bad_length' => 'Email addresses must be between 5 and 255 characters.',
'error_user_email_invalid' => 'The email address is invalid.', 'error_user_email_invalid' => 'The email address is invalid.',
@ -170,6 +161,7 @@ $sm_lang = array(
'status' => 'Status', 'status' => 'Status',
'email' => 'Email', 'email' => 'Email',
'sms' => 'SMS', 'sms' => 'SMS',
'discord' => 'Discord',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
'webhook' => 'Webhook', 'webhook' => 'Webhook',
'telegram' => 'Telegram', 'telegram' => 'Telegram',
@ -209,17 +201,13 @@ $sm_lang = array(
'type_service' => 'Service', 'type_service' => 'Service',
'type_ping' => 'Ping', 'type_ping' => 'Ping',
'pattern' => 'Search string/pattern', 'pattern' => 'Search string/pattern',
'pattern_description' => 'If this pattern is not found on the website, the server will be marked 'pattern_description' => 'If this pattern is not found on the website, the server will be marked online/offline. Regular expressions are allowed.',
online/offline. Regular expressions are allowed.',
'pattern_online' => 'Pattern indicates website is', 'pattern_online' => 'Pattern indicates website is',
'pattern_online_description' => 'Online: If this pattern was found on the website, the server will be marked 'pattern_online_description' => 'Online: If this pattern was found on the website, the server will be marked online. Offline: If this pattern was not found on the website, the server will be marked offline.',
online. Offline: If this pattern was not found on the website, the server
will be marked offline.',
'redirect_check' => 'Redirecting to another domain is', 'redirect_check' => 'Redirecting to another domain is',
'redirect_check_description' => 'Redirect to another domain is usually a bad sign.', 'redirect_check_description' => 'Redirect to another domain is usually a bad sign.',
'allow_http_status' => 'Allow HTTP status code', 'allow_http_status' => 'Allow HTTP status code',
'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as 'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as online by default. Seperate with |.',
online by default. Seperate with |.',
'header_name' => 'Header name', 'header_name' => 'Header name',
'header_value' => 'Header value', 'header_value' => 'Header value',
'header_name_description' => 'Case-sensitive.', 'header_name_description' => 'Case-sensitive.',
@ -237,6 +225,8 @@ $sm_lang = array(
'send_email' => 'Send Email', 'send_email' => 'Send Email',
'sms' => 'SMS', 'sms' => 'SMS',
'send_sms' => 'Send SMS', 'send_sms' => 'Send SMS',
'discord' => 'Discord',
'send_discord' => 'Send Discord notification',
'webhook' => 'Webhook', 'webhook' => 'Webhook',
'send_webhook' => 'Send Webhook notification', 'send_webhook' => 'Send Webhook notification',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
@ -266,8 +256,7 @@ $sm_lang = array(
'warning_threshold' => 'Warning threshold', 'warning_threshold' => 'Warning threshold',
'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.',
'ssl_cert_expiry_days' => 'SSL Certificate Validity', 'ssl_cert_expiry_days' => 'SSL Certificate Validity',
'ssl_cert_expiry_days_description' => 'The minimum remaining days the SSL certificate is still valid. Use 0 to 'ssl_cert_expiry_days_description' => 'The minimum remaining days the SSL certificate is still valid. Use 0 to disable check.',
disable check.',
'ssl_cert_expired' => 'SSL certificate expired since', 'ssl_cert_expired' => 'SSL certificate expired since',
'ssl_cert_expiring' => 'SSL certificate expiring:', 'ssl_cert_expiring' => 'SSL certificate expiring:',
'chart_last_week' => 'Last week', 'chart_last_week' => 'Last week',
@ -278,6 +267,7 @@ $sm_lang = array(
'chart_short_time_format' => '%H:%M', 'chart_short_time_format' => '%H:%M',
'warning_notifications_disabled_sms' => 'SMS notifications are disabled.', 'warning_notifications_disabled_sms' => 'SMS notifications are disabled.',
'warning_notifications_disabled_email' => 'Email notifications are disabled.', 'warning_notifications_disabled_email' => 'Email notifications are disabled.',
'warning_notifications_disabled_discord' => 'Discord notifications are disabled.',
'warning_notifications_disabled_webhook' => 'Webhook notifications are disabled.', 'warning_notifications_disabled_webhook' => 'Webhook notifications are disabled.',
'warning_notifications_disabled_pushover' => 'Pushover notifications are disabled.', 'warning_notifications_disabled_pushover' => 'Pushover notifications are disabled.',
'warning_notifications_disabled_telegram' => 'Telegram notifications are disabled.', 'warning_notifications_disabled_telegram' => 'Telegram notifications are disabled.',
@ -289,8 +279,7 @@ $sm_lang = array(
'error_server_ip_bad_website' => 'The website URL is not valid.', 'error_server_ip_bad_website' => 'The website URL is not valid.',
'error_server_type_invalid' => 'The selected server type is invalid.', 'error_server_type_invalid' => 'The selected server type is invalid.',
'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.', 'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.',
'error_server_ssl_cert_expiry_days' => 'The remaining days for SSL certificate validity must be a valid 'error_server_ssl_cert_expiry_days' => 'The remaining days for SSL certificate validity must be a valid integer greater than or equal to 0.',
integer greater than or equal to 0.',
), ),
'config' => array( 'config' => array(
'general' => 'General', 'general' => 'General',
@ -298,8 +287,7 @@ $sm_lang = array(
'language' => 'Language', 'language' => 'Language',
'show_update' => 'Check for updates?', 'show_update' => 'Check for updates?',
'password_encrypt_key' => 'The encryption key password', 'password_encrypt_key' => 'The encryption key password',
'password_encrypt_key_note' => 'This key is used to encrypt passwords that are stored on servers for access to 'password_encrypt_key_note' => 'This key is used to encrypt passwords that are stored on servers for access to websites. If the key will change the stored password is invalid!',
websites. If the key will change the stored password is invalid!',
'proxy' => 'Enable proxy', 'proxy' => 'Enable proxy',
'proxy_url' => 'Proxy URL', 'proxy_url' => 'Proxy URL',
'proxy_user' => 'Proxy username', 'proxy_user' => 'Proxy username',
@ -320,6 +308,8 @@ $sm_lang = array(
'sms_gateway_username' => 'Gateway username', 'sms_gateway_username' => 'Gateway username',
'sms_gateway_password' => 'Gateway password', 'sms_gateway_password' => 'Gateway password',
'sms_from' => 'Sender\'s phone number', 'sms_from' => 'Sender\'s phone number',
'discord_status' => 'Allow sending Discord messages',
'discord_description' => 'Discord is a service that makes it easy to get real-time notifications. See <a href="https://discord.com/" target="_blank">their website</a> for more info.',
'webhook_status' => 'Allow sending webhooks', 'webhook_status' => 'Allow sending webhooks',
'webhook_description' => 'Allow sending webhooks to services like slack. The message payload end endpoint are defined in the profile settings.', 'webhook_description' => 'Allow sending webhooks to services like slack. The message payload end endpoint are defined in the profile settings.',
'webhook_url' => 'Webhook Url', 'webhook_url' => 'Webhook Url',
@ -327,26 +317,16 @@ $sm_lang = array(
'webhook_json' => 'Webhook Json', 'webhook_json' => 'Webhook Json',
'webhook_json_description' => 'Customized Json, use #message as message variable.', 'webhook_json_description' => 'Customized Json, use #message as message variable.',
'pushover_status' => 'Allow sending Pushover messages', 'pushover_status' => 'Allow sending Pushover messages',
'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See <a 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See <a href="https://pushover.net/" target="_blank">their website</a> for more info.',
href="https://pushover.net/" target="_blank">their website</a> for more info.',
'pushover_clone_app' => 'Click here to create your Pushover app', 'pushover_clone_app' => 'Click here to create your Pushover app',
'pushover_api_token' => 'Pushover App API Token', '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" '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.',
rel="noopener">register an App</a> at their website and enter the App API
Token here.',
'telegram_status' => 'Allow sending Telegram messages', 'telegram_status' => 'Allow sending Telegram messages',
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> is a chat app that 'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> is a chat app that makes it easy to get real-time notifications. Visit the <a href="http://docs.phpservermonitor.org/" target="_blank">documentation</a> for more info and an install guide.',
makes it easy to get real-time notifications. Visit the <a
href="http://docs.phpservermonitor.org/" target="_blank">documentation</a> for more
info and an install guide.',
'telegram_api_token' => 'Telegram API Token', 'telegram_api_token' => 'Telegram API Token',
'telegram_api_token_description' => 'Before you can use Telegram, you need to get a API token. Visit the <a 'telegram_api_token_description' => 'Before you can use Telegram, you need to get a API token. Visit the <a href="http://docs.phpservermonitor.org/" target="_blank">documentation</a> for help.',
href="http://docs.phpservermonitor.org/"
target="_blank">documentation</a> for help.',
'jabber_status' => 'Allow sending Jabber (XMPP) messages', 'jabber_status' => 'Allow sending Jabber (XMPP) messages',
'jabber_description' => 'Visit the <a 'jabber_description' => 'Visit the <a href="http://docs.phpservermonitor.org/">documentation</a> for more info and an install guide.',
href="http://docs.phpservermonitor.org/">documentation</a> for more info and an
install guide.',
'jabber_host' => 'Host', 'jabber_host' => 'Host',
'jabber_host_description' => 'Host of your Jabber account provider. For Google Account use talk.google.com.', 'jabber_host_description' => 'Host of your Jabber account provider. For Google Account use talk.google.com.',
'jabber_port' => 'Port', 'jabber_port' => 'Port',
@ -359,26 +339,19 @@ $sm_lang = array(
'jabber_password_description' => 'Fill only to set or change.', 'jabber_password_description' => 'Fill only to set or change.',
'jabber_check' => 'Check your Jabber account if message was received.', 'jabber_check' => 'Check your Jabber account if message was received.',
'alert_type' => 'Select when you\'d like to be notified.', '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 '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 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><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.',
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><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_status' => 'Status change',
'alert_type_offline' => 'Offline', 'alert_type_offline' => 'Offline',
'alert_type_always' => 'Always', 'alert_type_always' => 'Always',
'combine_notifications' => 'Combine notifications', 'combine_notifications' => 'Combine notifications',
'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into 'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into 1 single notification. (This does not affect SMS notifications.)',
1 single notification. (This does not affect SMS notifications.)',
'alert_proxy' => 'Even if enabled, proxy is never used for services', 'alert_proxy' => 'Even if enabled, proxy is never used for services',
'alert_proxy_url' => 'Format: host:port', 'alert_proxy_url' => 'Format: host:port',
'log_status' => 'Log status', 'log_status' => 'Log status',
'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the 'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the notification settings are passed.',
notification settings are passed.',
'log_email' => 'Log emails sent by the script', 'log_email' => 'Log emails sent by the script',
'log_sms' => 'Log text messages sent by the script', 'log_sms' => 'Log text messages sent by the script',
'log_discord' => 'Log Discord messages sent by the script',
'log_pushover' => 'Log pushover messages sent by the script', 'log_pushover' => 'Log pushover messages sent by the script',
'log_webhook' => 'Log webhook messages sent by the script', 'log_webhook' => 'Log webhook messages sent by the script',
'log_telegram' => 'Log Telegram messages sent by the script', 'log_telegram' => 'Log Telegram messages sent by the script',
@ -386,12 +359,14 @@ $sm_lang = array(
'updated' => 'The configuration has been updated.', 'updated' => 'The configuration has been updated.',
'tab_email' => 'Email', 'tab_email' => 'Email',
'tab_sms' => 'SMS', 'tab_sms' => 'SMS',
'tab_discord' => 'Discord',
'tab_pushover' => 'Pushover', 'tab_pushover' => 'Pushover',
'tab_webhook' => 'Webhook', 'tab_webhook' => 'Webhook',
'tab_telegram' => 'Telegram', 'tab_telegram' => 'Telegram',
'tab_jabber' => 'Jabber', 'tab_jabber' => 'Jabber',
'settings_email' => 'Email settings', 'settings_email' => 'Email settings',
'settings_sms' => 'Text message settings', 'settings_sms' => 'Text message settings',
'settings_discord' => 'Discord settings',
'settings_pushover' => 'Pushover settings', 'settings_pushover' => 'Pushover settings',
'settings_webhook' => 'Webhook settings', 'settings_webhook' => 'Webhook settings',
'settings_telegram' => 'Telegram settings', 'settings_telegram' => 'Telegram settings',
@ -400,11 +375,12 @@ $sm_lang = array(
'settings_log' => 'Log settings', 'settings_log' => 'Log settings',
'settings_proxy' => 'Proxy settings', 'settings_proxy' => 'Proxy settings',
'auto_refresh' => 'Auto-refresh', 'auto_refresh' => 'Auto-refresh',
'auto_refresh_description' => 'Auto-refresh servers page.<br><span class="small">Time in seconds, if 0 the 'auto_refresh_description' => 'Auto-refresh servers page.<br><span class="small">Time in seconds, if 0 the page won\'t refresh.</span>',
page won\'t refresh.</span>',
'test' => 'Test', 'test' => 'Test',
'test_email' => 'An email will be sent to the address specified in your user profile.', 'test_email' => 'An email will be sent to the address specified in your user profile.',
'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.', '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 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user
profile.', profile.',
'test_webhook' => 'A webhook notification will be sent to the given url endpoint.', 'test_webhook' => 'A webhook notification will be sent to the given url endpoint.',
@ -418,28 +394,27 @@ $sm_lang = array(
'sms_sent' => 'SMS sent', 'sms_sent' => 'SMS sent',
'sms_error' => 'An error has occurred while sending the SMS: %s', 'sms_error' => 'An error has occurred while sending the SMS: %s',
'sms_error_nomobile' => 'Unable to send test SMS: no valid phone number found in your profile.', 'sms_error_nomobile' => 'Unable to send test SMS: no valid phone number found in your profile.',
'discord_sent' => 'Discord notification sent',
'discord_error' => 'An error has occurred while sending the Discord notification: %s',
'discord_error_nowebhook' => 'Unable to send test Discord notification: no valid Discord webhook found in your user profile.',
'webhook_sent' => 'Webhook notification sent', 'webhook_sent' => 'Webhook notification sent',
'webhook_error' => 'An error has occurred while sending the webhook notification: %s', 'webhook_error' => 'An error has occurred while sending the webhook notification: %s',
'webhook_error_nourl' => 'Unable to send test notification: no url found in user profile.', 'webhook_error_nourl' => 'Unable to send test notification: no url found in user profile.',
'webhook_error_nojson' => 'Unable to send test notification: no json found in user profile.', 'webhook_error_nojson' => 'Unable to send test notification: no json found in user profile.',
'pushover_sent' => 'Pushover notification sent', 'pushover_sent' => 'Pushover notification sent',
'pushover_error' => 'An error has occurred while sending the Pushover notification: %s', 'pushover_error' => 'An error has occurred while sending the Pushover notification: %s',
'pushover_error_noapp' => 'Unable to send test notification: no Pushover App API token found in the global 'pushover_error_noapp' => 'Unable to send test notification: no Pushover App API token found in the global configuration.',
configuration.',
'pushover_error_nokey' => 'Unable to send test notification: no Pushover key found in your profile.', 'pushover_error_nokey' => 'Unable to send test notification: no Pushover key found in your profile.',
'telegram_sent' => 'Telegram notification sent', 'telegram_sent' => 'Telegram notification sent',
'telegram_error' => 'An error has occurred while sending the Telegram notification: %s', 'telegram_error' => 'An error has occurred while sending the Telegram notification: %s',
'telegram_error_notoken' => 'Unable to send test notification: no Telegram API token found in the global 'telegram_error_notoken' => 'Unable to send test notification: no Telegram API token found in the global configuration.',
configuration.',
'telegram_error_noid' => 'Unable to send test notification: no chat id found in your profile.', 'telegram_error_noid' => 'Unable to send test notification: no chat id found in your profile.',
'jabber_sent' => 'Telegram notification sent', 'jabber_sent' => 'Telegram notification sent',
'jabber_error' => 'An error has occurred while sending the Telegram notification: %s', 'jabber_error' => 'An error has occurred while sending the Telegram notification: %s',
'jabber_error_noconfig' => 'Unable to send test notification: no Jabber account set in the global 'jabber_error_noconfig' => 'Unable to send test notification: no Jabber account set in the global configuration.',
configuration.',
'jabber_error_noaccount' => 'Unable to send test notification: no Jabber account found in your profile.', 'jabber_error_noaccount' => 'Unable to send test notification: no Jabber account found in your profile.',
'log_retention_period' => 'Log retention period', 'log_retention_period' => 'Log retention period',
'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server uptime. Enter 0 to disable log cleanup.',
uptime. Enter 0 to disable log cleanup.',
'log_retention_days' => 'days', 'log_retention_days' => 'days',
'user_agent' => 'User Agent', 'user_agent' => 'User Agent',
'user_agent_key_note' => 'Custom user agent used by monitor within communication with external services.', 'user_agent_key_note' => 'Custom user agent used by monitor within communication with external services.',
@ -447,23 +422,24 @@ $sm_lang = array(
'notifications' => array( 'notifications' => array(
'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%',
'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', '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_discord_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_email_body' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: '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%', %PORT%<br>Error: %ERROR%<br>Date: %DATE%',
'off_webhook_title' => 'Server \'%LABEL%\' is DOWN', 'off_webhook_title' => 'Server \'%LABEL%\' is DOWN',
'off_webhook_message' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: 'off_webhook_message' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP:
%IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%', %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%',
'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN',
'off_pushover_message' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: '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%',
%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_telegram_message' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: 'off_jabber_message' => 'Failed to connect to the following server:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%',
%IP%<br>Port: %PORT%<br>Error: %ERROR%<br>Date: %DATE%',
'off_jabber_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_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_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING',
'on_email_body' => 'Server \'%LABEL%\' is running again, it was down for '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: %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date:
%DATE%', %DATE%',
'on_discord_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_webhook_title' => 'Server \'%LABEL%\' is RUNNING', 'on_webhook_title' => 'Server \'%LABEL%\' is RUNNING',
'on_webhook_message' => 'Server \'%LABEL%\' is running again, it was down for 'on_webhook_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: %LAST_OFFLINE_DURATION%:<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date:
@ -480,6 +456,8 @@ $sm_lang = array(
%DATE%', %DATE%',
'combi_off_email_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: '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>', %ERROR%</li><li>Date: %DATE%</li></ul>',
'combi_off_discord_message' => '- Server: %LABEL%<br>- IP: %IP%<br>- Port: %PORT%<br>- Error: %ERROR%<br>-
Date: %DATE%<br><br>',
'combi_off_webhook_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error: 'combi_off_webhook_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error:
%ERROR%</li><li>Date: %DATE%</li></ul>', %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: 'combi_off_pushover_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: %PORT%</li><li>Error:
@ -493,6 +471,8 @@ $sm_lang = array(
'combi_on_webhook_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: 'combi_on_webhook_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port:
%PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date:
%DATE%</li></ul>', %DATE%</li></ul>',
'combi_on_discord_message' => '- Server: %LABEL%<br>- IP: %IP%<br>- Port: %PORT%<br>-
Downtime: %LAST_OFFLINE_DURATION%<br>- Date: %DATE%<br><br>',
'combi_on_pushover_message' => '<ul><li>Server: %LABEL%</li><li>IP: %IP%</li><li>Port: '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: %PORT%</li><li>Downtime: %LAST_OFFLINE_DURATION%</li><li>Date:
%DATE%</li></ul>', %DATE%</li></ul>',
@ -504,6 +484,8 @@ $sm_lang = array(
'combi_webhook_subject' => '\'%UP%\' servers UP again, \'%DOWN%\' servers DOWN', 'combi_webhook_subject' => '\'%UP%\' servers UP again, \'%DOWN%\' servers DOWN',
'combi_pushover_subject' => '\'%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 '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_discord_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following
servers are up again:</b><br>%UP_SERVERS%', servers are up again:</b><br>%UP_SERVERS%',
'combi_webhook_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following 'combi_webhook_message' => '<b>The following servers went down:</b><br>%DOWN_SERVERS%<br><b>The following
servers are up again:</b><br>%UP_SERVERS%', servers are up again:</b><br>%UP_SERVERS%',
@ -529,8 +511,7 @@ $sm_lang = array(
'password_forgot' => 'Forgot password?', 'password_forgot' => 'Forgot password?',
'password_reset' => 'Reset password', 'password_reset' => 'Reset password',
'password_reset_email_subject' => 'Reset your password for PHP Server Monitor', '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 'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.<br><br>%link%',
in 1 hour.<br><br>%link%',
'error_user_incorrect' => 'The provided username could not be found.', 'error_user_incorrect' => 'The provided username could not be found.',
'error_login_incorrect' => 'The information is incorrect.', 'error_login_incorrect' => 'The information is incorrect.',
'error_login_passwords_nomatch' => 'The provided passwords do not match.', 'error_login_passwords_nomatch' => 'The provided passwords do not match.',

View File

@ -43,6 +43,7 @@ class ConfigController extends AbstractController
'email_status', 'email_status',
'email_smtp', 'email_smtp',
'sms_status', 'sms_status',
'discord_status',
'pushover_status', 'pushover_status',
'webhook_status', 'webhook_status',
'telegram_status', 'telegram_status',
@ -50,6 +51,7 @@ class ConfigController extends AbstractController
'log_status', 'log_status',
'log_email', 'log_email',
'log_sms', 'log_sms',
'log_discord',
'log_pushover', 'log_pushover',
'log_webhook', 'log_webhook',
'log_telegram', 'log_telegram',
@ -212,7 +214,8 @@ class ConfigController extends AbstractController
$tpl_data[$this->default_tab . '_active'] = 'active'; $tpl_data[$this->default_tab . '_active'] = 'active';
$testmodals = array('email', 'sms', 'pushover','webhook', 'telegram', 'jabber'); $testmodals = array('email', 'sms', 'discord', 'webhook', 'pushover', 'telegram', 'jabber');
foreach ($testmodals as $modal_id) { foreach ($testmodals as $modal_id) {
$modal = new \psm\Util\Module\Modal( $modal = new \psm\Util\Module\Modal(
$this->twig, $this->twig,
@ -274,6 +277,8 @@ class ConfigController extends AbstractController
$this->testEmail(); $this->testEmail();
} elseif (!empty($_POST['test_sms'])) { } elseif (!empty($_POST['test_sms'])) {
$this->testSMS(); $this->testSMS();
} elseif (!empty($_POST['test_discord'])) {
$this->testDiscord();
} elseif (!empty($_POST['test_pushover'])) { } elseif (!empty($_POST['test_pushover'])) {
$this->testPushover(); $this->testPushover();
}elseif (!empty($_POST['test_webhook'])) { }elseif (!empty($_POST['test_webhook'])) {
@ -295,6 +300,8 @@ class ConfigController extends AbstractController
$this->default_tab = 'email'; $this->default_tab = 'email';
} elseif (isset($_POST['sms_submit']) || !empty($_POST['test_sms'])) { } elseif (isset($_POST['sms_submit']) || !empty($_POST['test_sms'])) {
$this->default_tab = 'sms'; $this->default_tab = 'sms';
} elseif (isset($_POST['discord_submit']) || !empty($_POST['test_discord'])) {
$this->default_tab = 'discord';
} elseif (isset($_POST['pushover_submit']) || !empty($_POST['test_pushover'])) { } elseif (isset($_POST['pushover_submit']) || !empty($_POST['test_pushover'])) {
$this->default_tab = 'pushover'; $this->default_tab = 'pushover';
} elseif (isset($_POST['webhook_submit']) || !empty($_POST['test_webhook'])) { } elseif (isset($_POST['webhook_submit']) || !empty($_POST['test_webhook'])) {
@ -355,7 +362,60 @@ class ConfigController extends AbstractController
} }
/** /**
* Execute webhook test * Execute Discord test
*
* @todo move test to separate class
*/
protected function testDiscord()
{
$user = $this->getUser()->getUser();
if (empty($user->discord)) {
$this->addMessage(psm_get_lang('config', 'discord_error_nowebhook'), 'error');
} else {
$success = 0;
$result = 'An unknown error has occurred.';
try {
$curl = curl_init($user->discord);
$json = json_decode(
'{"content":""}',
true
);
$json['content'] = psm_get_lang('config', 'test_message');
$msg = "payload_json=" . urlencode(json_encode($json));
if(isset($curl)) {
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_POSTFIELDS, $msg);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$err = curl_errno($curl);
if ($err != 0 || $httpcode != 204) {
$success = 0;
// $result = ($result == '') ? 'Wrong input, please check if all values are correct!' : $result;
$error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " .
curl_strerror($err) . ". \nResult: " . $result;
$result = $error;
} else {
$success = 1;
}
curl_close($curl);
}
} catch (Exception $e) {
$success = 0;
$result = $e->getMessage();
}
if ($success === 1) {
$this->addMessage(psm_get_lang('config', 'discord_sent'), 'success');
} else {
$this->addMessage(sprintf(psm_get_lang('config', 'discord_error'), $result), 'error');
}
}
}
/** Execute webhook test
* *
* @todo move test to separate class * @todo move test to separate class
*/ */
@ -382,6 +442,7 @@ class ConfigController extends AbstractController
} }
} }
} }
/** /**
* Execute pushover test * Execute pushover test
* *
@ -480,12 +541,14 @@ class ConfigController extends AbstractController
return array( return array(
'label_tab_email' => psm_get_lang('config', 'tab_email'), 'label_tab_email' => psm_get_lang('config', 'tab_email'),
'label_tab_sms' => psm_get_lang('config', 'tab_sms'), 'label_tab_sms' => psm_get_lang('config', 'tab_sms'),
'label_tab_discord' => psm_get_lang('config', 'tab_discord'),
'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'), 'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'),
'label_tab_webhook' => psm_get_lang('config', 'tab_webhook'), 'label_tab_webhook' => psm_get_lang('config', 'tab_webhook'),
'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'), 'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'),
'label_tab_jabber' => psm_get_lang('config', 'tab_jabber'), 'label_tab_jabber' => psm_get_lang('config', 'tab_jabber'),
'label_settings_email' => psm_get_lang('config', 'settings_email'), 'label_settings_email' => psm_get_lang('config', 'settings_email'),
'label_settings_sms' => psm_get_lang('config', 'settings_sms'), 'label_settings_sms' => psm_get_lang('config', 'settings_sms'),
'label_settings_discord' => psm_get_lang('config', 'settings_discord'),
'label_settings_webhook' => psm_get_lang('config', 'settings_webhook'), 'label_settings_webhook' => psm_get_lang('config', 'settings_webhook'),
'label_settings_pushover' => psm_get_lang('config', 'settings_pushover'), 'label_settings_pushover' => psm_get_lang('config', 'settings_pushover'),
'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'), 'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'),
@ -517,6 +580,8 @@ class ConfigController extends AbstractController
'label_sms_gateway_username' => psm_get_lang('config', 'sms_gateway_username'), 'label_sms_gateway_username' => psm_get_lang('config', 'sms_gateway_username'),
'label_sms_gateway_password' => psm_get_lang('config', 'sms_gateway_password'), 'label_sms_gateway_password' => psm_get_lang('config', 'sms_gateway_password'),
'label_sms_from' => psm_get_lang('config', 'sms_from'), 'label_sms_from' => psm_get_lang('config', 'sms_from'),
'label_discord_status' => psm_get_lang('config', 'discord_status'),
'label_discord_description' => psm_get_lang('config', 'discord_description'),
'label_webhook_description' => psm_get_lang('config', 'webhook_description'), 'label_webhook_description' => psm_get_lang('config', 'webhook_description'),
'label_webhook_status' => psm_get_lang('config', 'webhook_status'), 'label_webhook_status' => psm_get_lang('config', 'webhook_status'),
'label_webhook_url' => psm_get_lang('config', 'webhook_url'), 'label_webhook_url' => psm_get_lang('config', 'webhook_url'),
@ -556,6 +621,7 @@ class ConfigController extends AbstractController
'label_log_status_description' => psm_get_lang('config', 'log_status_description'), 'label_log_status_description' => psm_get_lang('config', 'log_status_description'),
'label_log_email' => psm_get_lang('config', 'log_email'), 'label_log_email' => psm_get_lang('config', 'log_email'),
'label_log_sms' => psm_get_lang('config', 'log_sms'), 'label_log_sms' => psm_get_lang('config', 'log_sms'),
'label_log_discord' => psm_get_lang('config', 'log_discord'),
'label_log_pushover' => psm_get_lang('config', 'log_pushover'), 'label_log_pushover' => psm_get_lang('config', 'log_pushover'),
'label_log_webhook' => psm_get_lang('config', 'log_webhook'), 'label_log_webhook' => psm_get_lang('config', 'log_webhook'),
'label_log_telegram' => psm_get_lang('config', 'log_telegram'), 'label_log_telegram' => psm_get_lang('config', 'log_telegram'),

View File

@ -81,6 +81,7 @@ abstract class AbstractServerController extends AbstractController
`s`.`active`, `s`.`active`,
`s`.`email`, `s`.`email`,
`s`.`sms`, `s`.`sms`,
`s`.`discord`,
`s`.`webhook`, `s`.`webhook`,
`s`.`pushover`, `s`.`pushover`,
`s`.`telegram`, `s`.`telegram`,

View File

@ -55,6 +55,7 @@ class LogController extends AbstractServerController
'label_status' => psm_get_lang('log', 'status'), 'label_status' => psm_get_lang('log', 'status'),
'label_email' => psm_get_lang('log', 'email'), 'label_email' => psm_get_lang('log', 'email'),
'label_sms' => psm_get_lang('log', 'sms'), 'label_sms' => psm_get_lang('log', 'sms'),
'label_discord' => psm_get_lang('log', 'discord'),
'label_pushover' => psm_get_lang('log', 'pushover'), 'label_pushover' => psm_get_lang('log', 'pushover'),
'label_webhook' => psm_get_lang('log', 'webhook'), 'label_webhook' => psm_get_lang('log', 'webhook'),
'label_telegram' => psm_get_lang('log', 'telegram'), 'label_telegram' => psm_get_lang('log', 'telegram'),
@ -78,7 +79,7 @@ class LogController extends AbstractServerController
$modal->setTitle(psm_get_lang('log', 'delete_title')); $modal->setTitle(psm_get_lang('log', 'delete_title'));
$modal->setMessage(psm_get_lang('log', 'delete_message')); $modal->setMessage(psm_get_lang('log', 'delete_message'));
$modal->setOKButtonLabel(psm_get_lang('system', 'delete')); $modal->setOKButtonLabel(psm_get_lang('system', 'delete'));
$sidebar->addButton( $sidebar->addButton(
'clear_logn', 'clear_logn',
psm_get_lang('log', 'clear'), psm_get_lang('log', 'clear'),
@ -90,7 +91,7 @@ class LogController extends AbstractServerController
); );
} }
$log_types = array('status', 'email', 'sms', 'pushover', 'webhook','telegram', 'jabber'); $log_types = array('status', 'email', 'sms', 'pushover', 'telegram', 'jabber', 'discord', 'webhook');
foreach ($log_types as $key) { foreach ($log_types as $key) {
$records = $this->getEntries($key); $records = $this->getEntries($key);

View File

@ -100,6 +100,7 @@ class ServerController extends AbstractServerController
$icons = array( $icons = array(
'email' => 'icon-envelope', 'email' => 'icon-envelope',
'sms' => 'icon-mobile', 'sms' => 'icon-mobile',
'discord' => 'icon-discord',
'pushover' => 'icon-pushover', 'pushover' => 'icon-pushover',
'webhook' => 'icon-webhook', 'webhook' => 'icon-webhook',
'telegram' => 'icon-telegram', 'telegram' => 'icon-telegram',
@ -131,6 +132,7 @@ class ServerController extends AbstractServerController
$tpl_data['config']['email'] = psm_get_conf('email_status'); $tpl_data['config']['email'] = psm_get_conf('email_status');
$tpl_data['config']['sms'] = psm_get_conf('sms_status'); $tpl_data['config']['sms'] = psm_get_conf('sms_status');
$tpl_data['config']['discord'] = psm_get_conf('discord_status');
$tpl_data['config']['webhook'] = psm_get_conf('webhook_status'); $tpl_data['config']['webhook'] = psm_get_conf('webhook_status');
$tpl_data['config']['pushover'] = psm_get_conf('pushover_status'); $tpl_data['config']['pushover'] = psm_get_conf('pushover_status');
$tpl_data['config']['telegram'] = psm_get_conf('telegram_status'); $tpl_data['config']['telegram'] = psm_get_conf('telegram_status');
@ -239,6 +241,7 @@ class ServerController extends AbstractServerController
'edit_active_selected' => $edit_server['active'], 'edit_active_selected' => $edit_server['active'],
'edit_email_selected' => $edit_server['email'], 'edit_email_selected' => $edit_server['email'],
'edit_sms_selected' => $edit_server['sms'], 'edit_sms_selected' => $edit_server['sms'],
'edit_discord_selected' => $edit_server['discord'],
'edit_webhook_selected' => $edit_server['webhook'], 'edit_webhook_selected' => $edit_server['webhook'],
'edit_pushover_selected' => $edit_server['pushover'], 'edit_pushover_selected' => $edit_server['pushover'],
'edit_telegram_selected' => $edit_server['telegram'], 'edit_telegram_selected' => $edit_server['telegram'],
@ -246,7 +249,7 @@ class ServerController extends AbstractServerController
)); ));
} }
$notifications = array('email', 'sms', 'pushover','webhook', 'telegram', 'jabber'); $notifications = array('email', 'sms', 'pushover', 'discord', 'webhook', 'telegram', 'jabber');
foreach ($notifications as $notification) { foreach ($notifications as $notification) {
if (psm_get_conf($notification . '_status') == 0) { if (psm_get_conf($notification . '_status') == 0) {
$tpl_data['warning_' . $notification] = true; $tpl_data['warning_' . $notification] = true;
@ -274,7 +277,7 @@ class ServerController extends AbstractServerController
// We need the server id to encrypt the password. Encryption will be done after the server is added // We need the server id to encrypt the password. Encryption will be done after the server is added
$encrypted_password = ''; $encrypted_password = '';
if (!empty($_POST['website_password'])) { if (!empty($_POST['website_password'])) {
$new_password = psm_POST('website_password'); $new_password = psm_POST('website_password');
@ -314,6 +317,7 @@ class ServerController extends AbstractServerController
'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no',
'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no',
'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no', 'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no',
'discord' => in_array($_POST['discord'], array('yes', 'no')) ? $_POST['discord'] : 'no',
'pushover' => in_array($_POST['pushover'], array('yes', 'no')) ? $_POST['pushover'] : 'no', 'pushover' => in_array($_POST['pushover'], array('yes', 'no')) ? $_POST['pushover'] : 'no',
'webhook' => in_array($_POST['webhook'], array('yes', 'no')) ? $_POST['webhook'] : 'no', 'webhook' => in_array($_POST['webhook'], array('yes', 'no')) ? $_POST['webhook'] : 'no',
'telegram' => in_array($_POST['telegram'], array('yes', 'no')) ? $_POST['telegram'] : 'no', 'telegram' => in_array($_POST['telegram'], array('yes', 'no')) ? $_POST['telegram'] : 'no',
@ -593,14 +597,17 @@ class ServerController extends AbstractServerController
'label_send_email' => psm_get_lang('servers', 'send_email'), 'label_send_email' => psm_get_lang('servers', 'send_email'),
'label_sms' => psm_get_lang('servers', 'sms'), 'label_sms' => psm_get_lang('servers', 'sms'),
'label_send_sms' => psm_get_lang('servers', 'send_sms'), 'label_send_sms' => psm_get_lang('servers', 'send_sms'),
'label_discord' => psm_get_lang('servers', 'discord'),
'label_send_discord' => psm_get_lang('servers', 'send_discord'),
'label_pushover' => psm_get_lang('servers', 'pushover'),
'label_send_pushover' => psm_get_lang('servers', 'send_pushover'), 'label_send_pushover' => psm_get_lang('servers', 'send_pushover'),
'label_send_webhook' => psm_get_lang('servers', 'send_webhook'), 'label_send_webhook' => psm_get_lang('servers', 'send_webhook'),
'label_telegram' => psm_get_lang('servers', 'telegram'), 'label_telegram' => psm_get_lang('servers', 'telegram'),
'label_jabber' => psm_get_lang('servers', 'jabber'), 'label_jabber' => psm_get_lang('servers', 'jabber'),
'label_send_jabber' => psm_get_lang('servers', 'send_jabber'),
'label_webhook' => psm_get_lang('servers', 'webhook'), 'label_webhook' => psm_get_lang('servers', 'webhook'),
'label_pushover' => psm_get_lang('servers', 'pushover'), 'label_pushover' => psm_get_lang('servers', 'pushover'),
'label_send_telegram' => psm_get_lang('servers', 'send_telegram'), 'label_send_telegram' => psm_get_lang('servers', 'send_telegram'),
'label_send_jabber' => psm_get_lang('servers', 'send_jabber'),
'label_users' => psm_get_lang('servers', 'users'), 'label_users' => psm_get_lang('servers', 'users'),
'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'), 'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'),
'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'), 'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'),

View File

@ -39,7 +39,7 @@ class ProfileController extends AbstractController
* @var array $profile_fields * @var array $profile_fields
*/ */
protected $profile_fields = protected $profile_fields =
array('name', 'user_name', 'email', 'mobile', 'pushover_key', 'pushover_device','webhook_url', 'webhook_json', 'telegram_id', 'jabber'); array('name', 'user_name', 'email', 'mobile', 'pushover_key', 'pushover_device', 'discord', 'webhook_url', 'webhook_json', 'telegram_id', 'jabber');
public function __construct(Database $db, \Twig_Environment $twig) public function __construct(Database $db, \Twig_Environment $twig)
{ {
@ -89,6 +89,10 @@ class ProfileController extends AbstractController
'label_pushover_key' => psm_get_lang('users', 'pushover_key'), 'label_pushover_key' => psm_get_lang('users', 'pushover_key'),
'label_pushover_device' => psm_get_lang('users', 'pushover_device'), 'label_pushover_device' => psm_get_lang('users', 'pushover_device'),
'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'),
'label_discord' => psm_get_lang('users', 'discord'),
'label_discord_description' => psm_get_lang('users', 'discord_description'),
'label_telegram' => psm_get_lang('users', 'telegram'), 'label_telegram' => psm_get_lang('users', 'telegram'),
'label_telegram_description' => psm_get_lang('users', 'telegram_description'), 'label_telegram_description' => psm_get_lang('users', 'telegram_description'),
'label_telegram_chat_id' => psm_get_lang('users', 'telegram_chat_id'), 'label_telegram_chat_id' => psm_get_lang('users', 'telegram_chat_id'),

View File

@ -158,6 +158,7 @@ class UserController extends AbstractController
'name', 'name',
'user_name', 'user_name',
'mobile', 'mobile',
'discord',
'webhook_url', 'webhook_url',
'webhook_json', 'webhook_json',
'pushover_key', 'pushover_key',
@ -257,6 +258,7 @@ class UserController extends AbstractController
'password_repeat', 'password_repeat',
'level', 'level',
'mobile', 'mobile',
'discord',
'webhook_url', 'webhook_url',
'webhook_json', 'webhook_json',
'pushover_key', 'pushover_key',
@ -396,6 +398,8 @@ class UserController extends AbstractController
'label_level' => psm_get_lang('users', 'level'), 'label_level' => psm_get_lang('users', 'level'),
'label_level_description' => psm_get_lang('users', 'level_description'), 'label_level_description' => psm_get_lang('users', 'level_description'),
'label_mobile' => psm_get_lang('users', 'mobile'), 'label_mobile' => psm_get_lang('users', 'mobile'),
'label_discord' => psm_get_lang('users', 'discord'),
'label_discord_description' => psm_get_lang('users', 'discord_description'),
'label_webhook' => psm_get_lang('users', 'webhook'), 'label_webhook' => psm_get_lang('users', 'webhook'),
'label_webhook_description' => psm_get_lang('users', 'webhook_description'), 'label_webhook_description' => psm_get_lang('users', 'webhook_description'),
'label_webhook_url' => psm_get_lang('users', 'webhook_url'), 'label_webhook_url' => psm_get_lang('users', 'webhook_url'),

View File

@ -180,6 +180,8 @@ class Installer
('log_webhook', '1'), ('log_webhook', '1'),
('log_telegram', '1'), ('log_telegram', '1'),
('log_jabber', '1'), ('log_jabber', '1'),
('discord_status', '0'),
('log_jdiscord', '1'),
('log_retention_period', '365'), ('log_retention_period', '365'),
('version', '" . PSM_VERSION . "'), ('version', '" . PSM_VERSION . "'),
('version_update_check', '" . PSM_VERSION . "'), ('version_update_check', '" . PSM_VERSION . "'),
@ -187,7 +189,7 @@ class Installer
('show_update', '1'), ('show_update', '1'),
('last_update_check', '0'), ('last_update_check', '0'),
('cron_running', '0'), ('cron_running', '0'),
('cron_running_time', '0'), ('cron_running_time', '0'),
('cron_off_running', '0'), ('cron_off_running', '0'),
('cron_off_running_time', '0');"; ('cron_off_running_time', '0');";
$this->execSQL($queries); $this->execSQL($queries);
@ -214,6 +216,7 @@ class Installer
`level` tinyint(2) unsigned NOT NULL DEFAULT '20', `level` tinyint(2) unsigned NOT NULL DEFAULT '20',
`name` varchar(255) NOT NULL, `name` varchar(255) NOT NULL,
`mobile` varchar(15) NOT NULL, `mobile` varchar(15) NOT NULL,
`discord` varchar(255) NOT NULL,
`pushover_key` varchar(255) NOT NULL, `pushover_key` varchar(255) NOT NULL,
`pushover_device` varchar(255) NOT NULL, `pushover_device` varchar(255) NOT NULL,
`webhook_url` varchar(255) NOT NULL, `webhook_url` varchar(255) NOT NULL,
@ -239,7 +242,7 @@ class Installer
PSM_DB_PREFIX . 'log' => "CREATE TABLE `" . PSM_DB_PREFIX . "log` ( PSM_DB_PREFIX . 'log' => "CREATE TABLE `" . PSM_DB_PREFIX . "log` (
`log_id` int(11) unsigned NOT NULL AUTO_INCREMENT, `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`server_id` int(11) unsigned NOT NULL, `server_id` int(11) unsigned NOT NULL,
`type` enum('status','email','sms','pushover','webhook','telegram', 'jabber') NOT NULL, `type` enum('status','email','sms','discord','pushover','webhook','telegram', 'jabber') NOT NULL,
`message` TEXT NOT NULL, `message` TEXT NOT NULL,
`datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`log_id`) PRIMARY KEY (`log_id`)
@ -273,6 +276,7 @@ class Installer
`active` enum('yes','no') NOT NULL default 'yes', `active` enum('yes','no') NOT NULL default 'yes',
`email` enum('yes','no') NOT NULL default 'yes', `email` enum('yes','no') NOT NULL default 'yes',
`sms` enum('yes','no') NOT NULL default 'no', `sms` enum('yes','no') NOT NULL default 'no',
`discord` enum('yes','no') NOT NULL default 'yes',
`pushover` enum('yes','no') NOT NULL default 'yes', `pushover` enum('yes','no') NOT NULL default 'yes',
`webhook` enum('yes','no') NOT NULL default 'yes', `webhook` enum('yes','no') NOT NULL default 'yes',
`telegram` enum('yes','no') NOT NULL default 'yes', `telegram` enum('yes','no') NOT NULL default 'yes',
@ -705,9 +709,9 @@ class Installer
$this->log('SMTP password is now encrypted.'); $this->log('SMTP password is now encrypted.');
} }
$queries[] = 'ALTER TABLE `' . PSM_DB_PREFIX . 'users` ADD `jabber` VARCHAR( 255 ) $queries[] = 'ALTER TABLE `' . PSM_DB_PREFIX . 'users` ADD `jabber` VARCHAR( 255 )
NOT NULL AFTER `telegram_id`;'; NOT NULL AFTER `telegram_id`;';
$queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `jabber` ENUM( 'yes','no' ) $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `jabber` ENUM( 'yes','no' )
NOT NULL DEFAULT 'yes' AFTER `telegram`;"; NOT NULL DEFAULT 'yes' AFTER `telegram`;";
$queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX .
"log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram', 'jabber' ) "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram', 'jabber' )
@ -725,25 +729,31 @@ class Installer
} }
/** /**
* Upgrade for v3.6.0 release * Patch for v3.6.0 release
* Added support for Discord and webhooks
*/ */
protected function upgrade360() protected function upgrade360()
{ {
$queries = array(); $queries = array();
$queries[] = 'ALTER TABLE `' . PSM_DB_PREFIX . 'users` $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users`
ADD `webhook_url` VARCHAR( 255 ) NOT NULL AFTER `telegram_id`;'; ADD `webhook_url` VARCHAR( 255 ) NOT NULL AFTER `telegram_id`;";
$queries[] = 'ALTER TABLE `' . PSM_DB_PREFIX . 'users` $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users`
ADD `webhook_json` VARCHAR( 255 ) NOT NULL AFTER `telegram_id`;'; ADD `webhook_json` VARCHAR( 255 ) NOT NULL AFTER `telegram_id`;";
$queries[] = "ALTER TABLE `' . PSM_DB_PREFIX . 'log` $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log`
CHANGE `type` `type` ENUM('status','email','sms','webhook','pushover','telegram','jabber') CHANGE `type` `type` ENUM('status','email','sms','discord','webhook','pushover','telegram','jabber')
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
$queries[] = "ALTER TABLE `' . PSM_DB_PREFIX . 'servers` $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers`
ADD `webhook` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `telegram`;"; ADD `webhook` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `telegram`;";
$queries[] = "INSERT INTO `' . PSM_DB_PREFIX . 'config` (`key`, `value`) VALUE $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE
('discord_status', '0'),
('log_discord', '1'),
('webhook_status', '0'), ('webhook_status', '0'),
('log_webhook', '1')"; ('log_webhook', '1')";
$queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users`
ADD `discord` VARCHAR( 255 ) NOT NULL AFTER `mobile`;";
$queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers`
ADD `discord` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `sms`;";
$this->execSQL($queries); $this->execSQL($queries);
} }
} }

View File

@ -57,6 +57,12 @@ class StatusNotifier
*/ */
protected $send_sms = false; protected $send_sms = false;
/**
* Send Discord notification?
* @var boolean $send_discord
*/
protected $send_discord = false;
/** /**
* Send Pushover notification? * Send Pushover notification?
* @var boolean $send_pushover * @var boolean $send_pushover
@ -134,6 +140,7 @@ class StatusNotifier
$this->send_emails = (bool)psm_get_conf('email_status'); $this->send_emails = (bool)psm_get_conf('email_status');
$this->send_sms = (bool)psm_get_conf('sms_status'); $this->send_sms = (bool)psm_get_conf('sms_status');
$this->send_discord = (bool)psm_get_conf('discord_status');
$this->send_webhook = (bool)psm_get_conf('webhook_status'); $this->send_webhook = (bool)psm_get_conf('webhook_status');
$this->send_pushover = (bool)psm_get_conf('pushover_status'); $this->send_pushover = (bool)psm_get_conf('pushover_status');
$this->send_telegram = (bool)psm_get_conf('telegram_status'); $this->send_telegram = (bool)psm_get_conf('telegram_status');
@ -156,6 +163,7 @@ class StatusNotifier
if ( if (
!$this->send_emails && !$this->send_emails &&
!$this->send_sms && !$this->send_sms &&
!$this->send_discord &&
!$this->send_webhook && !$this->send_webhook &&
!$this->send_pushover && !$this->send_pushover &&
!$this->send_telegram && !$this->send_telegram &&
@ -183,6 +191,7 @@ class StatusNotifier
'error', 'error',
'email', 'email',
'sms', 'sms',
'discord',
'webhook', 'webhook',
'pushover', 'pushover',
'telegram', 'telegram',
@ -254,11 +263,19 @@ class StatusNotifier
// yay lets wake those nerds up! // yay lets wake those nerds up!
$this->notifyByTxtMsg($users); $this->notifyByTxtMsg($users);
} }
// check if discord is enabled for this server
if ($this->send_discord && $this->server['discord'] == 'yes') {
// yay lets wake those nerds up!
$this->combine ? $this->setCombi('discord') : $this->notifyByDiscord($users);
}
// check if webhook is enabled for this server // check if webhook is enabled for this server
if ($this->send_webhook && $this->server['webhook'] == 'yes') { if ($this->send_webhook && $this->server['webhook'] == 'yes') {
// yay lets wake those nerds up! // yay lets wake those nerds up!
$this->combine ? $this->setCombi('webhook') : $this->notifyByWebhook($users); $this->combine ? $this->setCombi('webhook') : $this->notifyByWebhook($users);
} }
// check if pushover is enabled for this server // check if pushover is enabled for this server
if ($this->send_pushover && $this->server['pushover'] == 'yes') { if ($this->send_pushover && $this->server['pushover'] == 'yes') {
// yay lets wake those nerds up! // yay lets wake those nerds up!
@ -430,6 +447,86 @@ class StatusNotifier
} }
} }
/**
* This functions performs the discord notifications
*
* @param \PDOStatement $users
* @param array $combi contains message and subject (optional)
* @return void
*/
protected function notifyByDiscord($users, $combi = array())
{
$message_log = key_exists('message', $combi) ?
$combi['message'] :
psm_parse_msg($this->status_new, 'discord_message', $this->server);
// Remove users that have no Discord webhook
foreach ($users as $k => $user) {
if (trim($user['discord']) == '') {
unset($users[$k]);
}
}
// Validation
if (empty($users)) {
return;
}
// fix message for Discord viewing
$message = str_replace(array('<b>', '</b>'), array('**', '**'), $message_log);
$message = str_replace(array('<ul>', '</ul>'), array('', ''), $message);
$message = str_replace(array('<br>', '</li>'), array("\n", "\n"), $message);
$message = str_replace('<li>', " * ", $message);
$json = json_decode(
'{"content":""}',
true
);
$json['content'] = $message;
// Log
if (psm_get_conf('log_discord')) {
$log_id = psm_add_log($this->server_id, 'discord', $message_log);
}
foreach ($users as $user) {
// Log
if (!empty($log_id)) {
psm_add_log_user($log_id, $user['user_id']);
}
// set discord webhook and send
try {
$msg = "payload_json=" . urlencode(json_encode($json));
$curl = curl_init(trim($user['discord']));
if(isset($curl)) {
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_POSTFIELDS, $msg);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$err = curl_errno($curl);
if ($err != 0 || $httpcode != 204) {
// $result = ($result == '') ? 'Wrong input, please check if all values are correct!' : $result;
$error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " .
curl_strerror($err) . ". \nResult: " . $result;
$log_id = psm_add_log($this->server_id, 'discord', $error);
}
curl_close($curl);
}
} catch (Exception $e) {
$log_id = psm_add_log($this->server_id, 'discord', $e->getMessage());
}
}
}
/** /**
* This functions performs the pushover notifications * This functions performs the pushover notifications
* *
@ -673,7 +770,7 @@ class StatusNotifier
{ {
// find all the users with this server listed // find all the users with this server listed
$users = $this->db->query(' $users = $this->db->query('
SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`webhook_url`,`u`.`webhook_json`, SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`discord`, `u`.`webhook_url`,`u`.`webhook_json`,
`u`.`pushover_device`, `u`.`telegram_id`, `u`.`pushover_device`, `u`.`telegram_id`,
`u`.`jabber` `u`.`jabber`
FROM `' . PSM_DB_PREFIX . 'users` AS `u` FROM `' . PSM_DB_PREFIX . 'users` AS `u`

View File

@ -89,7 +89,8 @@
<script type="text/javascript" src="src/templates/default/static/plugin/bootstrap-select/dist/js/bootstrap-select.min.js"></script> <script type="text/javascript" src="src/templates/default/static/plugin/bootstrap-select/dist/js/bootstrap-select.min.js"></script>
<script type="text/javascript" src="src/templates/default/static/plugin/bootstrap-select/dist/js/i18n/defaults-{{ language }}.min.js"></script> <script type="text/javascript" src="src/templates/default/static/plugin/bootstrap-select/dist/js/i18n/defaults-{{ language }}.min.js"></script>
<script defer src="src/templates/default/static/plugin/font-awesome/js/solid.min.js"></script> <script defer src="src/templates/default/static/plugin/font-awesome/js/solid.min.js"></script>
<script defer src="src/templates/default/static/plugin/font-awesome/js/fontawesome.min.js" data-auto-replace-svg="nest"></script> <script defer src="src/templates/default/static/plugin/font-awesome/js/fontawesome.min.js" data-auto-replace-svg="nest"></script>
<script defer src="src/templates/default/static/plugin/font-awesome/js/brands.min.js" data-auto-replace-svg="nest"></script>
<script type="text/javascript" src="src/templates/default/static/js/scripts.js"></script> <script type="text/javascript" src="src/templates/default/static/js/scripts.js"></script>
</body> </body>

View File

@ -32,6 +32,11 @@
role="tab" aria-controls="config-jabber" aria-selected="{% if jabber_active %}true{% else %}false{% endif %}">{{ role="tab" aria-controls="config-jabber" aria-selected="{% if jabber_active %}true{% else %}false{% endif %}">{{
label_tab_jabber }}</a> label_tab_jabber }}</a>
</li> </li>
<li class="nav-item">
<a class="nav-link {{ discord_active }}" id="config-discord-tab" data-toggle="tab" href="#config-discord" role="tab"
aria-controls="config-discord" aria-selected="{% if discord_active %}true{% else %}false{% endif %}">{{
label_tab_discord }}</a>
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ webhook_active }}" id="config-webhook-tab" data-toggle="tab" href="#config-webhook" role="tab" <a class="nav-link {{ webhook_active }}" id="config-webhook-tab" data-toggle="tab" href="#config-webhook" role="tab"
aria-controls="config-webhook" aria-selected="{% if webhook_active %}true{% else %}false{% endif %}">{{ aria-controls="config-webhook" aria-selected="{% if webhook_active %}true{% else %}false{% endif %}">{{
@ -134,12 +139,24 @@
{{ macro.input_field("text", "sms_gateway_password", null, "sms_gateway_password", label_sms_gateway_password, sms_gateway_password, label_sms_gateway_password, "255") }} {{ 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--> <!-- sms sender number-->
{{ macro.input_field("text", "sms_from", null, "sms_from", label_sms_from, sms_from, "+31123456789", "255") }} {{ macro.input_field("text", "sms_from", null, "sms_from", label_sms_from, sms_from, "+31123456789", "255") }}
{{ macro.button_test("testSms", label_test) }} {{ macro.button_test("testSms", label_test) }}
{{ macro.input_hidden("test_sms", "0") }} {{ macro.input_hidden("test_sms", "0") }}
{{ macro.button_save("sms_submit", label_save) }} {{ macro.button_save("sms_submit", label_save) }}
</fieldset> </fieldset>
</div> </div>
<div class="tab-pane {{ discord_active }}" id="config-discord" role="tabpanel" aria-labelledby="config-discord-tab">
<fieldset>
<legend>{{ label_settings_discord }}</legend>
<!-- enable discord -->
{{ macro.input_checkbox("discord_status", "discord_status[]", label_discord_status, discord_status_checked) }}
<!-- enable discord log -->
{{ macro.input_checkbox("log_discord", "log_discord[]", label_log_discord, log_discord_checked) }}
{{ macro.button_test("testDiscord", label_test) }}
{{ macro.input_hidden("test_discord", "0") }}
{{ macro.button_save("discord_submit", label_save) }}
</fieldset>
</div>
<div class="tab-pane {{ pushover_active }}" id="config-pushover" role="tabpanel" aria-labelledby="config-pushover-tab"> <div class="tab-pane {{ pushover_active }}" id="config-pushover" role="tabpanel" aria-labelledby="config-pushover-tab">
<fieldset> <fieldset>
<legend>{{ label_settings_pushover }}</legend> <legend>{{ label_settings_pushover }}</legend>

View File

@ -63,19 +63,22 @@
</span> </span>
{% endif %} {% endif %}
{% if server.telegram|lower == 'yes' and config.telegram|lower%} {% if server.telegram|lower == 'yes' and config.telegram|lower%}
<span class="fa-layers"> <i class="fab fa-telegram" title="{{ label_telegram }}"></i>
<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 %} {% endif %}
{% if server.jabber|lower == 'yes'%} {% if server.jabber|lower == 'yes'%}
<span class="fa-layers"> <span class="fa-layers">
<i class="fas fa-circle" title="{{ label_jabber }}"></i> <i class="fas fa-circle" title="{{ label_jabber }}"></i>
<span class="fa-layers-text fa-inverse" style="font-weight:400; font-size:75%">J</span> <span class="fa-layers-text fa-inverse" style="font-weight:400; font-size:75%">J</span>
</span> </span>
{% endif %}
{% if server.discord|lower == 'yes' and config.discord|lower %}
<i class="fab fa-discord" title="{{ label_discord }}"></i>
{% endif %} {% endif %}
{% if server.webhook|lower == 'yes' and config.webhook|lower %} {% if server.webhook|lower == 'yes' and config.webhook|lower %}
<i class="fas fa-hashtag" title="{{ label_webhook }}"></i> <span class="fa-layers">
<i class="fas fa-circle" title="{{ label_webhook }}"></i>
<span class="fa-layers-text fa-inverse" style="font-weight:600; font-size:55%">W</span>
</span>
{% endif %} {% endif %}
</td> </td>
{% if user_level == 10 %} {% if user_level == 10 %}

View File

@ -144,6 +144,8 @@
{{ macro.input_select_monitoring("telegram", "telegram", label_send_telegram, edit_telegram_selected, label_yes, label_no, warning_telegram, label_warning_telegram) }} {{ macro.input_select_monitoring("telegram", "telegram", label_send_telegram, edit_telegram_selected, label_yes, label_no, warning_telegram, label_warning_telegram) }}
<!-- Jabber --> <!-- Jabber -->
{{ macro.input_select_monitoring("jabber", "jabber", label_send_jabber, edit_jabber_selected, label_yes, label_no, warning_jabber, label_warning_jabber) }} {{ macro.input_select_monitoring("jabber", "jabber", label_send_jabber, edit_jabber_selected, label_yes, label_no, warning_jabber, label_warning_jabber) }}
<!-- Discord -->
{{ macro.input_select_monitoring("discord", "discord", label_send_discord, edit_discord_selected, label_yes, label_no, warning_discord, label_warning_discord) }}
<!-- Webhook --> <!-- Webhook -->
{{ macro.input_select_monitoring("webhook", "webhook", label_send_webhook, edit_webhook_selected, label_yes, label_no, warning_webhook, label_warning_webhook) }} {{ macro.input_select_monitoring("webhook", "webhook", label_send_webhook, edit_webhook_selected, label_yes, label_no, warning_webhook, label_warning_webhook) }}
</div> </div>

View File

@ -309,6 +309,19 @@
<noscript>&#8263</noscript> <noscript>&#8263</noscript>
{% endif %} {% endif %}
</li> </li>
<li class="list-group-item">
{{ label_discord }}:
{% if discord|lower == 'yes' %}
<i class="fas fa-bell float-right"></i>
<noscript>&#10003</noscript>
{% elseif discord|lower == 'no' %}
<i class="fas fa-bell-slash float-right"></i>
<noscript>&#10005</noscript>
{% else %}
<i class="fas fa-question-circle float-right" title="Value from database should either be yes or no."></i>
<noscript>&#8263</noscript>
{% endif %}
</li>
<li class="list-group-item"> <li class="list-group-item">
{{ label_pushover }}: {{ label_pushover }}:
{% if pushover|lower == 'yes' %} {% if pushover|lower == 'yes' %}

View File

@ -34,7 +34,7 @@
<p>{{ label_telegram_description|raw }}</p> <p>{{ label_telegram_description|raw }}</p>
<!-- telegram id --> <!-- telegram id -->
<div class="form-group"> <div class="form-group">
<a class="btn btn-primary mb-2" href="{{ telegram_get_chat_id_url }}">{{ label_telegram_get_chat_id }}</a> <a class="btn btn-primary mb-2" href="{{ telegram_get_chat_id_url }}">{{ label_telegram_get_chat_id }}</a>
</div> </div>
{{ macro.input_field("text", "telegram_id", null, "telegram_id", label_telegram_chat_id, telegram_id, label_telegram_chat_id, "255", "telegram_id_help", label_telegram_id_description) }} {{ macro.input_field("text", "telegram_id", null, "telegram_id", label_telegram_chat_id, telegram_id, label_telegram_chat_id, "255", "telegram_id_help", label_telegram_id_description) }}
<button class="btn btn-primary show-modal" data-toggle="modal" data-modal-id="activateTelegram">{{ label_activate_telegram }}</button> <button class="btn btn-primary show-modal" data-toggle="modal" data-modal-id="activateTelegram">{{ label_activate_telegram }}</button>
@ -46,6 +46,11 @@
<!-- jabber --> <!-- jabber -->
{{ macro.input_field("text", "jabber", null, "jabber", label_jabber, jabber, label_jabber, "255", "jabber_help", label_jabber_description) }} {{ macro.input_field("text", "jabber", null, "jabber", label_jabber, jabber, label_jabber, "255", "jabber_help", label_jabber_description) }}
</fieldset> </fieldset>
<!-- Discord settings -->
<fieldset>
<legend>{{ label_discord }}</legend>
{{ macro.input_field("text", "discord", null, "discord", label_discord, discord, "https://discordapp.com/api/webhooks/xxxxx", "255", "discord_help", label_discord_description) }}
</fieldset>
<!-- Webhook settings --> <!-- Webhook settings -->
<fieldset> <fieldset>
<legend>{{ label_webhook }}</legend> <legend>{{ label_webhook }}</legend>
@ -56,4 +61,4 @@
{{ macro.input_field("text", "webhook_json", null, "webhook_json", label_webhook_json, webhook_json, "{\"text\":\"servermon: #message\"}", "255", "webhook_json_help", label_webhook_json_description) }} {{ macro.input_field("text", "webhook_json", null, "webhook_json", label_webhook_json, webhook_json, "{\"text\":\"servermon: #message\"}", "255", "webhook_json_help", label_webhook_json_description) }}
</fieldset> </fieldset>
{{ macro.button_save(null, label_save) }} {{ macro.button_save(null, label_save) }}
</form> </form>

View File

@ -17,6 +17,8 @@
{{ macro.input_field("email", "email", null, "email", label_email, edit_value_email, null, "255") }} {{ macro.input_field("email", "email", null, "email", label_email, edit_value_email, null, "255") }}
<!-- Mobile --> <!-- Mobile -->
{{ macro.input_field("tel", "mobile", null, "mobile", label_mobile, edit_value_mobile, null, "20") }} {{ macro.input_field("tel", "mobile", null, "mobile", label_mobile, edit_value_mobile, null, "20") }}
<!-- Discord -->
{{ macro.input_field("text", "discord", null, "discord", label_discord, edit_value_discord, null, "255") }}
<!-- Webhook_url --> <!-- Webhook_url -->
{{ macro.input_field("text", "webhook_url", null, "webhook_url", label_webhook_url, edit_value_webhook_url, null, "255") }} {{ macro.input_field("text", "webhook_url", null, "webhook_url", label_webhook_url, edit_value_webhook_url, null, "255") }}
<!-- Webhook_json --> <!-- Webhook_json -->