summaryrefslogtreecommitdiff
path: root/functions.sh
blob: aae9089857c5bd7711165d4fa72bb652535d7abf (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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# Copyright (C)  2016-2018 Iru Cai <mytbk920423@gmail.com>
# SPDX-License-Identifier: GPL-3.0-or-later

checksum_verify() {
	local _hashtool _hashsum _cksum
	if [ -n "$SHA512" ]; then
		_hashtool=sha512sum
		_hashsum=$SHA512
	elif [ -n "$SHA256" ]; then
		_hashtool=sha256sum
		_hashsum=$SHA256
	elif [ -n "$SHA1" ]; then
		_hashtool=sha1sum
		_hashsum=$SHA1
	elif [ -n "$VERIFY" ]; then
		"$VERIFY" && return 0 || return 1
	else
		fatalerror "Cannot find the SHA256, SHA1, or MD5 checksum of $ISOFILE"
	fi
	_cksum=$("$_hashtool" "$ISOPATH/$ISOFILE" | cut -d' ' -f1)
	if [[ $_cksum == $_hashsum ]]; then
		msg "$ISOFILE ok."
	else
		msg "$ISOFILE checksum bad!" && return 1
	fi
}

# a hash verify function that uses a checksum file
# usage: set HASHTOOL and HASHFILE in isoinfo, set VERIFY as hashfile
hashfile() {
	local _cksum _hashsum
	_cksum=$("$HASHTOOL" "$ISOPATH/$ISOFILE" | cut -d' ' -f1)
	_hashsum=$(grep "${ISOFILE}\$" "$HASHFILE" | cut -d' ' -f1)

	if [[ $_cksum == $_hashsum ]]; then
		msg "$ISOFILE ok."
	else
		msg "$ISOFILE checksum bad!" && return 1
	fi
}

set_distro() {
	_distrobase="distro/$(cut -d'/' -f1 <<< "$1")"
	source "$_distrobase/distroinfo"
}

# process_isoinfo <iso, e.g. mint/64/xfce>
# loads $DISTRONAME $ISONAME $ISOFILE $ISOURL
process_isoinfo() {
	unset MD5 SHA1 SHA256 SHA512
	set_distro "$1"
	source "distro/$1/isoinfo"
	ISOFILE="$(basename $ISOURL)"
}

process_distro() {
	source "distro/$1/install.sh"
	# FIXME
	# As a workaround, now we set $ISOFILE before using this function.
	# Maybe we have a better solution for this.
	# ISOMNT="/media/$ISOFILE"
}

gen_grubcfg() {
	local entry allentries
	allentries=("distro/$1/entry"*)
	if [ ${#allentries[@]} -gt 1 ]; then
		echo "submenu '$ISONAME' {"
	fi
	for entry in "${allentries[@]}"
	do
		UUID="$UUID" ISOFILE="$ISOFILE" ./mkgrubcfg.sh "$entry"
	done
	if [ ${#allentries[@]} -gt 1 ]; then
		echo '}'
	fi
}

gen_syslinux() {
	local entry allentries count name
	allentries=("distro/$1/entry"*)
	name=$(echo $1|sed 's/\//_/g')
	count=0
	for entry in "${allentries[@]}"
	do
		UUID="$UUID" ISOFILE="$ISOFILE" LABEL="$name$count" \
			./mksyslinux.sh "$entry"
		count=$(($count+1))
	done
}

download_iso() {
	mkdir -p "$ISOPATH"
	for url in ${mirrorlist[@]}
	do
		if wget -c -O "$ISOPATH/$ISOFILE" "$url/$ISOURL"; then
			if checksum_verify; then
				return 0
			else
				# checksum bad, may be due to a bad partial download
				# so remove the file and try again
				rm -f "$ISOPATH/$ISOFILE"
				wget -O "$ISOPATH/$ISOFILE" "$url/$ISOURL"
				checksum_verify && return 0
				rm -f "$ISOPATH/$ISOFILE" # then try next mirror
			fi
		fi
	done
	fatalerror "Fail to download $ISOFILE!"
}

mount_iso() {
	LOOPDEV=$(/sbin/losetup -n -O NAME -j "${ISO_FILEPATH}")
	if [[ -n "$LOOPDEV" ]]
	then
		ISOMNT="$LOOPDEV"
		umount_iso
	fi

	udevil mount "${ISO_FILEPATH}"
	LOOPDEV=$(/sbin/losetup -n -O NAME -j "${ISO_FILEPATH}")
	if [[ -n "$LOOPDEV" ]]
	then
		ISOMNT=$(findmnt -n -o TARGET "$LOOPDEV")
	fi
}

umount_iso() {
	udevil umount "$ISOMNT"
}

getuuid() {
	lsblk -n -o UUID "$1"
}

getdiskbypart() {
	# util-linux may have bug when using -s --raw
	# so it needs some work around
	local _devlist
	local _type
	_devlist=($(lsblk -s --raw -o NAME -n "$1"))
	for i in "${_devlist[@]}"
	do
		_type=$(lsblk -o TYPE -n "/dev/$i" | head -n1)
		if [[ "$_type" == "disk" ]]; then
			echo $i
		fi
	done
}

as-root() {
	echo as-root "$*"
	if [ "$UID" == 0 ]; then
		"$@"
	elif type -p sudo > /dev/null; then
		sudo "$@"
	elif type -p su > /dev/null; then
		su -c "$*"
	fi
}

syslinux_header() {
	cat << EOF
UI menu.c32

TIMEOUT 50

MENU TITLE Live USB
MENU COLOR border       30;44   #40ffffff #a0000000 std
MENU COLOR title        1;36;44 #9033ccff #a0000000 std
MENU COLOR sel          7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel        37;44   #50ffffff #a0000000 std
MENU COLOR help         37;40   #c0ffffff #a0000000 std
MENU COLOR timeout_msg  37;40   #80ffffff #00000000 std
MENU COLOR timeout      1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07        37;40   #90ffffff #a0000000 std
MENU COLOR tabmsg       31;40   #30ffffff #00000000 std

EOF
}

grubcfg_header() {
		cat  << 'EOF'
set default=0
set timeout=5

if [ ${grub_platform} == efi ]; then
	insmod all_video
	insmod font
	if loadfont /grub/fonts/unicode.pf2; then
		insmod gfxterm
		set gfxmode=auto
		set gfxpayload=keep
		terminal_output gfxterm
	fi
fi

EOF
}