r3305 gwRetrieveDeviceConfig(): initial implementation of gateway wrapper for "device...
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 1 Mar 2010 14:26:45 +0000 (14:26 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 1 Mar 2010 14:26:45 +0000 (14:26 +0000)
deviceconfig: fill in provided temporary file instead of making own one

gateways/deviceconfig/main
inc/gateways.php

index 518535a6076dcf1ef29123bad5f696bd6cc6feae..41d88197f8886ad102d3ba6f35f8e4a8e428c2e5 100755 (executable)
@@ -4,11 +4,9 @@
 # equivalent) and prints it onto stdout. When run, it accepts the
 # only command on stdin:
 #
-# * retrieve <endpoint> <hardware> <software>: print text and terminate
+# * retrieve <endpoint> <outputfile> <hardware> <software>
+#   (save config text into provided file)
 
-endpoint=
-hw=
-sw=
 MYDIR=`dirname $0`
 
 decode_error()
@@ -46,17 +44,18 @@ decode_error()
 
 do_work()
 {
-       endpoint=`echo $args | cut -s -d' ' -f1`
-       hw=`echo $args | cut -s -d' ' -f2`
-       sw=`echo $args | cut -s -d' ' -f3`
+       local endpoint=`echo $args | cut -s -d' ' -f1`
+       local conftext=`echo $args | cut -s -d' ' -f2`
+       local hw=`echo $args | cut -s -d' ' -f3`
+       local sw=`echo $args | cut -s -d' ' -f4`
        # sanity checks
-       if [ -z "$endpoint" -o -z "$hw" -o -z "$sw" ]; then
+       if [ -z "$endpoint" -o -z "$conftext" -o -z "$hw" -o -z "$sw" ]; then
                echo 'ERR!too few arguments to connect'
                return
        fi
        case "$sw" in
                Cisco+IOS+12.0|Cisco+IOS+12.1|Cisco+IOS+12.2)
-                       handler=cisco
+                       local handler=cisco
                ;;
                *)
                        echo "ERR!Don't know how to handle $sw on $endpoint"
@@ -64,17 +63,10 @@ do_work()
                ;;
        esac
 
-       CONFTEXT=`mktemp /tmp/racktables.XXXX`
-       if ! [ -f "$CONFTEXT" ]; then
-               echo 'ERR!could not create tmpfile'
-               return
-       fi
-
-       "$MYDIR/$handler.connector" $endpoint "$CONFTEXT"
-       ret=$?
+       "$MYDIR/$handler.connector" $endpoint "$conftext"
+       local ret=$?
        if [ $ret = 0 ]; then
                echo "OK!connected to $endpoint"
-               cat "$CONFTEXT"
        else
                echo -n "ERR!Cannot connect to $endpoint ("
                decode_error $ret
@@ -86,8 +78,6 @@ while read cmd args; do
        case $cmd in
                retrieve)
                        do_work $args
-                       rm -f "$CONFTEXT"
-                       exit 0
                        ;;
                *)
                        echo "ERR!unknown command $cmd"
index a70562e630be878d3e7ad5e20e09cd7dfb39370b..4e6b983a6a45624fab73004e05dc2e2e49edc8c4 100644 (file)
@@ -275,4 +275,41 @@ function gwRecvFileFromObject ($object_id = 0, $handlername, &$output)
        return gwRecvFile ($endpoint, $handlername, $output);
 }
 
+function gwRetrieveDeviceConfig ($object_id = 0, &$output)
+{
+       if ($object_id <= 0)
+               return oneLiner (160); // invalid arguments
+       $objectInfo = spotEntity ('object', $object_id);
+       $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
+       if (count ($endpoints) == 0)
+               return oneLiner (161); // endpoint not found
+       if (count ($endpoints) > 1)
+               return oneLiner (162); // can't pick an address
+       $endpoint = str_replace (' ', '\ ', str_replace (' ', '+', $endpoints[0]));
+       $tmpfilename = tempnam ('', 'RackTables-sendfile-');
+       $hwtype = $swtype = 'unknown';
+       foreach (getAttrValues ($object_id) as $record)
+       {
+               if ($record['name'] == 'SW type' && strlen ($record['o_value']))
+                       $swtype = str_replace (' ', '+', execGMarker ($record['o_value']));
+               if ($record['name'] == 'HW type' && strlen ($record['o_value']))
+                       $hwtype = str_replace (' ', '+', execGMarker ($record['o_value']));
+       }
+       $outputlines = queryGateway
+       (
+               'deviceconfig',
+               array ("retrieve ${endpoint} ${tmpfilename} ${hwtype} ${swtype}")
+       );
+       $output = file_get_contents ($tmpfilename);
+       unlink ($tmpfilename);
+       if ($outputlines == NULL)
+               return oneLiner (163); // unknown gateway failure
+       if (count ($outputlines) != 1)
+               return oneLiner (165); // protocol violation
+       if (strpos ($outputlines[0], 'OK!') !== 0)
+               return oneLiner (164, array ($outputlines[0])); // gateway failure
+       // Being here means having 'OK!' in the response.
+       return oneLiner (66, array ($handlername)); // ignore provided "Ok" text
+}
+
 ?>