r3814 nxos4.connector: add "getcdpstatus" command
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 11 Jun 2010 14:36:31 +0000 (14:36 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 11 Jun 2010 14:36:31 +0000 (14:36 +0000)
ios12ReadCDPStatus(): simplify and adjust regexps to understand NX-OS output format
ios12ScanCDPTopLevel(): sayonara
ios12ScanCDPEntry(): sayonara
ios12ShortenIfName(): reduce Ethernet to "e", not "et" (like SNMP code aleady does)

ChangeLog
gateways/deviceconfig/nxos4.connector
inc/functions.php
inc/gateways.php

index beb7537..b92a77a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
        bugfix: fix mktemp not working on Slackware (by Rafael Ganascim)
        bugfix: Nexus 802.1Q fixes
        bugfix: fix incorrect quoting of port reservation comment
+       new feature: "Live CDP" now works with Nexus devices
 0.18.2 2010-06-10
        bugfix: don't restore last opened tab, which won't be permitted anyway
        update: completely switch to PDO prepared queries (#120)
index 14d25b4..e07d0f7 100755 (executable)
@@ -57,6 +57,14 @@ if ($command eq "get8021q") {
     print WORKFILE @r;
     exit(0);
 }
+if ($command eq "getcdpstatus") {
+    open(WORKFILE, ">$workfile") || die "$workfile: $!";
+    $session->cmd ('terminal length 0');
+    $session->cmd ('terminal no monitor');
+    my @r = $session->cmd ('show cdp neighbors detail');
+    print WORKFILE @r;
+    exit(0);
+}
 if ($command eq "deploy") {
     open(WORKFILE, "<$workfile") || die "$workfile: $!";
     while (<WORKFILE>) {
index 4817f5c..67d87d6 100644 (file)
@@ -2361,7 +2361,7 @@ function formatVLANName ($vlaninfo, $context = 'markup long')
 // map interface name
 function ios12ShortenIfName ($ifname)
 {
-       $ifname = preg_replace ('@^Ethernet(.+)$@', 'et\\1', $ifname);
+       $ifname = preg_replace ('@^Ethernet(.+)$@', 'e\\1', $ifname);
        $ifname = preg_replace ('@^FastEthernet(.+)$@', 'fa\\1', $ifname);
        $ifname = preg_replace ('@^GigabitEthernet(.+)$@', 'gi\\1', $ifname);
        $ifname = preg_replace ('@^TenGigabitEthernet(.+)$@', 'te\\1', $ifname);
index 707d69e..c45039c 100644 (file)
 
 // translating functions maps
 $gwrxlator = array();
-$gwrxlator['getcdpstatus']['ios12'] = 'ios12ReadCDPStatus';
+$gwrxlator['getcdpstatus'] = array
+(
+       'ios12' => 'ios12ReadCDPStatus',
+       'nxos4' => 'ios12ReadCDPStatus',
+);
 $gwrxlator['getlldpstatus'] = array
 (
        'xos12' => 'xos12ReadLLDPStatus',
@@ -392,9 +396,28 @@ function gwDeployDeviceConfig ($object_id, $breed, $text)
 function ios12ReadCDPStatus ($input)
 {
        $ret = array();
-       $procfunc = 'ios12ScanCDPTopLevel';
        foreach (explode ("\n", $input) as $line)
-               $procfunc = $procfunc ($ret, $line);
+       {
+               $matches = array();
+               switch (TRUE)
+               {
+               case preg_match ('/^Device ID: ?(.+)$/', $line, $matches):
+               case preg_match ('/^System Name: (.+)$/', $line, $matches):
+                       $ret['current']['device'] = $matches[1];
+                       break;
+               case preg_match ('/^Interface: (.+),  ?Port ID \(outgoing port\): (.+)$/', $line, $matches):
+                       if (array_key_exists ('device', $ret['current']))
+                               $ret[ios12ShortenIfName ($matches[1])] = array
+                               (
+                                       'device' => $ret['current']['device'],
+                                       'port' => ios12ShortenIfName ($matches[2]),
+                               );
+                       unset ($ret['current']);
+                       break;
+               default:
+               }
+       }
+       unset ($ret['current']);
        return $ret;
 }
 
@@ -1217,37 +1240,6 @@ function xos12TranslatePushQueue ($queue, $do_save = FALSE)
        return $ret;
 }
 
-function ios12ScanCDPTopLevel (&$work, $line)
-{
-       $matches = array();
-       switch (TRUE)
-       {
-       case preg_match ('/^Device ID: (.+)$/', $line, $matches):
-               $work['current'] = array ('device' => $matches[1]);
-               return 'ios12ScanCDPEntry';
-       default:
-               return __FUNCTION__; // continue scan
-       }
-}
-
-function ios12ScanCDPEntry (&$work, $line)
-{
-       $matches = array();
-       switch (TRUE)
-       {
-       case preg_match ('/^Interface: (.+),  Port ID \(outgoing port\): (.+)$/', $line, $matches):
-               $work[ios12ShortenIfName ($matches[1])] = array
-               (
-                       'device' => $work['current']['device'],
-                       'port' => ios12ShortenIfName ($matches[2]),
-               );
-               unset ($work['current']);
-               return 'ios12ScanCDPTopLevel';
-       default:
-       }
-       return __FUNCTION__;
-}
-
 function xos12Read8021QConfig ($input)
 {
        $ret = array