summaryrefslogtreecommitdiffstats
path: root/src/util/geniso
blob: ff090d4a085f229dcc99a2ab95a7eafd2bca08c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/bash
#
# Generate a isolinux ISO boot image

function help() {
	echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]"
	echo
	echo "where OPTIONS are:"
	echo " -h       show this help"
	echo " -l       build legacy image with floppy emulation"
	echo " -o FILE  save iso image to file"
}

LEGACY=0
FIRST=""

while getopts "hlo:" opt; do
	case ${opt} in
		h)
			help
			exit 0
			;;
		l)
			LEGACY=1
			;;
		o)
			OUT="${OPTARG}"
			;;
	esac
done

shift $((OPTIND - 1))

if [ -z "${OUT}" ]; then
	echo "${0}: no output file given" >&2
	help
	exit 1
fi

# There should either be mkisofs or the compatible genisoimage program
for command in genisoimage mkisofs; do
	if ${command} --version >/dev/null 2>/dev/null; then
		mkisofs=(${command})
		break
	fi
done

if [ -z "${mkisofs}" ]; then
	echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2
	exit 1
fi

dir=$(mktemp -d bin/iso.dir.XXXXXX)
cfg=${dir}/isolinux.cfg

mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system"
	-appid "iPXE ${VERSION} - Open Source Network Boot Firmware"
	-publisher "http://ipxe.org/" -c boot.cat)

# generate the config
cat > ${cfg} <<EOF
# These default options can be changed in the geniso script
SAY iPXE ISO boot image
TIMEOUT 30
EOF
for f; do
	if [ ! -r ${f} ]; then
		echo "${f} does not exist, skipping" >&2
		continue
	fi
	b=$(basename ${f})
	g=${b%.lkrn}
	g=${g//[^a-z0-9]}
	g=${g:0:8}.krn
	case "${FIRST}" in
		"")
			echo "DEFAULT ${b}"
			FIRST=${g}
			;;
	esac
	echo "LABEL ${b}"
	echo " KERNEL ${g}"
	cp ${f} ${dir}/${g}
done >> ${cfg}

case "${LEGACY}" in
	1)
		# check for mtools
		case "$(mtools -V)" in
			Mtools\ version\ 3.9.9*|Mtools\ version\ 3.9.1[0-9]*|[mM]tools\ *\ [4-9].*)
				;;
			*)
				echo "Mtools version 3.9.9 or later is required" >&2
				exit 1
				;;
		esac

		# generate floppy image
		img=${dir}/boot.img
		mformat -f 1440 -C -i ${img} ::

		# copy lkrn file to floppy image
		for f in ${dir}/*.krn; do
			mcopy -m -i ${img} ${f} ::$(basename ${g})
			rm -f ${f}
		done

		# copy config file to floppy image
		mcopy -i ${img} ${cfg} ::syslinux.cfg
		rm -f ${cfg}

		# write syslinux bootloader to floppy image
		if ! syslinux ${img}; then
			echo "${0}: failed writing syslinux to floppy image ${img}" >&2
			exit 1
		fi

		# generate the iso image
		"${mkisofs[@]}" -b boot.img -output ${OUT} ${dir}
		;;
	0)
		# copy isolinux bootloader
		cp ${ISOLINUX_BIN} ${dir}

		# syslinux 6.x needs a file called ldlinux.c32
		if [ -n "${LDLINUX_C32}" -a -s "${LDLINUX_C32}" ]; then
			cp ${LDLINUX_C32} ${dir}
		fi

		# generate the iso image
		"${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir}

		# isohybrid will be used if available
		if isohybrid --version >/dev/null 2>/dev/null; then
			isohybrid ${OUT} >/dev/null
		fi
		;;
esac

# clean up temporary dir
rm -fr ${dir}