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);
- }
- }
- }
|