'Mikrotik Hotspot', 'description' => 'To handle connection between PHPNuxBill with Mikrotik Hotspot', 'author' => 'ibnux', 'url' => [ 'Github' => 'https://github.com/hotspotbilling/phpnuxbill/', 'Telegram' => 'https://t.me/phpnuxbill', 'Donate' => 'https://paypal.me/ibnux' ] ]; } function add_customer($customer, $plan) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $isExp = ORM::for_table('tbl_plans')->select("id")->where('plan_expired', $plan['id'])->find_one(); $this->removeHotspotUser($client, $customer['username']); if ($isExp){ $this->removeHotspotActiveUser($client, $customer['username']); } $this->addHotspotUser($client, $plan, $customer); } function sync_customer($customer, $plan) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $t = ORM::for_table('tbl_user_recharges')->where('username', $customer['username'])->where('status', 'on')->find_one(); if ($t) { $printRequest = new RouterOS\Request('/ip/hotspot/user/print'); $printRequest->setArgument('.proplist', '.id,limit-uptime,limit-bytes-total'); $printRequest->setQuery(RouterOS\Query::where('name', $customer['username'])); $userInfo = $client->sendSync($printRequest); $id = $userInfo->getProperty('.id'); $uptime = $userInfo->getProperty('limit-uptime'); $data = $userInfo->getProperty('limit-bytes-total'); if (!empty($id) && (!empty($uptime) || !empty($data))) { $setRequest = new RouterOS\Request('/ip/hotspot/user/set'); $setRequest->setArgument('numbers', $id); $setRequest->setArgument('profile', $t['namebp']); $client->sendSync($setRequest); } else { $this->add_customer($customer, $plan); } } } function remove_customer($customer, $plan) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); if (!empty($plan['plan_expired'])) { $p = ORM::for_table("tbl_plans")->find_one($plan['plan_expired']); if($p){ $this->add_customer($customer, $p); $this->removeHotspotActiveUser($client, $customer['username']); return; } } $this->removeHotspotUser($client, $customer['username']); $this->removeHotspotActiveUser($client, $customer['username']); } // customer change username public function change_username($plan, $from, $to) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); //check if customer exists $printRequest = new RouterOS\Request('/ip/hotspot/user/print'); $printRequest->setArgument('.proplist', '.id'); $printRequest->setQuery(RouterOS\Query::where('name', $from)); $id = $client->sendSync($printRequest)->getProperty('.id'); if (!empty($cid)) { $setRequest = new RouterOS\Request('/ip/hotspot/user/set'); $setRequest->setArgument('numbers', $id); $setRequest->setArgument('name', $to); $client->sendSync($setRequest); //disconnect then $this->removeHotspotActiveUser($client, $from); } } function add_plan($plan) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $bw = ORM::for_table("tbl_bandwidth")->find_one($plan['id_bw']); if ($bw['rate_down_unit'] == 'Kbps') { $unitdown = 'K'; } else { $unitdown = 'M'; } if ($bw['rate_up_unit'] == 'Kbps') { $unitup = 'K'; } else { $unitup = 'M'; } $rate = $bw['rate_up'] . $unitup . "/" . $bw['rate_down'] . $unitdown; if (!empty(trim($bw['burst']))) { $rate .= ' ' . $bw['burst']; } if ($bw['rate_up'] == '0' || $bw['rate_down'] == '0') { $rate = ''; } $addRequest = new RouterOS\Request('/ip/hotspot/user/profile/add'); $client->sendSync( $addRequest ->setArgument('name', $plan['name_plan']) ->setArgument('shared-users', $plan['shared_users']) ->setArgument('rate-limit', $rate) ); } function online_customer($customer, $router_name) { $mikrotik = $this->info($router_name); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $printRequest = new RouterOS\Request( '/ip hotspot active print', RouterOS\Query::where('user', $customer['username']) ); $id = $client->sendSync($printRequest)->getProperty('.id'); return $id; } function connect_customer($customer, $ip, $mac_address, $router_name) { $mikrotik = $this->info($router_name); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $addRequest = new RouterOS\Request('/ip/hotspot/active/login'); $client->sendSync( $addRequest ->setArgument('user', $customer['username']) ->setArgument('password', $customer['password']) ->setArgument('ip', $ip) ->setArgument('mac-address', $mac_address) ); } function disconnect_customer($customer, $router_name) { $mikrotik = $this->info($router_name); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $printRequest = new RouterOS\Request( '/ip hotspot active print', RouterOS\Query::where('user', $customer['username']) ); $id = $client->sendSync($printRequest)->getProperty('.id'); $removeRequest = new RouterOS\Request('/ip/hotspot/active/remove'); $client->sendSync( $removeRequest ->setArgument('numbers', $id) ); } function update_plan($old_plan, $new_plan) { $mikrotik = $this->info($new_plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $printRequest = new RouterOS\Request( '/ip hotspot user profile print .proplist=.id', RouterOS\Query::where('name', $old_plan['name_plan']) ); $profileID = $client->sendSync($printRequest)->getProperty('.id'); if (empty($profileID)) { $this->add_plan($new_plan); } else { $bw = ORM::for_table("tbl_bandwidth")->find_one($new_plan['id_bw']); if ($bw['rate_down_unit'] == 'Kbps') { $unitdown = 'K'; } else { $unitdown = 'M'; } if ($bw['rate_up_unit'] == 'Kbps') { $unitup = 'K'; } else { $unitup = 'M'; } $rate = $bw['rate_up'] . $unitup . "/" . $bw['rate_down'] . $unitdown; if (!empty(trim($bw['burst']))) { $rate .= ' ' . $bw['burst']; } if ($bw['rate_up'] == '0' || $bw['rate_down'] == '0') { $rate = ''; } $setRequest = new RouterOS\Request('/ip/hotspot/user/profile/set'); $client->sendSync( $setRequest ->setArgument('numbers', $profileID) ->setArgument('name', $new_plan['name_plan']) ->setArgument('shared-users', $new_plan['shared_users']) ->setArgument('rate-limit', $rate) ->setArgument('on-login', $new_plan['on_login']) ->setArgument('on-logout', $new_plan['on_logout']) ); } } function remove_plan($plan) { $mikrotik = $this->info($plan['routers']); $client = $this->getClient($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password']); $printRequest = new RouterOS\Request( '/ip hotspot user profile print .proplist=.id', RouterOS\Query::where('name', $plan['name_plan']) ); $profileID = $client->sendSync($printRequest)->getProperty('.id'); $removeRequest = new RouterOS\Request('/ip/hotspot/user/profile/remove'); $client->sendSync( $removeRequest ->setArgument('numbers', $profileID) ); } function info($name) { return ORM::for_table('tbl_routers')->where('name', $name)->find_one(); } function getClient($ip, $user, $pass) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $iport = explode(":", $ip); return new RouterOS\Client($iport[0], $user, $pass, ($iport[1]) ? $iport[1] : null); } function removeHotspotUser($client, $username) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $printRequest = new RouterOS\Request( '/ip hotspot user print .proplist=.id', RouterOS\Query::where('name', $username) ); $userID = $client->sendSync($printRequest)->getProperty('.id'); $removeRequest = new RouterOS\Request('/ip/hotspot/user/remove'); $client->sendSync( $removeRequest ->setArgument('numbers', $userID) ); } function addHotspotUser($client, $plan, $customer) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $addRequest = new RouterOS\Request('/ip/hotspot/user/add'); if ($plan['typebp'] == "Limited") { if ($plan['limit_type'] == "Time_Limit") { if ($plan['time_unit'] == 'Hrs') $timelimit = $plan['time_limit'] . ":00:00"; else $timelimit = "00:" . $plan['time_limit'] . ":00"; $client->sendSync( $addRequest ->setArgument('name', $customer['username']) ->setArgument('profile', $plan['name_plan']) ->setArgument('password', $customer['password']) ->setArgument('comment', $customer['fullname'] . ' | ' . implode(', ', User::getBillNames($customer['id']))) ->setArgument('email', $customer['email']) ->setArgument('limit-uptime', $timelimit) ); } else if ($plan['limit_type'] == "Data_Limit") { if ($plan['data_unit'] == 'GB') $datalimit = $plan['data_limit'] . "000000000"; else $datalimit = $plan['data_limit'] . "000000"; $client->sendSync( $addRequest ->setArgument('name', $customer['username']) ->setArgument('profile', $plan['name_plan']) ->setArgument('password', $customer['password']) ->setArgument('comment', $customer['fullname'] . ' | ' . implode(', ', User::getBillNames($customer['id']))) ->setArgument('email', $customer['email']) ->setArgument('limit-bytes-total', $datalimit) ); } else if ($plan['limit_type'] == "Both_Limit") { if ($plan['time_unit'] == 'Hrs') $timelimit = $plan['time_limit'] . ":00:00"; else $timelimit = "00:" . $plan['time_limit'] . ":00"; if ($plan['data_unit'] == 'GB') $datalimit = $plan['data_limit'] . "000000000"; else $datalimit = $plan['data_limit'] . "000000"; $client->sendSync( $addRequest ->setArgument('name', $customer['username']) ->setArgument('profile', $plan['name_plan']) ->setArgument('password', $customer['password']) ->setArgument('comment', $customer['fullname'] . ' | ' . implode(', ', User::getBillNames($customer['id']))) ->setArgument('email', $customer['email']) ->setArgument('limit-uptime', $timelimit) ->setArgument('limit-bytes-total', $datalimit) ); } } else { $client->sendSync( $addRequest ->setArgument('name', $customer['username']) ->setArgument('profile', $plan['name_plan']) ->setArgument('comment', $customer['fullname'] . ' | ' . implode(', ', User::getBillNames($customer['id']))) ->setArgument('email', $customer['email']) ->setArgument('password', $customer['password']) ); } } function setHotspotUser($client, $user, $pass) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $printRequest = new RouterOS\Request('/ip/hotspot/user/print'); $printRequest->setArgument('.proplist', '.id'); $printRequest->setQuery(RouterOS\Query::where('name', $user)); $id = $client->sendSync($printRequest)->getProperty('.id'); $setRequest = new RouterOS\Request('/ip/hotspot/user/set'); $setRequest->setArgument('numbers', $id); $setRequest->setArgument('password', $pass); $client->sendSync($setRequest); } function setHotspotUserPackage($client, $username, $plan_name) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $printRequest = new RouterOS\Request('/ip/hotspot/user/print'); $printRequest->setArgument('.proplist', '.id'); $printRequest->setQuery(RouterOS\Query::where('name', $username)); $id = $client->sendSync($printRequest)->getProperty('.id'); $setRequest = new RouterOS\Request('/ip/hotspot/user/set'); $setRequest->setArgument('numbers', $id); $setRequest->setArgument('profile', $plan_name); $client->sendSync($setRequest); } function removeHotspotActiveUser($client, $username) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $onlineRequest = new RouterOS\Request('/ip/hotspot/active/print'); $onlineRequest->setArgument('.proplist', '.id'); $onlineRequest->setQuery(RouterOS\Query::where('user', $username)); $id = $client->sendSync($onlineRequest)->getProperty('.id'); $removeRequest = new RouterOS\Request('/ip/hotspot/active/remove'); $removeRequest->setArgument('numbers', $id); $client->sendSync($removeRequest); } function getIpHotspotUser($client, $username) { global $_app_stage; if ($_app_stage == 'Demo') { return null; } $printRequest = new RouterOS\Request( '/ip hotspot active print', RouterOS\Query::where('user', $username) ); return $client->sendSync($printRequest)->getProperty('address'); } }