arch/pkg/de-p1st-installer/de-p1st-installer.sh

188 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
# load config
source installer.cfg || { exit 1; }
function check_network() {
echo "Sending ping to wikipedia.de ..."
ping -c 1 wikipedia.de || {
echo "Pleas set up network access."
return 1
}
}
function increase_cow_space() {
# May be useful when running 'pacman -Syu' on the live medium.
# Usually not necessary!
# make sure that we are on a live medium:
findmnt /run/archiso/cowspace || {
echo "Not on live medium, did not increase cowspace!"
return 1
}
echo "Increasing cowspace partition of live medium ..."
mount -o remount,size=2G /run/archiso/cowspace || return $?
}
function get_block_devices(){
# return: the following variables:
# BLOCK_DEVICES (array with each block device as one entry)
local tmp
# # get list of devices , one per line
# #
# # -> remove everything after first whitespace
# # -> with sed; alternative: awk '{print $1}'
# # -> add "/dev/" at start of each line
# tmp=$(lsblk --noheadings --nodeps | sed 's|\s.*$||; s|^|&/dev/|') || return $?
tmp=$(lsblk -dplnx size -o name | grep -Ev "boot|rpmb|loop")
readarray -t BLOCK_DEVICES <<<"$tmp"
}
function get_block_devices_with_size() {
# return: the following variables:
# BLOCK_DEVICE_SIZES (space separated list of block devices and their sizes)
# one could use sed to remove multiple white spaces
# sed 's|\s\s*| |'
BLOCK_DEVICE_SIZES="$(lsblk -dplnx size -o name,size | grep -Ev "boot|rpmb|loop" | tac)"
}
function get_text_input {
# If variable with name $1 is zero, then ask user for input.
# Only one line user input is allowed.
# User input must not be empty.
#
# $1: name of variable to store user input
# $2: text to display (e.g. "Enter hostname:")
if [ "$#" -ne 2 ]; then
echo "get_text_input requires two args!";
return 1
fi
for i in "$@"; do
if [ -z "$i" ]; then
echo "get_menu_selections: all given args must not be empty";
return 1;
fi
done
local -n VAR=$1
if [ -z "$VAR" ]; then
# if VAR has no value yet, ask user for input!
echo "$2"
read -r VAR || return $?
fi
# check string length to be greater than zero!
if [ "${#VAR}" -lt 1 ]; then
echo "get_text_input must not be empty!";
return 1;
fi
}
function get_menu_selection {
# If variable with name $1 is zero, then ask user to select one option.
#
# $1: name of variable to store user selection
# $2: text to display
# $3: name of variable with space-separated menu options to display (each menu option consists of an item and a description)
if [ "$#" -ne 3 ]; then
echo "get_menu_selection requires three args!";
return 1
fi
for i in "$@"; do
if [ -z "$i" ]; then
echo "get_menu_selections: all given args must not be empty";
return 1;
fi
done
local -n VAR=$1
if [ -z "$VAR" ]; then
# if VAR has no value yet, ask user for input!
local -n MENU_OPTIONS=$3
VAR=$(dialog --stdout --menu "$2" 0 0 0 ${MENU_OPTIONS}) || {
echo "Error during menu selection!"
exit 1
}
clear
fi
}
function get_user_input() {
# return: the following variables:
# BIOS_TYPE (uefi or bios)
# KERNEL (linux or linux-lts)
# FS (BTRFS, EXT4, F2FS)
# HOSTNAME
# USERNAME, USER_PWD
# LUKS_PWD
# get_block_devices || return $?
get_block_devices_with_size || return $?
get_menu_selection TARGET_BLOCK_DEVICE "Select target device for installation" BLOCK_DEVICE_SIZES || return $?
TMP1="uefi Newer-mainboards bios Legacy-BIOS-on-older-mainboards"
get_menu_selection BIOS_TYPE "Select your bios type" TMP1 || return $?
TMP1="linux-lts Long-Time-Stable-Linux-kernel linux Latest-Linux-kernel"
get_menu_selection KERNEL "Select kernel version" TMP1 || return $?
TMP1="BTRFS allows-snapshots-and-dynamic-extension-of-the-fs EXT4 default-fs-of-many-distributions F2FS Flash-Friendly-fs-for-SSD-or-NVMe"
get_menu_selection FS "Select filesystem to use" TMP1 || return $?
get_text_input HOSTNAME "Enter hostname:" || return $?
get_text_input USERNAME "Enter username:" || return $?
if [ -z "${USER_PWD}" ]; then
get_text_input USER_PWD "Enter a user password:" || return $?
get_text_input USER_PWD2 "Please enter the password again:" || return $?
[[ "${USER_PWD}" == "${USER_PWD2}" ]] || {
echo "Passwords did not match";
exit 1;
}
fi
if [ -z "${LUKS_PWD}" ]; then
get_text_input LUKS_PWD "Enter a disk encryption password:" || return $?
get_text_input LUKS_PWD2 "Please enter the password again:" || return $?
[[ "${LUKS_PWD}" == "${LUKS_PWD2}" ]] || {
echo "Passwords did not match";
exit 1;
}
fi
}
function get_cpu_vendor() {
# return: the following variables:
# CPU_VENDOR ("amd", "intel", "none")
if [ -z "${CPU_VENDOR}" ]; then
# if CPU_VENDOR has no value yet, ask user for input!
local vendor_id
vendor_id=$(cat /proc/cpuinfo | grep vendor_id | head -1 | sed 's|vendor_id\s*:\s*||')
if [ "$vendor_id" = "AuthenticAMD" ]; then
CPU_VENDOR="amd"
elif [ "$vendor_id" = "GenuineIntel" ]; then
CPU_VENDOR="intel"
else
echo "Unknown CPU vendor: $vendor_id"
return 1
fi
fi
}
function main() {
check_network || return $?
get_user_input || return $?
get_cpu_vendor || return $?
}
main "$@"