Handle case in build.php when $A is not set
[people/meteger/rom-o-matic/.git] / build.php
1 <?php // -*- Mode: PHP; -*-
2
3 /**
4  * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
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_gpxe_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.gpxe";
168     write_file_from_string ( $emb_script_path, $embedded_script );
169     $emb_script_cmd = "EMBEDDED_IMAGE=${emb_script_path}";
170 }
171
172 // Make the requested image.  $status is set to 0 on success
173 $make_target = "bin/${nic}.${fmt_extension}";
174 $make_cmd = "make -C '$build_dir' '$make_target' $emb_script_cmd $2>&1";
175
176 exec ( $make_cmd, $maketxt, $status );
177
178 // Uncomment the following section for debugging
179
180 /**
181
182 echo "<h2>build.php:</h2>";
183 echo "<h3>Begin debugging output</h3>";
184
185 //echo "<h3>\$_POST variables</h3>";
186 //echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
187
188 echo "<h3>Build options:</h3>";
189 echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
190 echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
191 echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
192 echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
193 echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
194
195 echo "<h3>Flags:</h3>";
196 show_flags ( $flags );
197
198 if ( $embedded_script != "" ) {
199     echo "<h3>Embedded script:</h3>";
200     echo "<blockquote>"."<pre>";
201     echo $embedded_script;
202     echo "</pre>"."</blockquote>";
203 }
204
205 echo "<h3>Make output:</h3>";
206 echo "Make command: " . $make_cmd . "<br>";
207 echo "Build status = <? echo $status ?>" . "<br>";
208 echo "<blockquote>"."<pre>";
209 echo htmlentities ( implode ("\n", $maketxt ) );
210 echo "</pre>"."</blockquote>";
211 // Uncomment the next line if you want to keep the
212 // build directory around for inspection after building.
213 $keep_build_dir = true;
214 die ( "<h3>End debugging output</h3>" );
215
216 **/ //   End debugging section
217
218 // Send ROM to browser (with extreme prejudice)
219
220 if ( $status == 0 ) {
221
222     $fp = fopen("${build_dir}/${make_target}", "rb" );
223     if ( $fp > 0 ) {
224
225         $len = filesize ( "${build_dir}/${make_target}" );
226         if ( $len > 0 ) {
227
228             $buf = fread ( $fp, $len );
229             fclose ( $fp );
230
231             // Delete build directory as soon as it is not needed
232             rm_build_dir ();
233
234             $output_filename = "gpxe-${version}-${nic}.${fmt_extension}";
235
236             // Try to force IE to handle downloading right.
237             Header ( "Cache-control: private");
238             Header ( "Content-Type: application/x-octet-stream; " .
239                      "name=$output_filename");
240             Header ( "Content-Disposition: attachment; " .
241                      "Filename=$output_filename");
242             Header ( "Content-Location: $output_filename");
243             Header ( "Content-Length: $len");
244
245             echo $buf;
246
247             exit ();
248         }
249     }
250 }
251
252 /*
253  * If we reach this point, the build has failed, and we provide
254  * debugging information for a potential bug report
255  *
256  */
257
258 // Remove build directory
259 rm_build_dir ();
260
261 // Announce failure if $status from make was non-zero
262 echo "<h2>Build failed.  Status = " . $status . "</h2>";
263 echo "<h2>build.php:</h2>";
264 echo "<h3>Build options:</h3>";
265 echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
266 echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
267 echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
268 echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
269 echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
270
271 echo "<h3>Flags:</h3>";
272 show_flags ( $flags );
273
274 if ( $embedded_script != "" ) {
275     echo "<h3>Embedded script:</h3>";
276     echo "<blockquote>"."<pre>";
277     echo $embedded_script;
278     echo "</pre>"."</blockquote>";
279 }
280
281 echo "<h3>Make output:</h3>";
282 echo "Make command: " . $make_cmd . "<br>";
283 echo "<blockquote>"."<pre>";
284 echo htmlentities ( implode ("\n", $maketxt ) );
285 echo "</pre>"."</blockquote>";
286
287 echo "Please let us know that this happened, and paste the above output into your email message.<br>";
288
289 include_once $bottom_inc;
290
291 // For emacs:
292 //  Local variables:
293 //  c-basic-offset: 4
294 //  c-indent-level: 4
295 //  tab-width: 4
296 //  End:
297
298 ?>