From 76ac9431b3090d40b30c104a3364247be0c79222 Mon Sep 17 00:00:00 2001 From: Focuslinkstech <45756999+Focuslinkstech@users.noreply.github.com> Date: Tue, 27 Aug 2024 00:26:52 +0100 Subject: [PATCH 1/2] added router online status, also add monitor and also report to admin when goes offline, report depend on cron runtime --- install/phpnuxbill.sql | 2 ++ system/cron.php | 61 ++++++++++++++++++++++++++++++++++++++++++ system/updates.json | 4 +++ ui/ui/routers.tpl | 50 +++++++++++++++++++++------------- 4 files changed, 98 insertions(+), 19 deletions(-) diff --git a/install/phpnuxbill.sql b/install/phpnuxbill.sql index 659194f0..d6645f60 100644 --- a/install/phpnuxbill.sql +++ b/install/phpnuxbill.sql @@ -138,6 +138,8 @@ CREATE TABLE `tbl_routers` ( `password` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `coordinates` VARCHAR(50) NOT NULL DEFAULT '', + `status` ENUM('Online', 'Offline') DEFAULT 'Online', + `last_seen` DATETIME, `coverage` VARCHAR(8) NOT NULL DEFAULT '0', `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 disabled' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; diff --git a/system/cron.php b/system/cron.php index caae5c05..a0862d23 100644 --- a/system/cron.php +++ b/system/cron.php @@ -78,3 +78,64 @@ foreach ($d as $ds) { echo " : ACTIVE \r\n"; } } + +$routers = ORM::for_table('tbl_routers')->find_many(); +if (!$routers) { + echo "No routers found in the database.\n"; + exit; +} + +foreach ($routers as $router) { + [$ip, $port] = explode(':', $router->ip_address); + $isOnline = false; + + try { + $timeout = 5; + if (is_callable('fsockopen') && false === stripos(ini_get('disable_functions'), 'fsockopen')) { + $fsock = @fsockopen($ip, $port, $errno, $errstr, $timeout); + if ($fsock) { + fclose($fsock); + $isOnline = true; + } else { + throw new Exception("Unable to connect to $ip on port $port using fsockopen: $errstr ($errno)"); + } + } elseif (is_callable('stream_socket_client') && false === stripos(ini_get('disable_functions'), 'stream_socket_client')) { + $connection = @stream_socket_client("$ip:$port", $errno, $errstr, $timeout); + if ($connection) { + fclose($connection); + $isOnline = true; + } else { + throw new Exception("Unable to connect to $ip on port $port using stream_socket_client: $errstr ($errno)"); + } + } else { + throw new Exception("Neither fsockopen nor stream_socket_client are enabled on the server."); + } + } catch (Exception $e) { + _log($e->getMessage()); + $adminEmail = $config['mail_from']; + $subject = "Router Monitoring Error Alert"; + $message = "An error occurred during the monitoring of router $ip: " . (string) $e->getMessage(); + Message::SendEmail($adminEmail, $subject, $message); + sendTelegram($message); + } + + if ($isOnline) { + $router->last_seen = date('Y-m-d H:i:s'); + $router->status = 'Online'; + } else { + $router->status = 'Offline'; + $adminEmail = $config['mail_from']; + $subject = "Router Offline Alert"; + $message = "Dear Administrator,\nThe router with Name: {$router->name} and IP: {$router->ip_address} appears to be offline.\nThe Router was last seen online on: {$router->last_seen}\nPlease check the router's status and take appropriate action.\n\nBest regards,\nRouter Monitoring System"; + Message::SendEmail($adminEmail, $subject, $message); + sendTelegram($message); + } + + $router->save(); +} + +if ($isCli) { + echo "Cronjob finished\n"; +} else { + echo ""; +} \ No newline at end of file diff --git a/system/updates.json b/system/updates.json index 00e214cc..f9f05bf1 100644 --- a/system/updates.json +++ b/system/updates.json @@ -151,5 +151,9 @@ ], "2024.8.7" : [ "ALTER TABLE `tbl_customers` CHANGE `coordinates` `coordinates` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'Latitude and Longitude coordinates';" + ], + "2024.8.27" : [ + "ALTER TABLE `tbl_routers` ADD `status` ENUM('Online', 'Offline') DEFAULT 'Online', AFTER `coordinates`;", + "ALTER TABLE `tbl_routers` ADD `last_seen` DATETIME AFTER `status`;" ] } \ No newline at end of file diff --git a/ui/ui/routers.tpl b/ui/ui/routers.tpl index 526c4446..3422a5b9 100644 --- a/ui/ui/routers.tpl +++ b/ui/ui/routers.tpl @@ -40,6 +40,8 @@ {Lang::T('IP Address')} {Lang::T('Username')} {Lang::T('Description')} + {Lang::T('Online Status')} + {Lang::T('Last Seen')} {Lang::T('Status')} {Lang::T('Manage')} ID @@ -47,27 +49,37 @@ {foreach $d as $ds} - - + + {if $ds['coordinates']} - + {/if} - {$ds['name']} - {$ds['ip_address']} - {$ds['username']} - {$ds['description']} - {if $ds['enabled'] == 1}{Lang::T('Enabled')}{else}{Lang::T('Disabled')}{/if} - - {Lang::T('Edit')} - - - {$ds['id']} - + {$ds['name']} + + {$ds['ip_address']} + {$ds['username']} + {$ds['description']} + {if + $ds['status'] == 'Online'}{Lang::T('Online')}{else}{Lang::T('Offline')}{/if} + + {$ds['last_seen']} + {if $ds['enabled'] == 1}{Lang::T('Enabled')}{else}{Lang::T('Disabled')}{/if} + + {Lang::T('Edit')} + + + {$ds['id']} + {/foreach} From edfa98e6b202cc9dff8144a84e76928b5dbad4e4 Mon Sep 17 00:00:00 2001 From: Focuslinkstech <45756999+Focuslinkstech@users.noreply.github.com> Date: Tue, 27 Aug 2024 08:17:28 +0100 Subject: [PATCH 2/2] Add condition to router check, if enable or not --- system/cron.php | 104 +++++++++++++++++++++-------------------- ui/ui/app-settings.tpl | 15 ++++++ 2 files changed, 68 insertions(+), 51 deletions(-) diff --git a/system/cron.php b/system/cron.php index a0862d23..4b8d63ad 100644 --- a/system/cron.php +++ b/system/cron.php @@ -33,7 +33,7 @@ foreach ($d as $ds) { $c = ORM::for_table('tbl_customers')->where('id', $ds['customer_id'])->find_one(); $p = ORM::for_table('tbl_plans')->where('id', $u['plan_id'])->find_one(); $dvc = Package::getDevice($p); - if($_app_stage != 'demo'){ + if ($_app_stage != 'demo') { if (file_exists($dvc)) { require_once $dvc; (new $p['device'])->remove_customer($c, $p); @@ -79,63 +79,65 @@ foreach ($d as $ds) { } } -$routers = ORM::for_table('tbl_routers')->find_many(); -if (!$routers) { - echo "No routers found in the database.\n"; - exit; -} +if ($config['router_check']) { + $routers = ORM::for_table('tbl_routers')->find_many(); + if (!$routers) { + echo "No routers found in the database.\n"; + exit; + } -foreach ($routers as $router) { - [$ip, $port] = explode(':', $router->ip_address); - $isOnline = false; + foreach ($routers as $router) { + [$ip, $port] = explode(':', $router->ip_address); + $isOnline = false; - try { - $timeout = 5; - if (is_callable('fsockopen') && false === stripos(ini_get('disable_functions'), 'fsockopen')) { - $fsock = @fsockopen($ip, $port, $errno, $errstr, $timeout); - if ($fsock) { - fclose($fsock); - $isOnline = true; + try { + $timeout = 5; + if (is_callable('fsockopen') && false === stripos(ini_get('disable_functions'), 'fsockopen')) { + $fsock = @fsockopen($ip, $port, $errno, $errstr, $timeout); + if ($fsock) { + fclose($fsock); + $isOnline = true; + } else { + throw new Exception("Unable to connect to $ip on port $port using fsockopen: $errstr ($errno)"); + } + } elseif (is_callable('stream_socket_client') && false === stripos(ini_get('disable_functions'), 'stream_socket_client')) { + $connection = @stream_socket_client("$ip:$port", $errno, $errstr, $timeout); + if ($connection) { + fclose($connection); + $isOnline = true; + } else { + throw new Exception("Unable to connect to $ip on port $port using stream_socket_client: $errstr ($errno)"); + } } else { - throw new Exception("Unable to connect to $ip on port $port using fsockopen: $errstr ($errno)"); + throw new Exception("Neither fsockopen nor stream_socket_client are enabled on the server."); } - } elseif (is_callable('stream_socket_client') && false === stripos(ini_get('disable_functions'), 'stream_socket_client')) { - $connection = @stream_socket_client("$ip:$port", $errno, $errstr, $timeout); - if ($connection) { - fclose($connection); - $isOnline = true; - } else { - throw new Exception("Unable to connect to $ip on port $port using stream_socket_client: $errstr ($errno)"); - } - } else { - throw new Exception("Neither fsockopen nor stream_socket_client are enabled on the server."); + } catch (Exception $e) { + _log($e->getMessage()); + $adminEmail = $config['mail_from']; + $subject = "Router Monitoring Error Alert"; + $message = "An error occurred during the monitoring of router $ip: " . (string) $e->getMessage(); + Message::SendEmail($adminEmail, $subject, $message); + sendTelegram($message); } - } catch (Exception $e) { - _log($e->getMessage()); - $adminEmail = $config['mail_from']; - $subject = "Router Monitoring Error Alert"; - $message = "An error occurred during the monitoring of router $ip: " . (string) $e->getMessage(); - Message::SendEmail($adminEmail, $subject, $message); - sendTelegram($message); + + if ($isOnline) { + $router->last_seen = date('Y-m-d H:i:s'); + $router->status = 'Online'; + } else { + $router->status = 'Offline'; + $adminEmail = $config['mail_from']; + $subject = "Router Offline Alert"; + $message = "Dear Administrator,\nThe router with Name: {$router->name} and IP: {$router->ip_address} appears to be offline.\nThe Router was last seen online on: {$router->last_seen}\nPlease check the router's status and take appropriate action.\n\nBest regards,\nRouter Monitoring System"; + Message::SendEmail($adminEmail, $subject, $message); + sendTelegram($message); + } + + $router->save(); } - if ($isOnline) { - $router->last_seen = date('Y-m-d H:i:s'); - $router->status = 'Online'; + if ($isCli) { + echo "Cronjob finished\n"; } else { - $router->status = 'Offline'; - $adminEmail = $config['mail_from']; - $subject = "Router Offline Alert"; - $message = "Dear Administrator,\nThe router with Name: {$router->name} and IP: {$router->ip_address} appears to be offline.\nThe Router was last seen online on: {$router->last_seen}\nPlease check the router's status and take appropriate action.\n\nBest regards,\nRouter Monitoring System"; - Message::SendEmail($adminEmail, $subject, $message); - sendTelegram($message); + echo ""; } - - $router->save(); } - -if ($isCli) { - echo "Cronjob finished\n"; -} else { - echo ""; -} \ No newline at end of file diff --git a/ui/ui/app-settings.tpl b/ui/ui/app-settings.tpl index 5e56539f..c1ca96ef 100644 --- a/ui/ui/app-settings.tpl +++ b/ui/ui/app-settings.tpl @@ -621,6 +621,21 @@

{Lang::T('This is to notify you when new updates is available')}

+
+ +
+ +
+

{Lang::T('If enabled, the system will notify Admin when router goes Offline, If admin have 10 or more router and many customers, it will get overlapping, you can disabled')} +

+