]> git.proxmox.com Git - grub2.git/blob - tests/util/grub-shell.in
grub-shell: support --files also for net boot
[grub2.git] / tests / util / grub-shell.in
1 #! /bin/sh
2 set -e
3
4 # Run GRUB script in a Qemu instance
5 # Copyright (C) 2009,2010 Free Software Foundation, Inc.
6 #
7 # GRUB is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # GRUB is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19
20 # Initialize some variables.
21 prefix="@prefix@"
22 exec_prefix="@exec_prefix@"
23 datarootdir="@datarootdir@"
24 builddir="@builddir@"
25 srcdir="@srcdir@"
26 PACKAGE_NAME=@PACKAGE_NAME@
27 PACKAGE_TARNAME=@PACKAGE_TARNAME@
28 PACKAGE_VERSION=@PACKAGE_VERSION@
29
30 # Force build directory components
31 PATH="${builddir}:$PATH"
32 export PATH
33
34 trim=0
35
36 # Usage: usage
37 # Print the usage.
38 usage () {
39 cat <<EOF
40 Usage: $0 [OPTION] [SOURCE]
41 Run GRUB script in a Qemu instance.
42
43 -h, --help print this message and exit
44 -v, --version print the version information and exit
45 --boot=[fd|hd|cd|net] boot method for Qemu instance
46 --modules=MODULES pre-load specified modules MODULES
47 --qemu=FILE Name of qemu binary
48 --disk=FILE Attach FILE as a disk
49 --qemu-opts=OPTIONS extra options to pass to Qemu instance
50 --files=FILES add files to the image
51 --mkrescue-arg=ARGS additional arguments to grub-mkrescue
52 --timeout=SECONDS set timeout
53 --trim trim firmware output
54
55 $0 runs input GRUB script or SOURCE file in a Qemu instance and prints
56 its output.
57
58 Report bugs to <bug-grub@gnu.org>.
59 EOF
60 }
61
62 . "${builddir}/grub-core/modinfo.sh"
63 qemuopts="${GRUB_QEMU_OPTS}"
64 serial_port=com0
65 serial_null=
66 halt_cmd=halt
67 pseries=n
68 disk=hda
69 case "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" in
70 *-emu)
71 device_map=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
72 boot=emu
73 console=console
74 disk=0
75 # To skip "Welcome to GRUB" and color setttings
76 trim=1
77 ;;
78 powerpc-ieee1275)
79 boot=hd
80 qemu=qemu-system-ppc
81 console=console
82 serial_port=escc-ch-b
83 serial_null="-serial null"
84 netbootext=elf
85 ;;
86
87 sparc64-ieee1275)
88 boot=cd
89 qemu=qemu-system-sparc64
90 console=
91 serial_port=ieee1275/ttya
92 trim=1
93 qemuopts="$qemuopts -no-reboot"
94 halt_cmd=reboot
95 ;;
96
97 mips-qemu_mips)
98 boot=mips_qemu
99 qemu=qemu-system-mips
100 qemuopts="$qemuopts -M mips"
101 console=vga_text
102 ;;
103 mips-arc)
104 boot=cd
105 qemu=qemu-system-mips64
106 qemuopts="$qemuopts -M indy"
107 serial_port=arc/serial0/line0
108 console=
109 trim=1
110 ;;
111 mipsel-arc)
112 boot=cd
113 qemu=qemu-system-mips64el
114 qemuopts="$qemuopts -M magnum -no-reboot"
115 serial_port=arc/multi0/serial0
116 console=console
117 halt_cmd=reboot
118 trim=1
119 ;;
120 mipsel-qemu_mips)
121 boot=mipsel_qemu
122 qemu=qemu-system-mipsel
123 qemuopts="$qemuopts -M mips"
124 console=vga_text
125 ;;
126 mipsel-loongson)
127 boot=mipsel_fulong2e
128 qemu=qemu-system-mips64el
129 qemuopts="$qemuopts -M fulong2e"
130 console=
131 trim=1
132 ;;
133 i386-coreboot)
134 boot=coreboot
135 qemu=qemu-system-i386
136 console=vga_text
137 ;;
138 i386-multiboot)
139 boot=cd
140 qemu=qemu-system-i386
141 console=vga_text;;
142
143 i386-ieee1275)
144 boot=hd
145 qemu=qemu-system-i386
146 console=console
147 trim=1
148 disk=hdb
149 ;;
150 i386-qemu)
151 boot=qemu
152 qemu=qemu-system-i386
153 console=vga_text;;
154
155 i386-pc)
156 boot=cd
157 qemu=qemu-system-i386
158 console=console
159 netbootext=0
160 ;;
161
162 i386-efi)
163 qemu=qemu-system-i386
164 boot=cd
165 console=console
166 trim=1
167 ;;
168 x86_64-efi)
169 qemu=qemu-system-x86_64
170 boot=cd
171 console=console
172 trim=1
173 ;;
174 *)
175 boot=hd
176 qemu=qemu-system-i386
177 console=console;;
178 esac
179
180 timeout=60
181 mkimage_extra_arg=
182
183 # Check the arguments.
184 for option in "$@"; do
185 case "$option" in
186 -h | --help)
187 usage
188 exit 0 ;;
189 -v | --version)
190 echo "$0 (GNU GRUB ${PACKAGE_VERSION})"
191 exit 0 ;;
192 --trim)
193 trim=1
194 ;;
195 --debug)
196 debug=1 ;;
197 --modules=*)
198 ms=`echo "$option" | sed -e 's/--modules=//' -e 's/,/ /g'`
199 modules="$modules $ms" ;;
200 --files=*)
201 fls=`echo "$option" | sed -e 's/--files=//' -e 's/,/ /g'`
202 files="$files $fls" ;;
203 --mkrescue-arg=*)
204 mkr=`echo "$option" | sed -e 's/--mkrescue-arg=//' -e 's/,/ /g'`
205 mkrescue_args="$mkrescue_args $mkr" ;;
206 --qemu=*)
207 qemu=`echo "$option" | sed -e 's/--qemu=//' -e 's/,/ /g'`;;
208 --pseries)
209 qemu=qemu-system-ppc64
210 serial_port=ieee1275/hvterm
211 serial_null=
212 qemuopts="$qemuopts -M pseries -no-reboot"
213 trim=1
214 pseries=y
215 ;;
216 --qemu-opts=*)
217 qs=`echo "$option" | sed -e 's/--qemu-opts=//'`
218 qemuopts="$qemuopts $qs" ;;
219 --disk=*)
220 dsk=`echo "$option" | sed -e 's/--disk=//'`
221 if [ ${grub_modinfo_platform} = emu ]; then
222 echo "(hd$disk) $dsk" >> "$device_map"
223 disk="$((disk+1))"
224 else
225 if [ $disk = error ]; then
226 echo "Too many disks" 1>&2
227 exit 1;
228 fi
229 qemuopts="$qemuopts -$disk $dsk"
230 if [ "$disk" = hda ]; then
231 disk=hdb;
232 elif [ "$disk" = hdb ]; then
233 # CDROM is hdc
234 disk=hdd
235 elif [ "$disk" = hdd ]; then
236 # CDROM is hdc
237 disk=error
238 fi
239 fi
240 ;;
241 --timeout=*)
242 timeout=`echo "$option" | sed -e 's/--timeout=//'`
243 ;;
244
245 # Intentionally undocumented
246 --grub-mkimage-extra)
247 mkimage_extra_arg="$mkimage_extra_arg `argument $option "$@"`"; shift ;;
248 --grub-mkimage-extra=*)
249 mkimage_extra_arg="$mkimage_extra_arg `echo "$option" | sed 's/--grub-mkimage-extra=//'`" ;;
250
251 --boot=*)
252 dev=`echo "$option" | sed -e 's/--boot=//'`
253 if [ "$dev" = "fd" ] ; then boot=fd;
254 elif [ "$dev" = "hd" ] ; then boot=hd;
255 elif [ "$dev" = "cd" ] ; then boot=cd;
256 elif [ "$dev" = "net" ] ; then boot=net;
257 elif [ "$dev" = "qemu" ] ; then boot=qemu;
258 elif [ "$dev" = "coreboot" ] ; then boot=coreboot;
259 elif [ "$dev" = "mips_qemu" ] ; then boot=mips_qemu;
260 elif [ "$dev" = "mipsel_qemu" ] ; then boot=mipsel_qemu;
261 elif [ "$dev" = "mipsel_fulong2e" ] ; then boot=mipsel_fulong2e;
262 else
263 echo "Unrecognized boot method \`$dev'" 1>&2
264 usage
265 exit 1
266 fi ;;
267 -*)
268 echo "Unrecognized option \`$option'" 1>&2
269 usage
270 exit 1 ;;
271 *)
272 if [ "x${source}" != x ] ; then
273 echo "too many parameters at the end" 1>&2
274 usage
275 exit 1
276 fi
277 source="${option}" ;;
278 esac
279 done
280
281 if [ "x${source}" = x ] ; then
282 tmpfile=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
283 while read REPLY; do
284 echo "$REPLY" >> ${tmpfile}
285 done
286 source=${tmpfile}
287 fi
288
289 cfgfile=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
290 cat <<EOF >${cfgfile}
291 grubshell=yes
292 EOF
293
294
295 if [ "${grub_modinfo_platform}" != emu ]; then
296 echo insmod serial >>${cfgfile}
297 fi
298
299 if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = powerpc-ieee1275 ]; then
300 echo insmod escc >>${cfgfile}
301 fi
302 if [ "${grub_modinfo_platform}" != emu ]; then
303 echo "serial ${serial_port}" >>${cfgfile}
304 term="serial_${serial_port}"
305 else
306 term=console
307 fi
308
309 cat <<EOF >>${cfgfile}
310 terminfo -g 1024x1024 ${term} dumb
311 terminal_input ${term}
312 terminal_output ${term}
313 EOF
314
315 trim_head=664cbea8-132f-4770-8aa4-1696d59ac35c
316
317 if [ $trim = 1 ]; then
318 echo "echo $trim_head" >>${cfgfile}
319 fi
320
321 rom_directory=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
322
323 for mod in ${modules}
324 do
325 echo "insmod ${mod}" >> ${cfgfile}
326 done
327
328 cat <<EOF >>${cfgfile}
329 source "\$prefix/testcase.cfg"
330 # Stop serial output to suppress "ACPI shutdown failed" error.
331 EOF
332 if [ x$console != x ]; then
333 echo "terminal_output $console" >>${cfgfile}
334 fi
335 echo "${halt_cmd}" >>${cfgfile}
336
337 test -z "$debug" || echo "GRUB script: ${cfgfile}" >&2
338 test -z "$debug" || echo "GRUB testcase script: ${tmpfile}" >&2
339 test -z "$debug" || echo "Boot device: ${boot}" >&2
340
341 isofile=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
342 test -z "$debug" || echo "GRUB ISO file: ${isofile}" >&2
343 test -z "$debug" || echo "GRUB ROM directory: ${rom_directory}" >&2
344
345 if test -z "$debug"; then
346 qemuopts="${qemuopts} -nographic -monitor file:/dev/null"
347 fi
348
349 if [ x$boot != xnet ] && [ x$boot != xemu ]; then
350 pkgdatadir="@builddir@" "@builddir@/grub-mkrescue" "--output=${isofile}" "--override-directory=${builddir}/grub-core" \
351 --rom-directory="${rom_directory}" \
352 --themes-directory="@srcdir@/themes" \
353 $mkimage_extra_arg ${mkrescue_args} \
354 "/boot/grub/grub.cfg=${cfgfile}" "/boot/grub/testcase.cfg=${source}" \
355 ${files} >/dev/null 2>&1
356 fi
357 if [ x$boot = xhd ]; then
358 if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = mips-arc ]; then
359 device="hdb "
360 else
361 device="hda "
362 fi
363 bootdev="-boot c"
364 fi
365 if [ x$boot = xcd ]; then
366 if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = powerpc-ieee1275 ] && [ x$pseries != xy ] ; then
367 device="-drive if=ide,media=cdrom,file="
368 else
369 device="cdrom "
370 fi
371 bootdev="-boot d"
372 fi
373 if [ x$boot = xfd ]; then
374 device="fda "
375 bootdev="-boot a"
376 fi
377
378 if [ x$boot = xqemu ]; then
379 bootdev="-bios ${rom_directory}/qemu.img"
380 device="cdrom "
381 fi
382
383 if [ x$boot = xmipsel_qemu ]; then
384 bootdev="-kernel ${rom_directory}/mipsel-qemu_mips.elf"
385 device="cdrom "
386 fi
387
388 if [ x$boot = xmipsel_fulong2e ]; then
389 bootdev="-kernel ${rom_directory}/mipsel-loongson.elf -append machtype=lemote-fuloong-2e"
390 device="cdrom "
391 fi
392
393 if [ x$boot = xmips_qemu ]; then
394 bootdev="-kernel ${rom_directory}/mips-qemu_mips.elf"
395 device="cdrom "
396 fi
397
398 if [ x$boot = xcoreboot ]; then
399 imgfile=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
400 cp "${GRUB_COREBOOT_ROM}" "${imgfile}"
401 "${GRUB_CBFSTOOL}" "${imgfile}" add-payload "${rom_directory}/coreboot.elf" fallback/payload
402 bootdev="-bios ${imgfile}"
403 device="cdrom "
404 test -z "$debug" || echo "Coreboot image: ${imgfile}" >&2
405 fi
406
407 if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = mipsel-arc ]; then
408 case "$boot" in
409 hd)
410 bootdev="-global ds1225y.filename=$GRUB_QEMU_MAGNUM_NVRAM_DIR/disk" ;;
411 *)
412 bootdev="-global ds1225y.filename=$GRUB_QEMU_MAGNUM_NVRAM_DIR/cdrom";;
413 esac
414 fi
415
416 do_trim ()
417 {
418 if [ $trim = 1 ]; then
419 awk '{ if (have_head == 1) print $0; } /664cbea8-132f-4770-8aa4-1696d59ac35c/ { have_head=1; }'
420 else
421 cat
422 fi
423 }
424
425 copy_extra_files() {
426 _destdir="$1"
427 shift
428
429 # FIXME support '=' in file names
430 for _file in "$@"; do
431 _target="${_file%=*}"
432 _source="${_file#*=}"
433 [ -n "$_source" ] || _source="$_target"
434 _target="$_destdir/$_target"
435 _targetdir="$(dirname "$_target")"
436 [ -d "$_targetdir" ] || mkdir -p "$_targetdir"
437 cp "$_source" "$_target"
438 done
439 }
440
441 if [ x$boot = xnet ]; then
442 netdir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
443 pkgdatadir="@builddir@" "@builddir@/grub-mknetdir" "--grub-mkimage=${builddir}/grub-mkimage" "--directory=${builddir}/grub-core" "--net-directory=$netdir" ${mkrescue_args} > /dev/null
444 cp "${cfgfile}" "$netdir/boot/grub/grub.cfg"
445 cp "${source}" "$netdir/boot/grub/testcase.cfg"
446 [ -z "$files" ] || copy_extra_files "$netdir" $files
447 timeout -s KILL $timeout "${qemu}" ${qemuopts} ${serial_null} -serial file:/dev/stdout -boot n -net "user,tftp=$netdir,bootfile=/boot/grub/${grub_modinfo_target_cpu}-${grub_modinfo_platform}/core.$netbootext" -net nic | cat | tr -d "\r" | do_trim
448 elif [ x$boot = xemu ]; then
449 grubdir="$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX")"
450 mkdir -p "$grubdir/fonts"
451 mkdir -p "$grubdir/themes"
452 mkdir -p "$grubdir/locale"
453 cp "@builddir@/"unicode.pf2 "$grubdir/fonts/unicode.pf2"
454 cp -R "@srcdir@/themes/starfield" "$grubdir/themes/starfield"
455 for file in "@srcdir@/po/"*.gmo; do
456 if [ -f "$file" ]; then
457 cp "$file" "$grubdir/locale/"
458 fi
459 done
460 cp "${cfgfile}" "$grubdir/grub.cfg"
461 cp "${source}" "$grubdir/testcase.cfg"
462 @builddir@/grub-core/grub-emu -m "$device_map" -d "$grubdir" | tr -d "\r" | do_trim
463 rm -rf "$grubdir"
464 else
465 timeout -s KILL $timeout "${qemu}" ${qemuopts} ${serial_null} -serial file:/dev/stdout -${device}"${isofile}" ${bootdev} | cat | tr -d "\r" | do_trim
466 fi
467 if [ x$boot = xcoreboot ]; then
468 test -n "$debug" || rm -f "${imgfile}"
469 fi
470 test -n "$debug" || rm -f "${isofile}"
471 test -n "$debug" || rm -rf "${rom_directory}"
472 test -n "$debug" || rm -f "${tmpfile}" "${cfgfile}"
473 exit 0
474
475