Code: Select all
class MikrotikLoggerListener extends Command
{
protected $signature = 'mikrotik:logger';
protected $description = 'Mikrotik logger listener';
public function handle()
{
$users = User::all();
foreach ($users as $user) {
if ($user->log == 1) {
try {
$addRequest = new RouterOS\Request('/log print');
$result = (new RouterOS\Client($user->mikrotik_ip, $user->mikrotik_user, $user->mikrotik_password))->sendSync($addRequest);
foreach ($result as $object) {
$id = $object->getProperty('.id');
$time = $object->getProperty('time');
$topics = $object->getProperty('topics');
$message = $object->getProperty('message');
$exists = LogTemp::where('time','=',$time)->first();
if(!$exists) {
if (str_contains($message, 'logged out') || str_contains($message, 'disconnected')) {
$status = 'logged out';
$log = new LogTemp;
$log->user_id = $user->id;
$log->mikrotik_id = $id;
$log->time = $time;
$log->topics = $topics;
$log->message = $message;
$log->status = $status;
$log->save();
}
}
}
//--------------------------------------------------------------------------------------------------
$request = new RouterOS\Request('/ip/hotspot/active/print');
$router = new RouterOS\Client($user->mikrotik_ip, $user->mikrotik_user, $user->mikrotik_password);
$onlineUsers = $router->sendSync($request);
$count = $onlineUsers->count();
$this->info('customer: ' . $user->id . ' count: ' . $count);
for ($i = 0; $i < $count; $i++) {
if ($onlineUsers[$i]->getProperty('.id') != null) {
$mikrotik_id = $onlineUsers[$i]->getProperty('.id');
$current_user = LogTemp::where('user', '=', $onlineUsers[$i]->getProperty('user'))->first();
if ($current_user) {
$log = new LogTemp;
$log->user_id = $user->id;
$log->mikrotik_id = $mikrotik_id;
$log->user = $onlineUsers[$i]->getProperty('user') ?? '';
$log->address = $onlineUsers[$i]->getProperty('address') ?? '';
$log->mac_address = $onlineUsers[$i]->getProperty('mac-address') ?? '';
$log->login_by = $onlineUsers[$i]->getProperty('login-by') ?? '';
$log->bytes_in = $onlineUsers[$i]->getProperty('bytes-in') ?? '';
$log->bytes_out = $onlineUsers[$i]->getProperty('bytes-out') ?? '';
$log->packets_in = $onlineUsers[$i]->getProperty('packets-in') ?? '';
$log->packets_out = $onlineUsers[$i]->getProperty('packets-out') ?? '';
$log->status = 'online';
$log->save();
} else {
$log = new LogTemp();
$log->user_id = $user->id;
$log->mikrotik_id = $mikrotik_id;
$log->user = $onlineUsers[$i]->getProperty('user') ?? '';
$log->address = $onlineUsers[$i]->getProperty('address') ?? '';
$log->mac_address = $onlineUsers[$i]->getProperty('mac-address') ?? '';
$log->login_by = $onlineUsers[$i]->getProperty('login-by') ?? '';
$log->bytes_in = $onlineUsers[$i]->getProperty('bytes-in') ?? '';
$log->bytes_out = $onlineUsers[$i]->getProperty('bytes-out') ?? '';
$log->packets_in = $onlineUsers[$i]->getProperty('packets-in') ?? '';
$log->packets_out = $onlineUsers[$i]->getProperty('packets-out') ?? '';
$log->status = 'logged-in';
$log->save();
}
}
}
} catch (Exception $ignore) {
$this->info(' ->' . $ignore->getMessage());
}
try {
$addRequest = new RouterOS\Request('/log print');
$result = (new RouterOS\Client($user->mikrotik_ip, $user->mikrotik_user, $user->mikrotik_password))->sendSync($addRequest);
foreach ($result as $object) {
$message = $object->getProperty('message');
$mikrotik_id = $object->getProperty('.id');
if (str_contains($message, 'logged out') || str_contains($message, 'disconnected')) {
$current_user = LogTemp::where('user', '=', $mikrotik_id)->orderBy('id', 'DESC')->first();
if ($current_user) {
//dd($current_user);
$result = LogTemp::with('user')
->select([DB::raw('SUM(bytes_in) as download , SUM(bytes_out) as upload')])
->where('mikrotik_id','=',$mikrotik_id)
->groupBy('mikrotik_id')
->get();
$new_log = new UserConnectionsLog();
$new_log->user_id = $current_user->id;
$new_log->mikrotik_id = $current_user->mikrotik_id;
$new_log->user = $current_user->user;
$new_log->address = $current_user->address;
$new_log->mac_address = $current_user->mac_address;
$new_log->login_by = $current_user->login_by;
$new_log->bytes_in = $result['download'];
$new_log->bytes_out = $result['upload'];
$new_log->logged_in = $current_user->logged_in;
$new_log->logged_out = now();
//$new_log->save();
//LogTemp::where('mikrotik_id', '', $log->user)->delete();
}
}
}
} catch (Exception $ignore) {
$this->info('Log section error ->' . $ignore->getMessage());
}
}
}
}
}