nestict 3a4ac7c4a1 Upload files to "system/controllers"
Signed-off-by: nestict <icttechnest@gmail.com>
2025-05-24 11:20:57 +02:00

348 lines
12 KiB
PHP

<?php
// Include necessary files and functions here
// ...
_admin();
$ui->assign('_title', Lang::T('Online Users'));
$ui->assign('_system_menu', 'onlineusers');
$action = $routes['1'];
$ui->assign('_admin', $admin);
use PEAR2\Net\RouterOS;
require_once 'system/autoload/PEAR2/Autoload.php';
if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin'])) {
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
}
// Handle cases for hotspot users and PPP users
switch ($action) {
case 'hotspot':
$ui->display('hotspot_users.tpl');
break;
case 'hotspot_users':
$hotspotUsers = mikrotik_get_hotspot_online_users();
// Filter out entries where all values are null
$filteredHotspotUsers = array_filter($hotspotUsers, function($user) {
// Check if all specified fields are null
return !(
is_null($user['username']) &&
is_null($user['address']) &&
is_null($user['uptime']) &&
is_null($user['server']) &&
is_null($user['mac']) &&
is_null($user['session_time']) &&
$user['rx_bytes'] === '0 B' &&
$user['tx_bytes'] === '0 B' &&
$user['total'] === '0 B'
);
});
header('Content-Type: application/json');
echo json_encode($filteredHotspotUsers);
exit;
break;
case 'pppoe':
$ui->display('ppp_users.tpl');
break;
case 'ppp_users':
$pppUsers = mikrotik_get_ppp_online_users();
header('Content-Type: application/json');
echo json_encode($pppUsers);
exit;
break;
case 'disconnect':
$routerId = $routes['2'];
$username = $routes['3'];
$userType = $routes['4'];
mikrotik_disconnect_online_user($routerId, $username, $userType);
// Redirect or handle the response as needed
break;
case 'summary':
// Fetch summary of online users and total bytes used
$summary = mikrotik_get_online_users_summary();
header('Content-Type: application/json');
echo json_encode($summary);
exit;
break;
default:
// Handle default case or invalid action
break;
}
// Function to round the value and append the appropriate unit
function mikrotik_formatBytes($bytes, $precision = 2)
{
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= pow(1024, $pow);
return round($bytes, $precision) . ' ' . $units[$pow];
}
function filter_null_users($users) {
return array_filter($users, function($user) {
return array_reduce($user, function($carry, $value) {
return $carry || $value !== null;
}, false);
});
}
function mikrotik_get_hotspot_online_users()
{
global $routes;
$routerId = $routes['2'];
$mikrotik = ORM::for_table('tbl_routers')->where('enabled', '1')->find_one($routerId);
$client = Mikrotik::getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
$hotspotActive = $client->sendSync(new RouterOS\Request('/ip/hotspot/active/print'));
$hotspotList = [];
foreach ($hotspotActive as $hotspot) {
$username = $hotspot->getProperty('user');
$address = $hotspot->getProperty('address');
$uptime = $hotspot->getProperty('uptime');
$server = $hotspot->getProperty('server');
$mac = $hotspot->getProperty('mac-address');
$sessionTime = $hotspot->getProperty('session-time-left');
$rxBytes = $hotspot->getProperty('bytes-in');
$txBytes = $hotspot->getProperty('bytes-out');
$hotspotList[] = [
'username' => $username,
'address' => $address,
'uptime' => $uptime,
'server' => $server,
'mac' => $mac,
'session_time' => $sessionTime,
'rx_bytes' => mikrotik_formatBytes($rxBytes),
'tx_bytes' => mikrotik_formatBytes($txBytes),
'total' => mikrotik_formatBytes($rxBytes + $txBytes),
];
}
// Filter out users with all null properties
$filteredHotspotList = filter_null_users($hotspotList);
// Return an empty array if no users are left after filtering
return empty($filteredHotspotList) ? [] : $filteredHotspotList;
}
function mikrotik_get_ppp_online_users()
{
global $routes;
$routerId = $routes['2'];
$mikrotik = ORM::for_table('tbl_routers')->where('enabled', '1')->find_one($routerId);
$client = Mikrotik::getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
$pppUsers = $client->sendSync(new RouterOS\Request('/ppp/active/print'));
$userList = [];
foreach ($pppUsers as $pppUser) {
$username = $pppUser->getProperty('name');
$address = $pppUser->getProperty('address');
$uptime = $pppUser->getProperty('uptime');
$service = $pppUser->getProperty('service');
$callerid = $pppUser->getProperty('caller-id');
$bytes_in = $pppUser->getProperty('limit-bytes-in');
$bytes_out = $pppUser->getProperty('limit-bytes-out');
$userList[] = [
'username' => $username,
'address' => $address,
'uptime' => $uptime,
'service' => $service,
'caller_id' => $callerid,
'bytes_in' => $bytes_in,
'bytes_out' => $bytes_out,
];
}
// Filter out users with all null properties
return filter_null_users($userList);
}
function save_data_usage($username, $bytes_in, $bytes_out, $connection_type) {
if (!$username) {
error_log("Error: Missing username in save_data_usage()");
return;
}
$currentTime = date('Y-m-d H:i:s');
$currentDate = date('Y-m-d');
// Check if there's an existing record for this user today
$existingRecord = ORM::for_table('tbl_user_data_usage')
->where('username', $username)
->where('connection_type', $connection_type)
->where_raw('DATE(timestamp) = ?', [$currentDate])
->find_one();
if ($existingRecord) {
// Update existing record for today
$existingRecord->bytes_in = ($bytes_in ?: 0);
$existingRecord->bytes_out = ($bytes_out ?: 0);
$existingRecord->last_updated = $currentTime;
$existingRecord->save();
} else {
// Create new record for today
$newRecord = ORM::for_table('tbl_user_data_usage')->create();
$newRecord->username = $username;
$newRecord->bytes_in = ($bytes_in ?: 0);
$newRecord->bytes_out = ($bytes_out ?: 0);
$newRecord->connection_type = $connection_type;
$newRecord->timestamp = $currentTime;
$newRecord->last_updated = $currentTime;
$newRecord->save();
}
}
function mikrotik_get_online_users_summary()
{
global $routes;
$routerId = $routes['2'];
$mikrotik = ORM::for_table('tbl_routers')->where('enabled', '1')->find_one($routerId);
$client = Mikrotik::getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
// Get Hotspot users
$hotspotActive = $client->sendSync(new RouterOS\Request('/ip/hotspot/active/print'));
$hotspotList = [];
$totalHotspotUsage = 0;
foreach ($hotspotActive as $hotspot) {
$rxBytes = $hotspot->getProperty('bytes-in');
$txBytes = $hotspot->getProperty('bytes-out');
$totalHotspotUsage += $rxBytes + $txBytes;
$username = $hotspot->getProperty('user');
save_data_usage($username, $rxBytes, $txBytes, 'hotspot');
$hotspotList[] = [
'username' => $username,
'address' => $hotspot->getProperty('address'),
'uptime' => $hotspot->getProperty('uptime'),
'server' => $hotspot->getProperty('server'),
'mac' => $hotspot->getProperty('mac-address'),
'session_time' => $hotspot->getProperty('session-time-left'),
'rx_bytes' => mikrotik_formatBytes($rxBytes),
'tx_bytes' => mikrotik_formatBytes($txBytes),
'total' => mikrotik_formatBytes($rxBytes + $txBytes),
];
}
// Filter out null hotspot users
$hotspotList = array_filter($hotspotList, function($user) {
return !(
is_null($user['username']) &&
is_null($user['address']) &&
is_null($user['uptime']) &&
is_null($user['server']) &&
is_null($user['mac']) &&
is_null($user['session_time']) &&
$user['rx_bytes'] === '0 B' &&
$user['tx_bytes'] === '0 B' &&
$user['total'] === '0 B'
);
});
// Get PPPoE users
$pppUsers = $client->sendSync(new RouterOS\Request('/ppp/active/print'));
$pppoeList = [];
$totalPPPoEUsage = 0;
foreach ($pppUsers as $pppUser) {
$bytes_in = $pppUser->getProperty('limit-bytes-in');
$bytes_out = $pppUser->getProperty('limit-bytes-out');
$totalPPPoEUsage += $bytes_in + $bytes_out;
$username = $pppUser->getProperty('name');
save_data_usage($username, $bytes_in, $bytes_out, 'pppoe');
$pppoeList[] = [
'username' => $username,
'address' => $pppUser->getProperty('address'),
'uptime' => $pppUser->getProperty('uptime'),
'service' => $pppUser->getProperty('service'),
'caller_id' => $pppUser->getProperty('caller-id'),
'bytes_in' => mikrotik_formatBytes($bytes_in),
'bytes_out' => mikrotik_formatBytes($bytes_out),
'total' => mikrotik_formatBytes($bytes_in + $bytes_out),
];
}
// Filter out null PPPoE users
$pppoeList = array_filter($pppoeList, function($user) {
return !(
is_null($user['username']) &&
is_null($user['address']) &&
is_null($user['uptime']) &&
is_null($user['service']) &&
is_null($user['caller_id']) &&
$user['bytes_in'] === '0 B' &&
$user['bytes_out'] === '0 B' &&
$user['total'] === '0 B'
);
});
// Calculate total data usage
$totalDataUsage = $totalHotspotUsage + $totalPPPoEUsage;
// Calculate total users
$totalHotspotUsers = count($hotspotList);
$totalPPPoEUsers = count($pppoeList);
$totalUsers = $totalHotspotUsers + $totalPPPoEUsers;
return [
'hotspot_users' => $totalHotspotUsers,
'ppoe_users' => $totalPPPoEUsers,
'total_users' => $totalUsers,
'total_bytes' => mikrotik_formatBytes($totalDataUsage),
];
}
function mikrotik_disconnect_online_user($router, $username, $userType)
{
// Check if the form was submitted
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Retrieve the form data
$router = $_POST['router'];
$username = $_POST['username'];
$userType = $_POST['userType'];
$mikrotik = ORM::for_table('tbl_routers')->where('enabled', '1')->find_one($router);
if (!$mikrotik) {
// Handle the error response or redirection
return;
}
try {
$client = Mikrotik::getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']);
if ($userType == 'hotspot') {
Mikrotik::removeHotspotActiveUser($client, $username);
// Handle the success response or redirection
} elseif ($userType == 'pppoe') {
Mikrotik::removePpoeActive($client, $username);
// Handle the success response or redirection
} else {
// Handle the error response or redirection
return;
}
} catch (Exception $e) {
// Handle the error response or redirection
} finally {
// Disconnect from the MikroTik router
if (isset($client)) {
$client->disconnect();
}
}
}
}
?>