Community discussions

MikroTik App
 
tuxworld
just joined
Topic Author
Posts: 1
Joined: Wed Nov 16, 2022 9:39 am
Location: iran
Contact:

Mikrotik online users id is difference than normal user id

Wed Nov 16, 2022 9:41 am

When i try to log `mikrotik` users activity we understood mikrotik assign another id to online users than when we created user with `/ip/hotspot/user/add` command, is there any solution to find which user connected to internet in mikrotik?
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());
                }
            }
        }
    }
}

Who is online

Users browsing this forum: UkRainUa and 18 guests