r2292 don't display optional attributes portlet if none exist. closes ticket 87
[racktables] / render_image.php
index a1f8995..31d7ac3 100644 (file)
@@ -1,22 +1,22 @@
 <?php
 
-// This page outputs PNG rack thumbnail.
-
 require 'inc/init.php';
 
-assertStringArg ('img');
+assertStringArg ('img', 'render_image');
 switch ($_REQUEST['img'])
 {
-       case 'minirack':
-               // Thumbnails are rendered in security context of rackspace.
-               $pageno = 'rackspace';
+       case 'minirack': // rack security context
+               assertUIntArg ('rack_id', 'render_image');
+               $pageno = 'rack';
                $tabno = 'default';
-               authorize();
-               assertUIntArg ('rack_id');
-               renderRackThumb ($_REQUEST['rack_id']);
+               fixContext();
+               if (!permitted())
+                       renderAccessDeniedImage();
+               else
+                       renderRackThumb ($_REQUEST['rack_id']);
                break;
-       case 'progressbar':
-               assertUIntArg ('done', TRUE);
+       case 'progressbar': // no security context
+               assertUIntArg ('done', 'render_image', TRUE);
                renderProgressBarImage ($_REQUEST['done']);
                break;
        default:
@@ -48,6 +48,25 @@ function colorFromHex ($image, $hex)
 }
 
 function renderRackThumb ($rack_id = 0)
+{
+       // Don't call DB extra times, hence we are most probably not the
+       // only script wishing to acces the same data now.
+       header("Content-type: image/png");
+       $thumbcache = loadThumbCache ($rack_id);
+       if ($thumbcache !== NULL)
+               echo $thumbcache;
+       else
+       {
+               ob_start();
+               generateMiniRack ($rack_id);
+               $capture = ob_get_contents();
+               ob_end_flush();
+               saveThumbCache ($rack_id, $capture);
+       }
+}
+
+// Output a binary string containing the PNG minirack.
+function generateMiniRack ($rack_id = 0)
 {
        if (($rackData = getRackData ($rack_id, TRUE)) == NULL)
        {
@@ -62,6 +81,7 @@ function renderRackThumb ($rack_id = 0)
                1 => getConfigVar ('rtwidth_1'),
                2 => getConfigVar ('rtwidth_2')
        );
+       $rtdepth = 9;
        $offset[0] = 3;
        $offset[1] = 3 + $rtwidth[0];
        $offset[2] = 3 + $rtwidth[0] + $rtwidth[1];
@@ -73,10 +93,12 @@ function renderRackThumb ($rack_id = 0)
        $color = array();
        foreach (array ('F', 'A', 'U', 'T', 'Th', 'Tw', 'Thw') as $statecode)
                $color[$statecode] = colorFromHex ($img, getConfigVar ('color_' . $statecode));
-       imagerectangle ($img, 0, 0, $totalwidth - 1, $totalheight - 1, colorFromHex ($img, '000000'));
-       imagerectangle ($img, 1, 1, $totalwidth - 2, $totalheight - 2, colorFromHex ($img, 'c0c0c0'));
-       imagerectangle ($img, 2, 2, $totalwidth - 3, $totalheight - 3, colorFromHex ($img, '000000'));
-       for ($unit_no = $rackData['height']; $unit_no > 0; $unit_no--)
+       $color['black'] = colorFromHex ($img, '000000');
+       $color['gray'] = colorFromHex ($img, 'c0c0c0');
+       imagerectangle ($img, 0, 0, $totalwidth - 1, $totalheight - 1, $color['black']);
+       imagerectangle ($img, 1, 1, $totalwidth - 2, $totalheight - 2, $color['gray']);
+       imagerectangle ($img, 2, 2, $totalwidth - 3, $totalheight - 3, $color['black']);
+       for ($unit_no = 1; $unit_no <= $rackData['height']; $unit_no++)
        {
                for ($locidx = 0; $locidx < 3; $locidx++)
                {
@@ -94,7 +116,6 @@ function renderRackThumb ($rack_id = 0)
                        );
                }
        }
-       header("Content-type: image/png");
        imagepng ($img);
        imagedestroy ($img);
 }
@@ -102,8 +123,17 @@ function renderRackThumb ($rack_id = 0)
 function renderProgressBarImage ($done)
 {
        $img = @imagecreatetruecolor (100, 10);
-       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
-       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       switch (isset ($_REQUEST['theme']) ? $_REQUEST['theme'] : 'rackspace')
+       {
+               case 'sparenetwork':
+                       $color['T'] = colorFromHex ($img, '808080');
+                       $color['F'] = colorFromHex ($img, 'c0c0c0');
+                       break;
+               case 'rackspace': // teal
+               default:
+                       $color['T'] = colorFromHex ($img, getConfigVar ('color_T'));
+                       $color['F'] = colorFromHex ($img, getConfigVar ('color_F'));
+       }
        imagefilledrectangle ($img, 0, 0, $done, 10, $color['T']);
        imagefilledrectangle ($img, $done, 0, 100, 10, $color['F']);
        header("Content-type: image/png");
@@ -111,4 +141,13 @@ function renderProgressBarImage ($done)
        imagedestroy ($img);
 }
 
+function renderAccessDeniedImage ()
+{
+       $img = @imagecreatetruecolor (1, 1);
+       imagefilledrectangle ($img, 0, 0, 1, 1, colorFromHex ($img, '000000'));
+       header("Content-type: image/png");
+       imagepng ($img);
+       imagedestroy ($img);
+}
+
 ?>