More code refactoring, renamed some files.
[people/meteger/rom-o-matic/.git] / utils.php
1 <? // -*- Mode: PHP; -*-
2
3 require_once "flag-table.php";
4
5 // Some debugging calls:
6 // dump_flag_table ();
7 // dump_flag_codes ();
8 // dump_flag_table_keys_sorted ();
9 // exit ();
10
11 // Include shadow-able globals
12 require_once "globals.php";
13
14 // Allow shadowing of globals
15 include_once "local-config.php";
16
17 // echo "$version<br>"; exit ();
18
19 function value_key ( $ofmt ) 
20 {
21         // Here we decide which $flag_table key is associated with
22         // the variable we want to retrieve.  The reason for this is
23         // that we might want to return a different value based on 
24         // what kind of build we are doing.  In particular, if we ever
25         // Support EFI or LinuxBIOS builds, we might want to return
26         // different values than for PC BIOS builds. In which 
27         // case we could do someting like:
28     //    return (strpos ($ofmt, "LinuxBIOS" ) === false 
29     //            ? "value" : "valuelnx" );
30
31         // For now, we return the key "value", since that is the 
32         // slot that contains the usual value associated with this key
33     return ( "value" );
34 }
35
36 function snarf_file ( $fname ) 
37 {
38     $len = filesize ( $fname );
39     if ( $len > 0 ) {
40         $fp = fopen ( $fname, "rb" );
41         if ( $fp > 0 ) {
42             $buf = fread ( $fp, $len );
43             fclose ( $fp );
44             if ( $buf ) 
45                 return ($buf);
46         }
47     }
48     die ( "Unable to get $fname" );
49     return 0;
50 }
51
52 function get_nics () 
53 {
54     global $version, $src_dir;
55
56     $nic = ( isset ( $_GET['nic'] ) ? $_GET['nic'] : '' );
57
58     $fd = fopen( "$src_dir/bin/NIC", "r" );
59
60     if ( $fd < 1 ) {
61         trigger_error ( "Missing NIC Config Info" );
62         exit ();
63     }
64
65     $nics = array ();
66     $family = "";
67
68     while ( !feof ( $fd ) ) {
69
70         $line = trim ( fgets ( $fd, 200 ) );
71
72         if ( strpos ( $line, "family" ) === 0 ) {
73
74             list ( $dummy, $family ) = split( "[ \t]+", $line );
75             settype ( $family, "string" );
76
77         } else if ( $line != "" && $line[0] != '#' ) {
78
79             list ( $rom, $pci_ids ) = split ( "[ \t]+", $line );
80             settype ( $rom, "string" );
81
82             if ( $pci_ids == "-" ) 
83                                 $pci_ids = "";
84
85             $fam_name = substr ( $family, strrpos ( $family, "/" ) + 1, 
86                          strlen ( $family ) - strrpos ( $family, "/" ) + 1 );
87             $option = ( $pci_ids ? "$fam_name:$rom -- [$pci_ids]" : "$fam_name:$rom" );
88
89             // * Kludge - fix incoming $nic if any.
90             if ( $nic == $rom ) 
91                                 $nic = $option;
92
93             // ISA drivers are per-family, PCI are per-ROM. If ever decide
94             // to cache the drivers, can use this key.
95             $nics[$option] = ( $pci_ids ? "PCI:" . $rom : "ISA:" . $family );
96
97             // echo $nics array for debugging
98             // echo "\$nics[$option] "." -> ".$nics[$option]."<br>";
99         }
100     }
101
102     $nics["gpxe:all-drivers"] = "PCI:gpxe";
103     fclose ( $fd );
104     ksort ( $nics );
105     return( $nics );
106 }
107
108 function get_families () 
109 {
110     global $version, $src_dir;
111
112     $nic = ( isset ( $_GET['nic'] ) ? $_GET['nic'] : '' );
113
114     $fd = fopen( "$src_dir/bin/NIC", "r" );
115
116     if ( $fd < 1 ) {
117         trigger_error ( "Missing NIC Config Info" );
118         exit ();
119     }
120
121     $families = array ();
122     $family = "";
123
124     while ( !feof ( $fd ) ) {
125
126         $line = trim ( fgets ( $fd, 200 ) );
127
128         if ( strpos ( $line, "family" ) === 0 ) {
129
130             list ( $dummy, $family ) = split( "[ \t]+", $line );
131             $fam_name = substr ( $family, strrpos ( $family, "/" ) + 1, 
132                          strlen ( $family ) - strrpos ( $family, "/" ) + 1 );
133             settype ( $family, "string" );
134             
135             $families[$fam_name] = $fam_name;
136         }
137     }
138     fclose ( $fd );
139
140     // Add special cases
141     $families["all-drivers"] = "gpxe";
142         
143     ksort ( $families );
144     return ( $families );
145 }
146
147 function get_nicfile () 
148 {
149     global $ofmts;
150
151     $nic = $_GET['nic'];
152     $ofmt = $_GET['ofmt'];
153
154     $n = strpos ( $nic, " " );
155     $family = substr ( $nic, 0, strpos ( $nic,":" ) );
156
157     $rom = ( $n > 0 ? 
158          substr ( $nic, strpos ( $nic, ":" ) + 1, 
159                   $n - ( strlen ( $family ) + 1 ) ) :  
160                   $family );
161
162     $ftype = $ofmts[$ofmt];
163     if ( $ftype == "" ) $ftype = "dsk"; 
164
165     // if .rom format is requested, return rom name,
166     //   since .rom images are PCI ID specific, and 
167     //   rules only exist to build bin/$rom for Binary
168     //    ROM images types
169     if ( $ftype == "rom" )
170         $retval = cleanstring ( $rom . "." . $ftype );
171     else
172         $retval = cleanstring ( $family . "." . $ftype );
173
174     // Let's take a look at what was chosen.
175     //  echo "strpos ( \$nic, \":\" ) ->" . strpos ( $nic, ":" ) . "<br>";
176     //  echo "\$n ->" . "$n" . "<br>";
177     //  echo "\$nic ->" . "|$nic|" . "<br>";
178     //  echo "\$rom ->" . "|$rom|" . "<br>";
179     //  echo "\$family ->" . "|$family|" . "<br>";
180     //  echo "\$ftype ->" . "|$ftype|" . "<br>";
181     //  echo "\$retval ->" . "|$retval|" . "<br>";
182     //  exit();
183
184     return ( $retval );
185 }
186
187 function hidden ( $flag, $value ) 
188 {
189     $value = htmlentities ( $value );
190     return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
191 }
192
193 function checkbox ( $flag, $value ) 
194 {
195     return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
196         ($value == "on" ? " checked>" : ">" );
197 }
198
199 function textbox ( $flag, $value, $size ) 
200 {
201     $value = htmlentities ( $value );
202     return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
203 }
204  
205 function menubox ( $name, $options, $value ) 
206 {
207     $s="<select name=\"$name\">";
208
209         foreach ( $options as $ignore => $option ) {
210         if ( !$value ) $value = $option;
211         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
212             htmlentities ( $option ) . "</option>";
213     }
214     return $s . "</select>";
215 }
216
217 function keys_menubox ( $name, $options, $value ) 
218 {
219     $s="<select name=\"$name\">";
220     
221     foreach ( $options as $option => $ignore ) {
222         if ( !$value ) $value = $option;
223         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
224             htmlentities ( $option ) . "</option>";
225     }
226     return $s . "</select>";
227 }  
228
229 function encode_flags ( $flags ) 
230 {
231     // Encode flags to keep size down, so can use GET's instead of POST's
232     // Note that the value may need to be urlencoded.
233
234     global $flag_table;
235
236     $s = "";
237
238         foreach ( $flags as $flag => $value ) {
239         $prop = $flag_table[$flag];
240         $type = $prop["type"];
241         $s .= $prop["code"];
242
243         if ( $type != "on/off" ) {
244             $n = strlen ( $value );
245             $nstr = strval ( $n );
246
247             if ( $n < 10 ) 
248                 $nstr = "0" . $nstr;
249
250             if ( $n >= 80 ) 
251                 die ( "Value too long!" );
252
253             $s .= $nstr . $value;
254         }
255     }
256     return $s;
257 }
258
259 function decode_flags_into ( $s, $flags ) 
260 {
261     global $flag_codes;
262     $len = strlen ( $s );
263
264     $pos = 0;
265     while ( $pos < $len ) {
266
267         $code = substr ( $s, $pos, 2 );
268         $pos += 2;
269         $prop = $flag_codes[$code];
270         $flag = $prop["flag"];
271         $value = "on";
272         $type = $prop["type"];
273
274         if ( $prop["type"] != "on/off" ) {
275             $n = intval ( substr ( $s, $pos, 2 ) );
276             $pos += 2;
277             $value = substr ( $s, $pos, $n );
278             $pos += $n;
279         }
280         $flags[$flag] = $value;
281     }
282     return $flags;
283 }
284
285 function default_flags () 
286 {
287     global $flag_table;
288
289     if ( isset ( $_GET["F"] ) )
290         $F = $_GET["F"];
291
292     if ( isset ( $_GET["nic"] ) )
293         $nic = $_GET["nic"];
294
295     if ( isset ( $_GET["nicfile"] ) )
296         $nicfile = $_GET["nicfile"];
297
298     if ( isset ( $_GET["ofmt"] ) )
299         $ofmt = $_GET["ofmt"];
300
301     if ( isset ( $_GET["arch"] ) )
302         $arch = $_GET["arch"];
303
304     $flags = array ();
305     if ( isset ( $F ) && $F != "ignore" && isset ( $arch ) &&
306          ( ( isset ( $nic ) && isset ( $ofmt ) ) || isset ( $nicfile ) ) ) {
307         $vkey = value_key($ofmt);
308
309                 foreach ( $flag_table as $key => $props ) {
310
311             $farch = isset ( $props["arch"] ) ? $props["arch"] : "";
312
313             if ( isset ( $arch ) && ( $farch == "all" || $farch == $arch ) ) {
314
315                 $flag = $props["flag"];
316                 $type = $props["type"];
317                 $value = ( isset ( $props[$vkey] ) ? $props[$vkey] : $props["value"] );
318                 if ( $type != "on/off" || $value == "on" ) {
319                     $flags[$flag] = $value;
320                 }
321             }
322         }
323         $flags = decode_flags_into ( $F, $flags );
324     }
325     return $flags;
326 }
327
328 function get_flags () 
329 {
330     global $flag_table;
331     $flags = default_flags ();
332
333     // echo "<p>Flags in get_flags (): </p>";
334     // show_flags ( $flags );
335
336     foreach ( $flag_table as $key => $props ) {
337         $flag = $props["flag"];
338         if ( isset ( $_GET["$flag"] ) ) {
339             $flags[$flag] = $_GET["$flag"];
340         }
341     }
342     return $flags;
343 }
344
345 function echo_flags ( $flags )
346 {
347     global $version;
348     global $flag_table;
349
350     $arch = isset ( $_GET['arch'] ) ? $_GET['arch'] : '';
351
352     echo "<table>\n";
353
354         foreach ( $flag_table as $key => $props ) {
355
356         $farch = isset ( $props["arch"] ) ? $props["arch"] : "";
357
358         // Hide parameters from users that should not be changed.
359
360         $hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
361
362         $flag = $props["flag"];
363         $type = $props["type"];
364
365         $value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
366
367         if ( $hide_from_user == "yes" ) {
368
369             // Hidden flags cannot not be set by the user.  We use hidden form
370             // fields to keep them at their default values.
371             if ( $type != "header" && ( $farch == "all" || $farch == $arch ) ) {
372                 echo hidden ( $flag, $value );
373             }
374
375         } else {
376
377             if ( $type == "header" || $farch == "all" || $farch == $arch ) {
378       
379                 if ( $type == "header" ) {
380   
381                     $label = $props["label"];
382                     echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
383   
384                 } else if ($type == "on/off" ) {
385   
386                     echo "<td>", checkbox($flag, $value), "</td><td><b>$flag</b></td>";
387   
388                 } else {        // no checkbox
389   
390                     echo "<td>&nbsp;</td><td><b>$flag: </b>";
391   
392                     if ($type == "choice" ) {
393                         $options = $props["options"];
394                         echo menubox($flag, $options, $value);
395                     }
396   
397                     else {
398                         echo textbox($flag, $value, ($type == "integer" ? 5 : 25));
399                     }
400   
401                     echo "</td>";
402   
403                 }
404   
405                 echo "</tr>\n";
406   
407                 if ( $type != "header" ) {
408
409                     echo "<tr><td>&nbsp;</td>";
410                     echo "<td>\n";
411                     include_once "doc/$flag.html";
412                     echo "\n</td></tr>\n";
413
414                 }
415             }
416         }
417     }
418     echo "</table>";
419 }
420
421 function pprint_flag ( $key, $value )
422 {
423     global $flag_table;
424
425     $type = $flag_table[$key]["type"];
426     $s = "";
427
428     if ( $type == "on/off" && $value == "on" ) {
429         $s = "#define $key";
430     } else if ( $type == "on/off" && $value != "on" ) {
431         $s = "#undef $key";
432     } else if ( $type == "string" ) {
433         if ( $value != "" ) $s = ( "#define $key \"" . cleanstring($value) . "\"" );
434     } else if ($type == "qstring" ) {
435         if ( $value != "" ) $s = ( "#define $key \\\"" . cleanstring($value) . "\\\"" );
436     } else {
437         $s = "#define $key " . cleanstring($value);
438     }
439     // print ( $s . "<br>" );
440     
441     return $s;
442 }
443
444 function pprint_flags ( $flags ) 
445 {
446     $s = "";
447         foreach ( $flags as $key => $value ) {
448         $f = pprint_flag($key, $value);
449         if ($f != "" )
450             $s .= $f . " ";
451     }
452     return $s;
453 }
454
455 function get_cfgsecs ()
456 {
457     global $flag_table;
458     $cfgsecs = array ();
459
460     foreach ( $flag_table as $key => $props ) {
461         if ( isset ( $props['cfgsec'] ) ) {
462             $cfgsec = $props["cfgsec"];
463             $cfgsecs[$cfgsec] = $cfgsec;
464         }
465     }
466     return ( $cfgsecs );
467 }
468
469 function write_config_file ( $fname, $arch, $flags ) 
470 {
471     global $flag_table;
472
473     $cfgsecs = get_cfgsecs ();
474
475     $fp = fopen ( $fname, "wb" );
476     if ( $fp <= 0 ) {
477         die ( "Unable to open $fname file for output!" );
478     }
479
480     foreach ( $cfgsecs as $cfgsec ) {
481
482         fwrite ( $fp, "/* @BEGIN ${cfgsec}.h \n*/ \n\n" );
483
484         foreach ( $flags as $key => $value ) {
485
486             // When the flag matches this section name, write it out
487             if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
488                 fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
489             } 
490
491         }
492         fwrite ( $fp, "\n/* @END ${cfgsec}.h \n*/ \n\n" );
493     }
494     fclose($fp);
495 }
496
497 function write_gpxe_config_files ( $config_dir, $flags ) 
498 {
499     global $flag_table;
500
501     $cfgsecs = get_cfgsecs ();
502
503     foreach ( $cfgsecs as $cfgsec ) {
504
505         $fname = $config_dir . "/" . $cfgsec . ".h";
506
507         $fp = fopen ( $fname, "wb" );
508         if ( $fp <= 0 ) {
509             die ( "Unable to open $fname file for output!" );
510         }
511
512         $ifdef_secname = "CONFIG_" . strtoupper ( $cfgsec ) . "_H";
513
514         fwrite ( $fp, "#ifndef ${ifdef_secname}\n" );
515         fwrite ( $fp, "#define ${ifdef_secname}\n" );
516         fwrite ( $fp, "#include <config/defaults.h>\n" );
517
518         foreach ( $flags as $key => $value ) {
519             // When the flag matches this section name, write it out
520             if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
521                 fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
522             } 
523         }
524         fwrite ( $fp, "#endif /* ${ifdef_secname} */\n" );
525         fclose ( $fp );
526     }
527 }
528
529 function cleanstring ( $s ) 
530 {
531     $len = strlen ( $s );
532     if ( $len > 80 ) {
533         $s = substr ( $s, 0, 80 );
534     }
535
536     $s      = trim ( $s );
537     $pos    = 0;
538     $result = "";
539
540     while ( $pos < $len ) {
541         $ltr = ord ( ucfirst ( $s[$pos] ) );
542         if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) || 
543              ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) || 
544              ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
545              ( $ltr == ord ( "_" ) ) ||
546              ( $ltr == ord ( "+" ) ) ||
547              ( $ltr == ord ( ":" ) ) ||
548              ( $ltr == ord ( "/" ) ) ||
549              ( $ltr == ord ( "-" ) ) ) {
550             $result .= $s[$pos];
551         }
552         $pos++;
553     }
554     return $result;
555 }
556
557 function copydir ( $src, $dst ) 
558 {
559     if ( !mkdir ( $dst, 0700 ) ) {
560         die ( "mkdir failed" );
561     }
562
563     $dp = opendir ( $src );
564     if ( $dp < 1 ) {
565         die ( "opendir failed" );
566     }
567
568     while ( $file = readdir ( $dp ) ) {
569
570         if ( is_dir ( "$src/$file" ) ) {
571
572             if ($file[0] != "." ) {
573                 copydir ( "$src/$file", "$dst/$file" );
574             }
575         } else {
576
577             copy ( "$src/$file", "$dst/$file" );
578         }
579     }
580     closedir ( $dp );
581 }
582
583 function mktempcopy ( $src, $dst ) 
584 {
585     if ( $src[0] != "/" ) {
586         $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
587     }
588
589     $dir = tempnam ( $dst, "ROM" );
590     unlink( $dir );
591
592     //  copydir ( $src, $dir );
593
594     exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );  
595
596     if ( $status != 0 ) {
597         die ( "src directory copy failed!" );
598     }
599     return ( $dir );
600 }
601
602 function deltempdir ( $dir ) 
603 {
604     $dp = opendir ( $dir );
605     if ($dp < 1) {
606         die ( "opendir failed" );
607     }
608
609     while ( $file = readdir ( $dp ) ) {
610
611         if ( is_dir ( "$dir/$file" ) ) {
612             if ($file[0] != "." ) {
613                 deltempdir ( "$dir/$file" );
614             }
615         } else {
616             unlink( "$dir/$file" );
617         }
618     }
619     closedir ( $dp );
620
621     if ( !rmdir ( "$dir" ) ) {
622         die ( "rmdir failed" );
623     }
624 }
625
626 // Debugging functions
627
628 function debug_info () 
629 {
630     $F = $_GET['F'];
631     $nic = $_GET['nic'];
632     $ofmt = $_GET['ofmt'];
633
634     $s = "F=\"" . htmlentities($F) . "\"<br>\n";
635     $s .= "nic=\"" . htmlentities($nic) . "\"<br>\n";
636     $s .= "ofmt=\"" . htmlentities($ofmt) . "\"<br>\n";
637
638     return $s;
639 }
640
641 function showflags ( $flags ) 
642 {
643         foreach ( $flags as $key => $flag ) {
644         print ( "flag[".$key."]="."\"$flag\""."<br>" );
645     }
646 }
647
648 function dump_flag_table () 
649 {
650     global $flag_table;
651
652         foreach ( $flag_table as $key => $props ) {
653         print ( "flag_table[" . $key . "] = " . "<br>" );
654
655                 foreach ( $props as $key2 => $props2 ) {
656             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
657         }
658     }
659 }
660
661 function dump_flag_table_keys_sorted () 
662 {
663     global $flag_table;
664
665     ksort ( $flag_table );
666
667     foreach ( $flag_table as $key => $props ) {
668         print ( $key . ".html<br>" );
669     }
670 }
671
672 function dump_flag_codes () 
673 {
674     global $flag_codes;
675
676         foreach ( $flag_codes as $key => $props ) {
677         print ( "flag_codes[" . $key . "] = " . "<br>" );
678
679                 foreach ( $props as $keys2 => $props2 ) {
680             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
681         }
682     }
683 }
684
685 function curPageURL () 
686 {
687     $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
688
689     $port = ( isset($_SERVER["SERVER_PORT"] ) && 
690           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
691             ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
692
693     $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
694
695     $url = ( $isHTTPS ? 'https://' : 'http://' ) .
696         $_SERVER["SERVER_NAME"] . $port . $_SERVER["REQUEST_URI"];
697
698     return $url;
699 }
700
701 function curDirURL () 
702 {
703         $dir = dirname ( $_SERVER['PHP_SELF'] );
704
705         if ( $dir == "." || $dir == "/" ) {
706                 $dir = "";
707         }
708
709         $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
710         $port = ( isset($_SERVER["SERVER_PORT"] ) && 
711                           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
712                                 ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
713
714         $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
715
716         $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
717                 $_SERVER["SERVER_NAME"] . $dir . "/";
718
719         return $dest;
720 }
721
722 // For emacs:
723 // Local variables:
724 //  c-basic-offset: 4
725 //  c-indent-level: 4
726 //  tab-width: 4
727 // End:
728
729 ?>