Jelajahi Sumber

Comandos y OIDs para obtener stats de ONUs.

Maximiliano Schvindt 7 tahun lalu
induk
melakukan
c56a6e15d5

+ 8 - 0
Command/BaseCommand.php

@@ -176,4 +176,12 @@ abstract class BaseCommand extends ContainerAwareCommand
         
         return array(0=>$type,1=>(int)$value);
     }
+
+    function hex2str($hex) {
+        $str = "";
+        for($i=0;$i<strlen($hex);$i+=2)
+           $str .= chr(hexdec(substr($hex,$i,2)));
+    
+        return $str;
+    }
 }

+ 106 - 0
Command/HuaweiOnuCatvRxCommand.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace HuaweiBundle\Command;
+
+use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use HuaweiBundle\SNMP\SNMP as SNMP;
+//use RedisBundle\Services\RedisService;
+
+class HuaweiOnuCatvRxCommand extends BaseCommand
+{
+
+    protected function configure()
+    {
+        $this
+            ->setName('huawei:onu:catvrx')
+            ->setDescription('CATV RX Power de ONUs')
+            ->setHelp('Se requieren parámetros para poder realizar la correcta consulta. El comando requiere Redis.')
+            ->setDefinition(array(
+                new InputOption('olt-device-id', null, InputOption::VALUE_OPTIONAL, "DeviceId de la OLT",1),
+                new InputOption('olt-server-id', null, InputOption::VALUE_OPTIONAL, "ServerDevice de la OLT",1),
+                new InputOption('olt-ip', false, InputOption::VALUE_OPTIONAL, "IP de la OLT"),
+                new InputOption('olt-community', false, InputOption::VALUE_OPTIONAL, "COMMUNITY de la OLT"),
+                new InputOption('olt-snmp-library', false, InputOption::VALUE_OPTIONAL, "Versión de librería SNMP")
+            ))
+        ;
+    }
+
+    /**
+     * @param InputInterface $input
+     * @param OutputInterface $output
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        parent::execute($input, $output);
+        
+        $this->output->writeln("INICIO");
+        
+        $inicio = microtime(true);
+        $time = time();
+
+        $oltDeviceId = (int) $input->getOption('olt-device-id');
+        $oltServerId = (int) $input->getOption('olt-server-id');
+        $oltIp = $input->getOption('olt-ip');
+        $oltCommunity = $input->getOption('olt-community');
+        $oltSnmpLibrary = $input->getOption('olt-snmp-library');
+        
+        $flag = "olt_onus_catvrx_d_{$oltDeviceId}_s_{$oltServerId}.lock";
+        $key_olt_scan = "olt_scan_d_{$oltDeviceId}_s_{$oltServerId}";
+        $key_onu_rx = "onu_catvrx_d_{$oltDeviceId}_s_{$oltServerId}";
+        
+        /* Control de bloqueo */
+        if($this->lock($flag)) {return;}
+
+        $SNMP = new SNMP($oltIp, $oltCommunity);
+        $library = "use".$oltSnmpLibrary;
+
+        $dataCached = $this->getData($key_olt_scan, true);
+        $rxCached = array(); //$this->getData($key_onu_rx, true);
+
+        if(empty($dataCached)) {
+            $this->output->writeln("Se requiere {$key_olt_scan}.");
+            $this->removeLock($flag);
+            return true;
+        }
+
+        $rxPower = $SNMP->$library()->onuCatvRxOpticalPower();
+        
+        $sendData = array();
+        $metric = "onu_catvrx_";
+        $line = 0;
+        foreach($rxPower as $index => $rx) {
+            if($rx == 2147483647) continue;
+            if(isset($dataCached[$index])) {
+                $value = 0.01 * $rx;
+                $sn = strtolower($dataCached[$index]['serialNumber']);
+                $k = $metric.strtolower($sn);
+                //print_r("$line - $index - $k - $value".PHP_EOL);
+                $sendData[$k] = "{$value}|g";
+                $line++;
+                
+                $rxCached[$sn] = $value;
+            }
+        }
+
+        $this->setData($key_onu_rx, $rxCached, true);
+
+        if($sendData) {
+            $t_start_script = microtime(true); 
+            $statsdService = $this->getContainer()->get('statsd');
+            $statsdService->send($sendData);
+            $t_end_script = microtime(true); 
+            $time = $t_end_script - $t_start_script;
+            print_r("Tiempo de envío al StatsD: {$time} ms / Cantidad: {$line}".PHP_EOL);
+        }
+
+        //$this->collector->set($key,$dataCached,true);
+
+        /* Fin de bloqueo */
+        $this->removeLock($flag);
+        
+    }
+
+}

+ 2 - 1
Command/HuaweiOnuRxCommand.php

@@ -67,11 +67,12 @@ class HuaweiOnuRxCommand extends BaseCommand
         }
 
         $rxPower = $SNMP->$library()->onuPonRxOpticalPower();
-
+        
         $sendData = array();
         $metric = "onu_rx_";
         $line = 0;
         foreach($rxPower as $index => $rx) {
+            if($rx == 2147483647) continue;
             if(isset($dataCached[$index])) {
                 $value = 0.01 * $rx;
                 $sn = strtolower($dataCached[$index]['serialNumber']);

+ 31 - 15
Command/HuaweiOnuScanCommand.php

@@ -48,6 +48,7 @@ class HuaweiOnuScanCommand extends BaseCommand
         
         $flag = "olt_scan_d_{$oltDeviceId}_s_{$oltServerId}.lock";
         $key_olt_scan = "olt_scan_d_{$oltDeviceId}_s_{$oltServerId}";
+        $key_olt_pons = "olt_scan_pons_d_{$oltDeviceId}_s_{$oltServerId}";
         
         /* Control de bloqueo */
         if($this->lock($flag)) {return;}
@@ -55,29 +56,44 @@ class HuaweiOnuScanCommand extends BaseCommand
         $SNMP = new SNMP($oltIp, $oltCommunity);
         $library = "use".$oltSnmpLibrary;
 
-        //$dataCached = $this->getData($key_olt_scan, true);
-        $dataCached = array();
+        $portCached = $this->getData($key_olt_pons, true);
 
-        /* $slots = $SNMP->$library()->onuSlot();
-        $pons = $SNMP->$library()->onuPon();
-        $onus = $SNMP->$library()->onuOnuid(); */
-        $serialNumbers = $SNMP->$library()->onuSerialNumber();
+        if(empty($portCached)) {
+            $this->output->writeln("Se requiere {$key_olt_pons}.");
+            $this->removeLock($flag);
+            return true;
+        }
 
-        print_r($serialNumbers);
+        $dataCached = array();
 
-        die;
+        $serialNumbers = $SNMP->$library()->onuSerialNumber();
+        // array [4194312192.1] => 485754430011D168
+        //        portIndex.onuIndex => serialNumber Hexa [48 57 54 43] 0011D168  => HWTC0011D168 (parecido al PonSerialNumber)
+        
+        //print_r($portCached);
+        //print_r($serialNumbers);
 
         $countOnus = 0;
-        foreach($onus as $index => $onuId) {
+        foreach($serialNumbers as $index => $hexSerialNumber) {
+            $vendoId = $this->hex2str(substr($hexSerialNumber,0,8));
+            $rest = substr($hexSerialNumber,8);
+            
+            $sn = strtolower($vendoId.$rest);
+            
+            $portOnu = explode(".",$index);
+            if(count($portOnu) != 2) continue;
+            $portIndex = $portOnu[0];
+            $onuId = $portOnu[1];
             $countOnus++;
-            if(isset($slots[$index]) && isset($pons[$index]) && isset($serialNumbers[$index])) {
-                $slot = $slots[$index]; $pon = $pons[$index]; $sn = strtolower($serialNumbers[$index]);
-                $data = array();
-                $data['slot'] = $slot;
-                $data['port'] = $pon;
+            
+            if(isset($portCached[$portIndex])) {
+                $p = $portCached[$portIndex];
+                
+                $data = $p;
                 $data['onuId'] = $onuId;
                 $data['serialNumber'] = $sn;
-                $data['ponport'] = "{$slot}/{$pon}/{$onuId}";
+                $data['hexaSerialNumber'] = $hexSerialNumber;
+                $data['ponport'] = "{$p['ponPort']}/{$onuId}";
                 $dataCached[$index] = $data;
             }
         }

+ 12 - 7
Command/HuaweiOnuStatsCommand.php

@@ -67,11 +67,12 @@ class HuaweiOnuStatsCommand extends BaseCommand
         $rxPower = $SNMP->$library()->onuPonRxOpticalPower();
         $temperature = $SNMP->$library()->onuPonOpticalTemperature();
         $voltage = $SNMP->$library()->onuPonOpticalVltage();
-        $status = $SNMP->$library()->onuStatus();
+        $catvRxPower = $SNMP->$library()->onuCatvRxOpticalPower();
+        $status = $txPower;
 
         $sendData = array();
 
-        $metrics = array("txPower" => "onu_tx_", "rxPower" => "onu_rx_", "temperature" => "onu_temperature_", "voltage" => "onu_voltage_", "status" => "onu_status_");
+        $metrics = array("txPower" => "onu_tx_", "rxPower" => "onu_rx_", "temperature" => "onu_temperature_", "voltage" => "onu_voltage_", "status" => "onu_status_", "catvRxPower" => "onu_catvrx_");
 
         $stats = array();
         foreach($metrics as $m => $metric) {
@@ -86,10 +87,16 @@ class HuaweiOnuStatsCommand extends BaseCommand
                 if(isset($$data[$index]) && !empty($$data[$index])) {
                     $m = "{$metric}{$sn}";
 
-                    if($data != "status") {
-                        $v = $$data[$index] * 0.01;
+                    if($$data[$index] == 2147483647 && $data != "status") continue;
+
+                    if($data == "voltage") {
+                        $v = $$data[$index] * 0.001;
+                    } elseif ($data == "temperature") {
+                        $v = $$data[$index];
+                    } elseif ($data == "status") {
+                        ($$data[$index] == 2147483647)? $v = 0 : $v = 1;
                     } else {
-                        ($$data[$index] != 1)? $v = 0 : $v = 1;
+                        $v = $$data[$index] * 0.01;
                     }
 
                     $sendData[$m] = "{$v}|g";
@@ -99,8 +106,6 @@ class HuaweiOnuStatsCommand extends BaseCommand
             }
         }
 
-        //print_r($stats);
-
         foreach($stats as $metric => $data) {
             $key_onu_stats = "{$metric}d_{$oltDeviceId}_s_{$oltServerId}";
 

+ 2 - 2
Command/HuaweiOnuStatusCommand.php

@@ -66,14 +66,14 @@ class HuaweiOnuStatusCommand extends BaseCommand
             return true;
         }
 
-        $status = $SNMP->$library()->onuStatus();
+        $status = $SNMP->$library()->onuPonRxOpticalPower(); //buscamos distinto a 2147483647
 
         $sendData = array();
         $metric = "onu_status_";
         $line = 0;
         foreach($status as $index => $s) {
             if(isset($dataCached[$index])) {
-                ($s != 1)? $value = 0 : $value = 1;
+                ($s == 2147483647)? $value = 0 : $value = 1;
                 
                 $sn = strtolower($dataCached[$index]['serialNumber']);
                 $k = $metric.strtolower($sn);

+ 2 - 1
Command/HuaweiOnuTemperatureCommand.php

@@ -72,8 +72,9 @@ class HuaweiOnuTemperatureCommand extends BaseCommand
         $metric = "onu_temperature_";
         $line = 0;
         foreach($temperature as $index => $temp) {
+            if($temp == 2147483647) continue;
             if(isset($dataCached[$index])) {
-                $value = 0.01 * $temp;
+                $value = $temp;
                 $sn = strtolower($dataCached[$index]['serialNumber']);
                 $k = $metric.strtolower($sn);
                 //print_r("$line - $index - $k - $value".PHP_EOL);

+ 1 - 0
Command/HuaweiOnuTxCommand.php

@@ -72,6 +72,7 @@ class HuaweiOnuTxCommand extends BaseCommand
         $metric = "onu_tx_";
         $line = 0;
         foreach($txPower as $index => $tx) {
+            if($tx == 2147483647) continue;
             if(isset($dataCached[$index])) {
                 $value = 0.01 * $tx;
                 $sn = strtolower($dataCached[$index]['serialNumber']);

+ 2 - 1
Command/HuaweiOnuVoltageCommand.php

@@ -72,8 +72,9 @@ class HuaweiOnuVoltageCommand extends BaseCommand
         $metric = "onu_voltage_";
         $line = 0;
         foreach($voltage as $index => $volt) {
+            if($volt == 2147483647) continue;
             if(isset($dataCached[$index])) {
-                $value = 0.01 * $volt;
+                $value = 0.001 * $volt;
                 $sn = strtolower($dataCached[$index]['serialNumber']);
                 $k = $metric.strtolower($sn);
                 //print_r("$line - $index - $k - $value".PHP_EOL);

+ 27 - 12
SNMP/MIBS/OIDSHuaweiV1.php

@@ -12,16 +12,21 @@ class OIDSHuaweiV1 extends \HuaweiBundle\SNMP\MIB {
     const OID_authOnuListSlot               = "1.3.6.1.4.1.5875.800.3.10.1.1.2";
     const OID_authOnuListPon                = "1.3.6.1.4.1.5875.800.3.10.1.1.3";
     const OID_authOnuListOnuid              = "1.3.6.1.4.1.5875.800.3.10.1.1.4";
+    
     const OID_authOnuListMac                = "1.3.6.1.4.1.2011.6.128.1.1.2.43.1.3";
-    const OID_onuPonRxOpticalPower                = "1.3.6.1.4.1.5875.800.3.9.3.3.1.6";
-    const OID_onuPonTxOpticalPower                = "1.3.6.1.4.1.5875.800.3.9.3.3.1.7";
-    const OID_onuPonOpticalVltage                 = "1.3.6.1.4.1.5875.800.3.9.3.3.1.8";
-    const OID_onuPonOpticalTemperature            = "1.3.6.1.4.1.5875.800.3.9.3.3.1.10";
+    const OID_onuPonRxOpticalPower          = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.4";
+    const OID_onuPonTxOpticalPower          = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.3";
+    const OID_onuPonOpticalVltage           = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.5";
+    const OID_onuPonOpticalTemperature      = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.1";
+    const OID_onuPonOpticalCurrent          = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.2";
+    const OID_onuCatvRxOpticalPower               = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.7";
+    
     const OID_onuStatus                           = "1.3.6.1.4.1.5875.800.3.10.1.1.11";
     const OID_oltPonDesc                          = "1.3.6.1.2.1.31.1.1.1.1";
     const OID_oltPonEnableStatus                  = "1.3.6.1.4.1.5875.800.3.9.3.4.1.4";
     
-    const OID_oltPonRxOpticalPower                = "1.3.6.1.4.1.5875.800.3.9.3.7.1.2";
+    const OID_oltPonRxOpticalPower                = "1.3.6.1.4.1.2011.6.128.1.1.2.51.1.6";
+    
     const OID_oltPonTxOpticalPower                = "1.3.6.1.4.1.5875.800.3.9.3.4.1.8";
     const OID_oltPonOpticalVltage                 = "1.3.6.1.4.1.5875.800.3.9.3.4.1.9";
     const OID_oltPonOpticalCurrent                = "1.3.6.1.4.1.5875.800.3.9.3.4.1.10";
@@ -65,36 +70,46 @@ class OIDSHuaweiV1 extends \HuaweiBundle\SNMP\MIB {
             return $this->getSNMP()->lastOidWalk(self::OID_authOnuListMac,16);
         } 
         
-        $values = $this->getSNMP()->lastOidWalk(self::OID_authOnuListMac,14);
+        $values = $this->getSNMP()->lastOidWalk(self::OID_authOnuListMac,16);
+        return $this->convertIndex($index, $values);
+    }
+    
+    public function onuCatvRxOpticalPower($index = null) {
+        if(is_null($index)) {
+            return $this->getSNMP()->lastOidWalk(self::OID_onuCatvRxOpticalPower,16);
+        } 
+        
+        $values = $this->getSNMP()->lastOidWalk(self::OID_onuCatvRxOpticalPower,16);
         return $this->convertIndex($index, $values);
+       
     }
     
     public function onuPonRxOpticalPower($index = null) {
         if(is_null($index)) {
-            return $this->getSNMP()->lastOidWalk(self::OID_onuPonRxOpticalPower,15);
+            return $this->getSNMP()->lastOidWalk(self::OID_onuPonRxOpticalPower,16);
         } 
         
-        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonRxOpticalPower,15);
+        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonRxOpticalPower,16);
         return $this->convertIndex($index, $values);
        
     }
     
     public function onuPonTxOpticalPower($index = null) {
         if(is_null($index)) {
-            return $this->getSNMP()->lastOidWalk(self::OID_onuPonTxOpticalPower,15);
+            return $this->getSNMP()->lastOidWalk(self::OID_onuPonTxOpticalPower,16);
         } 
 
-        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonTxOpticalPower,15);
+        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonTxOpticalPower,16);
         return $this->convertIndex($index, $values);
     }
     
     public function onuPonOpticalVltage($index = null) {
-        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonOpticalVltage,15);
+        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonOpticalVltage,16);
         return $this->convertIndex($index, $values);
     }
     
     public function onuPonOpticalTemperature($index = null) {
-        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonOpticalTemperature,15);
+        $values = $this->getSNMP()->lastOidWalk(self::OID_onuPonOpticalTemperature,16);
         return $this->convertIndex($index, $values);
     }