r4098 setPortVLAN(): update with respect to assertions, exceptions and error codes
authorDenis Ovsienko <infrastation@yandex.ru>
Tue, 11 Jan 2011 22:01:31 +0000 (22:01 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 11 Jan 2011 22:01:31 +0000 (22:01 +0000)
renderVLANMembership(): add catch block
setSwitchVLANs(): employ exceptions
gwSendFileToObject(): idem
gwRecvFileFromObject(): idem

inc/gateways.php
inc/interface.php
inc/ophandlers.php

index 315343d73cf4fdcd374a801a87b24b2911ccb858..de725750cf26bc847c801f7b7dfab1970457744f 100644 (file)
@@ -186,9 +186,9 @@ function setSwitchVLANs ($object_id = 0, $setcmd)
        $objectInfo = spotEntity ('object', $object_id);
        $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
        if (count ($endpoints) == 0)
-               return oneLiner (161); // endpoint not found
+               throw new RTGatewayError ('no management address set');
        if (count ($endpoints) > 1)
-               return oneLiner (162); // can't pick an address
+               throw new RTGatewayError ('cannot pick management address');
        $hwtype = $swtype = 'unknown';
        foreach (getAttrValues ($object_id) as $record)
        {
@@ -279,8 +279,10 @@ function gwRecvFile ($endpoint, $handlername, &$output)
                throw new RTGatewayError ('failed to read temporary file');
 }
 
-function gwSendFileToObject ($object_id = 0, $handlername, $filetext = '')
+function gwSendFileToObject ($object_id, $handlername, $filetext = '')
 {
+       if (!mb_strlen ($handlername))
+               throw new InvalidArgException ('$handlername');
        $objectInfo = spotEntity ('object', $object_id);
        $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
        if (count ($endpoints) == 0)
@@ -290,19 +292,17 @@ function gwSendFileToObject ($object_id = 0, $handlername, $filetext = '')
        gwSendFile (str_replace (' ', '+', $endpoints[0]), $handlername, array ($filetext));
 }
 
-function gwRecvFileFromObject ($object_id = 0, $handlername, &$output)
+function gwRecvFileFromObject ($object_id, $handlername, &$output)
 {
-       global $remote_username;
-       if ($object_id <= 0 or !strlen ($handlername))
-               return oneLiner (160); // invalid arguments
+       if (!mb_strlen ($handlername))
+               throw new InvalidArgException ('$handlername');
        $objectInfo = spotEntity ('object', $object_id);
        $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
        if (count ($endpoints) == 0)
-               return oneLiner (161); // endpoint not found
+               throw new RTGatewayError ('no management address set');
        if (count ($endpoints) > 1)
-               return oneLiner (162); // can't pick an address
-       $endpoint = str_replace (' ', '+', $endpoints[0]);
-       gwRecvFile ($endpoint, $handlername, $output);
+               throw new RTGatewayError ('cannot pick management address');
+       gwRecvFile (str_replace (' ', '+', $endpoints[0]), $handlername, $output);
 }
 
 function detectDeviceBreed ($object_id)
index eb38c23488a852059e9c75616315e97d04933965..2ad834dfcfde6a550c1e8b4e46465a87c3d61782 100644 (file)
@@ -1745,9 +1745,7 @@ function showMessageOrError ()
                                153 => array ('code' => 'error', 'format' => 'Password change failed.'),
                                154 => array ('code' => 'error', 'format' => "Verification error: %s"),
                                155 => array ('code' => 'error', 'format' => 'Save failed.'),
-                               156 => array ('code' => 'error', 'format' => 'getSwitchVLANs() failed'),
                                157 => array ('code' => 'error', 'format' => 'operation not permitted'),
-                               158 => array ('code' => 'error', 'format' => 'Ignoring malformed record #%u in form submit'),
                                159 => array ('code' => 'error', 'format' => 'Permission denied moving port %s from VLAN%u to VLAN%u'),
                                160 => array ('code' => 'error', 'format' => 'Invalid arguments'),
                                161 => array ('code' => 'error', 'format' => 'Endpoint not found. Please either set FQDN attribute or assign an IP address to the object.'),
@@ -4799,7 +4797,15 @@ function renderUIConfigEditForm ()
 // renders a form suitable for submit. Ah, and it does submit processing as well.
 function renderVLANMembership ($object_id)
 {
-       $data = getSwitchVLANs ($object_id);
+       try
+       {
+               $data = getSwitchVLANs ($object_id);
+       }
+       catch (RTGatewayError $re)
+       {
+               showWarning ('Device configuration unavailable:<br>' . $re->getMessage());
+               return;
+       }
        list ($vlanlist, $portlist, $maclist) = $data;
        $vlanpermissions = array();
        foreach ($portlist as $port)
index 45718e415bbe9ba7961959114a1e1ccac37acb82..d0a79faaf71d03054a98aa1949ce4a2cf2532b3e 100644 (file)
@@ -1580,16 +1580,21 @@ function saveRackCode ()
        return buildRedirectURL (__FUNCTION__, 'ERR2');
 }
 
-$msgcode['setPortVLAN']['ERR1'] = 156;
+$msgcode['setPortVLAN']['ERR'] = 164;
 // This handler's context is pre-built, but not authorized. It is assumed, that the
 // handler will take existing context and before each commit check authorization
 // on the base chain plus necessary context added.
 function setPortVLAN ()
 {
        assertUIntArg ('portcount');
-       $data = getSwitchVLANs ($_REQUEST['object_id']);
-       if ($data === NULL)
-               return buildRedirectURL (__FUNCTION__, 'ERR1');
+       try
+       {
+               $data = getSwitchVLANs ($_REQUEST['object_id']);
+       }
+       catch (RTGatewayError $re)
+       {
+               return buildRedirectURL (__FUNCTION__, 'ERR', array ($re->getMessage()));
+       }
        list ($vlanlist, $portlist) = $data;
        // Here we just build up 1 set command for the gateway with all of the ports
        // included. The gateway is expected to filter unnecessary changes silently
@@ -1600,36 +1605,32 @@ function setPortVLAN ()
        $log = emptyLog();
        $setcmd = '';
        for ($i = 0; $i < $nports; $i++)
+       {
+               genericAssertion ('portname_' . $i, 'string');
+               genericAssertion ('vlanid_' . $i, 'string');
+               if ($_REQUEST['portname_' . $i] != $portlist[$i]['portname'])
+                       throw new InvalidRequestArgException ('portname_' . $i, $_REQUEST['portname_' . $i], 'expected to be ' . $portlist[$i]['portname']);
                if
-               (
-                       !isset ($_REQUEST['portname_' . $i]) ||
-                       !isset ($_REQUEST['vlanid_' . $i]) ||
-                       $_REQUEST['portname_' . $i] != $portlist[$i]['portname']
-               )
-                       $log['m'][] = array ('c' => 158, 'a' => array ($i));
-               elseif
                (
                        $_REQUEST['vlanid_' . $i] == $portlist[$i]['vlanid'] ||
                        $portlist[$i]['vlaind'] == 'TRUNK'
                )
                        continue;
-               else
+               $portname = $_REQUEST['portname_' . $i];
+               $oldvlanid = $portlist[$i]['vlanid'];
+               $newvlanid = $_REQUEST['vlanid_' . $i];
+               if
+               (
+                       !permitted (NULL, NULL, NULL, array (array ('tag' => '$fromvlan_' . $oldvlanid))) or
+                       !permitted (NULL, NULL, NULL, array (array ('tag' => '$tovlan_' . $newvlanid)))
+               )
                {
-                       $portname = $_REQUEST['portname_' . $i];
-                       $oldvlanid = $portlist[$i]['vlanid'];
-                       $newvlanid = $_REQUEST['vlanid_' . $i];
-                       if
-                       (
-                               !permitted (NULL, NULL, NULL, array (array ('tag' => '$fromvlan_' . $oldvlanid))) or
-                               !permitted (NULL, NULL, NULL, array (array ('tag' => '$tovlan_' . $newvlanid)))
-                       )
-                       {
-                               $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
-                               continue;
-                       }
-                       $setcmd .= $prefix . $portname . '=' . $newvlanid;
-                       $prefix = ';';
+                       $log['m'][] = array ('c' => 159, 'a' => array ($portname, $oldvlanid, $newvlanid));
+                       continue;
                }
+               $setcmd .= $prefix . $portname . '=' . $newvlanid;
+               $prefix = ';';
+       }
        // Feed the gateway and interpret its (non)response.
        if ($setcmd != '')
                $log['m'] = array_merge ($log['m'], setSwitchVLANs ($_REQUEST['object_id'], $setcmd));