Files
ISP-Billing/system/controllers/monitoring.php
2026-01-16 12:28:46 +01:00

213 lines
6.6 KiB
PHP

<?php
/**
* Router Monitoring API Controller
* Provides monitoring data for dashboard
*/
_admin();
$ui->assign('_title', Lang::T('Router Monitoring'));
$ui->assign('_system_menu', 'monitoring');
$action = $routes['1'];
$ui->assign('_admin', $admin);
if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
}
switch ($action) {
case 'dashboard':
$ui->assign('xfooter', '<script type="text/javascript" src="ui/lib/c/monitoring.js"></script>');
$ui->display('monitoring.tpl');
break;
case 'get_router_status':
$routerId = $_GET['router_id'] ?? null;
$hours = $_GET['hours'] ?? 24;
if ($routerId) {
$data = getRouterMonitoringData($routerId, $hours);
} else {
$data = getAllRoutersMonitoringData($hours);
}
header('Content-Type: application/json');
echo json_encode($data);
exit;
break;
case 'get_router_history':
$routerId = $_GET['router_id'] ?? null;
$days = $_GET['days'] ?? 7;
if (!$routerId) {
http_response_code(400);
echo json_encode(['error' => 'Router ID required']);
exit;
}
$data = getRouterHistoryData($routerId, $days);
header('Content-Type: application/json');
echo json_encode($data);
exit;
break;
case 'get_alerts':
$hours = $_GET['hours'] ?? 24;
$data = getRecentAlerts($hours);
header('Content-Type: application/json');
echo json_encode($data);
exit;
break;
default:
r2(U . 'monitoring/dashboard/', 's', '');
}
/**
* Get monitoring data for specific router
*/
function getRouterMonitoringData($routerId, $hours = 24) {
$cutoffTime = date('Y-m-d H:i:s', strtotime("-$hours hours"));
$router = ORM::for_table('tbl_routers')->find_one($routerId);
if (!$router) {
return ['error' => 'Router not found'];
}
$monitoringData = ORM::for_table('tbl_router_monitoring')
->where('router_id', $routerId)
->where_gte('timestamp', $cutoffTime)
->order_by_desc('timestamp')
->find_many();
$data = [
'router' => [
'id' => $router['id'],
'name' => $router['name'],
'ip_address' => $router['ip_address'],
'status' => $router['status'],
'last_check' => $router['last_check'],
'last_error' => $router['last_error']
],
'monitoring' => []
];
foreach ($monitoringData as $record) {
$data['monitoring'][] = [
'timestamp' => $record['timestamp'],
'ping_status' => (bool)$record['ping_status'],
'api_status' => (bool)$record['api_status'],
'uptime' => $record['uptime'],
'free_memory' => (int)$record['free_memory'],
'total_memory' => (int)$record['total_memory'],
'cpu_load' => (int)$record['cpu_load'],
'temperature' => $record['temperature'],
'voltage' => $record['voltage'],
'error' => $record['error']
];
}
return $data;
}
/**
* Get monitoring data for all routers
*/
function getAllRoutersMonitoringData($hours = 24) {
$cutoffTime = date('Y-m-d H:i:s', strtotime("-$hours hours"));
$routers = ORM::for_table('tbl_routers')->where('enabled', '1')->find_many();
$data = [];
foreach ($routers as $router) {
$latestData = ORM::for_table('tbl_router_monitoring')
->where('router_id', $router['id'])
->where_gte('timestamp', $cutoffTime)
->order_by_desc('timestamp')
->find_one();
$data[] = [
'router' => [
'id' => $router['id'],
'name' => $router['name'],
'ip_address' => $router['ip_address'],
'status' => $router['status'],
'last_check' => $router['last_check'],
'last_error' => $router['last_error']
],
'latest_data' => $latestData ? [
'timestamp' => $latestData['timestamp'],
'ping_status' => (bool)$latestData['ping_status'],
'api_status' => (bool)$latestData['api_status'],
'uptime' => $latestData['uptime'],
'free_memory' => (int)$latestData['free_memory'],
'total_memory' => (int)$latestData['total_memory'],
'cpu_load' => (int)$latestData['cpu_load'],
'temperature' => $latestData['temperature'],
'voltage' => $latestData['voltage'],
'error' => $latestData['error']
] : null
];
}
return $data;
}
/**
* Get historical data for router
*/
function getRouterHistoryData($routerId, $days = 7) {
$cutoffTime = date('Y-m-d H:i:s', strtotime("-$days days"));
$data = ORM::for_table('tbl_router_monitoring')
->where('router_id', $routerId)
->where_gte('timestamp', $cutoffTime)
->order_by_asc('timestamp')
->find_many();
$result = [];
foreach ($data as $record) {
$result[] = [
'timestamp' => $record['timestamp'],
'ping_status' => (bool)$record['ping_status'],
'api_status' => (bool)$record['api_status'],
'cpu_load' => (int)$record['cpu_load'],
'memory_usage' => $record['total_memory'] ?
round((($record['total_memory'] - $record['free_memory']) / $record['total_memory']) * 100, 1) : 0,
'temperature' => $record['temperature'],
'voltage' => $record['voltage']
];
}
return $result;
}
/**
* Get recent alerts
*/
function getRecentAlerts($hours = 24) {
$cutoffTime = date('Y-m-d H:i:s', strtotime("-$hours hours"));
$alerts = ORM::for_table('tbl_router_monitoring')
->where_gte('timestamp', $cutoffTime)
->where_not_null('error')
->order_by_desc('timestamp')
->find_many();
$result = [];
foreach ($alerts as $alert) {
$router = ORM::for_table('tbl_routers')->find_one($alert['router_id']);
$result[] = [
'timestamp' => $alert['timestamp'],
'router_name' => $router ? $router['name'] : 'Unknown',
'error' => $alert['error'],
'cpu_load' => $alert['cpu_load'],
'temperature' => $alert['temperature']
];
}
return $result;
}
?>