Source of file api.pongcomel5610.php
Size: 20,220 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.pongcomel5610.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 | <?php /** * OLT GCOM EL5610 EPON hardware abstraction layer */ class PONGCOMEL5610 extends PONProto { /** * Receives, preprocess and stores all required data from OLT * * @return void */ public function collect() { $oltModelId = $this->oltParameters['MODELID']; $oltid = $this->oltParameters['ID']; $oltIp = $this->oltParameters['IP']; $oltCommunity = $this->oltParameters['COMMUNITY']; $oltNoFDBQ = $this->oltParameters['NOFDB']; $oltIPPORT = $oltIp . ':' . self::SNMPPORT; $sigIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['signal']['SIGINDEX'], '', array($this->snmpTemplates[$oltModelId]['signal']['SIGVALUE'], '"'), self::SNMPCACHE); $macIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['signal']['MACINDEX'], '', $this->snmpTemplates[$oltModelId]['signal']['MACVALUE'], self::SNMPCACHE); $gcomeMACsProcessed = $this->macParseGCOME($macIndex); if (!empty($gcomeMACsProcessed)) { $this->signalParseGCOME($sigIndex, $gcomeMACsProcessed); $distIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'], '', $this->snmpTemplates[$oltModelId]['misc']['DISTVALUE'], self::SNMPCACHE); $this->distanceParseGCOME($distIndex, $gcomeMACsProcessed); $ifaceIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['IFACEDESCR'], '', array($this->snmpTemplates[$oltModelId]['misc']['IFACEVALUE'], '"'), self::SNMPCACHE); $ifaceCustDescrIndex = array(); if (isset($this->snmpTemplates[$oltModelId]['misc']['IFACECUSTOMDESCR'])) { $ifaceCustDescrIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['IFACECUSTOMDESCR'], '', array($this->snmpTemplates[$oltModelId]['misc']['IFACEVALUE'], '"'), self::SNMPCACHE); } $this->interfaceParseGCOME($ifaceIndex, $gcomeMACsProcessed, $ifaceCustDescrIndex); $lastDeregIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'], '', $this->snmpTemplates[$oltModelId]['misc']['DEREGVALUE'], self::SNMPCACHE); $this->lastDeregParseGCOME($lastDeregIndex, $gcomeMACsProcessed); if (!$oltNoFDBQ) { // for some reason fdbVLANIndex for this OLT should be queried first // to prevent losing of the very first record from fdbVLANIndex $fdbVLANIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['FDBVLANINDEX'], '', $this->snmpTemplates[$oltModelId]['misc']['FDBVLANVALUE'], self::SNMPCACHE); $fdbIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['FDBMACINDEX'], '', $this->snmpTemplates[$oltModelId]['misc']['FDBMACVALUE'], self::SNMPCACHE); $this->fdbParseGCOME($gcomeMACsProcessed, $fdbIndex, $fdbVLANIndex); } $uniOperStatusIndex = array(); if (isset($this->snmpTemplates[$oltModelId]['misc']['UNIOPERSTATUS'])) { $uniOperStatusIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['UNIOPERSTATUS'], '', array($this->snmpTemplates[$oltModelId]['misc']['UNIOPERSTATUSVALUE'], '"'), self::SNMPCACHE); $this->uniParseGCOME($uniOperStatusIndex, $gcomeMACsProcessed); } } //getting others system data from OLT if (isset($this->snmpTemplates[$oltModelId]['system'])) { //OLT uptime if (isset($this->snmpTemplates[$oltModelId]['system']['UPTIME'])) { $uptimeIndexOid = $this->snmpTemplates[$oltModelId]['system']['UPTIME']; $oltSystemUptimeRaw = $this->snmp->walk($oltIPPORT, $oltCommunity, $uptimeIndexOid, self::SNMPCACHE); $this->uptimeParse($oltid, $oltSystemUptimeRaw); } //OLT temperature if (isset($this->snmpTemplates[$oltModelId]['system']['TEMPERATURE'])) { $temperatureIndexOid = $this->snmpTemplates[$oltModelId]['system']['TEMPERATURE']; $oltTemperatureRaw = $this->snmp->walk($oltIPPORT, $oltCommunity, $temperatureIndexOid, self::SNMPCACHE); $this->temperatureParse($oltid, $oltTemperatureRaw); } } } /** * Processes OLT MAC adresses and returns them in array: LLID=>MAC * * @param $macIndex * * @return array */ protected function macParseGCOME($macIndex) { $ONUsMACs = array(); if (!empty($macIndex)) { //mac index preprocessing foreach ($macIndex as $io => $eachmac) { $line = explode('=', $eachmac); if (empty($line[0]) || empty($line[1])) { continue; } $tmpONUPortLLID = trim($line[0]); $tmpONUMAC = strtolower(AddMacSeparator(RemoveMacAddressSeparator(trim($line[1]), array(':', '-', '.', ' ')))); //mac address //mac is present if (!empty($tmpONUPortLLID) and ! empty($tmpONUMAC)) { $ONUsMACs[$tmpONUPortLLID] = $tmpONUMAC; } } } return ($ONUsMACs); } /** * Performs signal preprocessing for sig/mac index arrays and stores it into cache * * @param array $sigIndex * @param array $macIndexProcessed * * @return void */ protected function signalParseGCOME($sigIndex, $macIndexProcessed) { $ONUsModulesTemps = array(); $ONUsModulesVoltages = array(); $ONUsModulesCurrents = array(); $ONUsSignals = array(); $result = array(); $macDevID = array(); $curDate = curdatetime(); //signal index preprocessing if ((!empty($sigIndex)) and ( !empty($macIndexProcessed))) { foreach ($sigIndex as $io => $eachsig) { if (empty($eachsig) or !ispos($eachsig, '=')) { continue; } $line = explode('=', $eachsig); //signal is present if (isset($line[0])) { $tmpONUPortLLID = trim($line[0]); $SignalRaw = trim($line[1]); // $ONUsSignals[$tmpONUPortLLID]['SignalRXRaw'] = trim($SignalRaw, '"'); // $ONUsSignals[$tmpONUPortLLID]['SignalRXdBm'] = trim(substr(stristr(stristr(stristr($SignalRaw, '('), ')', true), 'dBm', true), 1)); $ONUsSignals[$tmpONUPortLLID]['SignalRXdBm'] = trim($SignalRaw); } } //storing results foreach ($macIndexProcessed as $devId => $eachMac) { if (isset($ONUsSignals[$devId])) { //signal history filling $signal = $ONUsSignals[$devId]['SignalRXdBm']; if (!empty($signal)) { $signal = round($signal, 2); $result[$eachMac] = $signal; } if (empty($signal) or $signal == 'Offline') { $signal = $this->onuOfflineSignalLevel; //over 9000 offline signal level :P } //saving each ONU signal history $this->olt->writeSignalHistory($eachMac, $signal); } } $macDevID = array_flip($macIndexProcessed); //writing signals cache $this->olt->writeSignals($result); //saving ONU cache $this->olt->writeOnuCache($macIndexProcessed); // saving macindex as MAC => devID $this->olt->writeMacIndex($macDevID); } } /** * Performs distance preprocessing for distance/mac index arrays and stores it into cache * * @param $DistIndex * @param $macIndexProcessed */ protected function distanceParseGCOME($DistIndex, $macIndexProcessed) { $ONUDistances = array(); $result = array(); if (!empty($macIndexProcessed) and ! empty($DistIndex)) { //last dereg index preprocessing foreach ($DistIndex as $io => $eachRow) { $line = explode('=', $eachRow); if (empty($line[0]) || empty($line[1])) { continue; } $tmpONUPortLLID = trim($line[0]); $tmpONUDistance = trim($line[1]); $ONUDistances[$tmpONUPortLLID] = $tmpONUDistance; } //storing results foreach ($macIndexProcessed as $devId => $eachMac) { if (isset($ONUDistances[$devId])) { $result[$eachMac] = $ONUDistances[$devId]; } } //saving distances $this->olt->writeDistances($result); } } /** * Performs interface preprocessing for interface/mac index arrays and stores it into cache * * @param $IfaceIndex * @param $macIndexProcessed * @param $ifaceCustDescrRaw * * @return void */ protected function interfaceParseGCOME($IfaceIndex, $macIndexProcessed, $ifaceCustDescrRaw = array()) { $ONUIfaces = array(); $result = array(); $processIfaceCustDescr = !empty($ifaceCustDescrRaw); $ifaceCustDescrIdx = array(); $ifaceCustDescrArr = array(); // olt iface descr extraction if ($processIfaceCustDescr) { foreach ($ifaceCustDescrRaw as $io => $each) { if (empty($each)) { continue; } $ifDescr = explode('=', str_replace(array(" ", "\t", "\n", "\r", "\0", "\x0B"), '', $each)); if (empty($ifDescr[0]) && empty($ifDescr[1])) { continue; } $ifaceCustDescrIdx[$ifDescr[0]] = $ifDescr[1]; } } if (!empty($macIndexProcessed) and ! empty($IfaceIndex)) { //OLT iface index preprocessing foreach ($IfaceIndex as $io => $eachRow) { if (empty($eachRow)) { continue; } $line = explode('=', str_replace(array(" ", "\t", "\n", "\r", "\0", "\x0B"), '', $eachRow)); if (empty($line[0]) || empty($line[1]) || trim($line[0]) < 9) { continue; } $tmpONUPortLLID = trim($line[0]) - 8; // some shitty math $tmpONUIface = trim($line[1]); $ONUIfaces[$tmpONUPortLLID] = $tmpONUIface; } //storing results foreach ($macIndexProcessed as $devId => $eachMac) { $tPONIfaceNum = substr($devId, 0, 1); if (array_key_exists($tPONIfaceNum, $ONUIfaces)) { $tPONIfaceName = $ONUIfaces[$tPONIfaceNum]; $tPONIfaceStr = $tPONIfaceName . ' / ' . str_replace('.', ':', $devId); $cleanIface = strstr($tPONIfaceStr, ':', true); if ($processIfaceCustDescr && !isset($ifaceCustDescrArr[$cleanIface]) && array_key_exists($tPONIfaceNum, $ifaceCustDescrIdx)) { $ifaceCustDescrArr[$cleanIface] = $ifaceCustDescrIdx[$tPONIfaceNum]; } } else { $tPONIfaceStr = str_replace('.', ':', $devId); } $result[$eachMac] = $tPONIfaceStr; } //saving ONU interfaces and interfaces descriptions $this->olt->writeInterfaces($result); $this->olt->writeInterfacesDescriptions($ifaceCustDescrArr); } } /** * Parses & stores to cache ONUs FDB cache (MACs behind ONU) * * @param $onuMACIndex * @param $fdbIndex * @param $fdbVLANIndex * * @return void */ protected function fdbParseGCOME($onuMACIndex, $fdbIndex, $fdbVLANIndex) { if (!empty($onuMACIndex)) { $fdbDevIdxMAC = array(); $fdbIdxVLAN = array(); $fdbCahce = array(); if (!empty($fdbIndex)) { // processing FDBIndex array to get pon [port number + ONU LLID + dev idx => FDB MAC] mapping foreach ($fdbIndex as $each => $eachIdx) { $line = explode('=', $eachIdx); // FDB MAC is present if (isset($line[1])) { $fdbMAC = trim(str_replace(array('"', 'STRING:', 'dev/ro'), '', $line[1])); if (empty($fdbMAC)) continue; $fdbMAC = strtolower(AddMacSeparator(RemoveMacAddressSeparator($fdbMAC, array(':', '-', '.', ' ')))); // FDB MAC in space-separated format $portLLIDDevIdx = trim($line[0]); // pon port number + ONU LLID + dev idx //$portLLID = substr($portLLIDDevIdx, 0, 3); // pon port number + ONU LLID $fdbDevIdxMAC[$portLLIDDevIdx] = $fdbMAC; // pon port number + ONU LLID + dev idx => FDB MAC //$fdbIdxMAC[$fdbMAC] = $portLLID; // FDB MAC => pon port number + ONU LLID } } } if (!empty($fdbVLANIndex)) { // processing $fdbVLANIndex array to get [pon port number + ONU LLID + dev idx mapping => FDB VLAN] mapping foreach ($fdbVLANIndex as $each => $eachIdx) { $line = explode('=', $eachIdx); // FDB VLAN is present if (isset($line[1])) { $fdbVLAN = trim($line[1]); // FDB VLAN $portLLIDDevIdx = trim($line[0]); // pon port number + ONU LLID + dev idx $fdbIdxVLAN[$portLLIDDevIdx] = $fdbVLAN; // pon port number + ONU LLID + dev idx => FDB MAC } } } if (!empty($fdbDevIdxMAC)) { // processing $fdbIdxMAC and $fdbIdxVLAN to prepare [pon port number + ONU LLID => ['mac' => $eachFDBMAC, 'vlan' => $tmpFDBVLAN]] array foreach ($fdbDevIdxMAC as $eachPortLLIDDevIdx => $eachFDBMAC) { $portLLID = substr($eachPortLLIDDevIdx, 0, 3); $devIdx = substr($eachPortLLIDDevIdx, -1, 1); $tmpFDBVLAN = empty($fdbIdxVLAN[$eachPortLLIDDevIdx]) ? '' : $fdbIdxVLAN[$eachPortLLIDDevIdx]; $fdbMACVLAN[$portLLID][$devIdx] = array('mac' => $eachFDBMAC, 'vlan' => $tmpFDBVLAN); } if (!empty($fdbMACVLAN)) { foreach ($onuMACIndex as $eachLLID => $eachONUMAC) { if (!empty($fdbMACVLAN[$eachLLID])) { $fdbCahce[$eachONUMAC] = $fdbMACVLAN[$eachLLID]; } } } } //saving OLT FDB $this->olt->writeFdb($fdbCahce); } } /** * Performs last dereg reason preprocessing for dereg reason/mac index arrays and stores it into cache * * @param $LastDeregIndex * @param $macIndexProcessed * * @return void */ protected function lastDeregParseGCOME($LastDeregIndex, $macIndexProcessed) { $ONUDeRegs = array(); $result = array(); if (!empty($macIndexProcessed) and ! empty($LastDeregIndex)) { //last dereg index preprocessing foreach ($LastDeregIndex as $io => $eachRow) { $line = explode('=', $eachRow); if (empty($line[0]) || empty($line[1])) { continue; } $tmpONUPortLLID = trim($line[0]); $tmpONULastDeregReason = intval(trim($line[1])); switch ($tmpONULastDeregReason) { case 1: $TxtColor = '"#F80000"'; $tmpONULastDeregReasonStr = 'Wire down'; break; case 3: $TxtColor = '"#FF4400"'; $tmpONULastDeregReasonStr = 'Power off'; break; default: $TxtColor = '"#000000"'; $tmpONULastDeregReasonStr = 'Unknown'; break; } if (!empty($tmpONUPortLLID)) { $tmpONULastDeregReasonStr = wf_tag('font', false, '', 'color=' . $TxtColor . '') . $tmpONULastDeregReasonStr . wf_tag('font', true); $ONUDeRegs[$tmpONUPortLLID] = $tmpONULastDeregReasonStr; } } //storing results foreach ($macIndexProcessed as $devId => $eachMac) { if (isset($ONUDeRegs[$devId])) { $result[$eachMac] = $ONUDeRegs[$devId]; } } //saving ONUs deregs reasons $this->olt->writeDeregs($result); } } /** * Performs UNI port oper status preprocessing for index array and stores it into cache * * @param $uniOperStatusIndex * @param $macIndexProcessed * * @return void */ protected function uniParseGCOME($uniOperStatusIndex, $macIndexProcessed) { $uniStats = array(); $result = array(); if (!empty($macIndexProcessed) and !empty($uniOperStatusIndex)) { //UniOperStats index preprocessing foreach ($uniOperStatusIndex as $io => $eachRow) { $line = explode('=', $eachRow); if (empty($line[0]) || empty($line[1])) { continue; } // LLID + ether port index $tmpLLIDEtherIdx = trim($line[0]); $tmpLLIDEtherIdxLen = strlen($tmpLLIDEtherIdx); // ehter port index $tmpEtherIdx = strrchr($tmpLLIDEtherIdx, '.'); $tmpEtherIdxLen = strlen($tmpEtherIdx); $tmpEtherIdx = 'eth' . trim($tmpEtherIdx, '.'); //LLID $tmpONUPortLLID = substr($tmpLLIDEtherIdx, 0, $tmpLLIDEtherIdxLen - $tmpEtherIdxLen); $tmpUniStatus = trim($line[1]); $uniStats[$tmpONUPortLLID] = array($tmpEtherIdx => $tmpUniStatus); } //storing results foreach ($macIndexProcessed as $devId => $eachMac) { if (isset($uniStats[$devId])) { $result[$eachMac] = $uniStats[$devId]; } } //saving UniOperStats $this->olt->writeUniOperStats($result); } } } |