summaryrefslogtreecommitdiff
path: root/libre/mkbootcd/mkbootcd
blob: 012267be9c717ff35c19c09270431ce69b52e4a3 (plain)
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
142
143
144
#! /bin/sh
# Created by Tobias Powalowski <tpowa@archlinux.org>
# Rebranded for Parabola by André Silva <emulatorman@lavabit.com>
# Settings
APPNAME=$(basename "${0}")
CONFIG="/etc/mkbootcd.conf"
GENIMG=""
BURN="0"
BLANK="0"
GRUB="0"
TARNAME=""
export TEMPDIR=$(mktemp /tmp/mkbootcd.XXXX)
usage ()
{
    echo "${APPNAME}: usage"
    echo "  -g=IMAGE         Generate a ISO image as IMAGE"
    echo "  -c=CONFIG        Use CONFIG file. default: /etc/mkbootcd.conf"
    echo "  -B               Burn the ISO image after creation"
    echo "  -b               Blanking media first"
    echo "  -grub            Use grub instead of isolinux"
    echo "  -t=TARNAME       Generate a tar image instead of an iso image"
    echo "  -h               This message."
    exit 1
}

[ "$1" == "" ] && usage

while [ $# -gt 0 ]; do
	case $1 in
		-c=*|--c=*) CONFIG="$(echo $1 | awk -F= '{print $2;}')" ;;
		-g=*|--g=*) GENIMG="$(echo $1 | awk -F= '{print $2;}')" ;;
		-B|--B) BURN="1" ;;
		-b|--b) BLANK="1" ;;
		-grub|--grub) GRUB="1" ;;
		-t=*|--t=*) TARNAME="$(echo $1 | awk -F= '{print $2;}')" ;;
		-h|--h|?) usage ;; 
		*) usage ;;
		esac
	shift
done

if [ "${TARNAME}" = "" -a "${GENIMG}" = "" ]; then 
	echo "ERROR: No image name specified, please use the -g option"
	exit 1
fi

if [ ! -f "${CONFIG}" ]; then
	echo "config file '${CONFIG}' cannot be found, aborting..."
	exit 1
fi

. "${CONFIG}"
# export for mkinitcpio
[ -n "${APPENDBOOTMESSAGE}" ] && export APPENDBOOTMESSAGE
[ -n "${APPENDBOOTMESSAGE_SYSLINUX}" ] && export APPENDBOOTMESSAGE_SYSLINUX
[ -n "${APPENDBOOTMESSAGE_SYSLINUX_LOWMEM}" ] && export APPENDBOOTMESSAGE_SYSLINUX_LOWMEM
[ -n "${APPENDOPTIONSBOOTMESSAGE}" ] && export APPENDOPTIONSBOOTMESSAGE

if [ "$GRUB" = "1" ]; then
	export RUNPROGRAM="${APPNAME}-grub"
	export BOOTDIRNAME="boot"
else
	export RUNPROGRAM="${APPNAME}"
	export BOOTDIRNAME="isolinux"
fi
[ "${BOOTMESSAGE}" = "" ] && export BOOTMESSAGE=$(mktemp /tmp/bootmessage.XXXX)
[ "${OPTIONSBOOTMESSAGE}" = "" ] && export OPTIONSBOOTMESSAGE=$(mktemp /tmp/optionsbootmessage.XXXX)
[ "${ISONAME}" = "" ] && export ISONAME=$(mktemp /tmp/isoname.XXXX)
export USEKERNEL=${VERSION}
# begin script
[ -e ${TEMPDIR} ] && rm -r ${TEMPDIR}
mkdir -p ${TEMPDIR}/${BOOTDIRNAME}
if [ "$GRUB" = "1" ]; then
	mkdir ${TEMPDIR}/${BOOTDIRNAME}/grub
	install -m755 /usr/share/grub/i386-pc/stage2_eltorito ${TEMPDIR}/${BOOTDIRNAME}/grub/stage2_eltorito
else
	install -m755 /usr/lib/syslinux/isolinux.bin ${TEMPDIR}/${BOOTDIRNAME}/isolinux.bin
fi
# create isolinux.cfg
if [ "$GRUB" = "1" ]; then
	echo ":: Creating menu.lst ..."
	[ ! -e "${MENULST}" ] && echo "No menu.lst found" && exit 1
	sed "s|@@PROMPT@@|${PROMPT}|g;s|@@TIMEOUT@@|${TIMEOUT}|g;s|@@KERNEL_BOOT_OPTIONS@@|${KERNEL_BOOT_OPTIONS}|g" \
		${MENULST} \
		> ${TEMPDIR}/${BOOTDIRNAME}/grub/menu.lst
else
	echo ":: Creating isolinux.cfg ..."
	if [ "${ISOLINUXCFG}" = "" ]; then
		[ -e  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg ] && rm  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "prompt ${PROMPT}" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "timeout ${TIMEOUT}" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "display boot.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "F1 boot.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "F2 options.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "default parabola"  >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "label parabola" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "kernel vmlinuz" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
		echo "append initrd=initrd.img ${KERNEL_BOOT_OPTIONS}" >>  ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
	else
	sed "s|@@PROMPT@@|${PROMPT}|g;s|@@TIMEOUT@@|${TIMEOUT}|g;s|@@KERNEL_BOOT_OPTIONS@@|${KERNEL_BOOT_OPTIONS}|g" \
		${ISOLINUXCFG} > ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg
	fi
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/isolinux.cfg ] && echo "No isolinux.cfg found" && exit 1
fi
echo ":: Calling mkinitcpio CONFIG=${MKINITCPIO_CONFIG} KERNEL=${VERSION} ..." 
# generate initramdisk
echo ":: Creating initramdisk ..."
	mkinitcpio -c ${MKINITCPIO_CONFIG} -k ${VERSION} -g ${TEMPDIR}/${BOOTDIRNAME}/initrd.img
echo ":: Using ${KERNEL} as image kernel ..."
	install -m644 ${KERNEL} ${TEMPDIR}/${BOOTDIRNAME}/vmlinuz
	install -m644 ${BOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/boot.msg
	install -m644 ${OPTIONSBOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/options.msg
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/boot.msg ] && echo 'ERROR:no boot.msg found, aborting!' && exit 1
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/options.msg ] && echo 'ERROR:no options.msg found, aborting!' && exit 1
# create image
if ! [ "${TARNAME}" = "" ]; then
	echo ":: Creating tar image ..."
	[ -e ${TARNAME} ] && rm ${TARNAME}
	rm ${TEMPDIR}/parabola/pkg/*.pkg.tar.gz > /dev/null 2>&1
	tar cfv ${TARNAME} ${TEMPDIR} > /dev/null 2>&1 && echo ":: tar Image succesfull created at ${TARNAME}"
else
	echo ":: Creating ISO image ..."
		[ -e ${GENIMG} ] && rm ${GENIMG}
		[ -s "${ISONAME}" ] && ISONAME=$(cat $ISONAME) || ISONAME="Parabola GNU/Linux-libre"
		if [ "$GRUB" = "1" ]; then
			mkisofs -RlDJLV "${ISONAME}" -b boot/grub/stage2_eltorito -c boot/boot.cat \
				-no-emul-boot -boot-load-size 4 -boot-info-table -o ${GENIMG} ${TEMPDIR}/ > /dev/null 2>&1
		else
			mkisofs -RlDJLV "${ISONAME}" -b isolinux/isolinux.bin -c isolinux/boot.cat \
				-no-emul-boot -boot-load-size 4 -boot-info-table -o ${GENIMG} ${TEMPDIR}/ > /dev/null 2>&1
		fi
		[ $? -ne 0 ] && echo ":: ISO Image succesfull created at ${GENIMG}"
	# burning/blanking image
	if [ "$BLANK" = "1" ]; then
		echo ":: Blanking media DEVICE=${DEVICE}, BLANKMODE=${BLANKMODE}, SPEED=${SPEED} ..."
			cdrecord dev=${DEVICE} speed=${SPEED} blank=${BLANKMODE} > /dev/null 2>&1 && echo ":: Successfull."
	fi
	if [ "$BURN" = "1" ]; then
		echo ":: Burning ISO image DEVICE=${DEVICE}, SPEED=${SPEED} ..."
			cdrecord dev=${DEVICE} speed=${SPEED} -eject ${GENIMG}  > /dev/null 2>&1 && echo ":: Successfull."
	fi
fi
# clean /tmp
rm -r ${TEMPDIR}