diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e0c84da9..b4458810 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,7 @@ not yet released * #169: Increased server ip char limit to 500. * #164: Added support for FreeVoipDeal SMS gateway . * #181: Added blank index files to prevent directory listing. +* #245: Added support for CarrierSMS SMS gateway v3.1.1 (released November 6, 2014) diff --git a/README.rst b/README.rst index e7aa9d2a..ad2f8eb8 100755 --- a/README.rst +++ b/README.rst @@ -50,6 +50,10 @@ The following SMS gateways are currently available: Please note: for these gateways you will need an account with sufficient credits. +* CarrierSMS - + +CarrierSMS is free sms messaging using your Mobile Carrier's text messaging gateway. + Download -------- @@ -78,6 +82,10 @@ To be able to run an installation from the repo, you need to run the following c php composer.phar install +If you get "Fatal error: Uncaught exception 'PharException'..." run this and try again: + + curl -s http://getcomposer.org/installer | php + If you are familiar with Vagrant (https://www.vagrantup.com):: vagrant up diff --git a/docs/credits.rst b/docs/credits.rst index c769a056..d7c185a2 100644 --- a/docs/credits.rst +++ b/docs/credits.rst @@ -14,7 +14,7 @@ The following people have contributed to the development of PHP Server Monitor: * Creator and project maintainer -* Jérôme Cabanis - https://github.com/Abawell +* Jérôme Cabanis - https://github.com/Abawell * History graphs * Date localization @@ -67,6 +67,10 @@ The following people have contributed to the development of PHP Server Monitor: * FreeVoipDeal SMS gateway +* Glen Arason - http://CanadianDomainRegistry.ca + + * CarrierSMS SMS gateway + Translators +++++++++++ @@ -96,7 +100,7 @@ The following people have contributed to the translation of PHP Server Monitor: * French * David Ribeiro - * Jérôme Cabanis + * Jérôme Cabanis * German @@ -126,7 +130,7 @@ The following people have contributed to the translation of PHP Server Monitor: * Spanish - * Klemens Häckel - http://clickdimension.wordpress.com + * Klemens Häckel - http://clickdimension.wordpress.com * Luis Rodriguez - https://github.com/ldrrp * Swedish diff --git a/docs/intro.rst b/docs/intro.rst index 92c6d43a..150e0273 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -59,8 +59,12 @@ The following SMS gateways are currently available: Please note: for these gateways you will need an account with sufficient credits. +* CarrierSMS - + +CarrierSMS is free sms messaging using your Mobile Carrier's text messaging gateway. + Download ++++++++ -The latest version can be downloaded from http://www.phpservermonitor.org/. \ No newline at end of file +The latest version can be downloaded from http://www.phpservermonitor.org/. diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index f4bbf3d3..c084a620 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -442,6 +442,9 @@ function psm_build_sms() { // open the right class // not making this any more dynamic, because perhaps some gateways need custom settings (like Mollie) switch(strtolower(psm_get_conf('sms_gateway'))) { + case 'carriersms': + $sms = new \psm\Txtmsg\CarrierSMS(); + break; case 'mosms': $sms = new \psm\Txtmsg\Mosms(); break; diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index 2c244966..b9ded523 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -102,6 +102,12 @@ $sm_lang = array( 'error_user_no_match' => 'The user could not be found in the database.', 'error_user_password_invalid' => 'The entered password is invalid.', 'error_user_password_no_match' => 'The entered passwords do not match.', + 'error_carriersms_from_email_invalid' => 'No valid "From" email address, sending notifications failed.', + 'error_carriersms_to_email_invalid' => 'No valid "To" email address, sending notifications failed.', + 'error_carriersms_not_unique' => 'The "To" and "From" email addresses can not be the same, sending notifications failed.', + 'carriersms_description_user' => 'Receive real-time sms notifications using your "Mobile Carrier\'s SMS Gateway".
CarrierSMS Email addresses usually look like: <10DigitNumber>@<host.MobileCarrier.dom>', + 'carriersms_description_help' => 'A well maintained "Email-To-SMS Database" of mobile carrier gateways is available at AVTECH
Or, send a text message from your mobile device to an email account.
The "From" address in the email should be your device\'s gateway email address.', + 'carriersms_email' => 'CarrierSMS Email', ), 'log' => array( 'title' => 'Log entries', @@ -256,6 +262,11 @@ $sm_lang = array( 'log_retention_period' => 'Log retention period', 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server uptime. Enter 0 to disable log cleanup.', 'log_retention_days' => 'days', + 'sms_gateway_carriersms' => 'CarrierSMS', + 'sms_gateway_carriersms_select' => 'For CarrierSMS, the Email settings must be configured correctly even if Email is not being used.', + 'sms_gateway_carriersms_option' => 'For CarrierSMS, you can enter an alternate "From:" email address or leave blank to use the "Email from address".', + 'test_carriersms' => 'An SMS will be sent to the CarrierSMS Email specified in your user profile.', + 'sms_error_nomobile_carriersms' => 'Testing SMS failed: No assinged "CarrierSMS Email" in your profile.', ), // for newlines in the email messages use
'notifications' => array( @@ -269,6 +280,12 @@ $sm_lang = array( 'on_email_body' => "Server '%LABEL%' is running again:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%", 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', 'on_pushover_message' => 'Server \'%LABEL%\' is running again:

Server: %LABEL%
IP: %IP%
Port: %PORT%
Date: %DATE%', + 'on_carrier' => '
%IP%:%PORT%', + 'off_carrier' => '
%IP%:%PORT%
%ERROR%', + 'on_carrier_subject' => '%LABEL% is UP', + 'off_carrier_subject' => '%LABEL% is DOWN', + 'on_carrier_log' => '[%LABEL% was UP]   %IP%:%PORT%', + 'off_carrier_log' => '[%LABEL% was Down]   %IP%:%PORT%   ( %ERROR% )', ), 'login' => array( 'welcome_usermenu' => 'Welcome, %user_name%', diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index c51e6e72..c74a01d8 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -134,7 +134,9 @@ class ConfigController extends AbstractController { $modal = new \psm\Util\Module\Modal($this->twig, 'test' . ucfirst($modal_id), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL); $this->addModal($modal); $modal->setTitle(psm_get_lang('servers', 'send_' . $modal_id)); - $modal->setMessage(psm_get_lang('config', 'test_' . $modal_id)); + if($modal_id == "sms" && $GLOBALS['sm_config']['sms_gateway'] == 'carriersms'){ + $modal->setMessage(psm_get_lang('config', 'test_carriersms')); + }else{ $modal->setMessage(psm_get_lang('config', 'test_' . $modal_id)); } $modal->setOKButtonLabel(psm_get_lang('config', 'send')); } @@ -229,8 +231,14 @@ class ConfigController extends AbstractController { $sms = psm_build_sms(); if($sms) { $user = $this->getUser()->getUser(); + + if($GLOBALS['sm_config']['sms_gateway'] == 'carriersms') { + $user->mobile = $user->carriersms; + $smserr = '_carriersms'; + } else { $smserr = ''; } + if(empty($user->mobile)) { - $this->addMessage(psm_get_lang('config', 'sms_error_nomobile'), 'error'); + $this->addMessage(psm_get_lang('config', 'sms_error_nomobile'.$smserr), 'error'); } else { $sms->addRecipients($user->mobile); if($sms->sendSMS(psm_get_lang('config', 'test_message'))) { @@ -306,6 +314,9 @@ class ConfigController extends AbstractController { 'label_email_smtp_noauth' => psm_get_lang('config', 'email_smtp_noauth'), 'label_sms_status' => psm_get_lang('config', 'sms_status'), 'label_sms_gateway' => psm_get_lang('config', 'sms_gateway'), + 'label_sms_gateway_carriersms' => psm_get_lang('config', 'sms_gateway_carriersms'), + 'label_sms_gateway_carriersms_select' => psm_get_lang('config', 'sms_gateway_carriersms_select'), + 'label_sms_gateway_carriersms_option' => psm_get_lang('config', 'sms_gateway_carriersms_option'), 'label_sms_gateway_mosms' => psm_get_lang('config', 'sms_gateway_mosms'), 'label_sms_gateway_mollie' => psm_get_lang('config', 'sms_gateway_mollie'), 'label_sms_gateway_spryng' => psm_get_lang('config', 'sms_gateway_spryng'), diff --git a/src/psm/Module/Install/Controller/InstallController.php b/src/psm/Module/Install/Controller/InstallController.php index 06524091..71ab2bf4 100644 --- a/src/psm/Module/Install/Controller/InstallController.php +++ b/src/psm/Module/Install/Controller/InstallController.php @@ -210,6 +210,7 @@ class InstallController extends AbstractController { 'level' => PSM_USER_ADMIN, 'pushover_key' => '', 'pushover_device' => '', + 'carriersms' => '', ); $validator = $this->container->get('util.user.validator'); diff --git a/src/psm/Module/User/Controller/ProfileController.php b/src/psm/Module/User/Controller/ProfileController.php index f189868c..30b06ead 100644 --- a/src/psm/Module/User/Controller/ProfileController.php +++ b/src/psm/Module/User/Controller/ProfileController.php @@ -35,7 +35,7 @@ class ProfileController extends AbstractController { * Editable fields for the profile * @var array $profile_fields */ - protected $profile_fields = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'email'); + protected $profile_fields = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'carriersms', 'email'); function __construct(Database $db, \Twig_Environment $twig) { parent::__construct($db, $twig); @@ -65,6 +65,10 @@ class ProfileController extends AbstractController { 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), + 'label_carriersms' => psm_get_lang('config', 'sms_gateway_carriersms'), + 'label_carriersms_email' => psm_get_lang('users', 'carriersms_email'), + 'label_carriersms_description' => psm_get_lang('users', 'carriersms_description_user'), + 'label_carriersms_help' => psm_get_lang('users', 'carriersms_description_help'), 'label_email' => psm_get_lang('users', 'email'), 'label_save' => psm_get_lang('system', 'save'), 'form_action' => psm_build_url(array( @@ -134,4 +138,4 @@ class ProfileController extends AbstractController { return $this->executeIndex(); } -} \ No newline at end of file +} diff --git a/src/psm/Module/User/Controller/UserController.php b/src/psm/Module/User/Controller/UserController.php index e4b3a4b2..ea79f0e1 100644 --- a/src/psm/Module/User/Controller/UserController.php +++ b/src/psm/Module/User/Controller/UserController.php @@ -88,7 +88,7 @@ class UserController extends AbstractController { $users = $this->db->select( PSM_DB_PREFIX.'users', null, - array('user_id', 'user_name', 'level', 'name', 'mobile', 'pushover_key', 'pushover_device', 'email'), + array('user_id', 'user_name', 'level', 'name', 'mobile', 'pushover_key', 'pushover_device', 'carriersms', 'email'), null, array('name') ); @@ -132,7 +132,7 @@ class UserController extends AbstractController { */ protected function executeEdit() { $user_id = isset($_GET['id']) ? intval($_GET['id']) : 0; - $fields_prefill = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'email'); + $fields_prefill = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'carriersms', 'email'); if($user_id == 0) { // insert mode @@ -214,7 +214,7 @@ class UserController extends AbstractController { } $user_id = (isset($_GET['id'])) ? intval($_GET['id']) : 0; - $fields = array('name', 'user_name', 'password', 'password_repeat', 'level', 'mobile', 'pushover_key', 'pushover_device', 'email'); + $fields = array('name', 'user_name', 'password', 'password_repeat', 'level', 'mobile', 'pushover_key', 'pushover_device', 'carriersms', 'email'); $clean = array(); foreach($fields as $field) { if(isset($_POST[$field])) { @@ -332,6 +332,10 @@ class UserController extends AbstractController { 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), + 'label_carriersms' => psm_get_lang('config', 'sms_gateway_carriersms'), + 'label_carriersms_email' => psm_get_lang('users', 'carriersms_email'), + 'label_carriersms_description' => psm_get_lang('users', 'carriersms_description_user'), + 'label_carriersms_help' => psm_get_lang('users', 'carriersms_description_help'), 'label_email' => psm_get_lang('users', 'email'), 'label_servers' => psm_get_lang('menu', 'server'), 'label_action' => psm_get_lang('system', 'action'), diff --git a/src/psm/Txtmsg/CarrierSMS.php b/src/psm/Txtmsg/CarrierSMS.php new file mode 100644 index 00000000..ed201fbf --- /dev/null +++ b/src/psm/Txtmsg/CarrierSMS.php @@ -0,0 +1,121 @@ +. + * + * Determining your mobile device email address: + * 1. Send a text message from your mobile device to an email account. + * The "From" address in the email should be your device's gateway email address. + * + * 2. A well maintained "Email-To-SMS Database" of mobile carrier gateways is + * available at "http://avtech.com/Support/Email/index.htm" + * + * @author Glen Arason + * @copyright Copyright (c) 2015 ITIStudios + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: v2.0.0 + * @link http://www.canadiandomainregistry.ca + * + */ + +namespace psm\Txtmsg; + +class CarrierSMS extends Core { + // ========================================================================= + // [ Fields ] + // ========================================================================= + public $gateway = 0; + public $resultcode = 0; + public $resultmessage = ""; + public $success = false; + public $successcount = 0; + + public function sendSMS($status,$server='') { + // Create new mail object + $mailObj = psm_build_mail(); + + // Set some email headers + $mailObj->XMailer = "SMS"; + $mailObj->AltBody = null; // if not null a multi-part message is created. + + // Check and assign From address. + // "$this->originator" is any valid email address entered in the SMS "Sender's phone number" + // field and can be used as the "From:" email address for the sms text message. + // Rem: phpmailer ValidateAddress() is buggy so I'm using php's filter_var() instead. + $from = filter_var(strtolower($this->originator), FILTER_VALIDATE_EMAIL); + if( $from === false ) { // Get "Email From" address + $from = filter_var(strtolower(psm_get_conf('email_from_email')), FILTER_VALIDATE_EMAIL); + } + + if(is_bool($status) && is_array($server)){ // If Not a "Test" message. + $br = array('
','
'); $nl = "\n"; + // Available message length = +/- 155 minus (from email address length) minus (subject length) + $Body = psm_parse_msg($status, "carrier", $server); + $Subject = psm_parse_msg($status, "carrier_subject", $server); + + // The txt message must have new lines not line breaks. + $Body = str_replace($br,$nl, $Body); + $Subject = str_replace($br,$nl, $Subject); + + // User configureable log entries + $logMsg = psm_parse_msg($status, "carrier_log", $server); + $this->resultmessage = $logMsg; + + $mailObj->Body = $Body; + $mailObj->Subject = $Subject; + + foreach($this->recipients as $value) { + $to = filter_var(strtolower($value), FILTER_VALIDATE_EMAIL); + // XOR result codes for potential future use. + if(!$from) $this->resultcode = 1; + if(!$to) $this->resultcode = 2; + if($from == $to) $this->resultcode = 4; + + if(!$this->resultcode) { + if( !$mailObj->SetFrom($from,"",false) ){ $this->resultcode = 8; } + else if( !$mailObj->AddAddress($to) ){ $this->resultcode = 16; } + else{ + if(!$mailObj->Send()){ $this->resultcode = 32; } + $mailObj->ClearAddresses(); + } + } + switch ($this->resultcode) { + case 0: $this->success = true; $this->successcount +=1; break; + case 1: + case 8: $this->resultmessage = psm_get_lang('users', 'error_carriersms_from_email_invalid') . $logMsg; break; + case 2: $this->resultmessage = psm_get_lang('users', 'error_carriersms_to_email_invalid') . " ($to) " . $logMsg; break; + case 4: $this->resultmessage = psm_get_lang('users', 'error_carriersms_not_unique') . " ($to) = ($from) " . $logMsg; break; + case 16: $this->resultmessage = psm_get_lang('users', 'error_carriersms_to_email_invalid') . " ($to) " . $logMsg; break; + case 32: $this->resultmessage = psm_get_lang('config', 'sms_error') . " : " . $mailObj->ErrorInfo . $logMsg; break; + default: break; + } + } + }else{ // A test message is being sent/tested + $mailObj->Body = $status; + if($from !== false){ + $mailObj->SetFrom($from,"",false); + $mailObj->AddAddress($this->recipients[0]); + $this->success = $mailObj->Send(); + if(!$this->success && $mailObj->ErrorInfo != ""){ + $GLOBALS['sm_lang']['config']['sms_error']=$mailObj->ErrorInfo; + } + } + } + return $this->success; + } +} diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index 68b7fa2b..e6af2567 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -184,6 +184,7 @@ class Installer { `mobile` varchar(15) NOT NULL, `pushover_key` varchar(255) NOT NULL, `pushover_device` varchar(255) NOT NULL, + `carriersms` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `unique_username` (`user_name`) @@ -408,6 +409,8 @@ class Installer { $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_key` VARCHAR( 255 ) NOT NULL AFTER `mobile`;"; $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_device` VARCHAR( 255 ) NOT NULL AFTER `pushover_key`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `carriersms` VARCHAR( 255 ) NOT NULL AFTER `pushover_device`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pushover` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `sms`;"; $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index 1b54a862..717493f9 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -280,17 +280,33 @@ class StatusNotifier { // we have to build an userlist for the log table.. $userlist = array(); - // add all users to the recipients list - foreach ($users as $user) { - $userlist[] = $user['user_id']; - $sms->addRecipients($user['mobile']); + // CarrierSMS sends plain/text "email" so pass vars to CarrierSMS class. + if($GLOBALS['sm_config']['sms_gateway'] == 'carriersms') { + // add all users to the recipients list + foreach ($users as $user) { + if($user['carriersms'] != ""){ + // only log users configured with a mobile email address + $userlist[] = $user['user_id']; + $sms->addRecipients($user['carriersms']); + } + } + + // Send sms, CarrierSMS class will handle messaging + $result = $sms->sendSMS($this->status_new, $this->server); + $message = $sms->resultmessage; + }else{ + // add all users to the recipients list + foreach ($users as $user) { + $userlist[] = $user['user_id']; + $sms->addRecipients($user['mobile']); + } + + $message = psm_parse_msg($this->status_new, 'sms', $this->server); + + // Send sms + $result = $sms->sendSMS($message); } - $message = psm_parse_msg($this->status_new, 'sms', $this->server); - - // Send sms - $result = $sms->sendSMS($message); - if(psm_get_conf('log_sms')) { // save to log psm_add_log($this->server_id, 'sms', $message, implode(',', $userlist)); @@ -306,7 +322,7 @@ class StatusNotifier { public function getUsers($server_id) { // find all the users with this server listed $users = $this->db->query(" - SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`pushover_device` + SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`pushover_device`, `u`.`carriersms` FROM `".PSM_DB_PREFIX."users` AS `u` JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( `us`.`user_id`=`u`.`user_id` @@ -315,4 +331,4 @@ class StatusNotifier { "); return $users; } -} \ No newline at end of file +} diff --git a/src/templates/default/module/config/config.tpl.html b/src/templates/default/module/config/config.tpl.html index 6ff9093d..d0cb7aac 100644 --- a/src/templates/default/module/config/config.tpl.html +++ b/src/templates/default/module/config/config.tpl.html @@ -150,6 +150,7 @@
+

{{ label_sms_gateway_carriersms_select|raw }}

@@ -178,6 +180,7 @@
+

{{ label_sms_gateway_carriersms_option|raw }}

@@ -225,4 +228,4 @@
- \ No newline at end of file + diff --git a/src/templates/default/module/user/profile.tpl.html b/src/templates/default/module/user/profile.tpl.html index b8d26be2..07040ce0 100644 --- a/src/templates/default/module/user/profile.tpl.html +++ b/src/templates/default/module/user/profile.tpl.html @@ -42,11 +42,21 @@ +
+ +
{{ label_carriersms_description|raw }}

{{ label_carriersms_help|raw }}

+
+
+ +
+ +
+
-
{{ label_pushover_description|raw }}
+
{{ label_pushover_description|raw }}
@@ -68,4 +78,4 @@
- \ No newline at end of file + diff --git a/src/templates/default/module/user/user/list.tpl.html b/src/templates/default/module/user/user/list.tpl.html index d76e530c..e1ab1ea2 100644 --- a/src/templates/default/module/user/user/list.tpl.html +++ b/src/templates/default/module/user/user/list.tpl.html @@ -6,6 +6,7 @@ {{ label_level }} {{ label_email }} {{ label_mobile }} + {{ label_carriersms }} {{ label_servers }} {{ label_action }} @@ -43,6 +44,7 @@
{{ label_email }}: 
{{ user.email }}
{{ label_mobile }}: 
{{ user.mobile }}
+
{{ label_carriersms }}: 
{{ user.carriersms }}
{{ label_servers }}: 
{% for server in user.emp_servers %} {{ server.label }}
{% endfor %}
@@ -51,6 +53,7 @@
{{ user.level_text }}
{{ user.email }}
{{ user.mobile }}
+
{{ user.carriersms }}
{% for server in user.emp_servers %} {{ server.label }}
{% endfor %}
@@ -63,4 +66,4 @@ {% endfor %} - \ No newline at end of file + diff --git a/src/templates/default/module/user/user/update.tpl.html b/src/templates/default/module/user/user/update.tpl.html index 93769d0c..4a759b56 100644 --- a/src/templates/default/module/user/user/update.tpl.html +++ b/src/templates/default/module/user/user/update.tpl.html @@ -48,9 +48,19 @@ +
+ +
{{ label_carriersms_description|raw }}

{{ label_carriersms_help|raw }}

+
+
+ +
+ +
+
-
{{ label_pushover_description|raw }}
+
{{ label_pushover_description|raw }}
@@ -79,4 +89,4 @@
- \ No newline at end of file +