r1823 + now fix URLs...
[racktables] / inc / ophandlers.php
index 0ac80dc42a743a1bacbb47150e60e08e6323f483..9607f991eaa1fb66da23ebc97a9f53982da667aa 100644 (file)
@@ -5,6 +5,82 @@
 *
 */
 
+// This function assures that specified argument was passed
+// and is a number greater than zero.
+function assertUIntArg ($argname, $allow_zero = FALSE)
+{
+       if (!isset ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is missing.", __FUNCTION__);
+               die();
+       }
+       if (!is_numeric ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is not a number.", __FUNCTION__);
+               die();
+       }
+       if ($_REQUEST[$argname] < 0)
+       {
+               showError ("Parameter '${argname}' is less than zero.", __FUNCTION__);
+               die();
+       }
+       if (!$allow_zero and $_REQUEST[$argname] == 0)
+       {
+               showError ("Parameter '${argname}' is equal to zero.", __FUNCTION__);
+               die();
+       }
+}
+
+// This function assures that specified argument was passed
+// and is a non-empty string.
+function assertStringArg ($argname, $ok_if_empty = FALSE)
+{
+       if (!isset ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is missing.", __FUNCTION__);
+               die();
+       }
+       if (!is_string ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is not a string.", __FUNCTION__);
+               die();
+       }
+       if (!$ok_if_empty and empty ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is an empty string.", __FUNCTION__);
+               die();
+       }
+}
+
+function assertBoolArg ($argname, $ok_if_empty = FALSE)
+{
+       if (!isset ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is missing.", __FUNCTION__);
+               die();
+       }
+       if (!is_string ($_REQUEST[$argname]) or $_REQUEST[$argname] != 'on')
+       {
+               showError ("Parameter '${argname}' is not a string.", __FUNCTION__);
+               die();
+       }
+       if (!$ok_if_empty and empty ($_REQUEST[$argname]))
+       {
+               showError ("Parameter '${argname}' is an empty string.", __FUNCTION__);
+               die();
+       }
+}
+
+function assertIPv4Arg ($argname, $ok_if_empty = FALSE)
+{
+       assertStringArg ($argname, $ok_if_empty);
+       if (!empty ($_REQUEST[$argname]) and long2ip (ip2long ($_REQUEST[$argname])) !== $_REQUEST[$argname])
+       {
+               showError ("IPv4 address validation failed for value '" . $_REQUEST[$argname] . "'", __FUNCTION__);
+               die();
+       }
+}
+
 function addPortForwarding ()
 {
        global $root, $pageno, $tabno;
@@ -926,6 +1002,9 @@ function resetUIConfig()
        setConfigVar ('RACK_PRESELECT_THRESHOLD','1');
        setConfigVar ('DEFAULT_IPV4_RS_INSERVICE','no');
        setConfigVar ('AUTOPORTS_CONFIG','4 = 1*33*kvm + 2*24*eth%u;15 = 1*446*kvm');
+       setConfigVar ('SHOW_EXPLICIT_TAGS','yes');
+       setConfigVar ('SHOW_IMPLICIT_TAGS','yes');
+       setConfigVar ('SHOW_AUTOMATIC_TAGS','no');
        setConfigVar ('DEFAULT_OBJECT_TYPE','4');
        return "${root}?page=${pageno}&tab=default&message=" . urlencode ("Reset complete");
 }
@@ -936,14 +1015,14 @@ function addRealServer ()
        global $root, $pageno, $tabno;
 
        assertUIntArg ('id');
-       assertIPv4Arg ('rsip');
+       assertIPv4Arg ('remoteip');
        assertUIntArg ('rsport');
        assertStringArg ('rsconfig', TRUE);
        $pool_id = $_REQUEST['id'];
-       if (!addRStoRSPool ($pool_id, $_REQUEST['rsip'], $_REQUEST['rsport'], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('addRStoRSPool() failed');
+       if (!addRStoRSPool ($pool_id, $_REQUEST['remoteip'], $_REQUEST['rsport'], getConfigVar ('DEFAULT_IPV4_RS_INSERVICE'), $_REQUEST['rsconfig']))
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('addRStoRSPool() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully added");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Real server was successfully added");
 }
 
 // Parse textarea submitted and try adding a real server for each line.
@@ -996,9 +1075,9 @@ function addRealServers ()
                }
        }
        if ($nbad == 0 and $ngood > 0)
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Successfully added ${ngood} real servers");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Successfully added ${ngood} real servers");
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ("Added ${ngood} real servers and encountered ${nbad} errors");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ("Added ${ngood} real servers and encountered ${nbad} errors");
 }
 
 function addVService ()
@@ -1029,9 +1108,9 @@ function deleteRealServer ()
        assertUIntArg ('id');
        $pool_id = $_REQUEST['pool_id'];
        if (!commitDeleteRS ($_REQUEST['id']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitDeleteRS() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('commitDeleteRS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully deleted");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Real server was successfully deleted");
 }
 
 function deleteLoadBalancer ()
@@ -1043,9 +1122,9 @@ function deleteLoadBalancer ()
        assertUIntArg ('vs_id');
        $pool_id = $_REQUEST['pool_id'];
        if (!commitDeleteLB ($_REQUEST['object_id'], $pool_id, $_REQUEST['vs_id']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitDeleteLB() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('commitDeleteLB() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Load balancer was successfully deleted");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Load balancer was successfully deleted");
 }
 
 function deleteVService ()
@@ -1071,9 +1150,9 @@ function updateRealServer ()
        // only necessary for generating next URL
        $pool_id = $_REQUEST['id'];
        if (!commitUpdateRS ($_REQUEST['rs_id'], $_REQUEST['rsip'], $_REQUEST['rsport'], $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitUpdateRS() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('commitUpdateRS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully updated");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Real server was successfully updated");
 }
 
 function updateLoadBalancer ()
@@ -1087,9 +1166,9 @@ function updateLoadBalancer ()
        assertStringArg ('rsconfig', TRUE);
        $pool_id = $_REQUEST['pool_id'];
        if (!commitUpdateLB ($_REQUEST['object_id'], $pool_id, $_REQUEST['vs_id'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitUpdateLB() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('commitUpdateLB() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Load balancer info was successfully updated");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Load balancer info was successfully updated");
 }
 
 function updateVService ()
@@ -1120,9 +1199,9 @@ function addLoadBalancer ()
        assertStringArg ('rsconfig', TRUE);
        $pool_id = $_REQUEST['pool_id'];
        if (!addLBtoRSPool ($pool_id, $_REQUEST['object_id'], $_REQUEST['vs_id'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('addLBtoRSPool() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ('addLBtoRSPool() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Load balancer was successfully added");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ("Load balancer was successfully added");
 }
 
 function addRSPool ()
@@ -1142,8 +1221,8 @@ function deleteRSPool ()
 {
        global $root, $pageno, $tabno;
 
-       assertUIntArg ('id');
-       if (!commitDeleteRSPool ($_REQUEST['id']))
+       assertUIntArg ('pool_id');
+       if (!commitDeleteRSPool ($_REQUEST['pool_id']))
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitDeleteRSPool() failed');
        else
                return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Real server pool was successfully deleted");
@@ -1153,11 +1232,11 @@ function updateRSPool ()
 {
        global $root, $pageno, $tabno;
 
-       assertUIntArg ('id');
+       assertUIntArg ('pool_id');
        assertStringArg ('name', TRUE);
        assertStringArg ('vsconfig', TRUE);
        assertStringArg ('rsconfig', TRUE);
-       if (!commitUpdateRSPool ($_REQUEST['id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
+       if (!commitUpdateRSPool ($_REQUEST['pool_id'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitUpdateRSPool() failed');
        else
                return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Real server pool was successfully updated");
@@ -1166,9 +1245,9 @@ function updateRSPool ()
 function updateRSInService ()
 {
        global $root, $pageno, $tabno;
-       assertUIntArg ('id');
+       assertUIntArg ('pool_id');
        assertUIntArg ('rscount');
-       $pool_id = $_REQUEST['id'];
+       $pool_id = $_REQUEST['pool_id'];
        $orig = getRSPoolInfo ($pool_id);
        $nbad = $ngood = 0;
        for ($i = 1; $i <= $_REQUEST['rscount']; $i++)
@@ -1187,9 +1266,9 @@ function updateRSInService ()
                }
        }
        if (!$nbad)
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ($ngood . " real server(s) were successfully (de)activated");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&message=" . urlencode ($ngood . " real server(s) were successfully (de)activated");
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ("Encountered ${nbad} errors, (de)activated ${ngood} real servers");
+               return "${root}?page=${pageno}&tab=${tabno}&pool_id=${pool_id}&error=" . urlencode ("Encountered ${nbad} errors, (de)activated ${ngood} real servers");
 }
 
 function importPTRData ()
@@ -1236,21 +1315,76 @@ function generateAutoPorts ()
 }
 
 // Filter out implicit tags before storing the new tag set.
-function saveObjectTags ()
+function saveEntityTags ($realm, $bypass)
 {
        global $root, $pageno, $tabno, $explicit_tags, $implicit_tags;
-       assertUIntArg ('object_id');
-       $object_id = $_REQUEST['object_id'];
-       return "${root}?page=${pageno}&tab=${tabno}&object_id=${object_id}&message=" . urlencode ('This is a dummy message.');
-       // FIXME: build a trail from the submitted data, minimize it;
-       // then find and handle any differences between the result
-       // and current explicit tag set (or wipe existing records and
-       // store the whole new set instead).
-       $nchanges = 0;
-       foreach ($_REQUEST['taglist'] as $tag_id)
+       assertUIntArg ($bypass);
+       $entity_id = $_REQUEST[$bypass];
+       // Build a trail from the submitted data, minimize it,
+       // then wipe existing records and store the new set instead.
+       wipeTags ($realm, $entity_id);
+       $newtrail = getExplicitTagsOnly (buildTrailFromIds ($_REQUEST['taglist']));
+       $n_succeeds = $n_errors = 0;
+       foreach ($newtrail as $taginfo)
        {
-//             if (tagOnTrail ($explicit
+               if (useInsertBlade ('TagStorage', array ('target_realm' => "'${realm}'", 'target_id' => $entity_id, 'tag_id' => $taginfo['id'])))
+                       $n_succeeds++;
+               else
+                       $n_errors++;
        }
+       if ($n_errors)
+               return "${root}?page=${pageno}&tab=${tabno}&${bypass}=${entity_id}&error=" . urlencode ("Replaced trail with ${n_succeeds} tags, but experienced ${n_errors} errors.");
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&${bypass}=${entity_id}&message=" . urlencode ("New trail is ${n_succeeds} tags long");
+}
+
+function saveObjectTags ()
+{
+       return saveEntityTags ('object', 'object_id');
+}
+
+function saveIPv4PrefixTags ()
+{
+       return saveEntityTags ('ipv4net', 'id');
+}
+
+function saveRackTags ()
+{
+       return saveEntityTags ('rack', 'rack_id');
+}
+
+function saveIPv4VSTags ()
+{
+       return saveEntityTags ('ipv4vs', 'id');
+}
+
+function saveIPv4RSPoolTags ()
+{
+       return saveEntityTags ('ipv4rspool', 'id');
+}
+
+function destroyTag ()
+{
+       global $root, $pageno, $tabno;
+       assertUIntArg ('id');
+       if (($ret = commitDestroyTag ($_REQUEST['id'])) == '')
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Successfully deleted tag.");
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Error deleting tag: '${ret}'");
+}
+
+function createTag ()
+{
+       global $root, $pageno, $tabno;
+       assertStringArg ('tagname');
+       assertUIntArg ('parent_id', TRUE);
+       $tagname = trim ($_REQUEST['tagname']);
+       if (($parent_id = $_REQUEST['parent_id']) <= 0)
+               $parent_id = 'NULL';
+       if (($ret = commitCreateTag ($tagname, $parent_id)) == '')
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Created tag '${tagname}'.");
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Could not create tag '${tagname}' because of error '${ret}'");
 }
 
 ?>