-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathupdate-grml-rescueboot
executable file
·142 lines (121 loc) · 3.94 KB
/
update-grml-rescueboot
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
#!/bin/bash
# Simple script to download a Grml ISO image to use with grml-rescueboot
# Needs the Debian keyring, gpgv + wget
# Licensed under GPL v2+
set -eu -o pipefail
# defaults
grmlflavor=full
force=0
retrieved_iso=0
declare -A bin_to_pkg=( [update-grub]=grub2-common [wget]=wget [gpgv]=gpgv )
declare -a missing_packages=()
for binary in "${!bin_to_pkg[@]}" ; do
if ! which "${binary}" &>/dev/null ; then
echo "ERROR: Binary $binary not found." >&2
missing_packages+=( ${bin_to_pkg[$binary]} )
fi
done
if ! [ -r /usr/share/keyrings/debian-keyring.gpg ] ; then
echo "ERROR: File /usr/share/keyrings/debian-keyring.gpg not found." >&2
missing_packages+=( debian-keyring )
fi
if [ ${#missing_packages[@]} -ne 0 ] ; then
echo "TIP: Try running \`apt install ${missing_packages[*]}\` to fix this." >&2
exit 1
fi
usage() {
echo "Usage: $(basename "$0") [-f] [-t <small|full>]"
}
while getopts ":a:t:fh" opt ; do
case ${opt} in
t)
if [ "${OPTARG}" = "full" ] || [ "${OPTARG}" = "small" ] ; then
grmlflavor="${OPTARG}"
else
echo "ERROR: Invalid value '${OPTARG}'. Supported values: small, full" >&2
usage >&2 ; exit 1
fi
;;
f)
force=1
;;
h)
usage ; exit 0
;;
\?)
echo "ERROR: Invalid Option: -${OPTARG}" >&2
usage >&2 ; exit 1
;;
:)
echo "ERROR: Option -${OPTARG} requires an argument." >&2
;;
esac
done
arch="$(uname -m)"
case ${arch} in
aarch64)
grmlarch=arm64
;;
x86_64)
grmlarch=amd64
;;
*)
echo "ERROR: Unsupported architecture '${arch}'." >&2
usage >&2
exit 1
;;
esac
echo "Finding out latest ISO image..."
date=$(wget --quiet -O- https://download.grml.org/ | sed --regex -n 's/.*grml-('"$grmlflavor"')-([0-9]{4}\.[0-9]{2})-('"$grmlarch"')\.iso.*/\2/p' | sort | tail -1)
if [ -z "${date}" ] ; then
echo "ERROR: Could not find out latest ISO." >&2
exit 1
fi
output_directory="/boot/grml"
mkdir -p "${output_directory}"
diskfree=$(df --output=avail /boot/grml | tail -1)
if [ -z "${diskfree}" ] ; then
echo "ERROR: couldn't calculate free disk space in /boot." >&2
exit 1
fi
if [ "${grmlflavor}" = "full" ] && [ "${diskfree}" -lt 1048576 ] ; then
if [ "${force}" = "1" ] ; then
echo "WARN: There might not be enough free disk space in /boot, continuing anyway as requested via -f."
else
echo "ERROR: there doesn't seem to be enough free disk space in /boot." >&2
echo "Note: >=1GB for grml-full recommended (use -f to force download anyway)."
exit 1
fi
elif [ "${grmlflavor}" = "small" ] && [ "${diskfree}" -lt 524288 ] ; then
if [ "${force}" = "1" ] ; then
echo "WARN: There might not be enough free disk space in /boot, continuing anyway as requested via -f."
else
echo "ERROR: there doesn't seem to be enough free disk space in /boot." >&2
echo "Note: >=512MB for grml-small recommended (use -f to force download anyway)."
exit 1
fi
fi
isoname="grml-${grmlflavor}-${date}-${grmlarch}.iso"
if [ "${force}" = "1" ] || ! [ -f "${output_directory}/${isoname}" ] ; then
echo "Downloading Grml ISO to '${output_directory}/${isoname}'."
wget -O "${output_directory}/${isoname}.tmp" "https://download.grml.org/${isoname}"
retrieved_iso=1
elif [ -f "${output_directory}/${isoname}" ] ; then
echo "Found local ${output_directory}/${isoname}, skipping download (use -f to force download)."
fi
if [ "${retrieved_iso}" = "1" ] ; then
sig="$(mktemp)"
echo "Verifying ISO..."
wget --quiet -O "${sig}" "https://download.grml.org/${isoname}.asc"
if ! gpgv --keyring /usr/share/keyrings/debian-keyring.gpg "${sig}" "${output_directory}/${isoname}.tmp" ; then
echo "ERROR: ISO file will be left in '${output_directory}/${isoname}.tmp'." >&2
rm "${sig}"
exit 1
fi
rm "${sig}"
mv "${output_directory}/${isoname}.tmp" "${output_directory}/${isoname}"
echo "ISO file is OK."
fi
echo "Invoking 'update-grub' now."
update-grub
echo "Successfully finished grml-rescueboot integration."