Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[contrib] Add rom-o-matic to contrib
  • Loading branch information
Marty Connor committed Jan 17, 2010
1 parent 330abeb commit 67a10ef
Show file tree
Hide file tree
Showing 41 changed files with 1,854 additions and 0 deletions.
62 changes: 62 additions & 0 deletions contrib/rom-o-matic/bottom.php
@@ -0,0 +1,62 @@
<?

/**
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
* Copyright (C) 2009 Entity Cyber, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

?>
<hr>
<h4>
Resources:
</h4>
<ul>
<li>
Source code for gPXE images is available at
<a href="http://etherboot.org/wiki/download" target="_blank">
http://etherboot.org/wiki/download</a>
<br><br>
</li>
<li>
For general information about using gPXE, please visit the
<a href="http://www.etherboot.org/" target="_blank">
Etherboot Project Home Page</a>
<br><br>
</li>
<li>
For Email-based support for gPXE please join
<a href="http://etherboot.org/wiki/mailinglists" target="_blank">
Etherboot Project mailing lists.</a>
<br><br>
</li>
<li>
For real-time online gPXE support via IRC please visit the
<a href="irc://irc.freenode.net/%23etherboot"> #etherboot channel
of irc.freenode.net</a>.
<br><br>
</li>
</ul>
<hr>
<font size="-1">
<br>
Please email <a href="mailto:<? echo "${webmaster_email}" ?>"><? echo "${webmaster_email}"?></a>
with questions or comments about this website.
</font>
<br><br>
<hr>
</body>
</html>
306 changes: 306 additions & 0 deletions contrib/rom-o-matic/build.php
@@ -0,0 +1,306 @@
<?php // -*- Mode: PHP; -*-

/**
* Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
* Copyright (C) 2009 Entity Cyber, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

// Get utility functions and set globals
require_once "utils.php";

// Make sure at least $A (action) was supplied
if ( ! isset ( $_POST['A'] ) ) {

// Present user with form to customize build options
require_once "customize-flags.php";

exit ();

// If user chose "Customize" option on form
} else if ( $_POST['A'] == "Customize" ) {

// Present user with form to customize build options
require_once "customize-flags.php";

exit ();

// The following conditional includes all other cases except "Get Image"
// particularly the explicit ($A == "Start Over") case
} else if ( $_POST['A'] != "Get Image" ) {

// Note that this method of redirections discards all the
// configuration flags, which is intentional in this case.

$dest = curDirURL ();
header ( "Location: $dest" );

// This next "echo" should normally not be seen, because
// the "header" statement above should cause immediate
// redirection but just in case...

echo "Try this link: <a href=\"$dest\">$dest</a>";

exit ();
}

// OK, we're going to try to use whatever options have been set
// to build an image.

// Make sure at least $nic was supplied
if ( ! isset ( $_POST['nic'] ) ) {
die ( "No NIC supplied!" );
}
if ( isset ( $nics[$_POST['nic']] ) ) {
$nic = $nics[$_POST['nic']];
} else {
die ( "Invalid NIC \"${_POST['nic']}\" supplied!" );
}

// Fetch flags
$flags = get_flags ();

// Get requested format
$ofmt = isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "";
$fmt_extension = isset ( $ofmts[$ofmt] ) ? $ofmts[$ofmt] : 'dsk';

// Handle some special cases

$pci_vendor_code = "";
$pci_device_code = "";

if ( $nic == 'undionly' && $fmt_extension == "pxe" ) {

// undionly.pxe can't work because it unloads the PXE stack
// that it needs to communicate with, so we set the extension
// to .kpxe, which has a chance of working. The extension
// .kkpxe is another option.

$fmt_extension = "kpxe";

} else if ( $fmt_extension == "rom" ) {

if ( ! isset ( $_POST['pci_vendor_code'] )
|| ! isset ( $_POST['pci_device_code'] ) ) {
die ( "rom output format selected but PCI code(s) missing!" );
}

$pci_vendor_code = $_POST['pci_vendor_code'];
$pci_device_code = $_POST['pci_device_code'];

if ( $pci_vendor_code == ""
|| $pci_device_code == "" ) {
die ( "rom output format selected but PCI code(s) missing!" );
}

// Try to be forgiving of 0xAAAA format
if ( strtolower ( substr ( $pci_vendor_code, 0, 2 ) ) == "0x"
&& strlen ( $pci_vendor_code ) == 6 ) {
$pci_vendor_code = substr ( $pci_vendor_code, 2, 4 );
}
if ( strtolower ( substr ( $pci_device_code, 0, 2 ) ) == "0x"
&& strlen ( $pci_device_code ) == 6 ) {
$pci_device_code = substr ( $pci_device_code, 2, 4 );
}

// concatenate the pci codes to get the $nic part of the
// Make target
$pci_codes = strtolower ( $pci_vendor_code . $pci_device_code );

$nic = $pci_codes;
if ( ! isset ( $roms[$pci_codes] ) ) {
die ( "Sorry, no network driver supports PCI codes<br>"
. "${_POST['pci_vendor_code']}:"
. "${_POST['pci_device_code']}" );
}
} else if ( $fmt_extension != "rom"
&& ( $pci_vendor_code != "" || $pci_device_code != "" ) ) {
die ( "'$fmt_extension' format was selected but PCI IDs were"
. " also entered.<br>Did you mean to select 'rom' output format"
. " instead?" );
}

/**
* remove temporary build directory
*
* @return bool true if removal is successful, false otherwise
*/
function rm_build_dir ()
{
global $build_dir;
global $keep_build_dir;

if ( $keep_build_dir !== true ) {
rm_file_or_dir ( $build_dir );
}
}

// Arrange for the build directory to always be removed on exit.
$build_dir = "";
$keep_build_dir = false;
register_shutdown_function ( 'rm_build_dir' );

// Make temporary copy of src directory
$build_dir = mktempcopy ( "$src_dir", "/tmp", "MDCROM" );
$config_dir = $build_dir . "/config";

// Write config files with supplied flags
write_gpxe_config_files ( $config_dir, $flags );

// Handle a possible embedded script
$emb_script_cmd = "";
$embedded_script = isset ( $_POST['embedded_script'] ) ? $_POST['embedded_script'] : "";
if ( $embedded_script != "" ) {
$emb_script_path = "$build_dir" . "/script0.gpxe";

if ( substr ( $embedded_script, 0, 5 ) != "#!gpxe" ) {
$embedded_script = "#!gpxe\n" . $embedded_script;
}

// gPXE 0.9.7 doesn't like '\r\n" in the shebang...
$embedded_script = str_replace ( "\r\n", "\n", $embedded_script );

write_file_from_string ( $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}";
$make_cmd = "make -C '$build_dir' '$make_target' $emb_script_cmd $2>&1";

exec ( $make_cmd, $maketxt, $status );

// Uncomment the following section for debugging

/**
echo "<h2>build.php:</h2>";
echo "<h3>Begin debugging output</h3>";
//echo "<h3>\$_POST variables</h3>";
//echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
echo "<h3>Build options:</h3>";
echo "<strong>Build directory is:</strong> $build_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>";
// Uncomment the next line if you want to keep the
// build directory around for inspection after building.
$keep_build_dir = true;
die ( "<h3>End debugging output</h3>" );
**/ // End debugging section

// Send ROM to browser (with extreme prejudice)

if ( $status == 0 ) {

$fp = fopen("${build_dir}/${make_target}", "rb" );
if ( $fp > 0 ) {

$len = filesize ( "${build_dir}/${make_target}" );
if ( $len > 0 ) {

$buf = fread ( $fp, $len );
fclose ( $fp );

// Delete build directory as soon as it is not needed
rm_build_dir ();

$output_filename = "gpxe-${version}-${nic}.${fmt_extension}";

// Try to force IE to handle downloading right.
Header ( "Cache-control: private");
Header ( "Content-Type: application/x-octet-stream; " .
"name=$output_filename");
Header ( "Content-Disposition: attachment; " .
"Filename=$output_filename");
Header ( "Content-Location: $output_filename");
Header ( "Content-Length: $len");

echo $buf;

exit ();
}
}
}

/*
* If we reach this point, the build has failed, and we provide
* debugging information for a potential bug report
*
*/

// Remove build directory
rm_build_dir ();

// Announce failure if $status from make was non-zero
echo "<h2>Build failed. Status = " . $status . "</h2>";
echo "<h2>build.php:</h2>";
echo "<h3>Build options:</h3>";
echo "<strong>Build directory is:</strong> $build_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>";

echo "Please let us know that this happened, and paste the above output into your email message.<br>";

include_once $bottom_inc;

// For emacs:
// Local variables:
// c-basic-offset: 4
// c-indent-level: 4
// tab-width: 4
// End:

?>

0 comments on commit 67a10ef

Please sign in to comment.