~ubuntu-installer/kickseed/master

96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
1
#! /bin/sh -e
2
3
. /usr/share/debconf/confmodule
4
5
. /lib/kickseed/kickseed.sh
110 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-108]
6
. /lib/kickseed/cmdline.sh
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
7
. /lib/preseed/preseed.sh
8
9
ks_log () {
10
	logger -t kickseed "$@"
11
}
12
13
ks_preseed () {
14
	echo "$@" >> "$SPOOL/parse/preseed.cfg"
15
}
16
17
# No support for chrooting here, as /target isn't available yet and %pre
18
# scripts don't need it.
19
ks_run_script () {
20
	TYPE="$1"
21
	INTERPRETER="$2"
22
	SCRIPT="$4"
23
24
	logger -t kickseed "Running $TYPE script $SCRIPT using interpreter $INTERPRETER:"
182 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-180]
25
	log-output -t kickseed --pass-stdout "$INTERPRETER" "$SCRIPT"
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
26
}
27
212 by Colin Watson
[project @ colin.watson@canonical.com-20061004193014-a7fd926a5b37f152]
28
ks_write_script () {
29
	if [ "${1%/*}" != "$1" ]; then
30
		mkdir -p "${1%/*}"
31
	fi
32
	cat > "$1"
33
	chmod +x "$1"
34
}
35
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
36
preseed_fetch () {
37
	ln -sf "$1" "$2"
38
}
39
40
preseed_relative () {
41
	if [ -z "${1##/*}" ]; then
42
		return 1
43
	else
44
		return 0
45
	fi
46
}
47
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
48
FETCH_ERROR=
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
49
fetch_url () {
50
	local url="$1"
51
	local file="$2"
52
	iters=0
53
	while [ $iters -lt 3 ]; do
54
		# TODO proxy support? Would it be useful?
55
		# TODO add progress bar
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
56
		if FETCH_ERROR="$(wget -q "$url" -O "$file" 2>&1)"; then
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
57
			return 0
58
		fi
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
59
		echo "$FETCH_ERROR" | logger -t kickseed
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
60
		iters=$(($iters + 1))
61
	done
62
	return 1
63
}
64
107 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-105]
65
KS="$(kickseed_cmdline /proc/cmdline ks)"
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
66
KSCFG="$(kickseed_file "$KS")"
67
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
68
case $KS in
293 by Colin Watson
Add HTTPS support
69
	ftp://*/*|http://*/*|https://*/*)
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
70
		logger -t kickseed "Downloading kickstart file from $KS"
71
		if ! fetch_url "$KS" "$KSCFG"; then
72
			logger -t kickseed "... failed"
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
73
			db_subst initrd-kickseed/wget-failed URL "$KS"
74
			db_subst initrd-kickseed/wget-failed \
75
				ERROR "$FETCH_ERROR"
76
			db_input high initrd-kickseed/wget-failed || true
77
			db_go
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
78
			exit 1
79
		fi
80
		;;
125 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-123]
81
	nfs:*:/*)
82
		logger -t kickseed "Retrieving kickstart file from $KS"
83
		file="${KS#nfs:}"
84
		server="${file%%:*}"
85
		file="${file#*:}"
171 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-169]
86
		if ! mount -t nfs -o ro,intr,nolock \
128 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-126]
87
				"$server:${file%/*}" "${KSCFG%/*}"; then
125 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-123]
88
			logger -t kickseed "... failed"
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
89
			db_subst initrd-kickseed/nfs-mount-failed \
90
				DIR "${file%/*}"
91
			db_subst initrd-kickseed/nfs-mount-failed \
92
				SERVER "$server"
178 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-176]
93
			db_input high initrd-kickseed/nfs-mount-failed || true
176 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-174]
94
			db_go
125 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-123]
95
			exit 1
96
		fi
97
		trap "umount '${KSCFG%/*}' || true" \
98
			EXIT HUP INT QUIT TERM
99
		;;
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
100
esac
101
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
102
case $KSCFG in
98 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-95]
103
	/floppy/*)
250 by Joey Hess
Use new mountmedia command, instead of mountfloppy.
104
		mountmedia floppy || true
105
		KSCFG="/media/${KSCFG#/floppy/}"
106
		trap 'umount /media || true' EXIT HUP INT QUIT TERM
98 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-95]
107
		;;
109 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-107]
108
	/media/*)
109
		device="${KSCFG#/media/}"
110
		device="${device%%/*}"
111
		# TODO: relies on having non-devfs compatibility paths
182 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-180]
112
		if log-output -t kickseed \
113
				mount "/dev/$device" "/media/$device"; then
109 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-107]
114
			trap "umount '/media/$device' || true" \
115
				EXIT HUP INT QUIT TERM
116
		fi
117
		;;
98 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-95]
118
esac
119
120
case $KSCFG in
104 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-101]
121
	'')
96 by Colin Watson
[project @ Arch-1:colin.watson@canonical.com--2005%kickseed--mainline--0--patch-93]
122
		# not handled in initrd (yet?)
123
		: ;;
124
	*)
125
		logger -t kickseed "Reading kickstart file from $KSCFG"
126
127
		kickseed "$KSCFG"
128
129
		if [ -s "$SPOOL/parse/preseed.cfg" ]; then
130
			preseed_location "$SPOOL/parse/preseed.cfg"
131
		fi
132
		;;
133
esac