Source of file api.ipchange.php
Size: 12,523 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.ipchange.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 | <?php /** * User IP changing/management implementation */ class IpChange { /** * Contains current user login * * @var string */ protected $login = ''; /** * Contains current user IP * * @var string */ protected $currentIp = ''; /** * Contains current user MAC * * @var string */ protected $currentMac = ''; /** * Contains system billing.ini config as key=>value * * @var array */ protected $billingCfg = array(); /** * Contains system alter.ini config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains available network services as id=>name * * @var array */ protected $allServices = array(); /** * Flag of IP_CUSTOM_SELECT optional option state * * @var bool */ protected $customFlag = false; /** * message helper object placeholder * * @var object */ protected $messages = ''; /** * is database locking feature enabled * * @var bool */ protected $dbLockEnabled = false; const URL_ME = '?module=pl_ipchange'; public function __construct() { $this->loadConfigs(); $this->initMessages(); $this->loadServices(); } /** * Loads system configs and inits customFlag property * * @global object $ubillingConfig * * @return void */ protected function loadConfigs() { global $ubillingConfig; $this->billingCfg = $ubillingConfig->getBilling(); $this->altCfg = $ubillingConfig->getAlter(); if (isset($this->altCfg['IP_CUSTOM_SELECT'])) { if ($this->altCfg['IP_CUSTOM_SELECT']) { $this->customFlag = true; } } if (isset($this->altCfg['DB_LOCK_ENABLED'])) { $this->dbLockEnabled = $this->altCfg['DB_LOCK_ENABLED']; } } /** * Inits message helper object for further usage * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Loads available network services * * @return void */ protected function loadServices() { $rawServices = multinet_get_services(); if (!empty($rawServices)) { foreach ($rawServices as $io => $each) { $this->allServices[$each['id']] = $each['desc']; } } } /** * Sets current user login * * @param string $login * * @return void */ public function setLogin($login) { $this->login = mysql_real_escape_string($login); } /** * Inits user params as current IP and MAC * * @return void */ public function initUserParams() { if (!empty($this->login)) { $this->currentIp = zb_UserGetIP($this->login); $this->currentMac = zb_MultinetGetMAC($this->currentIp); } } /** * Renders service and IP selection dialog * * @return string */ public function renderMainForm() { if ($this->altCfg['BRANCHES_ENABLED']) { global $branchControl; $branchControl->loadServices(); } $result = ''; $servSelector = array(); if (!empty($this->allServices)) { foreach ($this->allServices as $serviceId => $serviceName) { if ($this->altCfg['BRANCHES_ENABLED']) { if ($branchControl->isMyService($serviceId)) { $servSelector[self::URL_ME . '&ajserviceid=' . $serviceId] = $serviceName; } } else { $servSelector[self::URL_ME . '&ajserviceid=' . $serviceId] = $serviceName; } } //getting firs service ID reset($this->allServices); $defaultService = key($this->allServices); $result = wf_AjaxLoader(); $inputs = wf_AjaxSelectorAC('ajcontainer', $servSelector, __('Select User new service'), '', false); $inputs .= wf_tag('br') . wf_tag('br'); $inputs .= wf_AjaxContainer('ajcontainer', '', $this->ajIpSelector($defaultService)); $inputs .= wf_delimiter(); $inputs .= wf_Submit(__('Save')); $result .= wf_Form("", 'POST', $inputs, 'floatpanels'); } else { $result = $this->messages->getStyledMessage(__('No available services'), 'error'); } return ($result); } /** * Returns IP selector ajax container content * * @param int $serviceId * * @return string */ public function ajIpSelector($serviceId) { $serviceId = vf($serviceId, 3); $result = ''; if (isset($this->allServices[$serviceId])) { $networkId = multinet_get_service_networkid($serviceId); //default IP selection - first free if (!$this->customFlag) { @$nextFreeIp = multinet_get_next_freeip('nethosts', 'ip', $networkId); if (!empty($nextFreeIp)) { $result = wf_HiddenInput('ipselector', $nextFreeIp) . ' ' . $nextFreeIp . ' (' . __('first free for this service') . ')'; $result .= wf_HiddenInput('serviceselector', $serviceId); } else { $result = __('No free IP available in selected pool. Please fix it in networks and services module.'); } } else { //custom IP selection box $allFreeIpsRaw = multinet_get_all_free_ip('nethosts', 'ip', $networkId); if (!empty($allFreeIpsRaw)) { $allFreeIpsSelector = array(); foreach ($allFreeIpsRaw as $io => $each) { $allFreeIpsSelector[$each] = $each; } $result = wf_Selector('ipselector', $allFreeIpsSelector, '', '', true); $result .= wf_HiddenInput('serviceselector', $serviceId); } else { $result = __('No free IP available in selected pool. Please fix it in networks and services module.'); } } } return ($result); } /** * Renders current IP styled notification * * @return string */ public function renderCurrentIp() { $result = wf_tag('h2', false, 'floatpanels', '') . ' ' . $this->currentIp . wf_tag('h2', true); $result = $this->messages->getStyledMessage(wf_tag('h2', false, '', '') . __('Current user IP') . ': ' . $this->currentIp . wf_tag('h2', true), 'info'); $result .= wf_CleanDiv(); return ($result); } /** * Renders IP usage stats in existing networks * * @return string */ public function renderFreeIpStats() { $result = ''; $controls = wf_Link(self::URL_ME . '&username=' . $this->login, wf_img('skins/done_icon.png') . ' ' . __('Services'), false, 'ubButton'); $controls .= wf_Link(self::URL_ME . '&username=' . $this->login . '&allnets=true', wf_img('skins/categories_icon.png') . ' ' . __('All networks'), false, 'ubButton'); $result .= web_FreeIpStats(); $result .= $controls; return ($result); } /** * Checks have current user IP existing network host * * @return bool */ protected function isNethostExists() { $result = true; $query = "SELECT * from `nethosts` WHERE `ip`='" . $this->currentIp . "'"; $data = simple_query($query); if (empty($data)) { $result = false; } return ($result); } /** * Performs user changing IP subroutine * * @global object $billing * @param int $serviceId * @param string $newIp * * @return void/string */ public function changeUserIp($serviceId, $newIp) { //set lock or wait until previous lock will be released //lock name "ipBind" is shared between userreg and pl_ipchange if ($this->dbLockEnabled) { $dbLockQuery = 'SELECT GET_LOCK("ipBind",1) AS result'; $dbLock = false; while (!$dbLock) { $dbLockCheck = simple_query($dbLockQuery); $dbLock = $dbLockCheck['result']; } } global $billing; $result = ''; $serviceId = vf($serviceId, 3); $networkId = multinet_get_service_networkid($serviceId); if (isset($this->allServices[$serviceId])) { if (zb_ip_unique($newIp)) { if (!empty($this->currentIp)) { if ($this->isNethostExists()) { //force user disconnect if ($this->billingCfg['RESET_AO']) { $billing->setao($this->login, 0); } else { $billing->setdown($this->login, 1); } $billing->setip($this->login, $newIp); multinet_delete_host($this->currentIp); multinet_add_host($networkId, $newIp, $this->currentMac); log_register("CHANGE MultiNetIP (" . $this->login . ") FROM " . $this->currentIp . " ON " . $newIp . ""); multinet_rebuild_all_handlers(); multinet_RestartDhcp(); zb_UserGetAllDataCacheClean(); if ($this->altCfg['MULTIGEN_ENABLED']) { if ($this->altCfg['MULTIGEN_POD_ON_IP_CHANGE']) { $newUserData = zb_UserGetAllData($this->login); $newUserData = $newUserData[$this->login]; $userData = $newUserData; $userData['ip'] = $this->currentIp; $mlg = new MultiGen(); if ($this->altCfg['MULTIGEN_POD_ON_IP_CHANGE'] == 2) { $mlg->podOnExternalEvent($this->login, $userData, $newUserData); $mlg->podOnExternalEvent($this->login, $newUserData); } if ($this->altCfg['MULTIGEN_POD_ON_IP_CHANGE'] == 1) { $mlg->podOnExternalEvent($this->login, $newUserData); } } } //back teh user online if ($this->billingCfg['RESET_AO']) { $billing->setao($this->login, 1); } else { $billing->setdown($this->login, 0); } //optional arp cleanup here if (@$this->altCfg['IPCHANGE_ARP_CLEANUP']) { $command = $this->billingCfg['SUDO'] . ' arp -d ' . $this->currentIp; shell_exec($command); } } else { log_register("CHANGE FAIL MultiNetIP (" . $this->login . ") FROM " . $this->currentIp . " ON " . $newIp . " NO_NETHOST"); $result = __('No existing nethost for current IP'); } } else { log_register("CHANGE FAIL MultiNetIP (" . $this->login . ") FROM " . $this->currentIp . " ON " . $newIp . " EMPTY_IP"); $result = __('Something went wrong') . ': ' . __('empty current IP'); } } else { log_register("CHANGE FAIL MultiNetIP (" . $this->login . ") FROM " . $this->currentIp . " ON " . $newIp . " IP_DUPLICATE"); $result = __('This IP is already used by another user'); } } else { log_register("CHANGE FAIL MultiNetIP (" . $this->login . ") FROM " . $this->currentIp . " ON " . $newIp . " NO_SERVICE"); $result = __('Unexistent service'); } //release lock if ($this->dbLockEnabled) { $dbUnlockQuery = 'SELECT RELEASE_LOCK("ipBind")'; nr_query($dbUnlockQuery); } return ($result); } } ?> |