Source of file api.dhcp.php
Size: 16,569 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.dhcp.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 | <?php /** * ISC-DHCPD server management class */ class UbillingDHCP { /** * Contains available DHCP networks * * @var array */ protected $allDhcpNets = array(); /** * Contains available multinet networks * * @var array */ protected $allMultinetNets = array(); /** * Default message helper placeholder * * @var object */ protected $messages = ''; /** * Pregenerated DHCP configs path */ const MULTINET_PATH = 'multinet/'; /** * Default module URL */ const URL_ME = '?module=dhcp'; /** * DHCP config generation templates path */ const TEMPLATES_PATH = 'config/dhcp/'; public function __construct() { $this->loadMultinetNets(); $this->loadDhcpNets(); $this->initMessages(); } /** * Loads existing DHCP subnets from database into protected property */ protected function loadDhcpNets() { $query = "SELECT * from `dhcp` ORDER BY `id` ASC"; $all = simple_queryall($query); if (!empty($all)) { foreach ($all as $io => $each) { $this->allDhcpNets[$each['id']] = $each; } } } /** * Loads all of multinet networks for further usage * * @return void */ protected function loadMultinetNets() { $query = "SELECT * from `networks` ORDER BY `id` ASC"; $all = simple_queryall($query); if (!empty($all)) { foreach ($all as $io => $each) { $this->allMultinetNets[$each['id']] = $each; } } } /** * Creates new instance of message helper * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Renders list of available DHCP networks with some controls * * @return string */ public function renderNetsList() { $result = ''; $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Network/CIDR')); $cells .= wf_TableCell(__('DHCP custom subnet template')); $cells .= wf_TableCell(__('DHCP config name')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); if (!empty($this->allDhcpNets)) { foreach ($this->allDhcpNets as $io => $eachnet) { $rowClass = 'row5'; if (isset($this->allMultinetNets[$eachnet['netid']])) { $cidr = $this->allMultinetNets[$eachnet['netid']]['desc']; } else { $cidr = __('Network does not exist anymore'); } $cells = wf_TableCell($eachnet['id']); $cells .= wf_TableCell($cidr); $cells .= wf_TableCell(web_bool_led($eachnet['dhcpconfig'])); $cells .= wf_TableCell($eachnet['confname']); $actLinks = wf_JSAlert('?module=dhcp&delete=' . $eachnet['id'], web_delete_icon(), 'Removing this may lead to irreparable results') . ' '; $actLinks .= wf_Link('?module=dhcp&edit=' . $eachnet['id'], web_edit_icon(), false); $cells .= wf_TableCell($actLinks); $rows .= wf_TableRow($cells, 'row5'); } $result = wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result = $this->messages->getStyledMessage(__('No available DHCP networks found'), 'info'); } return ($result); } /** * Renders main module controls * * @return string */ public function renderPanel() { $result = ''; $result .= wf_modalAuto(wf_img('skins/add_icon.png') . ' ' . __('Add DHCP network'), __('Add DHCP network'), $this->addForm(), 'ubButton') . ' '; $result .= wf_Link('?module=dhcplog', wf_img('skins/log_icon_small.png') . ' ' . __('View log'), false, 'ubButton') . ' '; if (cfr('ROOT')) { $result .= wf_Link('?module=dhcpzen', wf_img('skins/zen.png') . ' ' . __('DHCP') . ' ' . __('Zen'), false, 'ubButton') . ' '; } $result .= wf_Link(self::URL_ME . '&restartserver=true', wf_img('skins/refresh.gif') . ' ' . __('Restart DHCP server'), false, 'ubButton'); return ($result); } /** * Renders generated configs previews list * * @return string */ public function renderConfigPreviews() { $result = ''; if (!empty($this->allDhcpNets)) { $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Network/CIDR')); $cells .= wf_TableCell(__('DHCP config name')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); if (file_exists(self::MULTINET_PATH . 'dhcpd.conf')) { $dhcpdconf = str_replace("\n", '<br>', file_get_contents(self::MULTINET_PATH . 'dhcpd.conf')); } else { $dhcpdconf = $this->messages->getStyledMessage(__('File not found') . ': dhcpd.conf', 'error'); } $actLinks = wf_Link(self::URL_ME . '&downloadconfig=dhcpd.conf', web_icon_download(), false) . ' '; $actLinks .= wf_modal(web_icon_search(__('Preview') . ' dhcpd.conf'), 'dhcpd.conf', $dhcpdconf, '', 800, 600); $cells = wf_TableCell('-'); $cells .= wf_TableCell('-'); $cells .= wf_TableCell('dhcpd.conf'); $cells .= wf_TableCell($actLinks); $rows .= wf_TableRow($cells, 'row5'); foreach ($this->allDhcpNets as $io => $eachnet) { $subconfname = trim($eachnet['confname']); if (file_exists(self::MULTINET_PATH . $subconfname)) { $subconfdata = str_replace("\n", '<br>', file_get_contents(self::MULTINET_PATH . $subconfname)); } else { $subconfdata = $this->messages->getStyledMessage(__('File not found') . ': ' . $subconfname, 'error'); } $actLinks = wf_Link(self::URL_ME . '&downloadconfig=' . $subconfname, web_icon_download(), false); $actLinks .= wf_modal(web_icon_search(__('Preview') . ' ' . $subconfname), $subconfname, $subconfdata, '', 800, 600); $cells = wf_TableCell($eachnet['id']); $netLabel = ''; if (isset($this->allMultinetNets[$eachnet['netid']])) { $netLabel = $this->allMultinetNets[$eachnet['netid']]['desc']; } else { $netLabel = __('Network does not exist anymore'); } $cells .= wf_TableCell($netLabel); $cells .= wf_TableCell($subconfname); $cells .= wf_TableCell($actLinks); $rows .= wf_TableRow($cells, 'row5'); } $result = wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result = $this->messages->getStyledMessage(__('No available DHCP configs found'), 'info'); } return ($result); } /** * Returns json array of all available DHCP configs for remote deploy * * @return string */ public function getConfigsRemote() { $result = array(); if (!empty($this->allDhcpNets)) { if (file_exists(self::MULTINET_PATH . 'dhcpd.conf')) { $dhcpdconf = file_get_contents(self::MULTINET_PATH . 'dhcpd.conf'); } else { $dhcpdconf = '#EX_DHCPDCONF_NOT_EXISTS'; } //main config $result['dhcpd.conf']['content'] = $dhcpdconf; foreach ($this->allDhcpNets as $io => $eachnet) { $subconfname = trim($eachnet['confname']); if (file_exists(self::MULTINET_PATH . $subconfname)) { $subconfdata = file_get_contents(self::MULTINET_PATH . $subconfname); } else { $subconfdata = '#' . $subconfname . '_NOT_EXISTS'; } $result[$subconfname]['content'] = $subconfdata; } } $result = json_encode($result); return($result); } /** * Downloads pregenerated DHCP config * * @param string $filename * * @return void */ public function downloadConfig($filename) { $filename = vf($filename); if (file_exists(self::MULTINET_PATH . $filename)) { zb_DownloadFile(self::MULTINET_PATH . $filename, 'text'); } else { show_error(__('File not found') . ': ' . $filename); } } /** * Downloads DHCP config template * * @param string $filename * * @return void */ public function downloadTemplate($filename) { $filename = vf($filename); if (file_exists(self::TEMPLATES_PATH . $filename)) { zb_DownloadFile(self::TEMPLATES_PATH . $filename, 'text'); } else { show_error(__('File not found') . ': ' . $filename); } } /** * Renders DHCP config templates previews * * @return string */ public function renderConfigTemplates() { $allTemplates = rcms_scandir(self::TEMPLATES_PATH); $result = ''; if (!empty($allTemplates)) { $cells = wf_TableCell(__('Filename')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($allTemplates as $eachfilename) { $templateData = file_get_contents(self::TEMPLATES_PATH . $eachfilename); $templateData = nl2br($templateData); $actLinks = wf_Link(self::URL_ME . '&downloadtemplate=' . $eachfilename, web_icon_download(), false) . ' '; $actLinks .= wf_modal(web_icon_search(__('Preview') . ' ' . $eachfilename), $eachfilename, $templateData, '', 800, 600) . ' '; $cells = wf_TableCell($eachfilename); $cells .= wf_TableCell(__($actLinks)); $rows .= wf_TableRow($cells, 'row5'); } $result = wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result = $this->messages->getStyledMessage(__('Nothing found'), 'warning'); } return ($result); } /** * Checks is multinet netid used for one of DHCP nets or not * * @param int $netId * * @return bool */ protected function isNetUnused($netId) { $result = true; if (!empty($this->allDhcpNets)) { foreach ($this->allDhcpNets as $io => $each) { if ($each['netid'] == $netId) { $result = false; break; } } } return ($result); } /** * Checks is config name unused? * * @param string $filename * * @return bool */ public function isConfigNameFree($filename) { $result = true; $filename = vf($filename); $filename = trim($filename); if (!empty($this->allDhcpNets)) { foreach ($this->allDhcpNets as $io => $each) { if ($each['confname'] == $filename) { $result = false; break; } } } return ($result); } /** * Renders network selector with not set DHCP handlers * * @return string */ protected function networkSelector() { $tmpArr = array(); $result = ''; /** * V čůráckým vobdobí, kdy mě serou fronty, * sem na pokraji sil, už nepomáhaj jointy. * Rodinu nemám, večeřim sám, žeru šproty, * Vánoce zmrdem na Štědrej den do rachoty. */ if (!empty($this->allMultinetNets)) { foreach ($this->allMultinetNets as $io => $each) { if ($this->isNetUnused($each['id'])) { $tmpArr[$each['id']] = $each['desc']; } } if (!empty($tmpArr)) { $result = wf_Selector('networkselect', $tmpArr, __('Network'), '', true); } } return ($result); } /** * Returns DHCP network data by its id * * @param int $dhcpid * * @return array */ public function getNetworkData($dhcpid) { $result = array(); if (isset($this->allDhcpNets)) { $result = $this->allDhcpNets[$dhcpid]; } return($result); } /** * Returns DHCP network addition form * * @return string */ public function addForm() { $result = ''; //any multinet nets available if (!empty($this->allMultinetNets)) { $networkSelector = $this->networkSelector(); //some of it have no DHCP handlers if (!empty($networkSelector)) { $inputs = $networkSelector; $inputs .= wf_HiddenInput('adddhcp', 'true'); $inputs .= wf_TextInput('dhcpconfname', __('DHCP config name'), '', true, '20'); $inputs .= wf_Submit(__('Create')); $result = wf_Form('', 'POST', $inputs, 'glamour'); } else { $result = $this->messages->getStyledMessage(__('All networks already has DHCP configured'), 'info'); } } else { $result = $this->messages->getStyledMessage(__('No networks for DHCP setup available'), 'error'); } return ($result); } /** * Renders network template editing form * * @param int $dhcpid * * @return string */ public function editForm($dhcpid) { $dhcpid = vf($dhcpid, 3); $result = ''; if (isset($this->allDhcpNets[$dhcpid])) { $dhcpnetdata = $this->getNetworkData($dhcpid); $inputs = wf_TextInput('editdhcpconfname', __('DHCP config name'), $dhcpnetdata['confname'], true, 20); $inputs .= __('DHCP custom subnet template') . wf_tag('br'); $inputs .= wf_TextArea('editdhcpconfig', '', $dhcpnetdata['dhcpconfig'], true, '60x10'); $inputs .= wf_Submit(__('Save')); $result = wf_Form('', 'POST', $inputs, 'glamour'); $result .= wf_CleanDiv(); $result .= wf_BackLink(self::URL_ME); } else { $result = $this->messages->getStyledMessage(__('Something went wrong'), 'errors'); } return ($result); } /** * Creates new DHCP network * * @param int $netid * @param string $dhcpconfname * * @return void */ public function createNetwork($netid, $dhcpconfname) { $netid = vf($netid, 3); $dhcpconfname = vf($dhcpconfname); $dhcpconfname = trim($dhcpconfname); $query = "INSERT INTO `dhcp` (`id` ,`netid` , `dhcpconfig` , `confname`) VALUES (NULL , '" . $netid . "', '', '" . $dhcpconfname . "');"; nr_query($query); $newID = simple_get_lastid('dhcp'); log_register('CREATE DHCPNet [' . $newID . '] NETWORK [' . $netid . ']'); } /** * Updates existing DHCP network handler * * @param int $dhcpid * @param string $dhcpconfname * @param string $dhcpconfig * * @return void */ public function updateNetwork($dhcpid, $dhcpconfname, $dhcpconfig) { $dhcpid = vf($dhcpid, 3); $dhcpconfname = vf($dhcpconfname); $dhcpconfname = trim($dhcpconfname); $dhcpconfig = mysql_real_escape_string($dhcpconfig); $query = "UPDATE `dhcp` SET `dhcpconfig` = '" . $dhcpconfig . "'," . "`confname` = '" . $dhcpconfname . "' WHERE `id` ='" . $dhcpid . "';"; nr_query($query); log_register('CHANGE DHCPNet [' . $dhcpid . ']'); } /** * Deletes existing DHCP network * * @param int $dhcpid * * @return void */ public function deleteNetwork($dhcpid) { $dhcpid = vf($dhcpid, 3); $query = "DELETE from `dhcp` WHERE `id`='" . $dhcpid . "'"; nr_query($query); log_register('DELETE DHCPNet [' . $dhcpid . ']'); } /** * Rebuilds all configs and restarts DHCP server * * @return void */ public function restartDhcpServer() { multinet_rebuild_all_handlers(); } } ?> |