r4049 addVSTRule(): enhance to support 2-mode operation (2nd is "copier")
authorDenis Ovsienko <infrastation@yandex.ru>
Thu, 16 Dec 2010 12:46:33 +0000 (12:46 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 16 Dec 2010 12:46:33 +0000 (12:46 +0000)
renderVSTRulesEditor(): idem
trigger_vst_editrules(): new function to modify tab style

ChangeLog
inc/interface.php
inc/navigation.php
inc/ophandlers.php
inc/triggers.php

index 1e159a7..f202852 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
        new feature: IPv6 support, except of LivePTR, NAT and SLB functionality (by Alexey Andriyanov)
        new feature: cable ID column for links (#328, by Giovani Zamboni and Jens Weibler)
        new feature: SNMPv3 support (#379, by Jens Weibler)
+       new feature: 802.1Q template copier
        update: cache image files thumbnails and make them JPEGs (#369, by Matt Mills)
        update: enhance rackspace click helpers (by Jeroen Benda)
        bugfix: the feature of remembering last opened tab of realm page is now working
index 0648ef4..5a762b7 100644 (file)
@@ -8673,7 +8673,7 @@ function renderVSTRulesEditor ($vst_id)
 {
        function printNewItemTR ($port_role_options)
        {
-               printOpFormIntro ('add');
+               printOpFormIntro ('add', array ('submode' => 'addnew'));
                echo '<tr>';
                echo '<td>' . getImageHREF ('add', 'add rule', TRUE, 110) . '</td>';
                echo '<td><input type=text tabindex=101 name=rule_no size=3></td>';
@@ -8685,7 +8685,27 @@ function renderVSTRulesEditor ($vst_id)
                echo '</tr></form>';
        }
        $vst = getVLANSwitchTemplate ($vst_id);
+       if (count ($vst['rules']))
+               $source_options = array();
+       else
+       {
+               $vstlist = getVSTStats();
+               $source_options = array();
+               foreach (getVSTStats() as $vst_id => $vst_info)
+                       if ($vst_info['rulec'])
+                               $source_options[$vst_id] = niftyString ('(' . $vst_info['rulec'] . ') ' . $vst_info['description']);
+       }
        echo '<center><h1>' . niftyString ($vst['description']) . '</h1></center>';
+       if (count ($source_options))
+       {
+               startPortlet ('clone another template');
+               printOpFormIntro ('add', array ('submode' => 'copyfrom'));
+               echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
+               echo '<tr><td>' . getSelect ($source_options, array ('name' => 'from_id')) . '</td>';
+               echo '<td>' . getImageHREF ('COPY', 'copy from selected', TRUE) . '</td></tr></table></form>';
+               finishPortlet();
+               startPortlet ('add rules one by one');
+       }
        echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
        echo '<tr><th>&nbsp;</th><th>sequence</th><th>regexp</th><th>role</th>';
        echo '<th>VLAN IDs</th><th>comment</th><th>&nbsp;</th></tr>';
@@ -8709,6 +8729,8 @@ function renderVSTRulesEditor ($vst_id)
        if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
                printNewItemTR ($port_role_options);
        echo '</table>';
+       if (count ($source_options))
+               finishPortlet();
 }
 
 function renderDeployQueue ($dqcode)
index dfabeaf..f5888be 100644 (file)
@@ -594,9 +594,9 @@ $page['vst']['parent'] = '8021q';
 $page['vst']['bypass'] = 'vst_id';
 $page['vst']['bypass_type'] = 'uint';
 $tab['vst']['default'] = 'View';
-#$tab['vst']['editvst'] = 'Properties';
 $tab['vst']['editrules'] = 'Rules';
 $tab['vst']['8021qorder'] = '802.1Q orders';
+$trigger['vst']['editrules'] = 'trigger_vst_editrules';
 $tabhandler['vst']['default'] = 'renderVST';
 $tabhandler['vst']['editvst'] = 'renderVSTEditor';
 $tabhandler['vst']['editrules'] = 'renderVSTRulesEditor';
index f3bded5..1d8f0c6 100644 (file)
@@ -2710,30 +2710,53 @@ function updVLANSwitchTemplate()
 }
 
 $msgcode['addVSTRule']['OK'] = 48;
-$msgcode['addVSTRule']['ERR'] = 110;
+$msgcode['addVSTRule']['ERR1'] = 110;
+$msgcode['addVSTRule']['ERR2'] = 179;
 function addVSTRule()
 {
        assertUIntArg ('vst_id');
-       assertUIntArg ('rule_no');
-       assertPCREArg ('port_pcre');
-       assertStringArg ('port_role');
-       assertStringArg ('wrt_vlans', TRUE);
-       assertStringArg ('description', TRUE);
-       global $sic;
-       $result = usePreparedInsertBlade
-       (
-               'VLANSTRule',
-               array
+       assertStringArg ('submode');
+       switch ($_REQUEST['submode'])
+       {
+       case 'addnew':
+               assertUIntArg ('rule_no');
+               assertPCREArg ('port_pcre');
+               assertStringArg ('port_role');
+               assertStringArg ('wrt_vlans', TRUE);
+               assertStringArg ('description', TRUE);
+               global $sic;
+               $result = usePreparedInsertBlade
                (
-                       'vst_id' => $sic['vst_id'],
-                       'rule_no' => $sic['rule_no'],
-                       'port_pcre' => $sic['port_pcre'],
-                       'port_role' => $sic['port_role'],
-                       'wrt_vlans' => $sic['wrt_vlans'],
-                       'description' => $sic['description'],
-               )
-       );
-       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
+                       'VLANSTRule',
+                       array
+                       (
+                               'vst_id' => $sic['vst_id'],
+                               'rule_no' => $sic['rule_no'],
+                               'port_pcre' => $sic['port_pcre'],
+                               'port_role' => $sic['port_role'],
+                               'wrt_vlans' => $sic['wrt_vlans'],
+                               'description' => $sic['description'],
+                       )
+               );
+               return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR1');
+               break;
+       case 'copyfrom':
+               $dst_vst = getVLANSwitchTemplate ($_REQUEST['vst_id']);
+               // FIXME: this is a race condition, which is better handled with proper locking
+               if (count ($dst_vst['rules']))
+                       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2');
+               assertUIntArg ('from_id');
+               $src_vst = getVLANSwitchTemplate ($_REQUEST['from_id']);
+               foreach ($src_vst['rules'] as $rule)
+               {
+                       $rule['vst_id'] = $_REQUEST['vst_id'];
+                       usePreparedInsertBlade ('VLANSTRule', $rule);
+               }
+               return buildRedirectURL (__FUNCTION__, 'OK');
+               break;
+       default:
+               throw new InvalidArgException ('submode', $_REQUEST['submode']);
+       }
 }
 
 $msgcode['delVSTRule']['OK'] = 49;
index 4d89524..4d9195b 100644 (file)
@@ -289,4 +289,11 @@ function trigger_anyDP ($command, $constraint)
        return '';
 }
 
+// tease rules editor tab, when the VST has no rules
+function trigger_vst_editrules()
+{
+       $vst = getVLANSwitchTemplate ($_REQUEST['vst_id']);
+       return count ($vst['rules']) ? 'std' : 'attn';
+}
+
 ?>