Manually edit parameters.
[gnucomo.git] / src / web / parameter.php
1 <?php 
2
3 /**************************************************************************
4 **  (c) Copyright 2003, Andromeda Technology & Automation
5 ** This is free software; you can redistribute it and/or modify it under the
6 ** terms of the GNU General Public License, see the file COPYING.
7 ***************************************************************************
8 ** MODULE INFORMATION *
9 ***********************
10 **      FILE NAME      : parameter.php
11 **      SYSTEM NAME    : Gnucomo - Gnu Computer Monitoring
12 **      VERSION NUMBER : $Revision: 1.8 $
13 **
14 **  DESCRIPTION      : Parameter administration for a specific object.
15 **                     Input - GET[oid]    : Object id
16 **
17 **  EXPORTED OBJECTS : 
18 **  LOCAL    OBJECTS : 
19 **  MODULES  USED    :
20 ***************************************************************************
21 **  ADMINISTRATIVE INFORMATION *
22 ********************************
23 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
24 **      CREATION DATE   : Dec 04, 2002
25 **      LAST UPDATE     : Aug 04, 2003
26 **      MODIFICATIONS   : 
27 **************************************************************************/
28
29 /*****************************
30    $Log: parameter.php,v $
31    Revision 1.8  2007-01-11 13:44:29  arjen
32    Manually edit parameters.
33    View logs from abusing IP addresses.
34
35    Revision 1.7  2003/12/03 08:03:28  arjen
36    Optionally show or hide removed parameters from the parameter
37    comparison page.
38
39    Revision 1.6  2003/08/14 10:33:01  arjen
40    Added performance measurement.
41
42    Revision 1.5  2003/07/15 11:06:45  arjen
43    Removed parameters are displayed in a shaded style.
44
45    Revision 1.4  2003/02/21 08:50:12  arjen
46    Database optimizations.
47
48    Revision 1.3  2003/02/13 09:01:29  arjen
49    All web interface pages use the page class.
50
51    Revision 1.2  2003/02/05 09:47:39  arjen
52    Display the difference of all package class parameters for two objects
53
54 ******************************/
55
56 // RCSID = "$Id: parameter.php,v 1.8 2007-01-11 13:44:29 arjen Exp $";
57
58
59 ini_set('include_path', '.:./classes:../phpclasses');
60
61 require_once('page.class.php');
62
63
64 /*  Local functions */
65
66 function getmicrotime()
67 {
68    list ($usec, $sec) = explode(" ", microtime());
69    return (float)$sec + (float)$usec;
70 }
71
72 function object_selection($db, $skip_oid)
73 {
74    /*  Create and print an HTML option list of objects */
75
76    $res = pg_exec("SELECT objectid, objectname FROM object WHERE objectid != "
77                      . $skip_oid . "ORDER BY objectname");
78    for ($row = 0; $row < pg_numrows($res); $row++)
79    {
80       $obj = pg_fetch_object($res, $row);
81       echo "<option value='" . $obj->objectid . "'>";
82       echo $obj->objectname;
83       echo "</option>";
84    }
85 }
86
87 class param_page extends page
88 {
89
90    function Body()
91    {
92
93    if (!empty($_GET['oid']))
94    {
95       $ObjId = $_GET['oid'];
96
97       $res = pg_exec($this->database, "SELECT objectname FROM object WHERE objectid=CAST('" . $ObjId ."' AS BIGINT)");
98       $obj = pg_fetch_object($res, 0);
99       echo "<h1>Parameters for " . $obj->objectname . "</h1>";
100
101       echo "Action = " . $_POST['action'] . "<br>";
102       //  See if we have an update for the database
103       if (isset($_POST['action']) && $_POST['action'] == 'Create Parameter')
104       {
105          $name = $_POST['paramname'];
106          $class = $_POST['paramclass'];
107          $description = $_POST['paramdescr'];
108
109          echo "<h2>Creating parameter $name of class $class.</h2>";
110
111          echo "<form action='parameter.php?oid=$ObjId' method='post'>";
112          echo "<input type='hidden' name='paramclass' value='$class'>";
113          echo "<input type='hidden' name='paramname' value='$name'>";
114          echo "Description : <input type='text' name='paramdescr' value='$description'>";
115          echo "<br>";
116          echo "<table>";
117          echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>";
118
119          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='$class'");
120          for ($row = 0; $row < pg_numrows($class_res); $row++)
121          {
122             $prop = pg_fetch_object($class_res, $row);
123             echo "<tr>";
124             echo "<td>", $prop->property_name, "</td><td>", $prop->description, "</td>";
125             echo "<td><input type='text' name='" . $prop->property_name . "'></td>";
126             echo "</tr>";
127          }
128          echo "</table>";
129          echo "<input type='submit' name='action' value='Save New Parameter'>";
130          echo "</form>";
131       }
132
133       if (isset($_POST['action']) && $_POST['action'] == 'Save New Parameter')
134       {
135          $name = $_POST['paramname'];
136          $class = $_POST['paramclass'];
137          $description = $_POST['paramdescr'];
138
139          echo "<h2>Saving new parameter $name of class $class.</h2>";
140
141          echo "Description : $description";
142          echo "<br>";
143
144          $insertion = "insert into parameter (objectid, name, class, description) values ";
145          $insertion .= "('$ObjId', '$name', '$class', '$description')";
146          pg_exec($this->database, $insertion);
147          $par = pg_fetch_object(pg_exec($this->database, "select currval('paramid_seq')"), 0);
148
149          echo "<table>";
150          echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>";
151
152          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='$class'");
153          for ($row = 0; $row < pg_numrows($class_res); $row++)
154          {
155             $prop = pg_fetch_object($class_res, $row);
156             $insertion = "insert into property (paramid, name, value, type, min, max) values ('";
157             $insertion .= $par->currval . "', '" . $prop->property_name . "', '";
158             $insertion .= $_POST[$prop->property_name] . "', '" . $prop->property_type . "', '";
159             $insertion .= $prop->min . "', '" . $prop->max . "')";
160
161             pg_exec($this->database, $insertion);
162
163             $insertion = "insert into history (paramid, modified, change_nature, changed_property, new_value)";
164             $insertion .= " values ('" . $par->currval . "', '";
165             $insertion .= date('Y-m-d H:i:s') . "', 'CREATED', '";
166             $insertion .= $prop->property_name . "', '" . $_POST[$prop->property_name] . "')";
167
168             pg_exec($this->database, $insertion);
169  
170             echo "<tr>";
171             echo "<td>", $prop->property_name, "</td><td>", $prop->description, "</td>";
172             echo "<td>" . $_POST[$prop->property_name] . "</td>";
173             echo "</tr>";
174          }
175          echo "</table>";
176       }
177
178       
179      ?>
180      <form action='parameter_compare.php' method='post'>
181        <input type='hidden' name='oid' value='<?php echo $ObjId  ?>'>
182        Compare to object:
183        <select name='compare_to'>
184          <?php object_selection($this->database, $ObjId ); ?>
185        </select>
186        <input type='hidden' name='class' value='package'>
187        <input type='checkbox' name='show_removed' value='on'>Show removed parameters
188        <input type='submit' value=' Show Difference'>
189      </form>
190      <?php
191       echo "<hr>";
192       echo "<table>";
193       $row = 0;
194       $start_time = getmicrotime();
195       $res = pg_exec($this->database, "SELECT paramid, class, name, description FROM parameter "
196                      ."WHERE objectid= CAST('" . $ObjId  . "' AS BIGINT) order by class, name");
197       while ($row < pg_numrows($res))
198       {
199          $par = pg_fetch_object($res, $row);
200          $qry ="select change_nature from history where paramid= CAST('";
201          $qry .= $par->paramid . "' AS BIGINT) order by modified desc";
202          $rhist = pg_exec($this->database, $qry);
203          $hist = pg_fetch_object($rhist, 0);
204          if ($hist->change_nature != "REMOVED")
205          {
206             ?>
207             <tr><td align='center'>
208                <?php echo $par->class?>
209             </td><td>
210                <?php echo "<a href=parameter.php?paramid=" . $par->paramid . ">" . $par->name . "</a>"?>
211             </td><td>
212                <?php echo $par->description?>
213             </td><td>
214                <?php
215                   $r = pg_exec($this->database, "SELECT name, value FROM property
216                                               WHERE paramid=CAST('" . $par->paramid . "' AS BIGINT)");
217                   for ($p = 0; $p < pg_numrows($r); $p++)
218                   {
219                      $prop = pg_fetch_object($r, $p);
220                      echo $prop->name . "=" . $prop->value . " ";
221                   }
222                ?>
223             </td></tr>
224             <?php
225          }
226          $row++;
227       }
228       echo "</table>";
229       $duration = getmicrotime() - $start_time;
230
231       echo "$row parameters in " . round($duration, 3) . " seconds (";
232       echo round($duration / $row * 1000, 3) . " milliseconds per parameter).<br>";
233       ?>
234         <h2>Create new parameter:</h2>
235         <p>
236         <form action='parameter.php?oid=<?php echo $ObjId ?>' method='post'>
237           Class : <input type='text' name='paramclass'>
238           Name : <input type='text' name='paramname'>
239           Description : <input type='text' name='paramdescr'>
240         <br>
241         <input type='submit' name='action' value='Create Parameter'>
242         </form>
243         </p>
244       <?php 
245    }
246    if (!empty($_GET['paramid']))
247    {
248       // Edit a specific parameter
249
250       $paramid = $_GET['paramid'];
251       $par = pg_fetch_object(pg_exec($this->database, "SELECT * FROM parameter WHERE paramid='$paramid'"), 0);
252
253       if (isset($_POST['action']) && $_POST['action'] == 'Update Parameter')
254       {
255          //  Update each property if its value has changed
256
257          $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='" . $par->class . "'");
258          for ($row = 0; $row < pg_numrows($class_res); $row++)
259          {
260             $prop = pg_fetch_object($class_res, $row);
261             $pname = $prop->property_name;
262             $property = pg_fetch_object(pg_exec($this->database,
263                             "SELECT value FROM property WHERE paramid='$paramid' AND name='$pname'"), 0);
264             $pvalue = $property->value;
265             if ($pvalue != $_POST[$pname])
266             {
267                $pvalue = $_POST[$pname];
268
269                pg_exec($this->database, "UPDATE property SET value='$pvalue' WHERE paramid='$paramid' AND name='$pname'");
270
271                $insertion = "insert into history (paramid, modified, change_nature, changed_property, new_value)";
272                $insertion .= " values ('" . $paramid . "', '";
273                $insertion .= date('Y-m-d H:i:s') . "', 'MODIFIED', '";
274                $insertion .= $pname . "', '" . $pvalue . "')";
275
276                pg_exec($this->database, $insertion);
277             }
278          }
279       }
280
281       echo "<h1>Parameter " . $par->name . " of class " . $par->class . "</h1>\n";
282
283       echo "<form action='parameter.php?paramid=$paramid' method='post'>\n";
284       echo "Description : <input type='text' name='paramdescr' value='" . $par->description . "'>\n";
285       echo "<br>";
286       echo "<table>\n";
287       echo "<tr><th>Property</th><th>Description</th><th>Value</th></tr>\n";
288
289       $class_res = pg_exec($this->database, "SELECT * FROM parameter_class WHERE name='" . $par->class . "'");
290       for ($row = 0; $row < pg_numrows($class_res); $row++)
291       {
292          $prop = pg_fetch_object($class_res, $row);
293          $pname = $prop->property_name;
294          $property = pg_fetch_object(pg_exec($this->database,
295                          "SELECT value FROM property WHERE paramid='$paramid' AND name='$pname'"), 0);
296          $pvalue = $property->value;
297          echo "<tr>";
298          echo "<td>", $pname, "</td><td>", $prop->description, "</td>";
299          echo "<td><input type='text' name='$pname' value='$pvalue'></td>";
300          echo "</tr>\n";
301       }
302       echo "</table>\n";
303       echo "<input type='submit' name='action' value='Update Parameter'>\n";
304       echo "</form>\n";
305
306       echo "<h2>Change history for " . $par->class . " parameter " . $par->name . "</h2>";
307
308       $histres = pg_exec($this->database, "SELECT * FROM history WHERE paramid='$paramid' ORDER BY modified");
309       echo "<table>";
310       for ($row = 0; $row < pg_numrows($histres); $row++)
311       {
312          $hist = pg_fetch_object($histres, $row);
313          echo "<tr>";
314          echo "<td>" . $hist->changed_property . "</td>";
315          echo "<td>" . $hist->modified . "</td>";
316          echo "<td>" . $hist->change_nature . "</td>";
317          echo "<td>" . $hist->new_value . "</td>";
318          echo "</tr>\n";
319       }
320       echo "</table>";
321    }
322    }
323 }
324
325 $page = new param_page("Gnucomo Parameters");
326
327 $page->Showpage();
328
329 ?>