r2083 + setSwitchVLANs(): use oneLiner(), handle "C" messages
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 28 Jul 2008 16:57:01 +0000 (16:57 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 28 Jul 2008 16:57:01 +0000 (16:57 +0000)
+ make the switchvlans gateway use new message coding scheme
+ fix setPortVLAN() to build correct log structure

gateways/switchvlans/cisco.connector
gateways/switchvlans/main
inc/gateways.php
inc/interface.php
inc/ophandlers.php

index 636e3c4..50d6ec6 100755 (executable)
@@ -91,7 +91,7 @@ prepare_push_commands()
                        "$MYDIR/trunkdecoder" $vlanid >> $CMDS1
                fi
                printf "exit\n" >> $CMDS1
-               echo "I!Port $portname@$ENDPOINT has been assigned to VLAN $vlanid" >> "$FILE2"
+               echo "C!64!$portname!$ENDPOINT!$vlanid" >> "$FILE2"
        done < "$FILE1"
        printf "end\nwri\nquit\n" >> $CMDS1
 }
index 25f22f8..6399abd 100755 (executable)
@@ -148,24 +148,24 @@ do_set()
                newvlan=`echo $setexpr | cut -s -d'=' -f2`
                curvlan=`egrep "^$portname=" $PORTINFO | cut -s -d'=' -f2 | cut -d',' -f2`
                if [ -z "$curvlan" ]; then
-                       echo "E!Could not find port $portname" >> "$REPLIES"
+                       echo "C!167!$portname" >> "$REPLIES"
                        continue
                fi
                if [ "$curvlan" = "trunk" ]; then
-                       echo "E!Port $portname is a trunk" >> "$REPLIES"
+                       echo "C!168!$portname" >> "$REPLIES"
                        continue
                fi
                [ "$curvlan" = "$newvlan" ] && continue
                echo "$portname $newvlan" >> "$REQUESTS"
                cmembers=`grep -c ",$newvlan$" "$PORTINFO"`
                if [ "$cmembers" = "0" -a $newvlan -lt 4096 ]; then
-                       echo "W!Port $portname seems to be the first in VLAN $newvlan at this switch." >> "$REPLIES"
-                       echo "W!Check uplink/downlink configuration for proper operation." >> "$REPLIES"
+                       echo "C!203!$portname!$newvlan" >> "$REPLIES"
+                       echo "C!204" >> "$REPLIES"
                fi
        done
-       nr=`egrep -c '^E!.' "$REPLIES"`
+       nr=`egrep -c '^C!1.' "$REPLIES"`
        if [ "$nr" -ge 1 ]; then
-               echo "W!$nr change request(s) have been ignored" >> "$REPLIES"
+               echo "C!205!$nr" >> "$REPLIES"
        fi
 
        nq=`egrep -c '^.' "$REQUESTS"`
@@ -175,10 +175,10 @@ do_set()
                local ret=$?
 
                if [ $ret != 0 ]; then
-                       echo "ERR!Failed to configure $endpoint, connector returned code $ret"
+                       echo "C!169!$endpoint!$ret"
                        return
                fi
-               echo "I!$nq change request(s) have been processed" >> "$REPLIES"
+               echo "C!63!$nq" >> "$REPLIES"
        fi
        echo -n 'OK!'
        local SEMICOLON=
index d4b55be..de36e03 100644 (file)
@@ -157,15 +157,14 @@ function getSwitchVLANs ($object_id = 0)
 function setSwitchVLANs ($object_id = 0, $setcmd)
 {
        global $remote_username;
-       $log = array();
        if ($object_id <= 0)
-               return array (array ('c' => 160)); // invalid arguments
+               return oneLiner (160); // invalid arguments
        $objectInfo = getObjectInfo ($object_id);
        $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
        if (count ($endpoints) == 0)
-               return array (array ('c' => 161)); // endpoint not found
+               return oneLiner (161); // endpoint not found
        if (count ($endpoints) > 1)
-               return array (array ('c' => 162)); // can't pick an address
+               return oneLiner (162); // can't pick an address
        $hwtype = $swtype = 'unknown';
        foreach (getAttrValues ($object_id, TRUE) as $record)
        {
@@ -181,27 +180,30 @@ function setSwitchVLANs ($object_id = 0, $setcmd)
                array ("connect ${endpoint} ${hwtype} ${swtype} ${remote_username}", $setcmd)
        );
        if ($data == NULL)
-               return array (array ('c' => 163)); // unknown gateway failure
+               return oneLiner (163); // unknown gateway failure
        if (strpos ($data[0], 'OK!') !== 0)
-               return array (array ('c' => 164, 'a' => array ($data[0]))); // gateway failure
+               return oneLiner (164, array ($data[0])); // gateway failure
        if (count ($data) != 2)
-               return array (array ('c' => 165)); // protocol violation
+               return oneLiner (165); // protocol violation
        // Finally we can parse the response into message array.
-       $ret = array();
+       $log_m = array();
        foreach (split (';', substr ($data[1], strlen ('OK!'))) as $text)
        {
                if (strpos ($text, 'C!') === 0)
                {
+                       $tmp = split ('!', $text);
+                       array_shift ($tmp);
+                       $code = array_shift ($tmp);
+                       $log_m[] = count ($tmp) ? array ('c' => $code, 'a' => $tmp) : array ('c' => $code); // gateway-encoded message
                }
                elseif (strpos ($text, 'I!') === 0)
-                       $code = 62;
+                       $log_m[] = array ('c' => 62, 'a' => array (substr ($text, 2))); // generic gateway success
                elseif (strpos ($text, 'W!') === 0)
-                       $code = 202;
+                       $log_m[] = array ('c' => 202, 'a' => array (substr ($text, 2))); // generic gateway warning
                else // All improperly formatted messages must be treated as error conditions.
-                       $code = 166;
-               $ret[] = array ('c' => $code, 'a' => array (substr ($text, 2)));
+                       $log_m[] = array ('c' => 166, 'a' => array (substr ($text, 2))); // generic gateway error
        }
-       return $ret;
+       return $log_m;
 }
 
 // FIXME: shouldn't the common code be made into some helper?
index fb54924..adbbe28 100644 (file)
@@ -1324,6 +1324,9 @@ function printLog ($log)
                                60 => array ('code' => 'success', 'format' => "Updated tag '%s'."),
                                61 => array ('code' => 'success', 'format' => 'Password changed successfully.'),
                                62 => array ('code' => 'success', 'format' => 'gw: %s'),
+                               63 => array ('code' => 'success', 'format' => '%u change request(s) have been processed'),
+                               64 => array ('code' => 'success', 'format' => 'Port %s@%s has been assigned to VLAN %u'),
+
                                100 => array ('code' => 'error', 'format' => 'Generic error: %s'),
                                101 => array ('code' => 'error', 'format' => 'Port name cannot be empty'),
                                102 => array ('code' => 'error', 'format' => "Error creating user account '%s'"),
@@ -1391,9 +1394,16 @@ function printLog ($log)
                                164 => array ('code' => 'error', 'format' => 'Gateway failure: returned code %u.'),
                                165 => array ('code' => 'error', 'format' => 'Gateway failure: malformed reply.'),
                                166 => array ('code' => 'error', 'format' => 'gw: %s'),
+                               167 => array ('code' => 'error', 'format' => 'Could not find port %s'),
+                               168 => array ('code' => 'error', 'format' => 'Port %s is a trunk'),
+                               169 => array ('code' => 'error', 'format' => 'Failed to configure %s, connector returned code %u'),
+
                                200 => array ('code' => 'warning', 'format' => 'generic warning: %s'),
                                201 => array ('code' => 'warning', 'format' => 'nothing happened...'),
                                202 => array ('code' => 'warning', 'format' => 'gw: %s'),
+                               203 => array ('code' => 'warning', 'format' => 'Port %s seems to be the first in VLAN %u at this switch.'),
+                               204 => array ('code' => 'warning', 'format' => 'Check uplink/downlink configuration for proper operation.'),
+                               205 => array ('code' => 'warning', 'format' => '%u change request(s) have been ignored'),
                        );
                        // Handle the arguments. Is there any better way to do it?
                        foreach ($log['m'] as $record)
index 15df994..8e7080e 100644 (file)
@@ -1329,7 +1329,7 @@ function setPortVLAN ()
                }
        // Feed the gateway and interpret its (non)response.
        if ($setcmd != '')
-               $log['m'] = array_merge ($log, setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
+               $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));
        else
                $log['m'][] = array ('c' => 201);
        return buildWideRedirectURL ($log);