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