Lots of updates GET -> POST, ROM support
[people/meteger/rom-o-matic/.git] / utils.php
1 <? // -*- Mode: PHP; -*-
2
3 // Show more runtime errors
4 // error_reporting ( -1 );
5
6 // Include table of user-configurable gPXE options
7 require_once "flag-table.php";
8
9 // Include user-shadowable globals
10 require_once "globals.php";
11
12 // Allow user to shadow globals
13 if ( is_file ( 'local-config.php' ) ) { 
14     include "local-config.php";
15 }
16
17 list ( $nics, $roms ) = parse_nics_file ();
18
19 function parse_nics_file ()
20 {
21     // Extract NIC families and associated ROM PCI IDs from 
22     // the src/bin/NIC file.
23     global $src_dir;
24
25     $fd = fopen( "$src_dir/bin/NIC", "r" );
26
27     if ( $fd < 1 ) {
28         trigger_error ( "Missing NIC Config Info" );
29         exit ();
30     }
31
32     $nics = array ();
33     $roms = array ();
34     $nic = "";
35
36     while ( !feof ( $fd ) ) {
37
38         $line = trim ( fgets ( $fd, 200 ) );
39
40         $first_eight_chars = substr ( $line, 0, 8 );
41         settype ( $first_eight_chars, "string" );
42
43         if ( strpos ( $first_eight_chars, "family" ) === 0 ) {
44
45             // get pathname of NIC driver
46             list ( $dummy, $nic ) = split( "[ \t]+", $line );
47             settype ( $nic, "string" );
48             
49             // extract filename name of driver from pathname
50             $nic = substr ( $nic, strrpos ( $nic, "/" ) + 1, 
51                            strlen ( $nic ) - strrpos ( $nic, "/" ) + 1 );
52
53             $nics[$nic] = $nic;
54
55             // For each ISA NIC, there can only be one ROM variant
56             $roms[$nic] = $nic;
57         }
58
59         // If the first 8 digits of the line are hex digits
60         // add this rom to the current nic family.
61
62         if (    ( strlen ( $first_eight_chars ) == 8 ) 
63              && ( ctype_xdigit ( $first_eight_chars ) )
64              && ( $nic != "" ) ) {
65         
66             $roms[$first_eight_chars] = $nic;
67         }
68     }
69     fclose ( $fd );
70
71     // add special cases
72     $nics["undi"] = "undionly";
73     $nics["gpxe-all-drivers"] = "gpxe";
74
75     // put NICs in nice alpha order for menu
76     ksort ( $nics );
77
78     return ( array ( $nics, $roms ) );
79 }
80
81 function hidden ( $flag, $value ) 
82 {
83     $value = htmlentities ( $value );
84     return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
85 }
86
87 function checkbox ( $flag, $value ) 
88 {
89     return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
90         ($value == "on" ? " checked>" : ">" );
91 }
92
93 function textbox ( $flag, $value, $size ) 
94 {
95     $value = htmlentities ( $value );
96     return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
97 }
98  
99 function menubox ( $name, $options, $value ) 
100 {
101     $s="<select name=\"$name\">";
102
103         foreach ( $options as $ignore => $option ) {
104         if ( !$value ) $value = $option;
105         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
106             htmlentities ( $option ) . "</option>";
107     }
108     return $s . "</select>";
109 }
110
111 function keys_menubox ( $name, $options, $value ) 
112 {
113     $s="<select name=\"$name\">";
114     
115     foreach ( $options as $option => $ignore ) {
116         if ( !$value ) $value = $option;
117         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
118             htmlentities ( $option ) . "</option>";
119     }
120     return $s . "</select>";
121 }  
122
123 function default_flags () 
124 {
125     global $flag_table;
126     
127     $flags = array ();
128
129     foreach ( $flag_table as $key => $props ) {
130
131         $flag  = $props["flag"];
132         $type  = $props["type"];
133
134         // Fields like headers have no "value" property
135         $value = isset ( $props["value"] ) ? $props['value'] : '';
136
137         if ( $value != '' ) {
138             if ( $type != "on/off" || $value == "on" ) {
139                 $flags[$flag] = $props["value"];
140             }
141         }
142     }
143     return $flags;
144 }
145
146 function get_flags () 
147 {
148     global $flag_table;
149     
150     $flags = default_flags ();
151
152     foreach ( $flag_table as $key => $props ) {
153
154         $flag = $props["flag"];
155         
156         if ( isset ( $_POST["$flag"] ) ) {
157             $flags[$flag] = $_POST["$flag"];
158         }
159     }
160     return $flags;
161 }
162
163 function echo_flags ( $flags )
164 {
165     global $flag_table;
166
167     echo "<table>\n";
168
169         foreach ( $flag_table as $key => $props ) {
170
171         // Hide parameters from users that should not be changed.
172         $hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
173
174         $flag = $props["flag"];
175         $type = $props["type"];
176
177         $value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
178
179         if ( $hide_from_user == "yes" ) {
180
181             // Hidden flags cannot not be set by the user.  We use hidden form
182             // fields to keep them at their default values.
183             if ( $type != "header" ) {
184                 echo hidden ( $flag, $value );
185             }
186             
187         } else {
188             
189             // Flag (gPXE compile option) should be displayed to user
190
191             if ( $type == "header" ) {
192
193                 $label = $props["label"];
194                 echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
195
196             } else if ($type == "on/off" ) {
197
198                 echo "<td>", checkbox ( $flag, $value ), "</td><td><b>$flag</b></td>";
199
200             } else {   // don't display checkbox for non-on/off flags
201
202                 echo "<td>&nbsp;</td><td><b>$flag: </b>";
203
204                 if ($type == "choice" ) {
205                     $options = $props["options"];
206                     echo menubox($flag, $options, $value);
207
208                 } else {
209
210                     echo textbox($flag, $value, ($type == "integer" ? 5 : 25));
211                 }
212                 echo "</td>";
213             }
214             echo "</tr>\n";
215
216             if ( $type != "header" ) {
217                 echo "<tr><td>&nbsp;</td>";
218                 echo "<td>\n";
219                 include_once "doc/$flag.html";
220                 echo "\n</td></tr>\n";
221             }
222         }
223     }
224     echo "</table>";
225 }
226
227 function pprint_flag ( $key, $value )
228 {
229     global $flag_table;
230
231     $type = $flag_table[$key]["type"];
232     $s = "";
233
234     if ( $type == "on/off" && $value == "on" ) {
235         $s = "#define $key";
236     } else if ( $type == "on/off" && $value != "on" ) {
237         $s = "#undef $key";
238     } else if ( $type == "string" ) {
239         if ( $value != "" ) $s = ( "#define $key \"" . cleanstring($value) . "\"" );
240     } else if ($type == "qstring" ) {
241         if ( $value != "" ) $s = ( "#define $key \\\"" . cleanstring($value) . "\\\"" );
242     } else {
243         $s = "#define $key " . cleanstring($value);
244     }
245     // print ( $s . "<br>" );
246     
247     return $s;
248 }
249
250 function pprint_flags ( $flags ) 
251 {
252     $s = "";
253         foreach ( $flags as $key => $value ) {
254         $f = pprint_flag($key, $value);
255         if ($f != "" )
256             $s .= $f . " ";
257     }
258     return $s;
259 }
260
261 function get_cfgsecs ()
262 {
263     global $flag_table;
264     $cfgsecs = array ();
265
266     foreach ( $flag_table as $key => $props ) {
267         if ( isset ( $props['cfgsec'] ) ) {
268             $cfgsec = $props["cfgsec"];
269             $cfgsecs[$cfgsec] = $cfgsec;
270         }
271     }
272     return ( $cfgsecs );
273 }
274
275 function write_gpxe_config_files ( $config_dir, $flags ) 
276 {
277     global $flag_table;
278
279     $cfgsecs = get_cfgsecs ();
280
281     foreach ( $cfgsecs as $cfgsec ) {
282
283         $fname = $config_dir . "/" . $cfgsec . ".h";
284
285         $fp = fopen ( $fname, "wb" );
286         if ( $fp <= 0 ) {
287             die ( "Unable to open $fname file for output!" );
288         }
289
290         $ifdef_secname = "CONFIG_" . strtoupper ( $cfgsec ) . "_H";
291
292         fwrite ( $fp, "#ifndef ${ifdef_secname}\n" );
293         fwrite ( $fp, "#define ${ifdef_secname}\n" );
294         fwrite ( $fp, "#include <config/defaults.h>\n" );
295
296         foreach ( $flags as $key => $value ) {
297             // When the flag matches this section name, write it out
298             if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
299                 fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
300             } 
301         }
302         fwrite ( $fp, "#endif /* ${ifdef_secname} */\n" );
303         fclose ( $fp );
304     }
305 }
306
307 function cleanstring ( $s ) 
308 {
309     $len = strlen ( $s );
310     if ( $len > 80 ) {
311         $s = substr ( $s, 0, 80 );
312     }
313
314     $s      = trim ( $s );
315     $pos    = 0;
316     $result = "";
317
318     while ( $pos < $len ) {
319         $ltr = ord ( ucfirst ( $s[$pos] ) );
320         if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) || 
321              ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) || 
322              ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
323              ( $ltr == ord ( "_" ) ) ||
324              ( $ltr == ord ( "+" ) ) ||
325              ( $ltr == ord ( ":" ) ) ||
326              ( $ltr == ord ( "/" ) ) ||
327              ( $ltr == ord ( "-" ) ) ) {
328             $result .= $s[$pos];
329         }
330         $pos++;
331     }
332     return $result;
333 }
334
335 function mktempcopy ( $src, $dst ) 
336 {
337     if ( $src[0] != "/" ) {
338         $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
339     }
340
341     $dir = tempnam ( $dst, "MDCROM" );
342     unlink( $dir );
343
344     exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );  
345     if ( $status != 0 ) {
346         die ( "src directory copy failed!" );
347     }
348     return ( $dir );
349 }
350
351 function deltempdir ( $dir )
352 {
353     $dp = opendir ( $dir );
354     if ($dp < 1) {
355         die ( "opendir failed" );
356     }
357
358     while ( $file = readdir ( $dp ) ) {
359
360         if ( is_dir ( "$dir/$file" ) ) {
361             if ($file[0] != "." ) {
362                 deltempdir ( "$dir/$file" );
363             }
364         } else {
365             unlink( "$dir/$file" );
366         }
367     }
368     closedir ( $dp );
369
370     if ( !rmdir ( "$dir" ) ) {
371         die ( "rmdir failed" );
372     }
373 }
374
375 function curDirURL () 
376 {
377         $dir = dirname ( $_SERVER['PHP_SELF'] );
378
379         if ( $dir == "." || $dir == "/" ) {
380                 $dir = "";
381         }
382
383         $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
384         $port = ( isset($_SERVER["SERVER_PORT"] ) && 
385                           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
386                                 ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
387
388         $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
389
390         $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
391                 $_SERVER["SERVER_NAME"] . $dir . "/";
392
393         return $dest;
394 }
395
396 // Debugging functions
397
398 function show_flags ( $flags ) 
399 {
400     echo ( "\$flags contains " . count ( $flags ) . " elements:" . "<br>" );
401
402         foreach ( $flags as $key => $flag ) {
403         echo ( "\$flags[" . $key . "]=" . "\"$flag\"" . "<br>" );
404     }
405 }
406
407 function dump_flag_table () 
408 {
409     global $flag_table;
410
411         foreach ( $flag_table as $key => $props ) {
412         print ( "flag_table[" . $key . "] = " . "<br>" );
413
414                 foreach ( $props as $key2 => $props2 ) {
415             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
416         }
417     }
418 }
419
420 function dump_flag_table_keys_sorted () 
421 {
422     global $flag_table;
423
424     ksort ( $flag_table );
425
426     foreach ( $flag_table as $key => $props ) {
427         print ( $key . ".html<br>" );
428     }
429 }
430
431 function dump_flag_codes () 
432 {
433     global $flag_codes;
434
435         foreach ( $flag_codes as $key => $props ) {
436         print ( "flag_codes[" . $key . "] = " . "<br>" );
437
438                 foreach ( $props as $keys2 => $props2 ) {
439             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
440         }
441     }
442 }
443
444 // For emacs:
445 // Local variables:
446 //  c-basic-offset: 4
447 //  c-indent-level: 4
448 //  tab-width: 4
449 // End:
450
451 ?>