View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 533 | RackTables | 802.1Q VLANs | public | 2012-02-28 21:29 | 2012-03-01 13:37 |
| Reporter | Assigned To | infrastation | |||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | closed | Resolution | fixed | ||
| Product Version | 0.19.11 | ||||
| Target Version | 0.19.12 | Fixed in Version | 0.19.12 | ||
| Summary | 533: Adding support for D-Link L2 switches | ||||
| Description | Initial support for communicating with D-Link hardware: get VLAN list, get port status list, get MAC list. Tested on DES-3xxx with fresh firmware. Side effect: disables CLI paging. | ||||
| Tags | No tags attached. | ||||
| Attached Files | racktables-0.19.11-dlink.diff (11,927 bytes)
Index: gateways/deviceconfig/dlink.connector
===================================================================
--- gateways/deviceconfig/dlink.connector (revision 0)
+++ gateways/deviceconfig/dlink.connector (revision 0)
@@ -0,0 +1,85 @@
+#!/bin/sh
+#
+# ./racktables/gateways/deviceconfig/dlink.connector
+#
+# Written by evseev@fastvps.ru at Feb-2011
+# Based on ios12.connector
+#
+
+[ $# = 3 ] || exit 1
+
+ENDPOINT=$1
+COMMAND=$2
+WORKFILE=$3
+
+prepare_connect_commands()
+{
+ [ $# = 1 ] || exit 2
+ local skip=yes cval found=no MYDIR=`dirname $0`
+ while read line; do
+ if [ "$skip" = "yes" -a "$line" = "# S-T-A-R-T" ]; then
+ skip=no
+ continue
+ fi
+ if [ "$skip" = "no" -a "$line" = "# S-T-O-P" ]; then
+ skip=yes
+ continue
+ fi
+ [ "$skip" = "yes" ] && continue
+ # ignore comments
+ [ -z "${line###*}" ] && continue
+
+ # First endpoint string/regexp match is sufficient for us.
+ cval=`echo $line | cut -s -d' ' -f1`
+ if [ -z "${1##$cval}" ]; then
+ found=yes
+ username=`echo $line | cut -s -d' ' -f5`
+ [ "$username" != "-" ] && echo $username > $SESSION
+ # access password
+ echo $line | cut -s -d' ' -f6 >> $SESSION
+ enable_password=`echo $line | cut -s -d' ' -f7`
+ [ "$enable_password" != "-" ] && {
+ echo 'enable admin' >> $SESSION
+ echo $enable_password >> $SESSION
+ }
+ break
+ fi
+ echo 'disable clipaging' >> "$SESSION" # ..requires admin!
+ done < "$MYDIR/switch.secrets.php"
+ [ "$found" = "yes" ] && return
+ exit 3
+}
+
+MYNAME=`basename $0`
+SESSION=`mktemp /tmp/$MYNAME.XXXXXX`
+[ -f "$SESSION" ] || exit 5
+prepare_connect_commands $ENDPOINT
+case $COMMAND in
+get8021q)
+ echo 'show vlan' >> "$SESSION"
+ outfile="$WORKFILE"
+ ;;
+getportstatus)
+ echo 'show ports' >> "$SESSION"
+ outfile="$WORKFILE"
+ ;;
+getmaclist)
+ echo 'show fdb' >> "$SESSION"
+ outfile="$WORKFILE"
+ ;;
+deploy)
+ cat "$WORKFILE" >> "$SESSION"
+ outfile=/dev/null
+ ;;
+*)
+ rm -f "$SESSION"
+ exit 6
+ ;;
+esac
+echo 'logout' >> "$SESSION"
+#echo "[ $(date +'%Y.%m.%d %H:%M:%S') ] cmd=$COMMAND, ep=$ENDPOINT, wf=$WORKFILE, sess=$SESSION, of=$outfile" >> /tmp/dlink.connector.debug
+rc=0
+nc -w 30 $ENDPOINT 23 < "$SESSION" > "$outfile" || rc=4
+#cp -p "$outfile" "$outfile.copy"
+rm -f "$SESSION"
+exit $rc
Property changes on: gateways/deviceconfig/dlink.connector
___________________________________________________________________
Added: svn:executable
+ *
Index: wwwroot/inc/gateways.php
===================================================================
--- wwwroot/inc/gateways.php (revision 4865)
+++ wwwroot/inc/gateways.php (working copy)
@@ -30,6 +30,7 @@
);
$gwrxlator['get8021q'] = array
(
+ 'dlink' => 'dlinkReadVLANConfig',
'ios12' => 'ios12ReadVLANConfig',
'fdry5' => 'fdry5ReadVLANConfig',
'vrp53' => 'vrp53ReadVLANConfig',
@@ -40,6 +41,7 @@
);
$gwrxlator['getportstatus'] = array
(
+ 'dlink' => 'dlinkReadInterfaceStatus',
'ios12' => 'ciscoReadInterfaceStatus',
'vrp53' => 'vrpReadInterfaceStatus',
'vrp55' => 'vrpReadInterfaceStatus',
@@ -47,6 +49,7 @@
);
$gwrxlator['getmaclist'] = array
(
+ 'dlink' => 'dlinkReadMacList',
'ios12' => 'ios12ReadMacList',
'vrp53' => 'vrp53ReadMacList',
'vrp55' => 'vrp55ReadMacList',
@@ -334,8 +337,14 @@
1367 => 'jun10',
);
foreach (getAttrValues ($object_id) as $record)
+ {
+ // See Attribute table: ID = 4, Type = 'dict', Name = 'SW Type'
if ($record['id'] == 4 and array_key_exists ($record['key'], $breed_by_swcode))
return $breed_by_swcode[$record['key']];
+ // See Attribute table: ID = 2, Type = 'dict', Name = 'HW Type'
+ if ($record['id'] == 2 and $record['key'] >= 589 and $record['key'] <= 637)
+ return 'dlink';
+ }
return '';
}
Index: wwwroot/inc/deviceconfig.php
===================================================================
--- wwwroot/inc/deviceconfig.php (revision 4865)
+++ wwwroot/inc/deviceconfig.php (working copy)
@@ -183,6 +183,119 @@
return $ret;
}
+/*
+D-Link VLAN info sample:
+========================
+VID : 72 VLAN Name : v72
+VLAN Type : Static Advertisement : Disabled
+Member Ports : 1-16,25-28
+Static Ports : 1-16,25-28
+Current Tagged Ports : 25-28
+Current Untagged Ports : 1-16
+Static Tagged Ports : 25-28
+Static Untagged Ports : 1-16
+Forbidden Ports :
+*/
+function dlinkReadVLANConfig ($input)
+{
+ $ret = array
+ (
+ 'vlanlist' => array(),
+ 'portdata' => array(),
+ );
+ $procfunc = 'dlinkScanTopLevel';
+ foreach (preg_split("/\n\r?/", $input) as $line)
+ $procfunc = $procfunc ($ret, $line);
+ return $ret;
+}
+
+function dlinkScanTopLevel(&$work, $line)
+{
+ $matches = array();
+ switch(TRUE)
+ {
+ case (preg_match('@^\s*VID\s*:\s*(\d+)\s+.*name\s*:\s*(.+)$@i', $line, $matches)):
+ $work['current'] = array
+ (
+ 'vlan_id' => $matches[1],
+ 'vlan_name' => $matches[2],
+ 'tagged_ports' => '',
+ 'untagged_ports' => '',
+ );
+ return 'dlinkPickVLANCommand';
+ default:
+ return __FUNCTION__;
+ }
+}
+
+function dlinkPickVLANCommand(&$work, $line)
+{
+ switch(TRUE)
+ {
+ case (preg_match ('@END OF VLAN LIST@', $line)):
+ case (trim($line) === ''):
+ if (!isset($work['current']))
+ break;
+ $work['vlanlist'][] = $work['current']['vlan_id'];
+ foreach (dlinkParsePortList ($work['current']['tagged_ports']) as $port_name)
+ dlinkStorePortInfo ($work, $port_name, 'trunk', 'trunk');
+ foreach (dlinkParsePortList ($work['current']['untagged_ports']) as $port_name)
+ dlinkStorePortInfo ($work, $port_name, 'access');
+ unset ($work['current']);
+ return 'dlinkScanTopLevel';
+ case (preg_match('@current tagged ports\s*:\s*([[:digit:]]+.*)$@i', $line, $matches)):
+ $work['current']['tagged_ports'] = $matches[1];
+ break;
+ case (preg_match('@current untagged ports\s*:\s*([[:digit:]]+.*)$@i', $line, $matches)):
+ $work['current']['untagged_ports'] = $matches[1];
+ break;
+// default:
+// error_log("dlinkPickVLANCommand: skip: \"$line\".");
+ }
+ return __FUNCTION__;
+}
+
+function dlinkStorePortInfo (&$work, $port_name, $new_mode, $overwrite_mode = '')
+{
+ if (!array_key_exists($port_name, $work['portdata']))
+ {
+ $work['portdata'][$port_name] = array
+ (
+ 'mode' => $new_mode,
+ 'allowed' => array($work['current']['vlan_id']),
+ 'native' => $work['current']['vlan_id']
+ );
+ return;
+ }
+ $work['portdata'][$port_name]['allowed'][] = $work['current']['vlan_id'];
+ if ($overwrite_mode !== '')
+ $work['portdata'][$port_name]['mode'] = $overwrite_mode;
+}
+
+// portlist = range[,range..]
+// range = N[-N]
+function dlinkParsePortList($portlist)
+{
+ $ret = array();
+ foreach(explode(',', $portlist) as $port_range)
+ {
+ $a = explode('-', $port_range);
+ switch (count($a))
+ {
+ case 1:
+ $ret[] = $port_range;
+ break;
+ case 2:
+ for ($p = $a[0]; $p <= $a[1]; $p++)
+ $ret[] = $p;
+ break;
+ default:
+ // ..impossible?
+ }
+ }
+ return $ret;
+}
+
function ios12ReadVLANConfig ($input)
{
$ret = array
@@ -1416,6 +1529,43 @@
return $ret;
}
+/*
+ D-Link "show ports" output sample
+ =================================
+
+ Port State/ Settings Connection Address
+ MDI Speed/Duplex/FlowCtrl Speed/Duplex/FlowCtrl Learning
+ ----- -------- --------------------- --------------------- --------
+ 1 Enabled Auto/Disabled 100M/Full/None Enabled
+ Auto
+ ...
+ 26(C) Enabled Auto/Disabled LinkDown Enabled
+ Auto
+ 26(F) Enabled Auto/Disabled LinkDown Enabled
+*/
+function dlinkReadInterfaceStatus ($text)
+{
+ $result = array();
+ foreach (preg_split ("/\n\r?/", $text) as $line)
+ {
+ if (!preg_match ('/^\s*\d+/', $line))
+ continue;
+ $w = preg_split ('/\s+/', strtolower($line));
+ if (count($w) != 5)
+ continue;
+ $port_name = $w[0];
+ if ($w[1] != 'enabled') {
+ $result[$portname] = array ('status'=>'disabled', 'speed'=>0, 'duplex'=>'');
+ } elseif ($w[3] == 'linkdown') {
+ $result[$portname] = array ('status'=>'down', 'speed'=>0, 'duplex'=>'');
+ } else {
+ $s = split('/', $w[3]);
+ $result[$portname] = array ('status'=>'up', 'speed'=>$s[0], 'duplex'=>$s[1]);
+ }
+ }
+ return $result;
+}
+
function ciscoReadInterfaceStatus ($text)
{
$result = array();
@@ -1501,6 +1651,37 @@
return ($a['vid'] < $b['vid']) ? -1 : 1;
}
+/*
+D-Link "show fdb" output sample
+===============================
+
+VID VLAN Name MAC Address Port Type
+---- -------------------------------- ----------------- ---- ---------------
+1 default 00-1B-2C-5F-4E-AE 27 Dynamic
+99 switch 00-00-3E-11-B7-52 27 Dynamic
+99 switch 84-C9-B2-36-80-F2 27 Dynamic
+*/
+function dlinkReadMacList ($text)
+{
+ $result = array();
+ foreach (preg_split ("/\n\r?/", $text) as $line)
+ {
+ if (!preg_match ('/^\s*\d+\s+/', $line))
+ continue;
+ $w = preg_split ('/\s+/', $line);
+ if (count($w) != 5)
+ continue;
+ $result[$w[3]][] = array
+ (
+ 'mac' => $w[2],
+ 'vid' => $w[0],
+ );
+ }
+ foreach ($result as $portname => &$maclist)
+ usort ($maclist, 'maclist_sort');
+ return $result;
+}
+
function ios12ReadMacList ($text)
{
$result = array();
| ||||
| parent of | 537 | closed | infrastation | Bugfix D-Link support |
|
(Note that I don't have the hardware to test this code against.) Merged into maintenance-0.19.x branch, the changes will be available in 0.19.12 release. Please consider sending next diffs without converting tabs into 8 spaces. As soon as 0.20.x series comes with a refactored gateway code, someone will have to take the care of forward-porting the feature (this should not be hard). Thank you. |
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2012-02-28 21:29 |
|
New Issue | |
| 2012-02-28 21:29 |
|
Status | new => assigned |
| 2012-02-28 21:29 |
|
Assigned To | => infrastation |
| 2012-02-28 21:29 |
|
File Added: racktables-0.19.11-dlink.diff | |
| 2012-03-01 13:37 | infrastation | Note Added: 0000621 | |
| 2012-03-01 13:37 | infrastation | Status | assigned => closed |
| 2012-03-01 13:37 | infrastation | Resolution | open => fixed |
| 2012-03-01 13:37 | infrastation | Fixed in Version | => 0.19.12 |
| 2012-03-01 13:37 | infrastation | Target Version | => 0.19.12 |
| 2012-03-02 09:50 | infrastation | Relationship added | parent of 537 |