Source of file api.ponstels16.php
Size: 19,415 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.ponstels16.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 | <?php /** * OLT Stels FD16XX hardware abstraction layer */ class PONstels16 extends PONProto { /** * Stels FD16XX devices polling * * @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; $deviceType = $this->snmpTemplates[$oltModelId]['define']['DEVICE']; $ponPrefixAdd = (empty($this->snmpTemplates[$oltModelId]['misc']['INTERFACEADDPONPREFIX']) ? '' : $this->snmpTemplates[$oltModelId]['misc']['INTERFACEADDPONPREFIX']); $this->onuSerialCaseMode = (isset($this->snmpTemplates[$oltModelId]['onu']['SERIAL_CASE_MODE']) ? $this->snmpTemplates[$oltModelId]['onu']['SERIAL_CASE_MODE'] : 0); $distIndex = array(); $ifaceIndex = array(); $sigIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['signal']['SIGINDEX'], '', '.0.0 ', self::SNMPCACHE); //ONU distance polling for stels16 devices if (isset($this->snmpTemplates[$oltModelId]['misc'])) { if (isset($this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'])) { if (!empty($this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'])) { $distIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'], '', '', self::SNMPCACHE); $onuIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['ONUINDEX'], '', '.0.0 ', self::SNMPCACHE); $ifaceIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['INTERFACEINDEX'], '', '"', self::SNMPCACHE); } } if (isset($this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'])) { if (!empty($this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'])) { $lastDeregIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'], '', '"', self::SNMPCACHE); } } } //getting MAC index. $macIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['signal']['MACINDEX'], '', '', self::SNMPCACHE); $macIndexProcessed = $this->macParseStels16($macIndex); $this->signalParse($oltid, $sigIndex, $macIndex, $this->snmpTemplates[$oltModelId]['signal']); if (isset($this->snmpTemplates[$oltModelId]['misc'])) { if (isset($this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'])) { if (!empty($this->snmpTemplates[$oltModelId]['misc']['DISTINDEX'])) { // processing distance data $this->distanceParse($oltid, $distIndex, $macIndex); //processing interfaces data //$this->interfaceParsestels16($oltid, $ifaceIndex, $macIndex, $deviceType); $this->interfaceParsestels16($oltid, $ifaceIndex, $ponPrefixAdd); } } if (isset($this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'])) { if (!empty($this->snmpTemplates[$oltModelId]['misc']['DEREGREASON'])) { $this->lastDeregParsestels16($oltid, $lastDeregIndex, $macIndexProcessed); } } } if (!$oltNoFDBQ) { $fdbMACIndex = $this->walkCleared($oltIPPORT, $oltCommunity, $this->snmpTemplates[$oltModelId]['misc']['FDBMACINDEX'], '', '', self::SNMPCACHE); $this->fdbParsestels16($fdbMACIndex, $macIndexProcessed); } $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->uniParseStels16($uniOperStatusIndex, $macIndexProcessed); } } /** * Processes OLT MAC adresses and returns them in array: LLID=>MAC * * @param $macIndex * * @return array */ protected function macParseStels16($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; } $tmpONUDevIdx = trim($line[0]); $tmpONUMAC = trim($line[1]); $tmpONUMAC = str_replace(' ', ':', $tmpONUMAC); if ($this->onuSerialCaseMode == 1) { $tmpONUMAC = strtolower($tmpONUMAC); } elseif ($this->onuSerialCaseMode == 2) { $tmpONUMAC = strtoupper($tmpONUMAC); } //mac is present if (!empty($tmpONUDevIdx) and ! empty($tmpONUMAC)) { $ONUsMACs[$tmpONUDevIdx] = $tmpONUMAC; } } } return ($ONUsMACs); } /** * Parses & stores in cache OLT ONU interfaces * * @param int $oltid * @param array $ifaceIndex * @param array $macIndex * * @return void */ protected function interfaceParsestels16($oltid, $ifaceIndex, $ponPrefixAdd = '') { $macIndex = $this->olt->readMacIndex(); $oltid = vf($oltid, 3); $ifaceTmp = array(); $result = array(); $i = 0; //iface index preprocessing if ((!empty($ifaceIndex)) and ( !empty($macIndex))) { // creating mapping of internal pon ifaces nums to sequential, like this: //bsPortIndex.1.0.13; Value (Integer): 13 => 1 //bsPortIndex.1.0.14; Value (Integer): 14 => 2 //bsPortIndex.1.0.15; Value (Integer): 15 => 3 //bsPortIndex.1.0.16; Value (Integer): 16 => 4 //bsPortIndex.1.0.17; Value (Integer): 17 => 5 //bsPortIndex.1.0.18; Value (Integer): 18 => 6 //bsPortIndex.1.0.19; Value (Integer): 19 => 7 //bsPortIndex.1.0.20; Value (Integer): 20 => 8 foreach ($ifaceIndex as $io => $eachIface) { $i++; $line = explode('=', $eachIface); if (isset($line[1])) { $ponIfaceNum = trim($line[1]); // pon interface number $ifaceTmp[$ponIfaceNum] = $i; } } // using "special" math to get pon port num + LLID from dev index // formula: dev index DEC to HEX // 16780033 => 1000B01, where // 0B => 11 - pon port num // 01 => 1 - LLID if (!empty($macIndex) and !empty($ifaceTmp)) { foreach ($macIndex as $eachMac => $devId) { $LLID = ''; $hexDevId = dechex($devId); $portNum = hexdec(substr($hexDevId, -4, 2)); $onuNum = hexdec(substr($hexDevId, -2, 2)); if (!empty($ifaceTmp[$portNum])) { $portNum = $ifaceTmp[$portNum]; $LLID = $portNum . ":" . $onuNum; } else { $LLID = __('On ho'); } //storing results $result[$eachMac] = $ponPrefixAdd . $LLID; } } //saving ONUs interfaces $this->olt->writeInterfaces($result); } } /** * Parses & stores in cache ONU last dereg reasons * * @param int $oltid * @param array $deregIndex * @param array $macIndex * * @return void */ protected function lastDeregParsestels16($oltid, $deregIndex, $macIndex) { $oltid = vf($oltid, 3); $deregTmp = array(); $macTmp = array(); $result = array(); //dereg index preprocessing if ((!empty($deregIndex)) and ( !empty($macIndex))) { foreach ($deregIndex as $io => $eachdereg) { $line = explode('=', $eachdereg); //dereg is present if (isset($line[1])) { $lastDeregRaw = trim($line[1]); // last dereg reason $devIndex = trim($line[0]); // device index $deregTmp[$devIndex] = $lastDeregRaw; } } //mac index preprocessing /* foreach ($macIndex as $io => $eachmac) { $line = explode('=', $eachmac); //mac is present if (isset($line[1])) { $macRaw = trim($line[1]); //mac address $devIndex = trim($line[0]); //device index $macRaw = str_replace(' ', ':', $macRaw); $macRaw = strtolower($macRaw); $macTmp[$devIndex] = $macRaw; } }*/ //storing results if (!empty($macIndex)) { foreach ($macIndex as $devId => $eachMac) { $currentInterface = ''; if (!empty($deregTmp)) { foreach ($deregTmp as $intefaceOffset => $interfaceName) { // dirty hack for firmware > 1.4.0 - some shitty math used $recalcIfaceOffset = $intefaceOffset; if ($recalcIfaceOffset < 100) { $recalcIfaceOffset = (($recalcIfaceOffset - 10) * 256) + 16779776; } if ($devId >= $recalcIfaceOffset) { $currentInterface = $intefaceOffset; } } $result[$eachMac] = (isset($deregTmp[$currentInterface])) ? $deregTmp[$currentInterface] : __('On ho'); } } //saving ONUs dereg reasons $this->olt->writeDeregs($result); } } } /** * Parses & stores in cache OLT ONU interfaces * * @param int $oltid * @param array $intIndex * @param array $macIndex * * @return void */ protected function interfaceParseStels($oltid, $intIndex, $macIndex) { $oltid = vf($oltid, 3); $intTmp = array(); $macTmp = array(); $result = array(); //distance index preprocessing if ((!empty($intIndex)) and ( !empty($macIndex))) { foreach ($intIndex as $io => $eachint) { $line = explode('=', $eachint); //distance is present if (isset($line[1])) { // distance $devIndex = trim($line[0]); // device index $devIndex = explode('.', $devIndex); $portIndex = trim($devIndex[0]); $interfaceRaw = $devIndex[0] . ':' . $devIndex[1]; // $devIndex = ($devIndex[1] * 256) + 1; $intTmp[$portIndex . ':' . $devIndex] = $interfaceRaw; } } //mac index preprocessing foreach ($macIndex as $io => $eachmac) { $line = explode('=', $eachmac); //mac is present if (isset($line[1])) { $macRaw = trim($line[1]); //mac address $devIndex = trim($line[0]); //device index $devIndex = explode('.', $devIndex); $portIndex = trim($devIndex[0]); $devIndex = $devIndex[1]; $macRaw = str_replace(' ', ':', $macRaw); $macRaw = strtolower($macRaw); $macTmp[$portIndex . ':' . $devIndex] = $macRaw; } } //storing results if (!empty($macTmp)) { foreach ($macTmp as $devId => $eachMac) { if (isset($intTmp[$devId])) { $interface = $intTmp[$devId]; $result[$eachMac] = $interface; } } //saving ONUs interfaces $this->olt->writeInterfaces($result); } } } /** * Parses & stores in cache OLT ONU interfaces * * @param int $oltid * @param array $deregIndex * @param array $macIndex * * @return void */ protected function lastDeregParseStels($oltid, $deregIndex, $macIndex) { $oltid = vf($oltid, 3); $deregTmp = array(); $onuTmp = array(); $result = array(); //dereg index preprocessing if ((!empty($deregIndex)) and ( !empty($macIndex))) { foreach ($deregIndex as $io => $eachdereg) { $line = explode('=', $eachdereg); //dereg is present if (isset($line[1])) { $deregRaw = trim(trim($line[1]), '"'); // dereg $devIndex = $line[0]; $devIndex = explode('.', $devIndex); $portIndex = trim($devIndex[0]); $devIndex = trim($devIndex[1]); // $devIndex = (($devIndex * 256) + 1); $deregTmp[$portIndex . ':' . $devIndex] = $deregRaw; } } //mac index preprocessing foreach ($macIndex as $io => $eachmac) { $line = explode('=', $eachmac); //mac is present if (isset($line[1])) { $macRaw = trim($line[1]); //mac address $devIndex = trim($line[0]); $devIndex = explode('.', $devIndex); $portIndex = trim($devIndex[0]); $devIndex = $devIndex[1]; $macRaw = str_replace(' ', ':', $macRaw); $macRaw = strtolower($macRaw); $onuTmp[$portIndex . ':' . $devIndex] = $macRaw; } } //storing results if (!empty($onuTmp)) { foreach ($onuTmp as $devId => $eachMac) { if (isset($deregTmp[$devId])) { $result[$eachMac] = $deregTmp[$devId]; } } //saving ONUs dereg reasons $this->olt->writeDeregs($result); } } } /** * Parses & stores to cache ONUs FDB cache (MACs behind ONU) * * @param $fdbMACIndex * * @return void */ protected function fdbParsestels16($fdbMACIndex, $macIndexProcessed) { $onuMACIndex = $macIndexProcessed; $i = 0; $fdbCahce = array(); if (!empty($onuMACIndex) and !empty($fdbMACIndex)) { // processing $fdbMACIndex array to get a FDB record at once foreach ($fdbMACIndex as $eachIdx => $eachFDBLine) { $i++; if (empty($eachFDBLine) or !ispos($eachFDBLine, '=')) { continue; } $line = explode('=', $eachFDBLine); $onuPlasticIdx = trim($line[1]); // ONU Plastic index // Plastic index is present if (isset($onuMACIndex[$onuPlasticIdx])) { $fdbMACVLAN = trim($line[0]); // getting DEC MAC + VLAN portion $fdbVLAN = substr($fdbMACVLAN, strripos($fdbMACVLAN, '.') + 1); // fdb VLAN $fdbMAC = convertMACDec2Hex(substr($fdbMACVLAN, 0, strripos($fdbMACVLAN, '.'))); // fdb MAC; $fdbCahce[$onuMACIndex[$onuPlasticIdx]][$i] = array('mac' => $fdbMAC, 'vlan' => $fdbVLAN); } } } //saving OLT FDB $this->olt->writeFdb($fdbCahce); } /** * Performs UNI port oper status preprocessing for index array and stores it into cache * * @param $uniOperStatusIndex * @param $macIndexProcessed * * @return void */ protected function uniParseStels16($uniOperStatusIndex, $macIndexProcessed) { $uniStats = array(); $result = array(); if (!empty($macIndexProcessed) and !empty($uniOperStatusIndex)) { //UniOperStats index preprocessing foreach ($uniOperStatusIndex as $io => $eachRow) { $line = explode('=', $eachRow); file_put_contents('exports/pondata/unioperstats/unistats', print_r($line, true)); if (empty($line[0]) || empty($line[1])) { continue; } // dev index + .0. + ether port index $tmpDevIdxEtherIdx = trim($line[0]); $tmpDevIdxEtherIdxLen = strlen($tmpDevIdxEtherIdx); // ehter port index $tmpEtherIdx = strrchr($tmpDevIdxEtherIdx, '.'); $tmpEtherIdxLen = strlen($tmpEtherIdx); $tmpEtherIdx = 'eth' . trim($tmpEtherIdx, '.'); file_put_contents('exports/pondata/unioperstats/unistats', $tmpEtherIdx . "\n", 8); //dev index = $tmpDevIdxEtherIdx - '.0.' - $tmpEtherIdx $tmpONUDevIdx = substr($tmpDevIdxEtherIdx, 0, $tmpDevIdxEtherIdxLen - $tmpEtherIdxLen - 2); $tmpUniStatus = trim(trim($line[1]), '"'); file_put_contents('exports/pondata/unioperstats/unistats', $tmpONUDevIdx . "\n", 8); file_put_contents('exports/pondata/unioperstats/unistats', $tmpUniStatus . "\n", 8); $uniStats[$tmpONUDevIdx] = array($tmpEtherIdx => $tmpUniStatus); } file_put_contents('exports/pondata/unioperstats/unistats', print_r($uniStats, true), 8); file_put_contents('exports/pondata/unioperstats/unistats', print_r($macIndexProcessed, true), 8); //storing results foreach ($macIndexProcessed as $devId => $eachMac) { if (isset($uniStats[$devId])) { $result[$eachMac] = $uniStats[$devId]; } } //saving UniOperStats $this->olt->writeUniOperStats($result); } } } |