mgmt link on FQDN supports any protocol
authorAlexey Andriyanov <alan@al-an.info>
Wed, 11 Sep 2013 12:37:48 +0000 (16:37 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 17 Oct 2013 09:05:33 +0000 (13:05 +0400)
getMgmtProtosConfig: new func
formatAttributeValue: switch from hardcoded protocols array to the configured one
convertMgmtConfigVars: helper for converting old var values to the new format

Conflicts:
ChangeLog
README
wwwroot/inc/upgrade.php

ChangeLog
README
wwwroot/inc/functions.php
wwwroot/inc/install.php
wwwroot/inc/interface.php
wwwroot/inc/upgrade.php

index 24427cf3f7138d5a9e0f3989731e0ebd041697eb..904c35c20b52e3cf195500fbe080d11dd4bda079 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
        bugfix: update of Cisco WS-C4948 SNMPsync port definitions (#977) by Mark Wilkinson
        update: display friendlier message when attempting to NAT non-existent IP (#963) 
        update: support of Huawei CE5800 series switch
+       update: mgmt link on FQDN (telnet, ssh, rdp) now supports any protocol (MGMT_PROTOS config var)
        update: replace CodePress highlighter with CodeMirror (by Mark Jazmik)
        update: display links to newly created rows & locations (#883)
        update: add collapse/expand feature to location filter (#901)
diff --git a/README b/README
index 34841e156b6686ebe28a16680ddca7b1df658192..f3be1dc50af55b2bb17a5a4369f2ea06e6c353c2 100644 (file)
--- a/README
+++ b/README
@@ -111,6 +111,12 @@ MySQL 5.1.7.
 Cable paths can be traced and displayed in a graphical format. This requires
 the Image_GraphViz PEAR module (http://pear.php.net/package/Image_GraphViz).
 
+Config variables TELNET_OBJS_LISTSRC, SSH_OBJS_LISTSRC, RDP_OBJS_LISTSRC were merged into new MGMT_PROTOS.
+The old ones were deleted from the DB. MGMT_PROTOS allows to specify any management protocol for a particular
+device list by RackCode filter. The default value is 'ssh: {\$typeid_4}, telnet: {\$typeid_8}' which leads to
+object's FQDN linked to 'ssh://server.fqdn' and 'telnet://switch.fqdn'. If the old variables contained any data,
+it will be converted to the new syntax and stored into MGMT_PROTOS variable.
+
 *** Upgrading to 0.20.5 ***
 
 This release introduces the VS groups feature. VS groups is a new way to store
index c4a7f6b3c4077fb001c529e483ebd2fea9b36b58..b62ca4443b9b7be305d0b38fff5035f5d54e2e0c 100644 (file)
@@ -6143,4 +6143,25 @@ function cmp_array_sizes ($a, $b)
        return $diff < 0 ? -1 : ($diff > 0 ? 1 : 0);
 }
 
+// parses the value of MGMT_PROTOS config variable and returns an array
+// indexed by protocol name with corresponding textual RackCode values
+function getMgmtProtosConfig ($ignore_cache = FALSE)
+{
+       static $cache = NULL;
+       if (!$ignore_cache && isset ($cache))
+               return $cache;
+
+       $cache = array();
+       $config = getConfigVar ('MGMT_PROTOS');
+       foreach (explode (';', $config) as $item)
+       {
+               $item = trim ($item);
+               if (! strlen ($item))
+                       continue;
+               if (preg_match('/^(\S+)\s*:\s*(.*)$/', $item, $m))
+                       $cache[$m[1]] = $m[2];
+       }
+       return $cache;
+}
+
 ?>
index 4f4015029216f112412aee36f91b778960d3eff0..f5fa2897d3305fda9495055fa581d66d77128d70 100644 (file)
@@ -1772,9 +1772,7 @@ WHERE O.objtype_id = 1562";
 ('SYNCDOMAIN_MAX_PROCESSES','0','uint','yes','no', 'no', 'How many worker proceses syncdomain cron script should create'),
 ('PORT_EXCLUSION_LISTSRC','{\$typeid_3} or {\$typeid_10} or {\$typeid_11} or {\$typeid_1505} or {\$typeid_1506}','string','yes','no','no','List source: objects without ports'),
 ('FILTER_RACKLIST_BY_TAGS','yes','string','yes','no','yes','Rackspace: show only racks matching the current object\'s tags'),
-('SSH_OBJS_LISTSRC','false','string','yes','no','yes','Rackcode filter for SSH-managed objects'),
-('RDP_OBJS_LISTSRC','false','string','yes','no','yes','Rackcode filter for RDP-managed objects'),
-('TELNET_OBJS_LISTSRC','false','string','yes','no','yes','Rackcode filter for telnet-managed objects'),
+('MGMT_PROTOS','ssh: {\$typeid_4}; telnet: {\$typeid_8}','string','yes','no','yes','Mapping of management protocol to devices')
 ('SYNC_802Q_LISTSRC','','string','yes','no','no','List of VLAN switches sync is enabled on'),
 ('QUICK_LINK_PAGES','depot,ipv4space,rackspace','string','yes','no','yes','List of pages to dislay in quick links'),
 ('CACTI_LISTSRC','false','string','yes','no','no','List of object with Cacti graphs'),
index 87f02ae4532f915647c2c5a703517d5f1cf8d20a..aabec3154ee1e9faafbcc56ddbcb8568a6b647cd 100644 (file)
@@ -8301,16 +8301,20 @@ function formatAttributeValue ($record)
        if (! isset ($record['key'])) // if record is a dictionary value, generate href with autotag in cfe
        {
                if ($record['id'] == 3) // FQDN attribute
-               {
-                       $protos_to_try = array (
-                               'ssh'    => 'SSH_OBJS_LISTSRC',
-                               'telnet' => 'TELNET_OBJS_LISTSRC',
-                               'rdp'    => 'RDP_OBJS_LISTSRC',
-                       );
-                       foreach ($protos_to_try as $proto => $cfgvar)
-                               if (considerConfiguredConstraint (NULL, $cfgvar))
-                                       return "<a title='Open $proto session' class='mgmt-link' href='" . $proto . '://' . $record['a_value'] . "'>${record['a_value']}</a>";
-               }
+                       foreach (getMgmtProtosConfig() as $proto => $filter)
+                               try
+                               {
+                                       if (considerGivenConstraint (NULL, $filter))
+                                       {
+                                               $blank = (preg_match ('/^https?$/', $proto) ? 'target=_blank' : '');
+                                               return "<a $blank title='Open $proto session' class='mgmt-link' href='" . $proto . '://' . $record['a_value'] . "'>${record['a_value']}</a>";
+                                       }
+                               }
+                               catch (RackTablesError $e)
+                               {
+                                       // syntax error in $filter
+                                       continue;
+                               }
                return isset ($record['href']) ? "<a href=\"".$record['href']."\">${record['a_value']}</a>" : $record['a_value'];
        }
 
index 738c00619df397fdf6d5552628bcef6689cc3dd3..a523b882d223a9752c36f7c86c3c068f7358ac72 100644 (file)
@@ -211,6 +211,12 @@ MySQL 5.1.7.
 
 Cable paths can be traced and displayed in a graphical format. This requires
 the Image_GraphViz PEAR module (http://pear.php.net/package/Image_GraphViz).
+
+Config variables TELNET_OBJS_LISTSRC, SSH_OBJS_LISTSRC, RDP_OBJS_LISTSRC were merged into new MGMT_PROTOS.
+The old ones were deleted from the DB. MGMT_PROTOS allows to specify any management protocol for a particular
+device list by RackCode filter. The default value is 'ssh: {\$typeid_4}, telnet: {\$typeid_8}' which leads to
+object's FQDN linked to 'ssh://server.fqdn' and 'telnet://switch.fqdn'. If the old variables contained any data,
+it will be converted to the new syntax and stored into MGMT_PROTOS variable.
 ENDOFTEXT
 ,
 );
@@ -1859,6 +1865,12 @@ END;
                        // one HW type was moved from the 'Network switch' chapter to the 'Network chassis' chapter
                        // change the type of affected objects to 'Network chassis'
                        $query[] = "UPDATE `Object` SET objtype_id = 1503 WHERE id IN (SELECT object_id FROM `AttributeValue` WHERE attr_id = 2 and uint_value = 935)";
+
+                       // convert values of old 'TELNET_OBJS_LISTSRC' 'SSH_OBJS_LISTSRC', 'RDP_OBJS_LISTSRC' variables into 'MGMT_PROTOS'
+                       $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('MGMT_PROTOS','ssh: {\$typeid_4}; telnet: {\$typeid_8}','string','yes','no','yes','Mapping of management protocol to devices')";
+                       if ('' !== $mgmt_converted_var = convertMgmtConfigVars())
+                               $query[] = "UPDATE `Config` SET varvalue = '" . mysql_escape_string ($mgmt_converted_var) . "' WHERE varname = 'MGMT_PROTOS'"; // TODO: call of deprecated function
+                       $query[] = "DELETE `Config`,`UserConfig` FROM `Config` LEFT JOIN `UserConfig` USING (`varname`) WHERE `Config`.`varname` IN ('TELNET_OBJS_LISTSRC', 'SSH_OBJS_LISTSRC', 'RDP_OBJS_LISTSRC')";
                        $query[] = "UPDATE Config SET varvalue = '0.20.6' WHERE varname = 'DB_VERSION'";
                        break;
                case 'dictionary':
@@ -2179,4 +2191,22 @@ function usePreparedInsertBlade ($tablename, $columns)
        }
 }
 
+// converts the values of old-style config vars TELNET_OBJS_LISTSRC, SSH_OBJS_LISTSRC, RDP_OBJS_LISTSRC
+// to the format of MGMT_PROTOS (comma-separated list of "proto: rackcode" pairs)
+function convertMgmtConfigVars()
+{
+       global $dbxlink;
+       $ret = array();
+       foreach (array ('telnet' => 'TELNET_OBJS_LISTSRC', 'ssh' => 'SSH_OBJS_LISTSRC', 'rdp' => 'RDP_OBJS_LISTSRC') as $proto => $varname)
+       {
+               $result = $dbxlink->prepare ("SELECT varvalue FROM Config WHERE varname = ?");
+               $result->execute (array ($varname));
+               if ($row = $result->fetch (PDO::FETCH_ASSOC))
+                       if ($row['varvalue'] != 'false' && $row['varvalue'] != '')
+                               $ret[] = "$proto: " . $row['varvalue'];
+               unset ($result);
+       }
+       return implode (',', $ret);
+}
+
 ?>