Source of file api.arpdiag.php
Size: 10,124 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.arpdiag.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 | <?php /** * ARP diag report implementation */ class ArpDiag { /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains system billing config as key=>value * * @var array */ protected $billCfg = array(); /** * Message helper placeholder * * @var object */ protected $messages = ''; /** * Contains default module URL */ const URL_ME = '?module=arpdiag'; /** * Creates new instance of object */ public function __construct() { $this->loadConfigs(); $this->initMessages(); } /** * Loads system configs into protected property * * @global object $ubillingConfig * * @return void */ protected function loadConfigs() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); $this->billCfg = $ubillingConfig->getBilling(); } /** * Inits new instance of message helper object * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Renders control panel * * @return string */ public function renderPanel() { $result = ''; $result .= wf_Link(self::URL_ME, wf_img('skins/log_icon_small.png') . ' ' . __('Last events'), false, 'ubButton'); $result .= wf_Link(self::URL_ME . '&arptable=true', wf_img('skins/icon_search_small.gif') . ' ' . __('Local ARP table'), false, 'ubButton'); return ($result); } /** * Returns all switches IP as ip=>array(location,id) * * @return array */ protected function getAllSwitchesIps() { $result = array(); $switchesDb = new NyanORM('switches'); $switchesDb->selectable(array('`id`', '`ip`', '`location`', '`swid`')); $allSwitches = $switchesDb->getAll(); if (!empty($allSwitches)) { foreach ($allSwitches as $io => $each) { $result[$each['ip']]['location'] = $each['location']; $result[$each['ip']]['id'] = $each['id']; $result[$each['ip']]['mac'] = $each['swid']; } } return ($result); } /** * Returns row class for some event * * @param string $event * * @return string */ protected function getEventClass($event) { $result = 'row3'; if (ispos($event, 'attemp')) { $result = 'ukvbankstadup'; } if (ispos($event, 'moved from')) { $result = 'undone'; } if (ispos($event, 'new station')) { $result = 'todaysig'; } if (ispos($event, 'ETHERTYPE')) { $result = 'sigcemeteryuser'; } if (ispos($event, 'hardware')) { $result = 'donetask'; } if (ispos($event, 'flip flop')) { $result = 'undone'; } if (ispos($event, 'using my IP')) { $result = 'rowerror'; } return ($result); } /** * Renders arp events report * * @return string */ public function renderReport() { $log_path = $this->altCfg['ARPDIAG_LOG']; $sudo_path = $this->billCfg['SUDO']; $cat_path = $this->billCfg['CAT']; $grep_path = $this->billCfg['GREP']; $command = $sudo_path . ' ' . $cat_path . ' ' . $log_path . ' | ' . $grep_path . ' "arp"'; $rawdata = shell_exec($command); $tablerows = ''; if (!empty($rawdata)) { $splitdata = explodeRows($rawdata); if (!empty($splitdata)) { foreach ($splitdata as $eachrow) { if (!empty($eachrow)) { $rowclass = $this->getEventClass($eachrow); $tablecells = wf_TableCell($eachrow); $tablerows .= wf_TableRow($tablecells, $rowclass); } } } $result = wf_TableBody($tablerows, '100%', '0', ''); } else { $result = $this->messages->getStyledMessage(__('It seems there is nothing unusual'), 'info'); } return ($result); } /** * Returns clickable if possible host link by its IP * * @param array $allUserIps * @param array $allUserAddress * @param array $allSwitchesIps * @param string $ip * * @return string */ protected function getHostLink($allUserIps, $allUserAddress, $allSwitchesIps, $ip) { $result = ''; $userUrl = '?module=userprofile&username='; $switchUrl = '?module=switches&edit='; if (isset($allUserIps[$ip])) { $result = wf_Link($userUrl . $allUserIps[$ip], web_profile_icon(__('User')) . ' ' . @$allUserAddress[$allUserIps[$ip]], false); } else { if (isset($allSwitchesIps[$ip])) { $result = wf_Link($switchUrl . $allSwitchesIps[$ip]['id'], wf_img_sized('skins/menuicons/switches.png', __('Switch'), '11', '13') . ' ' . $allSwitchesIps[$ip]['location'], false); } } return ($result); } /** * Returns device MAC controls if required * * @param string $ip * @param string $mac * @param array $allUserIps * @param array $allUserIpMacs * @param array $allSwitchesIps * * @return string */ protected function getMacControls($ip, $mac, $allUserIps, $allUserIpMacs, $allSwitchesIps) { $result = ''; //normal user if (isset($allUserIps[$ip])) { if (isset($allUserIpMacs[$ip])) { if (($allUserIpMacs[$ip] != $mac) AND ( !empty($mac))) { $result = wf_img('skins/createtask.gif', __('MAC mismatch')) . ' ' . __('Oh no'); } else { $result = wf_img_sized('skins/icon_ok.gif', '', 10, 10) . ' ' . __('Ok'); } } } else { //Switches ID management enabled if ($this->altCfg['SWITCHES_EXTENDED']) { //registered switches directory device if (isset($allSwitchesIps[$ip])) { if (empty($allSwitchesIps[$ip]['mac'])) { if (check_mac_format($mac)) { if (cfr('SWITCHESEDIT')) { $result = wf_Link(self::URL_ME . '&arptable=true&swassign=' . $allSwitchesIps[$ip]['id'] . '&swmac=' . $mac, wf_img_sized('skins/add_icon.png', '', 10, 10) . ' ' . __('Assign')); } } } else { //switch already have mac if (!empty($mac) AND ( $mac != $allSwitchesIps[$ip]['mac'])) { $result = wf_img('skins/createtask.gif', __('MAC mismatch')) . ' ' . __('Oh no'); } else { if ($mac) { $result = wf_img_sized('skins/icon_ok.gif', '', 10, 10) . ' ' . __('Normal'); } else { $result = wf_img_sized('skins/icon_ok.gif', '', 10, 10) . ' ' . __('Normal') . ' (?)'; } } } } } } return ($result); } /** * Assigns some switch MAC if required * * @param int $switchId * @param string $mac * * @return void */ public function assignSwitchMac($switchId, $mac) { $switchId = vf($switchId, 3); $macF = mysql_real_escape_string($mac); if (cfr('SWITCHESEDIT')) { $where = "WHERE `id`='" . $switchId . "';"; simple_update_field('switches', 'swid', $macF, $where); log_register('SWITCH CHANGE [' . $switchId . '] MAC `' . $mac . '`'); } } /** * Returns JSON for actual ARP table * * @return void */ public function ajaxReplyArp() { $json = new wf_JqDtHelper(); $command = 'arp -a'; $raw = shell_exec($command); if (!empty($raw)) { $allUserAddress = zb_AddressGetFulladdresslistCached(); $allUserIps = zb_UserGetAllIPs(); $allUserIps = array_flip($allUserIps); $allUserIpMacs = zb_UserGetAllIpMACs(); $allSwitchesIps = $this->getAllSwitchesIps(); $allSwitchesMac = array(); $raw = explodeRows($raw); if (!empty($raw)) { foreach ($raw as $io => $each) { if (!empty($each)) { /** * And all you see are the cards that you can play * And you thought you'd get away with these games * And all you see are the cards there in your hand * And you thought that you have everything planned */ $ip = zb_ExtractIpAddress($each); $mac = zb_ExtractMacAddress($each); $hostType = $this->getHostLink($allUserIps, $allUserAddress, $allSwitchesIps, $ip, $mac); $jsonItem[] = $ip; $jsonItem[] = $mac; $jsonItem[] = $hostType; $jsonItem[] = $this->getMacControls($ip, $mac, $allUserIps, $allUserIpMacs, $allSwitchesIps); $json->addRow($jsonItem); unset($jsonItem); } } } } $json->getJson(); } /** * Renders localhost ARP table placeholder * * @return string */ public function renderArpTable() { $result = wf_JqDtLoader(array('IP', 'MAC', 'Host', 'Actions'), self::URL_ME . '&ajaxarp=true', true, __('Host'), '100'); return ($result); } } |