Added support for a single embedded script file
authorMarty Connor <mdc@etherboot.org>
Wed, 19 Aug 2009 06:05:49 +0000 (02:05 -0400)
committerMarty Connor <mdc@etherboot.org>
Wed, 19 Aug 2009 06:05:49 +0000 (02:05 -0400)
build.php
customize-flags.php
flag-table.php
utils.php

index 64fbf0f..2ce4e85 100644 (file)
--- a/build.php
+++ b/build.php
@@ -32,24 +32,6 @@ if ( $_POST['A'] == "Customize" ) {
 // OK, we're going to try to use whatever options have been set
 // to build an image.
 
-$flags = get_flags ();
-
-// For debugging
-// echo "===== build.php =====" . "<br>";
-// echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
-// echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
-// echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
-// echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
-// show_flags ( $flags );
-// exit ();
-
-// Make temporary copy of src directory
-$dir = mktempcopy ( "$src_dir", "/tmp" );
-$config_dir = $dir . "/config";
-
-// Write config files
-write_gpxe_config_files ( $config_dir, $flags );
-
 // Make sure at least $nic was supplied
 if ( ! isset ( $_POST['nic'] ) ) {
     die ( "No NIC supplied!" );
@@ -57,9 +39,18 @@ if ( ! isset ( $_POST['nic'] ) ) {
 if ( isset ( $nics[$_POST['nic']] ) ) {
     $nic = $nics[$_POST['nic']];
 } else {
-    die ( "Invalid NIC supplied!" );
+    die ( "Invalid NIC \"${_POST['nic']}\" supplied!" );
 }
 
+$flags = get_flags ();
+
+// Make temporary copy of src directory
+$dir = mktempcopy ( "$src_dir", "/tmp" );
+$config_dir = $dir . "/config";
+
+// Write config files with supplied flags
+write_gpxe_config_files ( $config_dir, $flags );
+
 // Get requested format
 $ofmt = isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "";
 $fmt_extension = isset ( $ofmts[$ofmt] ) ? $ofmts[$ofmt] : 'dsk';
@@ -79,20 +70,50 @@ if ( $nic == 'undionly' && $fmt_extension == "pxe" ) {
     }
 }
 
+// Handle a possible embedded script
+$emb_script_cmd = "";
+$embedded_script = isset ( $_POST['embedded_script'] ) ? $_POST['embedded_script'] : "";
+if ( $embedded_script != "" ) {
+    $emb_script_path = "$dir" . "/script0.gpxe";
+    write_embedded_file ( $emb_script_path, $embedded_script );
+    $emb_script_cmd = "EMBEDDED_IMAGE=${emb_script_path}";
+}
+
 // Make the requested image.  $status is set to 0 on success
 $make_target = "bin/${nic}.${fmt_extension}";
-exec ( "make -C '$dir' '$make_target' 2>&1", $maketxt, $status );
-
-// for debugging
-// echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
-// echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
-// echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
-// echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
-// echo "<blockquote>"."<pre>";
-// echo htmlentities ( implode("\n", $maketxt ) );
-// echo "</pre>"."</blockquote>";
-// // deltempdir ( $dir );
-// die ( "Build directory is $dir" );
+$make_cmd = "make -C '$dir' '$make_target' $emb_script_cmd $2>&1";
+
+exec ( $make_cmd, $maketxt, $status );
+
+// Uncomment for debugging
+/**
+echo "<h2>build.php:</h2>";
+echo "<h3>Build options:</h3>";
+echo "<b>Build directory is:</b> $dir" . "<br><br>";
+echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
+echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
+echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
+echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
+
+echo "<h3>Flags:</h3>";
+show_flags ( $flags );
+
+if ( $embedded_script != "" ) {
+  echo "<h3>Embedded script:</h3>";
+  echo "<blockquote>"."<pre>";
+  echo $embedded_script;
+  echo "</pre>"."</blockquote>";
+}
+
+echo "<h3>Make output:</h3>";
+echo "Make command: " . $make_cmd . "<br>";
+echo "Build status = <? echo $status ?>" . "<br>";
+echo "<blockquote>"."<pre>";
+echo htmlentities ( implode ("\n", $maketxt ) );
+echo "</pre>"."</blockquote>";
+deltempdir ( $dir );
+die ( "<h3>End debugging output</h3>" );
+**/
 
 // Send ROM to browser (with extreme prejudice)
 
@@ -145,11 +166,29 @@ Build failed.  Status = <? echo $status ?>.
 Following is the output from <code>make</code>:
 <br><br>
 
-<blockquote>
-<pre>
-<? echo htmlentities ( implode ( "\n", $maketxt ) ); ?>
-</pre>
-</blockquote>
+echo "<h2>build.php:</h2>";
+echo "<h3>Build options:</h3>";
+echo "<b>Build directory is:</b> $dir" . "<br><br>";
+echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
+echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
+echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
+echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
+
+echo "<h3>Flags:</h3>";
+show_flags ( $flags );
+
+if ( $embedded_script != "" ) {
+  echo "<h3>Embedded script:</h3>";
+  echo "<blockquote>"."<pre>";
+  echo $embedded_script;
+  echo "</pre>"."</blockquote>";
+}
+
+echo "<h3>Make output:</h3>";
+echo "Make command: " . $make_cmd . "<br>";
+echo "<blockquote>"."<pre>";
+echo htmlentities ( implode ("\n", $maketxt ) );
+echo "</pre>"."</blockquote>";
 
 Please let us know that this happened.
 
index 50b410f..f49685b 100644 (file)
@@ -26,6 +26,8 @@ include_once $top_inc;
   </ul>
   <hr>
   <? echo_flags( $flags ); ?>
+  <h3>Embedded Script:</h3>
+  <? echo textarea ( "embedded_script", "", "10", "50" ); ?>
   <hr>
   <center><table width="35%"><tr>
   <td align="left"> <? echo $build; ?> </td>
index c51db39..c257340 100644 (file)
@@ -13,6 +13,38 @@ $ofmts = array
 
 $flag_table = array (
 
+       // Begin General Options:
+
+       "HDR_MISC_OPTIONS"
+       => array ( 
+          "flag" => "HDR_MISC_OPTIONS",
+          "hide_from_user" => "yes",  // Hide even the header
+          "type" => "header",
+          "label" => "Miscellaneous Options" 
+               ),
+
+/**    
+       "PRODUCT_NAME"
+       => array (
+          "flag" => "PRODUCT_NAME",
+          "hide_from_user" => "yes",
+          "type" => "string",
+          "value" => "gPXE",
+          "cfgsec" => "gemeral"
+          ),
+       
+       "PRODUCT_SHORT_NAME"
+       => array (
+          "flag" => "PRODUCT_SHORT_NAME",
+          "hide_from_user" => "yes",
+          "type" => "string",
+          "value" => "gPXE",
+          "cfgsec" => "gemeral"
+          ),
+**/
+
+       // End General Options:
+
        // Begin Console Options:
        
        "HDR_CONSOLE_OPTIONS"
@@ -38,36 +70,6 @@ $flag_table = array (
           "cfgsec" => "console"
           ),
        
-       // End Console Options
-       
-       // Begin Timer Options:
-       
-       "HDR_TIMER_OPTIONS"
-       => array ( 
-          "flag" => "HDR_TIMER_OPTIONS",
-          "hide_from_user" => "yes",  // Hide even the header
-          "type" => "header",
-          "label" => "Timer Options" 
-               ),
-       
-       "TIMER_BIOS"
-       => array (
-          "flag" => "TIMER_BIOS",
-          "type" => "on/off",
-          "value" => "on",
-          "hide_from_user" => "yes",
-          "cfgsec" => "timer"
-          ),
-       
-       "TIMER_RDTSC"
-       => array (
-          "flag" => "TIMER_RDTSC",
-          "type" => "on/off",
-          "value" => "off",
-          "hide_from_user" => "yes",
-          "cfgsec" => "timer"
-          ),
-
        "BANNER_TIMEOUT"
        => array (
           "flag" => "BANNER_TIMEOUT",
@@ -76,8 +78,8 @@ $flag_table = array (
           "cfgsec" => "general"
           ),
        
-       // End Timer Options
-       
+       // End Console Options
+
        // Begin Network Protocol Options:
        
        "HDR_NETWORK_PROTOCOL_OPTIONS"
index 9e2c80b..a2c4b14 100644 (file)
--- a/utils.php
+++ b/utils.php
@@ -1,8 +1,5 @@
 <? // -*- Mode: PHP; -*-
 
-// Show more runtime errors
-// error_reporting ( -1 );
-
 // Include table of user-configurable gPXE options
 require_once "flag-table.php";
 
@@ -14,9 +11,63 @@ if ( is_file ( 'local-config.php' ) ) {
     include "local-config.php";
 }
 
-list ( $nics, $roms ) = parse_nics_file ();
+// Parse src/bin/NIC file
+list ( $nics, $roms ) = parse_nic_file ();
+
+////
+// General utility functions
+////
+
+function cleanstring ( $s ) 
+{
+    $len = strlen ( $s );
+    if ( $len > 80 ) {
+        $s = substr ( $s, 0, 80 );
+    }
+
+    $s      = trim ( $s );
+    $pos    = 0;
+    $result = "";
+
+    while ( $pos < $len ) {
+        $ltr = ord ( ucfirst ( $s[$pos] ) );
+        if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) || 
+             ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) || 
+             ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
+             ( $ltr == ord ( "_" ) ) ||
+             ( $ltr == ord ( "+" ) ) ||
+             ( $ltr == ord ( ":" ) ) ||
+             ( $ltr == ord ( "/" ) ) ||
+             ( $ltr == ord ( "-" ) ) ) {
+            $result .= $s[$pos];
+        }
+        $pos++;
+    }
+    return $result;
+}
+
+function curDirURL () 
+{
+        $dir = dirname ( $_SERVER['PHP_SELF'] );
+
+        if ( $dir == "." || $dir == "/" ) {
+                $dir = "";
+        }
 
-function parse_nics_file ()
+        $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
+        $port = ( isset($_SERVER["SERVER_PORT"] ) && 
+                          ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
+                                ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
+
+        $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
+
+        $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
+                $_SERVER["SERVER_NAME"] . $dir . "/";
+
+        return $dest;
+}
+
+function parse_nic_file ()
 {
     // Extract NIC families and associated ROM PCI IDs from 
     // the src/bin/NIC file.
@@ -78,6 +129,10 @@ function parse_nics_file ()
     return ( array ( $nics, $roms ) );
 }
 
+////
+// HTML form utility functions
+////
+
 function hidden ( $flag, $value ) 
 {
     $value = htmlentities ( $value );
@@ -96,6 +151,13 @@ function textbox ( $flag, $value, $size )
     return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
 }
  
+function textarea ( $flag, $value, $rows, $cols ) 
+{
+    $value = htmlentities ( $value );
+    return "<textarea name=\"$flag\" rows=\"$rows\" cols=\"$cols\">"
+            . $value . "</textarea>";
+}
+
 function menubox ( $name, $options, $value ) 
 {
     $s="<select name=\"$name\">";
@@ -120,6 +182,10 @@ function keys_menubox ( $name, $options, $value )
     return $s . "</select>";
 }  
 
+////
+// Flag (compile option) handling functions
+////
+
 function default_flags () 
 {
     global $flag_table;
@@ -160,6 +226,40 @@ function get_flags ()
     return $flags;
 }
 
+function pprint_flag ( $key, $value )
+{
+    global $flag_table;
+
+    $type = $flag_table[$key]["type"];
+    $s = "";
+
+    if ( $type == "on/off" && $value == "on" ) {
+        $s = "#define $key";
+    } else if ( $type == "on/off" && $value != "on" ) {
+        $s = "#undef $key";
+    } else if ( $type == "string" ) {
+        if ( $value != "" ) $s = ( "#define $key \"" . cleanstring($value) . "\"" );
+    } else if ($type == "qstring" ) {
+        if ( $value != "" ) $s = ( "#define $key \\\"" . cleanstring($value) . "\\\"" );
+    } else {
+        $s = "#define $key " . cleanstring($value);
+    }
+    // print ( $s . "<br>" );
+    
+    return $s;
+}
+
+function pprint_flags ( $flags ) 
+{
+    $s = "";
+       foreach ( $flags as $key => $value ) {
+        $f = pprint_flag($key, $value);
+        if ($f != "" )
+            $s .= $f . " ";
+    }
+    return $s;
+}
+
 function echo_flags ( $flags )
 {
     global $flag_table;
@@ -224,40 +324,6 @@ function echo_flags ( $flags )
     echo "</table>";
 }
 
-function pprint_flag ( $key, $value )
-{
-    global $flag_table;
-
-    $type = $flag_table[$key]["type"];
-    $s = "";
-
-    if ( $type == "on/off" && $value == "on" ) {
-        $s = "#define $key";
-    } else if ( $type == "on/off" && $value != "on" ) {
-        $s = "#undef $key";
-    } else if ( $type == "string" ) {
-        if ( $value != "" ) $s = ( "#define $key \"" . cleanstring($value) . "\"" );
-    } else if ($type == "qstring" ) {
-        if ( $value != "" ) $s = ( "#define $key \\\"" . cleanstring($value) . "\\\"" );
-    } else {
-        $s = "#define $key " . cleanstring($value);
-    }
-    // print ( $s . "<br>" );
-    
-    return $s;
-}
-
-function pprint_flags ( $flags ) 
-{
-    $s = "";
-       foreach ( $flags as $key => $value ) {
-        $f = pprint_flag($key, $value);
-        if ($f != "" )
-            $s .= $f . " ";
-    }
-    return $s;
-}
-
 function get_cfgsecs ()
 {
     global $flag_table;
@@ -272,6 +338,26 @@ function get_cfgsecs ()
     return ( $cfgsecs );
 }
 
+////
+// File and directory handling functions
+////
+
+function mktempcopy ( $src, $dst ) 
+{
+    if ( $src[0] != "/" ) {
+        $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
+    }
+
+    $dir = tempnam ( $dst, "MDCROM" );
+    unlink( $dir );
+
+    exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );  
+    if ( $status != 0 ) {
+        die ( "src directory copy failed!" );
+    }
+    return ( $dir );
+}
+
 function write_gpxe_config_files ( $config_dir, $flags ) 
 {
     global $flag_table;
@@ -304,48 +390,14 @@ function write_gpxe_config_files ( $config_dir, $flags )
     }
 }
 
-function cleanstring ( $s ) 
+function write_embedded_file ( $fname, $ftext )
 {
-    $len = strlen ( $s );
-    if ( $len > 80 ) {
-        $s = substr ( $s, 0, 80 );
-    }
-
-    $s      = trim ( $s );
-    $pos    = 0;
-    $result = "";
-
-    while ( $pos < $len ) {
-        $ltr = ord ( ucfirst ( $s[$pos] ) );
-        if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) || 
-             ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) || 
-             ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
-             ( $ltr == ord ( "_" ) ) ||
-             ( $ltr == ord ( "+" ) ) ||
-             ( $ltr == ord ( ":" ) ) ||
-             ( $ltr == ord ( "/" ) ) ||
-             ( $ltr == ord ( "-" ) ) ) {
-            $result .= $s[$pos];
+        $fp = fopen ( $fname, "wb" );
+        if ( $fp <= 0 ) {
+            die ( "Unable to open $fname file for output!" );
         }
-        $pos++;
-    }
-    return $result;
-}
-
-function mktempcopy ( $src, $dst ) 
-{
-    if ( $src[0] != "/" ) {
-        $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
-    }
-
-    $dir = tempnam ( $dst, "MDCROM" );
-    unlink( $dir );
-
-    exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );  
-    if ( $status != 0 ) {
-        die ( "src directory copy failed!" );
-    }
-    return ( $dir );
+        fwrite ( $fp, $ftext );
+        fclose ( $fp );
 }
 
 function deltempdir ( $dir )
@@ -372,28 +424,9 @@ function deltempdir ( $dir )
     }
 }
 
-function curDirURL () 
-{
-        $dir = dirname ( $_SERVER['PHP_SELF'] );
-
-        if ( $dir == "." || $dir == "/" ) {
-                $dir = "";
-        }
-
-        $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
-        $port = ( isset($_SERVER["SERVER_PORT"] ) && 
-                          ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
-                                ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
-
-        $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
-
-        $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
-                $_SERVER["SERVER_NAME"] . $dir . "/";
-
-        return $dest;
-}
-
+////
 // Debugging functions
+////
 
 function show_flags ( $flags ) 
 {
@@ -417,17 +450,6 @@ function dump_flag_table ()
     }
 }
 
-function dump_flag_table_keys_sorted () 
-{
-    global $flag_table;
-
-    ksort ( $flag_table );
-
-    foreach ( $flag_table as $key => $props ) {
-        print ( $key . ".html<br>" );
-    }
-}
-
 function dump_flag_codes () 
 {
     global $flag_codes;