From 30dfe15a6e6b7b7abdb431ba9ea51f0433917dd7 Mon Sep 17 00:00:00 2001 From: langfingaz Date: Fri, 30 Apr 2021 21:42:12 +0200 Subject: [PATCH] installer script: work in progress (2) --- pkg/de-p1st-installer/de-p1st-installer.sh | 177 ++++++++++++++----- pkg/de-p1st-installer/helper.sh | 35 ++++ pkg/de-p1st-installer/installer.cfg | 3 +- pkg/de-p1st-installer/name-reference-test.sh | 8 +- 4 files changed, 169 insertions(+), 54 deletions(-) create mode 100644 pkg/de-p1st-installer/helper.sh diff --git a/pkg/de-p1st-installer/de-p1st-installer.sh b/pkg/de-p1st-installer/de-p1st-installer.sh index e493455..cdc71f0 100755 --- a/pkg/de-p1st-installer/de-p1st-installer.sh +++ b/pkg/de-p1st-installer/de-p1st-installer.sh @@ -3,6 +3,9 @@ # load config source installer.cfg || { exit 1; } +# load functions +source helper.sh || { exit 1; } + function check_network() { echo "Sending ping to wikipedia.de ..." @@ -26,31 +29,6 @@ function increase_cow_space() { 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. @@ -64,49 +42,49 @@ function get_text_input { fi for i in "$@"; do if [ -z "$i" ]; then - echo "get_menu_selections: all given args must not be empty"; + echo "get_text_input: 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 ptr=$1 + if [ -z "$ptr" ]; then + # if ptr has no value yet, ask user for input! echo "$2" - read -r VAR || return $? + read -r ptr || return $? fi # check string length to be greater than zero! - if [ "${#VAR}" -lt 1 ]; then + if [ "${#ptr}" -lt 1 ]; then echo "get_text_input must not be empty!"; return 1; fi } -function get_menu_selection { +function get_single_choice { # If variable with name $1 is zero, then ask user to select one option. # - # $1: name of variable to store user selection + # $1: name of variable to store the selected option # $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!"; + echo "get_single_choice 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"; + echo "get_single_choice: 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 ptr=$1 + if [ -z "$ptr" ]; then + # if ptr has no value yet, ask user for input! local -n MENU_OPTIONS=$3 - VAR=$(dialog --stdout --menu "$2" 0 0 0 ${MENU_OPTIONS}) || { + ptr=$(dialog --stdout --menu "$2" 0 0 0 ${MENU_OPTIONS}) || { echo "Error during menu selection!" exit 1 } @@ -114,6 +92,41 @@ function get_menu_selection { fi } +function get_multi_choice { + # If variable with name $1 is zero, then ask user to select one ore more options. + # + # $1: name of variable to store array of selected options + # $2: text to display + # $3: name of variable with space-separated menu options to display (each menu option consists of an item, a description and on/off if preselected or not) + if [ "$#" -ne 3 ]; then + echo "get_multi_choice requires three args!"; + return 1 + fi + for i in "$@"; do + if [ -z "$i" ]; then + echo "get_multi_choice: all given args must not be empty"; + return 1; + fi + done + + + local -n ptr=$1 + if [ -z "$ptr" ]; then + # if ptr has no value yet, ask user for input! + + local -n MENU_OPTIONS=$3 + local tmp=$(dialog --stdout --checklist "$2" 0 0 0 ${MENU_OPTIONS}) || { + echo "Error during menu selection!" + exit 1 + } + clear + + # Result of dialog is space separated list + # Store this as an array + readarray -d " " -t ptr <<<"$tmp" + fi +} + function get_user_input() { # return: the following variables: # BIOS_TYPE (uefi or bios) @@ -123,18 +136,17 @@ function get_user_input() { # 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 $? + get_single_choice 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 $? + get_single_choice 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 $? + get_single_choice 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_single_choice FS "Select filesystem to use" TMP1 || return $? get_text_input HOSTNAME "Enter hostname:" || return $? get_text_input USERNAME "Enter username:" || return $? @@ -158,8 +170,8 @@ function get_user_input() { } function get_cpu_vendor() { - # return: the following variables: - # CPU_VENDOR ("amd", "intel", "none") + # 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! @@ -178,10 +190,77 @@ function get_cpu_vendor() { fi } +function get_default_mount_options() { + # return: the following variables: + # FS_DEFAULT_MOUNT_OPTIONS (array) + + FS_DEFAULT_MOUNT_OPTIONS=() + + case "${FS}" in + BTRFS) + # compress=lzo: archwiki -> Btrfs#Compression + # "Enable compression (better performance, longer flash lifespan)" + FS_DEFAULT_MOUNT_OPTIONS+=('compress=lzo') + ;; + EXT4) + # https://wiki.archlinux.org/index.php/Ext4#Enabling_metadata_checksums + # If the CPU supports SSE 4.2, make sure the crc32c_intel kernel module is loaded (TODO) + FS_DEFAULT_MOUNT_OPTIONS+=('metadata_csum') + ;; + F2FS) + # When mounting the filesystem, specify compress_algorithm=(lzo|lz4|zstd|lzo-rle). + # Using compress_extension=txt will cause all txt files to be compressed by default. + FS_DEFAULT_MOUNT_OPTIONS+=('compress_algorithm=lz4') + ;; + *) + echo "Filesystem $FS not yet supported!" + return 1 + ;; + esac +} + +function choose_mount_options() { + # return: the following variables: + # FS_MOUNT_OPTIONS (array) + + case "${FS}" in + BTRFS) + # noatime, nodiratime: + # - The atime options do impact drive performance; + # - noatime implies nodiratime, one does not need to specify both; + # - The noatime option fully disables writing file access times to the drive every time you read a file. + # This works well for almost all applications, except for those that need to know if a file has been + # read since the last time it was modified. + TMP1="noatime Don't-write-file/folder-access-times off ssd Only-enable-when-on-ssd-or-nvme off" + ;; + EXT4) + TMP1="noatime Don't-write-file/folder-access-times off" + ;; + F2FS) + TMP1="noatime Don't-write-file/folder-access-times off" + ;; + *) + echo "Filesystem $FS not yet supported!" + return 1 + ;; + esac + + get_multi_choice FS_MOUNT_OPTIONS "Select mount options" TMP1 || return $? + + # TODO: test FS_MOUNT_OPTIONS + echo "${FS_MOUNT_OPTIONS[@]}" + echo "${#FS_MOUNT_OPTIONS[@]}" + for i in "${FS_MOUNT_OPTIONS[@]}"; do + echo "<<$i>>" + done +} + function main() { - check_network || return $? - get_user_input || return $? - get_cpu_vendor || return $? + check_network || return $? + get_user_input || return $? + get_cpu_vendor || return $? + get_default_mount_options || return $? + choose_mount_options || return $? } main "$@" diff --git a/pkg/de-p1st-installer/helper.sh b/pkg/de-p1st-installer/helper.sh new file mode 100644 index 0000000..b2cd383 --- /dev/null +++ b/pkg/de-p1st-installer/helper.sh @@ -0,0 +1,35 @@ +function newline_to_space(){ + # Replaces all newlines with spaces + # $1: name of variable + + local -n ptr=$1 + # Replace newlines with spaces + # See bash string substitution: https://gist.github.com/JPvRiel/b279524d3e56229a896477cb8082a72b + + echo "removing newlines in str: -->$ptr<--" + ptr="${ptr//$'\n'/' '}" + echo "new str is: -->$ptr<--" +} + +function get_block_devices(){ + # return: the following variables: + # BLOCK_DEVICES (array with each block device as one entry) + + # get list of devices, one per line + local tmp + 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)" + + # replace newlines with spaces + newline_to_space BLOCK_DEVICE_SIZES +} diff --git a/pkg/de-p1st-installer/installer.cfg b/pkg/de-p1st-installer/installer.cfg index 1e2cefe..d5b33c8 100644 --- a/pkg/de-p1st-installer/installer.cfg +++ b/pkg/de-p1st-installer/installer.cfg @@ -8,8 +8,9 @@ LUKS_PWD=test KERNEL=linux -TARGET_BLOCK_DEVICE=/dev/sda +# TARGET_BLOCK_DEVICE=/dev/sda FS=BTRFS CPU_VENDOR=none BIOS_TYPE=uefi +# FS_MOUNT_OPTIONS=() diff --git a/pkg/de-p1st-installer/name-reference-test.sh b/pkg/de-p1st-installer/name-reference-test.sh index 0da1c49..f816fdd 100644 --- a/pkg/de-p1st-installer/name-reference-test.sh +++ b/pkg/de-p1st-installer/name-reference-test.sh @@ -18,14 +18,14 @@ function text_input { return 1 fi - local -n VAR=$1 - if [ -z "$VAR" ]; then + local -n ptr=$1 + if [ -z "$ptr" ]; then echo "$2" - read -r VAR || return $? + read -r ptr || return $? fi # check string length to be greater than zero! - if [ "${#VAR}" -lt 1 ]; then + if [ "${#ptr}" -lt 1 ]; then echo "text_input must not be empty!"; return 1; fi