Annotation of qemu/roms/ipxe/contrib/rom-o-matic/build.php, revision 1.1

1.1     ! root        1: <?php // -*- Mode: PHP; -*-
        !             2: 
        !             3: /**
        !             4:  * Copyright (C) 2009 Marty Connor <[email protected]>.
        !             5:  * Copyright (C) 2009 Entity Cyber, Inc.
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or
        !             8:  * modify it under the terms of the GNU General Public License as
        !             9:  * published by the Free Software Foundation; either version 2 of the
        !            10:  * License, or any later version.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            15:  * General Public License for more details.
        !            16:  *
        !            17:  * You should have received a copy of the GNU General Public License
        !            18:  * along with this program; if not, write to the Free Software
        !            19:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20:  */
        !            21: 
        !            22: // Get utility functions and set globals
        !            23: require_once "utils.php";
        !            24: 
        !            25: // Make sure at least $A (action)  was supplied
        !            26: if ( ! isset ( $_POST['A'] ) ) {
        !            27: 
        !            28:     // Present user with form to customize build options
        !            29:     require_once "customize-flags.php";
        !            30: 
        !            31:     exit ();
        !            32: 
        !            33: // If user chose "Customize" option on form
        !            34: } else if ( $_POST['A'] == "Customize" ) {
        !            35: 
        !            36:     // Present user with form to customize build options
        !            37:     require_once "customize-flags.php";
        !            38: 
        !            39:     exit ();
        !            40: 
        !            41: // The following conditional includes all other cases except "Get Image"
        !            42: // particularly the explicit ($A == "Start Over") case
        !            43: } else if ( $_POST['A'] != "Get Image" ) {
        !            44: 
        !            45:     // Note that this method of redirections discards all the
        !            46:     // configuration flags, which is intentional in this case.
        !            47: 
        !            48:     $dest = curDirURL ();
        !            49:     header ( "Location: $dest" );
        !            50: 
        !            51:     // This next "echo" should normally not be seen, because
        !            52:     // the "header" statement above should cause immediate
        !            53:     // redirection but just in case...
        !            54: 
        !            55:     echo "Try this link: <a href=\"$dest\">$dest</a>";
        !            56: 
        !            57:     exit ();
        !            58: }
        !            59: 
        !            60: // OK, we're going to try to use whatever options have been set
        !            61: // to build an image.
        !            62: 
        !            63: // Make sure at least $nic was supplied
        !            64: if ( ! isset ( $_POST['nic'] ) ) {
        !            65:     die ( "No NIC supplied!" );
        !            66: }
        !            67: if ( isset ( $nics[$_POST['nic']] ) ) {
        !            68:     $nic = $nics[$_POST['nic']];
        !            69: } else {
        !            70:     die ( "Invalid NIC \"${_POST['nic']}\" supplied!" );
        !            71: }
        !            72: 
        !            73: // Fetch flags
        !            74: $flags = get_flags ();
        !            75: 
        !            76: // Get requested format
        !            77: $ofmt = isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "";
        !            78: $fmt_extension = isset ( $ofmts[$ofmt] ) ? $ofmts[$ofmt] : 'dsk';
        !            79: 
        !            80: // Handle some special cases
        !            81: 
        !            82: $pci_vendor_code = "";
        !            83: $pci_device_code = "";
        !            84: 
        !            85: if ( $nic == 'undionly' && $fmt_extension == "pxe" ) {
        !            86: 
        !            87:     // undionly.pxe can't work because it unloads the PXE stack
        !            88:     // that it needs to communicate with, so we set the extension
        !            89:     // to .kpxe, which has a chance of working. The extension
        !            90:     // .kkpxe is another option.
        !            91: 
        !            92:     $fmt_extension = "kpxe";
        !            93: 
        !            94: } else if ( $fmt_extension == "rom" ) {
        !            95: 
        !            96:     if ( ! isset ( $_POST['pci_vendor_code'] )
        !            97:                 || ! isset ( $_POST['pci_device_code'] ) ) {
        !            98:                die ( "rom output format selected but PCI code(s) missing!" );
        !            99:        }
        !           100: 
        !           101:        $pci_vendor_code = $_POST['pci_vendor_code'];
        !           102:        $pci_device_code = $_POST['pci_device_code'];
        !           103: 
        !           104:     if ( $pci_vendor_code == ""
        !           105:                 || $pci_device_code == "" ) {
        !           106:                die ( "rom output format selected but PCI code(s) missing!" );
        !           107:        }
        !           108: 
        !           109:        // Try to be forgiving of 0xAAAA format
        !           110:        if ( strtolower ( substr ( $pci_vendor_code, 0, 2 ) ) == "0x"
        !           111:                 && strlen ( $pci_vendor_code ) == 6 ) {
        !           112:                $pci_vendor_code = substr ( $pci_vendor_code, 2, 4 );
        !           113:        }
        !           114:        if ( strtolower ( substr ( $pci_device_code, 0, 2 ) ) == "0x"
        !           115:                 && strlen ( $pci_device_code ) == 6 ) {
        !           116:                $pci_device_code = substr ( $pci_device_code, 2, 4 );
        !           117:        }
        !           118: 
        !           119:     // concatenate the pci codes to get the $nic part of the
        !           120:     // Make target
        !           121:     $pci_codes = strtolower (  $pci_vendor_code . $pci_device_code );
        !           122: 
        !           123:     $nic = $pci_codes;
        !           124:     if ( ! isset ( $roms[$pci_codes] ) ) {
        !           125:         die (   "Sorry, no network driver supports PCI codes<br>"
        !           126:               . "${_POST['pci_vendor_code']}:"
        !           127:               . "${_POST['pci_device_code']}" );
        !           128:     }
        !           129: } else if ( $fmt_extension != "rom"
        !           130:             && ( $pci_vendor_code != "" || $pci_device_code != "" ) ) {
        !           131:     die (   "'$fmt_extension' format was selected but PCI IDs were"
        !           132:           . " also entered.<br>Did you mean to select 'rom' output format"
        !           133:           . " instead?" );
        !           134: }
        !           135: 
        !           136: /**
        !           137:  * remove temporary build directory
        !           138:  *
        !           139:  * @return bool true if removal is successful, false otherwise
        !           140:  */
        !           141: function rm_build_dir ()
        !           142: {
        !           143:     global $build_dir;
        !           144:     global $keep_build_dir;
        !           145: 
        !           146:     if ( $keep_build_dir !== true ) {
        !           147:         rm_file_or_dir ( $build_dir );
        !           148:     }
        !           149: }
        !           150: 
        !           151: // Arrange for the build directory to always be removed on exit.
        !           152: $build_dir = "";
        !           153: $keep_build_dir = false;
        !           154: register_shutdown_function ( 'rm_build_dir' );
        !           155: 
        !           156: // Make temporary copy of src directory
        !           157: $build_dir = mktempcopy ( "$src_dir", "/tmp", "MDCROM" );
        !           158: $config_dir = $build_dir . "/config";
        !           159: 
        !           160: // Write config files with supplied flags
        !           161: write_ipxe_config_files ( $config_dir, $flags );
        !           162: 
        !           163: // Handle a possible embedded script
        !           164: $emb_script_cmd = "";
        !           165: $embedded_script = isset ( $_POST['embedded_script'] ) ? $_POST['embedded_script'] : "";
        !           166: if ( $embedded_script != "" ) {
        !           167:     $emb_script_path = "$build_dir" . "/script0.ipxe";
        !           168: 
        !           169:        if ( substr ( $embedded_script, 0, 5 ) != "#!ipxe" ) {
        !           170:                $embedded_script = "#!ipxe\n" . $embedded_script;
        !           171:        }
        !           172: 
        !           173:     // iPXE 0.9.7 doesn't like '\r\n" in the shebang...
        !           174:     $embedded_script = str_replace ( "\r\n", "\n", $embedded_script );
        !           175: 
        !           176:     write_file_from_string ( $emb_script_path, $embedded_script );
        !           177:     $emb_script_cmd = "EMBEDDED_IMAGE=${emb_script_path}";
        !           178: }
        !           179: 
        !           180: // Make the requested image.  $status is set to 0 on success
        !           181: $make_target = "bin/${nic}.${fmt_extension}";
        !           182: $make_cmd = "make -C '$build_dir' '$make_target' $emb_script_cmd $2>&1";
        !           183: 
        !           184: exec ( $make_cmd, $maketxt, $status );
        !           185: 
        !           186: // Uncomment the following section for debugging
        !           187: 
        !           188: /**
        !           189: 
        !           190: echo "<h2>build.php:</h2>";
        !           191: echo "<h3>Begin debugging output</h3>";
        !           192: 
        !           193: //echo "<h3>\$_POST variables</h3>";
        !           194: //echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
        !           195: 
        !           196: echo "<h3>Build options:</h3>";
        !           197: echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
        !           198: echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
        !           199: echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
        !           200: echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
        !           201: echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
        !           202: 
        !           203: echo "<h3>Flags:</h3>";
        !           204: show_flags ( $flags );
        !           205: 
        !           206: if ( $embedded_script != "" ) {
        !           207:     echo "<h3>Embedded script:</h3>";
        !           208:     echo "<blockquote>"."<pre>";
        !           209:     echo $embedded_script;
        !           210:     echo "</pre>"."</blockquote>";
        !           211: }
        !           212: 
        !           213: echo "<h3>Make output:</h3>";
        !           214: echo "Make command: " . $make_cmd . "<br>";
        !           215: echo "Build status = <? echo $status ?>" . "<br>";
        !           216: echo "<blockquote>"."<pre>";
        !           217: echo htmlentities ( implode ("\n", $maketxt ) );
        !           218: echo "</pre>"."</blockquote>";
        !           219: // Uncomment the next line if you want to keep the
        !           220: // build directory around for inspection after building.
        !           221: $keep_build_dir = true;
        !           222: die ( "<h3>End debugging output</h3>" );
        !           223: 
        !           224: **/ //   End debugging section
        !           225: 
        !           226: // Send ROM to browser (with extreme prejudice)
        !           227: 
        !           228: if ( $status == 0 ) {
        !           229: 
        !           230:     $fp = fopen("${build_dir}/${make_target}", "rb" );
        !           231:     if ( $fp > 0 ) {
        !           232: 
        !           233:         $len = filesize ( "${build_dir}/${make_target}" );
        !           234:         if ( $len > 0 ) {
        !           235: 
        !           236:             $buf = fread ( $fp, $len );
        !           237:             fclose ( $fp );
        !           238: 
        !           239:             // Delete build directory as soon as it is not needed
        !           240:             rm_build_dir ();
        !           241: 
        !           242:             $output_filename = "ipxe-${version}-${nic}.${fmt_extension}";
        !           243: 
        !           244:             // Try to force IE to handle downloading right.
        !           245:             Header ( "Cache-control: private");
        !           246:             Header ( "Content-Type: application/x-octet-stream; " .
        !           247:                      "name=$output_filename");
        !           248:             Header ( "Content-Disposition: attachment; " .
        !           249:                      "Filename=$output_filename");
        !           250:             Header ( "Content-Location: $output_filename");
        !           251:             Header ( "Content-Length: $len");
        !           252: 
        !           253:             echo $buf;
        !           254: 
        !           255:             exit ();
        !           256:         }
        !           257:     }
        !           258: }
        !           259: 
        !           260: /*
        !           261:  * If we reach this point, the build has failed, and we provide
        !           262:  * debugging information for a potential bug report
        !           263:  *
        !           264:  */
        !           265: 
        !           266: // Remove build directory
        !           267: rm_build_dir ();
        !           268: 
        !           269: // Announce failure if $status from make was non-zero
        !           270: echo "<h2>Build failed.  Status = " . $status . "</h2>";
        !           271: echo "<h2>build.php:</h2>";
        !           272: echo "<h3>Build options:</h3>";
        !           273: echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
        !           274: echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
        !           275: echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
        !           276: echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
        !           277: echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
        !           278: 
        !           279: echo "<h3>Flags:</h3>";
        !           280: show_flags ( $flags );
        !           281: 
        !           282: if ( $embedded_script != "" ) {
        !           283:     echo "<h3>Embedded script:</h3>";
        !           284:     echo "<blockquote>"."<pre>";
        !           285:     echo $embedded_script;
        !           286:     echo "</pre>"."</blockquote>";
        !           287: }
        !           288: 
        !           289: echo "<h3>Make output:</h3>";
        !           290: echo "Make command: " . $make_cmd . "<br>";
        !           291: echo "<blockquote>"."<pre>";
        !           292: echo htmlentities ( implode ("\n", $maketxt ) );
        !           293: echo "</pre>"."</blockquote>";
        !           294: 
        !           295: echo "Please let us know that this happened, and paste the above output into your email message.<br>";
        !           296: 
        !           297: include_once $bottom_inc;
        !           298: 
        !           299: // For emacs:
        !           300: //  Local variables:
        !           301: //  c-basic-offset: 4
        !           302: //  c-indent-level: 4
        !           303: //  tab-width: 4
        !           304: //  End:
        !           305: 
        !           306: ?>

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.