2019-12-31 14:28:42 -01:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
source "$GENTOO_BOOTSTRAP_DIR/scripts/protection.sh" || exit 1
|
|
|
|
|
|
|
|
|
|
elog() {
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "[1m *[m $*"
|
2019-12-31 14:28:42 -01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
einfo() {
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "[1;32m *[m $*"
|
2019-12-31 14:28:42 -01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ewarn() {
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "[1;33m *[m $*" >&2
|
2019-12-31 14:28:42 -01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eerror() {
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "[1;31m * ERROR:[m $*" >&2
|
2019-12-31 14:28:42 -01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
die() {
|
|
|
|
|
eerror "$*"
|
|
|
|
|
kill "$GENTOO_BOOTSTRAP_SCRIPT_PID"
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-02 22:29:17 -01:00
|
|
|
|
for_line_in() {
|
|
|
|
|
while IFS="" read -r line || [[ -n "$line" ]]; do
|
|
|
|
|
"$2" "$line"
|
|
|
|
|
done <"$1"
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-04 10:55:31 -01:00
|
|
|
|
flush_stdin() {
|
2020-01-02 22:29:17 -01:00
|
|
|
|
local empty_stdin
|
|
|
|
|
while read -r -t 0.01 empty_stdin; do true; done
|
2020-01-04 10:55:31 -01:00
|
|
|
|
}
|
2020-01-02 22:29:17 -01:00
|
|
|
|
|
2020-01-04 10:55:31 -01:00
|
|
|
|
ask() {
|
|
|
|
|
local response
|
2019-12-31 14:28:42 -01:00
|
|
|
|
while true; do
|
2020-01-04 10:55:31 -01:00
|
|
|
|
flush_stdin
|
2020-01-04 11:09:29 -01:00
|
|
|
|
read -r -p "$* (Y/n) " response \
|
|
|
|
|
|| die "Error in read"
|
2019-12-31 14:28:42 -01:00
|
|
|
|
case "${response,,}" in
|
|
|
|
|
'') return 0 ;;
|
|
|
|
|
y|yes) return 0 ;;
|
|
|
|
|
n|no) return 1 ;;
|
|
|
|
|
*) continue ;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-04 10:55:31 -01:00
|
|
|
|
try() {
|
|
|
|
|
local response
|
|
|
|
|
local cmd_status
|
2020-01-04 11:09:29 -01:00
|
|
|
|
local prompt_parens="([1mS[mhell/[1mr[metry/[1ma[mbort/[1mc[montinue/[1mp[mrint)"
|
2020-01-04 10:55:31 -01:00
|
|
|
|
|
|
|
|
|
# Outer loop, allows us to retry the command
|
|
|
|
|
while true; do
|
|
|
|
|
# Try command
|
|
|
|
|
"$@"
|
|
|
|
|
cmd_status="$?"
|
|
|
|
|
|
|
|
|
|
if [[ "$cmd_status" != 0 ]]; then
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "[1;31m * Command failed: [1;33m\$[m $*"
|
|
|
|
|
echo "Last command failed with exit code $cmd_status"
|
2020-01-04 10:55:31 -01:00
|
|
|
|
|
|
|
|
|
# Prompt until input is valid
|
|
|
|
|
while true; do
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo -n "Specify next action $prompt_parens "
|
2020-01-04 10:55:31 -01:00
|
|
|
|
flush_stdin
|
2020-01-04 11:09:29 -01:00
|
|
|
|
read -r response \
|
|
|
|
|
|| die "Error in read"
|
2020-01-04 10:55:31 -01:00
|
|
|
|
case "${response,,}" in
|
|
|
|
|
''|s|shell)
|
2020-01-04 12:10:40 -01:00
|
|
|
|
echo "You will be prompted for action again after exiting this shell."
|
|
|
|
|
/bin/bash --init-file <(echo "init_bash")
|
2020-01-04 10:55:31 -01:00
|
|
|
|
;;
|
|
|
|
|
r|retry) continue 2 ;;
|
2020-01-04 11:09:29 -01:00
|
|
|
|
a|abort) die "Installation aborted" ;;
|
|
|
|
|
c|continue) return 0 ;;
|
2020-01-04 12:10:40 -01:00
|
|
|
|
p|print) echo "[1;33m\$[m $*" ;;
|
2020-01-04 11:31:39 -01:00
|
|
|
|
*) ;;
|
2020-01-04 10:55:31 -01:00
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
fi
|
2020-01-04 11:27:12 -01:00
|
|
|
|
|
|
|
|
|
return
|
2020-01-04 10:55:31 -01:00
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-31 14:28:42 -01:00
|
|
|
|
countdown() {
|
2020-01-02 22:29:17 -01:00
|
|
|
|
echo -n "$1" >&3
|
2019-12-31 14:28:42 -01:00
|
|
|
|
|
|
|
|
|
local i="$2"
|
|
|
|
|
while [[ $i -gt 0 ]]; do
|
2020-01-02 22:29:17 -01:00
|
|
|
|
echo -n "[1;31m$i[m " >&3
|
2019-12-31 14:28:42 -01:00
|
|
|
|
i=$((i - 1))
|
|
|
|
|
sleep 1
|
|
|
|
|
done
|
2020-01-02 22:29:17 -01:00
|
|
|
|
echo >&3
|
2019-12-31 14:28:42 -01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
download_stdout() {
|
|
|
|
|
wget --quiet --https-only --secure-protocol=PFS -O - -- "$1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
download() {
|
|
|
|
|
wget --quiet --https-only --secure-protocol=PFS --show-progress -O "$2" -- "$1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get_device_by_partuuid() {
|
|
|
|
|
blkid -g \
|
|
|
|
|
|| die "Error while executing blkid"
|
|
|
|
|
local dev
|
|
|
|
|
dev="$(blkid -o export -t PARTUUID="$1")" \
|
|
|
|
|
|| die "Error while executing blkid to find PARTUUID=$1"
|
|
|
|
|
dev="$(grep DEVNAME <<< "$dev")" \
|
|
|
|
|
|| die "Could not find DEVNAME=... in blkid output"
|
|
|
|
|
dev="${dev:8}"
|
|
|
|
|
echo -n "$dev"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
load_or_generate_uuid() {
|
|
|
|
|
local uuid
|
|
|
|
|
local uuid_file="$UUID_STORAGE_DIR/$1"
|
|
|
|
|
|
|
|
|
|
if [[ -e "$uuid_file" ]]; then
|
|
|
|
|
uuid="$(cat "$uuid_file")"
|
|
|
|
|
else
|
|
|
|
|
uuid="$(uuidgen -r)"
|
|
|
|
|
mkdir -p "$UUID_STORAGE_DIR"
|
|
|
|
|
echo -n "$uuid" > "$uuid_file"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo -n "$uuid"
|
|
|
|
|
}
|