|
|
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: ?>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.