VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/ipxe/contrib/rom-o-matic/build.php@ 98174

最後變更 在這個檔案從98174是 95666,由 vboxsync 提交於 3 年 前

Devices/PC/ipxe: scm fixes and export to OSE, bugref:10254

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 9.3 KB
 
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
23require_once "utils.php";
24
25// Make sure at least $A (action) was supplied
26if ( ! 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
64if ( ! isset ( $_POST['nic'] ) ) {
65 die ( "No NIC supplied!" );
66}
67if ( 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
85if ( $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 */
141function 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;
154register_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
161write_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'] : "";
166if ( $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$gitversion = exec('git describe --always --abbrev=1 --match "" 2>/dev/null');
183if ($gitversion) {
184 $gitversion = "GITVERSION=$gitversion";
185}
186
187$make_cmd = "make -C '$build_dir' '$make_target' $gitversion $emb_script_cmd 2>&1";
188
189exec ( $make_cmd, $maketxt, $status );
190
191// Uncomment the following section for debugging
192
193/**
194
195echo "<h2>build.php:</h2>";
196echo "<h3>Begin debugging output</h3>";
197
198//echo "<h3>\$_POST variables</h3>";
199//echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
200
201echo "<h3>Build options:</h3>";
202echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
203echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
204echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" . "<br>";
205echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
206echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
207
208echo "<h3>Flags:</h3>";
209show_flags ( $flags );
210
211if ( $embedded_script != "" ) {
212 echo "<h3>Embedded script:</h3>";
213 echo "<blockquote>"."<pre>";
214 echo $embedded_script;
215 echo "</pre>"."</blockquote>";
216}
217
218echo "<h3>Make output:</h3>";
219echo "Make command: " . $make_cmd . "<br>";
220echo "Build status = <? echo $status ?>" . "<br>";
221echo "<blockquote>"."<pre>";
222echo htmlentities ( implode ("\n", $maketxt ) );
223echo "</pre>"."</blockquote>";
224// Uncomment the next line if you want to keep the
225// build directory around for inspection after building.
226$keep_build_dir = true;
227die ( "<h3>End debugging output</h3>" );
228
229**/ // End debugging section
230
231// Send ROM to browser (with extreme prejudice)
232
233if ( $status == 0 ) {
234
235 $fp = fopen("${build_dir}/${make_target}", "rb" );
236 if ( $fp > 0 ) {
237
238 $len = filesize ( "${build_dir}/${make_target}" );
239 if ( $len > 0 ) {
240
241 $buf = fread ( $fp, $len );
242 fclose ( $fp );
243
244 // Delete build directory as soon as it is not needed
245 rm_build_dir ();
246
247 $output_filename = preg_replace('/[^a-z0-9\+\.\-]/i', '', "ipxe-${version}-${nic}.${fmt_extension}");
248
249 // Try to force IE to handle downloading right.
250 Header ( "Cache-control: private");
251 Header ( "Content-Type: application/x-octet-stream; " .
252 "name=$output_filename");
253 Header ( "Content-Disposition: attachment; " .
254 "Filename=$output_filename");
255 Header ( "Content-Location: $output_filename");
256 Header ( "Content-Length: $len");
257
258 echo $buf;
259
260 exit ();
261 }
262 }
263}
264
265/*
266 * If we reach this point, the build has failed, and we provide
267 * debugging information for a potential bug report
268 *
269 */
270
271// Remove build directory
272rm_build_dir ();
273
274// Announce failure if $status from make was non-zero
275echo "<h2>Build failed. Status = " . $status . "</h2>";
276echo "<h2>build.php:</h2>";
277echo "<h3>Build options:</h3>";
278echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
279echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
280echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" . "<br>";
281echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
282echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
283
284echo "<h3>Flags:</h3>";
285show_flags ( $flags );
286
287if ( $embedded_script != "" ) {
288 echo "<h3>Embedded script:</h3>";
289 echo "<blockquote>"."<pre>";
290 echo $embedded_script;
291 echo "</pre>"."</blockquote>";
292}
293
294echo "<h3>Make output:</h3>";
295echo "Make command: " . $make_cmd . "<br>";
296echo "<blockquote>"."<pre>";
297echo htmlentities ( implode ("\n", $maketxt ) );
298echo "</pre>"."</blockquote>";
299
300echo "Please let us know that this happened, and paste the above output into your email message.<br>";
301
302include_once $bottom_inc;
303
304// For emacs:
305// Local variables:
306// c-basic-offset: 4
307// c-indent-level: 4
308// tab-width: 4
309// End:
310
311?>
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette