Source of file api.policedog.php
Size: 17,908 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.policedog.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 | <?php /** * Allows control apper of some MAC address in billing reality */ class PoliceDog { /** * Contains system alter.ini config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains system billing.ini config as key=>value * * @var array */ protected $billCfg = array(); /** * Contains all available MAC data as id=>macdata * * @var array */ protected $macData = array(); /** * Contains all MAC-s to search as mac=>id * * @var array */ protected $allMacs = array(); /** * Contains actual wanted MAC alerts as id=>data * * @var array */ protected $alerts = array(); /** * System message helper object placeholder * * @var object */ protected $messages = ''; /** * Contains MACs already assigned for users as login=>MAC * * @var array */ protected $usersMacs = array(); const URL_ME = '?module=policedog'; /** * Creates new PoliceDog instance */ public function __construct() { $this->loadConfig(); $this->loadMacData(); $this->loadUsersMacs(); $this->loadAlerts(); $this->initMessages(); } /** * Loads system alter config for further usage * * @global object $ubillingConfig * * @return void */ protected function loadConfig() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); $this->billCfg = $ubillingConfig->getBilling(); } /** * Inits system message helper object * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Loads current MAC-s data into protected property * * @return void */ protected function loadMacData() { $query = "SELECT * from `policedog`"; $all = simple_queryall($query); if (!empty($all)) { foreach ($all as $io => $each) { $this->macData[$each['id']] = $each; $this->allMacs[$each['mac']] = $each['id']; } } } /** * Loads available police dog alerts * * @return void */ protected function loadAlerts() { $query = "SELECT * from `policedogalerts`"; $all = simple_queryall($query); if (!empty($all)) { foreach ($all as $io => $each) { $this->alerts[$each['id']] = $each; } } } /** * Loads available users macs into database * * @rerutn void */ protected function loadUsersMacs() { $all = zb_UserGetAllMACs(); if (!empty($all)) { $this->usersMacs = array_flip($all); } } /** * Renders module control panel * * @return string */ public function panel() { $result = ''; $result.= wf_modalAuto(web_icon_create() . ' ' . __('Upload new MACs'), __('Upload new MACs'), $this->renderUploadForm(), 'ubButton'); $result.= wf_Link(self::URL_ME, wf_img('skins/undone_icon.png') . ' ' . __('Wanted MAC database'), false, 'ubButton'); $result.= wf_Link(self::URL_ME . '&show=fastscan', wf_img('skins/icon_search_small.gif') . ' ' . __('Fast scan'), false, 'ubButton'); $result.= wf_Link(self::URL_ME . '&show=deepscan', wf_img('skins/track_icon.png') . ' ' . __('Deep scan'), false, 'ubButton'); return ($result); } /** * Renders MAC uploading form * * @return string */ protected function renderUploadForm() { $result = ''; $inputs = __('One MAC address per line') . wf_tag('br'); $inputs.= wf_TextArea('newmacupload', '', '', true, '50x10'); $inputs.= wf_TextInput('newnotes', __('Notes'), '', true, '40'); $inputs.= wf_Submit(__('Upload')); $result.= wf_Form('', 'POST', $inputs, 'glamour'); return ($result); } /** * Renders wanted MAC addresses database * * @return string */ public function renderWandedMacList() { $result = ''; $columns = array(__('ID'), __('Date'), __('MAC'), __('Notes'), __('Actions')); $opts = '"order": [[ 0, "desc" ]]'; $result.= wf_JqDtLoader($columns, self::URL_ME . '&show=ajwlist', false, __('MAC'), 50, $opts); return ($result); } /** * Deletes some MAC from database * * @param int $id * * @return void */ public function deleteWantedMac($id) { $id = vf($id, 3); if (isset($this->macData[$id])) { $deleteMac = $this->macData[$id]['mac']; $query = "DELETE from `policedog` WHERE `id`='" . $id . "';"; nr_query($query); log_register('POLICEDOG DELETE MAC `' . $deleteMac . '`'); } } /** * Renders ajax data reply with available MAC data list * * @return void */ public function renderWantedMacListAjaxReply() { $result = ''; $jsonAAData = array(); if (!empty($this->macData)) { foreach ($this->macData as $io => $each) { $jsonItem = array(); $jsonItem[] = $each['id']; $jsonItem[] = $each['date']; $jsonItem[] = $each['mac']; $jsonItem[] = $each['notes']; $actLinks = wf_JSAlert(self::URL_ME . '&delmacid=' . $each['id'], web_delete_icon(), $this->messages->getDeleteAlert()); $jsonItem[] = $actLinks; $jsonAAData[] = $jsonItem; } } $result = array("aaData" => $jsonAAData); die(json_encode($result)); die($result); } /** * Creates new MAC address database records * * @return void/string */ public function catchCreateMacRequest() { $result = ''; $count = 0; if (wf_CheckPost(array('newmacupload'))) { if (!empty($_POST['newmacupload'])) { $macsRaw = explodeRows($_POST['newmacupload']); if (!empty($macsRaw)) { $curDate = curdatetime(); if (wf_CheckPost(array('newnotes'))) { $newNotes = mysql_real_escape_string($_POST['newnotes']); } else { $newNotes = ''; } foreach ($macsRaw as $io => $eachmac) { $insertMac = trim($eachmac); $insertMac = mysql_real_escape_string($insertMac); $insertMac = strtolower_utf8($insertMac); if (!empty($insertMac)) { if (check_mac_format($insertMac)) { if (!isset($this->allMacs[$insertMac])) { $query = "INSERT INTO `policedog` (`id`,`date`,`mac`,`notes`) VALUES "; $query.= "(NULL,'" . $curDate . "','" . $insertMac . "','" . $newNotes . "');"; nr_query($query); $count++; } else { $result.= $this->messages->getStyledMessage(__('MAC duplicate') . ': ' . $insertMac, 'warning'); } } else { $result.= $this->messages->getStyledMessage(__('This MAC have wrong format') . ': ' . $insertMac, 'error'); } } } log_register('POLICEDOG UPLOAD `' . $count . '` MAC'); } } } return ($result); } /** * Checks is MAC already alerted or not? * * @param string $mac * * @return bool */ protected function isNotAlertedYet($mac) { $result = true; if (!empty($this->alerts)) { foreach ($this->alerts as $io => $each) { if ($each['mac'] == $mac) { $result = false; break; } } } return ($result); } /** * Performs fast database scan for wanted MAC addresses * * @return void */ public function fastScan() { $curDate = curdatetime(); if (!empty($this->allMacs)) { foreach ($this->allMacs as $eachmac => $eachId) { if (isset($this->usersMacs[$eachmac])) { $detectedLogin = $this->usersMacs[$eachmac]; if ($this->isNotAlertedYet($eachmac)) { $query = "INSERT INTO `policedogalerts` (`id`,`date`,`mac`,`login`) VALUES "; $query.= "(NULL, '" . $curDate . "', '" . $eachmac . "', '" . $detectedLogin . "');"; nr_query($query); log_register('POLICEDOG MAC `' . $eachmac . '` ALERT `' . $detectedLogin . '`'); } } } } } /** * Renders fast scan interface with current alerts * * @return string */ public function renderFastScan() { $result = ''; $result.=wf_Link(self::URL_ME . '&show=fastscan&forcefast=true', wf_img('skins/refresh.gif') . ' ' . __('Renew'), true, 'ubButton'); if (!empty($this->alerts)) { $cells = wf_TableCell(__('ID')); $cells.= wf_TableCell(__('Date')); $cells.= wf_TableCell(__('MAC')); $cells.= wf_TableCell(__('Assigned')); $cells.= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($this->alerts as $io => $each) { $cells = wf_TableCell($each['id']); $cells.= wf_TableCell($each['date']); $cells.= wf_TableCell($each['mac']); $profileLink = wf_Link('?module=userprofile&username=' . $each['login'], web_profile_icon() . ' ' . $each['login'], false, ''); $cells.= wf_TableCell($profileLink); $actLinks = wf_JSAlertStyled(self::URL_ME . '&delalertid=' . $each['id'], web_delete_icon(), $this->messages->getDeleteAlert(), ''); $cells.= wf_TableCell($actLinks); $rows.= wf_TableRow($cells, 'row3'); } $result.=wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result.= $this->messages->getStyledMessage(__('Nothing found'), 'info'); } return ($result); } /** * Deletes existing alert from database * * @param int $id * * @return void */ public function deleteAlert($id) { $id = vf($id, 3); if (isset($this->alerts[$id])) { $alertData = $this->alerts[$id]; $query = "DELETE from `policedogalerts` WHERE `id`='" . $id . "';"; nr_query($query); log_register('POLICEDOG DELETE ALERT [' . $id . '] MAC `' . $alertData['mac'] . '`'); } } /** * Performs and renders deep scan results * * @return string */ public function renderDeepScan() { set_time_limit(0); $result = ''; if (!empty($this->allMacs)) { //nethosts scanning $nethostsAlerts = ''; $nethostsAlertsTmp = array(); if (!empty($this->allMacs)) { foreach ($this->allMacs as $eachmac => $eachId) { if (isset($this->usersMacs[$eachmac])) { if (!isset($nethostsAlertsTmp[$eachmac])) { $nethostsAlerts.= $this->messages->getStyledMessage(__('Wanted MAC assigned to user') . ': ' . $eachmac, 'error'); $nethostsAlertsTmp[$eachmac] = $eachmac; } } } if (!empty($nethostsAlerts)) { $result.=$nethostsAlerts; } else { $result.=$this->messages->getStyledMessage(__('No wanted MAC assigned to existing users'), 'success'); } } //DHCP logs parsing $cat_path = $this->billCfg['CAT']; $sudo_path = $this->billCfg['SUDO']; $tail_path = $this->billCfg['TAIL']; $leasefile = $this->altCfg['NMLEASES']; $command = $sudo_path . ' ' . $cat_path . ' ' . $leasefile . ' | ' . $tail_path . ' -n 10000'; $rawDhcp = shell_exec($command); $dhcpAlerts = ''; $dhcpAlertsTmp = array(); if (!empty($rawDhcp)) { $rawDhcp = explodeRows($rawDhcp); if (!empty($rawDhcp)) { foreach ($rawDhcp as $eachLine) { $macExtract = zb_ExtractMacAddress($eachLine); if (!empty($macExtract)) { if (isset($this->allMacs[$macExtract])) { if (!isset($dhcpAlertsTmp[$macExtract])) { $dhcpAlerts.=$this->messages->getStyledMessage(__('DHCP request from') . ': ' . $macExtract, 'error'); $dhcpAlertsTmp[$macExtract] = $macExtract; } } } } } if (!empty($dhcpAlerts)) { $result.=$dhcpAlerts; } else { $result.=$this->messages->getStyledMessage(__('No wanted MAC DHCP requests detected'), 'success'); } } //FDB cache processing $fdbCachePath = 'exports/'; $fdbAlerts = ''; $fdbMacTmp = array(); $fdbAlertsTmp = array(); $allFdb = rcms_scandir($fdbCachePath, '*_fdb'); if (!empty($allFdb)) { foreach ($allFdb as $io => $eachFdbFile) { $fdbData = file_get_contents($fdbCachePath . $eachFdbFile); $fdbData = unserialize($fdbData); if (!empty($fdbData)) { foreach ($fdbData as $fdbmac => $port) { $fdbMacTmp[$fdbmac] = $fdbmac; } } } if (!empty($fdbMacTmp)) { foreach ($fdbMacTmp as $io => $eachFdbMac) { if (isset($this->allMacs[$eachFdbMac])) { if (!isset($fdbAlertsTmp[$eachFdbMac])) { $fdbAlerts.=$this->messages->getStyledMessage(__('Wanted MAC occurs in FDB') . ': ' . $eachFdbMac, 'error'); $fdbAlersTmp[$eachFdbMac] = $eachFdbMac; } } } } } if (!empty($fdbAlerts)) { $result.= $fdbAlerts; } else { $result.= $this->messages->getStyledMessage(__('No wanted MAC in FDB cache detected'), 'success'); } //weblogs assigns parsing $logAlerts = ''; $logAlertsTmp = array(); $weblogs_q = "SELECT `event` from `weblogs` WHERE `event` NOT LIKE '%POLICEDOG%' AND `event` LIKE '%MAC%'"; $weblogsRaw = simple_queryall($weblogs_q); if (!empty($weblogsRaw)) { foreach ($weblogsRaw as $io => $eachEvent) { $macExtract = zb_ExtractMacAddress($eachEvent['event']); if (!empty($macExtract)) { if (isset($this->allMacs[$macExtract])) { if (!isset($logAlertsTmp[$macExtract])) { $logAlerts.= $this->messages->getStyledMessage(__('Wanted MAC occurs in event logs') . ': ' . $macExtract, 'error'); $logAlertsTmp[$macExtract] = $macExtract; } } } } } if (!empty($logAlerts)) { $result.=$logAlerts; } else { $result.= $this->messages->getStyledMessage(__('No wanted MAC in event logs detected'), 'success'); } //PON devices processing if ($this->altCfg['PON_ENABLED']) { $ponAlerts = ''; $ponAlertsTmp = array(); $pon_q = "SELECT `mac` from `pononu`"; $ponRaw = simple_queryall($pon_q); if (!empty($pon_q)) { foreach ($ponRaw as $io => $eachPonMac) { $eachPonMac = $eachPonMac['mac']; if (isset($this->allMacs[$eachPonMac])) { if (!isset($ponAlertsTmp[$eachPonMac])) { $ponAlerts.= $this->messages->getStyledMessage(__('Wanted MAC occurs in PON ONU devices') . ': ' . $eachPonMac, 'error'); $ponAlertsTmp[$eachPonMac] = $eachPonMac; } } } } if (!empty($ponAlerts)) { $result.= $ponAlerts; } else { $result.= $this->messages->getStyledMessage(__('No wanted MAC in PON ONU devices detected'), 'success'); } } } else { $result.= $this->messages->getStyledMessage(__('Wanted MAC database') . ': ' . __('No'), 'warning'); } return ($result); } } ?> |