Upload files to "system/controllers"
Signed-off-by: nestict <icttechnest@gmail.com>
This commit is contained in:
347
system/controllers/onlineusers.php
Normal file
347
system/controllers/onlineusers.php
Normal file
@ -0,0 +1,347 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
Reference in New Issue
Block a user