diff --git a/README.md b/README.md index 11f4550..d6304ed 100644 --- a/README.md +++ b/README.md @@ -19,22 +19,21 @@ - `arch-chroot` to perform operations in a chroot. - `chpasswd` to set root and user passwords. - `openssl` to encrypt passwords. -- Basic Unix tools - - `awk` `sed` `grep` `uniq` `sort` `find` `ping` `mkfs` `lsblk` `curl`. +- Basic unix tool set: `awk` `sed` `grep` `uniq` `sort` `find` `ping` `mkfs` `lsblk` `curl`. - Network connection is needed to install packages and update the system. #### Manual Installation - curl - ``` - sh -c "$(curl -fsSL https://bitbucket.org/archlabslinux/installer/raw/master/install.sh)" - ``` +``` +sh -c "$(curl -fsSL https://bitbucket.org/archlabslinux/installer/raw/master/install.sh)" +``` - wget - ``` - sh -c "$(wget https://bitbucket.org/archlabslinux/installer/raw/master/install.sh -O -)" - ``` +``` +sh -c "$(wget https://bitbucket.org/archlabslinux/installer/raw/master/install.sh -O -)" +``` -- Packages for `pacman` can be found in our repos: - - stable: https://bitbucket.org/archlabslinux/archlabs_repo/src/master/x86_64/ - - unstable: https://bitbucket.org/archlabslinux/archlabs_unstable/src/master/x86_64/ +- Pre-built packages can be found in our repos: +[stable](https://bitbucket.org/archlabslinux/archlabs_repo/src/master/x86_64/) +[unstable](https://bitbucket.org/archlabslinux/archlabs_unstable/src/master/x86_64/) diff --git a/src/archlabs-installer b/src/archlabs-installer index ae4975f..3c456e7 100755 --- a/src/archlabs-installer +++ b/src/archlabs-installer @@ -1,5 +1,7 @@ #!/usr/bin/bash + # shellcheck disable=2154,2034,2153 +# vim:fdm=marker:fmr={,} # This program is free software, provided under the GNU GPL # Written by Nathaniel Maia for use in Archlabs @@ -8,13 +10,14 @@ # immutable globals -readonly VER="1.7.19" # Installer version +readonly VER="1.7.20" # Installer version readonly DIST="ArchLabs" # Linux distributor readonly MNT="/mnt/install" # Install mountpoint readonly ERR="/tmp/errlog" # Built-in error log readonly DBG="/tmp/debuglog" # Built-in error log -main() { +main() +{ if [[ $CURRENT_MENU != "main" ]]; then if [[ $SAVED ]]; then SELECTED=$((SAVED + 1)) diff --git a/src/lib/boot.sh b/src/lib/boot.sh index 2cf1f88..de78a7e 100644 --- a/src/lib/boot.sh +++ b/src/lib/boot.sh @@ -35,7 +35,8 @@ declare -Agx EDIT_FILES=( [11]="" # login files, left empty, don't know the username yet for /home/USER/FILES ) -prep_for_grub() { +prep_for_grub() +{ local cfg="$MNT/etc/default/grub" sed -i "s/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR=\"${DIST}\"/g; s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $cfg @@ -49,7 +50,8 @@ prep_for_grub() { return 0 } -prep_for_systemd-boot() { +prep_for_systemd-boot() +{ # no LVM then systemd-boot uses PARTUUID [[ $ROOT_PART =~ /dev/mapper ]] || ROOT_PART_ID="PART$ROOT_PART_ID" @@ -84,7 +86,8 @@ EOF return 0 } -prep_for_syslinux() { +prep_for_syslinux() +{ if [[ $SYS == 'UEFI' ]]; then local cfgdir="${MNT}${BMNTS[$SYS-$BOOTLDR]}/EFI/syslinux" local cfgsrcdir="/usr/lib/syslinux/efi32/" @@ -119,7 +122,8 @@ EOF return 0 } -install_bootloader() { +install_bootloader() +{ # not an LVM we can use the UUID for booting otherwise use the partition label if ! [[ $ROOT_PART =~ /dev/mapper ]]; then ROOT_PART_ID="UUID=$(blkid -s PARTUUID -o value $ROOT_PART)" @@ -145,7 +149,8 @@ install_bootloader() { return 0 } -uefi_boot_fallback() { +uefi_boot_fallback() +{ # some UEFI firmware requires a directory in the ESP and a generic bootx64.efi # see: https://wiki.archlinux.org/index.php/GRUB#UEFI # also: https://wiki.archlinux.org/index.php/syslinux#UEFI_Systems @@ -172,7 +177,8 @@ uefi_boot_fallback() { return 0 } -shim_secure_boot() { +shim_secure_boot() +{ # still a W.I.P local shim_file="shim.efi" [[ $IS_64BIT == true ]] && shim_file="shim64.efi" diff --git a/src/lib/dialogs.sh b/src/lib/dialogs.sh index e7192a2..d7bde9d 100644 --- a/src/lib/dialogs.sh +++ b/src/lib/dialogs.sh @@ -8,7 +8,9 @@ # shellcheck disable=2154,2034,2153 -# mutable globals { +# mutable globals +# { + declare -g WARN=false declare -g AUTOLOGIN=false declare -g CONFIG_DONE=false @@ -38,15 +40,16 @@ declare -g MKINIT_HOOKS="shutdown" # } - # basic dialog helper functions -msgbox() { +msgbox() +{ tput civis dialog --cr-wrap --backtitle "$BT" --title " $1 " --msgbox "$2\n" 0 0 } -menubox() { +menubox() +{ local title="$1" local body="$2" local h=$3 @@ -60,7 +63,8 @@ menubox() { printf "%s" "$response" } -checkbox() { +checkbox() +{ local title="$1" local body="$2" local h=$3 @@ -74,7 +78,8 @@ checkbox() { printf "%s" "$response" } -getinput() { +getinput() +{ local answer if ! answer="$(dialog --cr-wrap --max-input 63 --stdout --no-cancel --backtitle "$BT" --title " $1 " --inputbox "$2" 0 0 "$3")" || [[ $answer == '' ]]; then return 1 @@ -82,14 +87,16 @@ getinput() { printf "%s" "$answer" } -infobox() { +infobox() +{ local sec="$3" tput civis dialog --cr-wrap --backtitle "$BT" --title " $1 " --infobox "$2\n" 0 0 sleep ${sec:-2} } -yesno() { +yesno() +{ # usage: yesno <text> [<yes_label> <no_label> [<no>]] # three options: one --default-no and custom labels, one just custom labels, and one basic. tput civis @@ -106,7 +113,8 @@ yesno() { # larger specific dialog menus -select_language() { +select_language() +{ tput civis local lang local title="\nLanguage - sprache - taal - språk - lingua - idioma - nyelv - língua\n" @@ -145,7 +153,8 @@ select_language() { return 0 } -user_creation() { +user_creation() +{ tput cnorm local values if ! values="$(dialog --stdout --no-cancel --separator '~' --ok-label "Submit" --backtitle "$BT" \ @@ -211,7 +220,8 @@ user_creation() { return 0 } -select_keymap() { +select_keymap() +{ tput civis if ! KEYMAP="$(menubox "$_PrepLayout" "$_XMapBody" 20 70 12 \ 'us' 'English' 'cm' 'English' 'gb' 'English' 'au' 'English' 'gh' 'English' \ @@ -254,7 +264,8 @@ select_keymap() { return 0 } -select_timezone() { +select_timezone() +{ # create associative array for SUBZONES[zone] local f="/usr/share/zoneinfo/zone.tab" declare -A SUBZONES @@ -276,7 +287,8 @@ select_timezone() { yesno "$_TimeZTitle" "$_TimeZQ $ZONE/$SUBZONE?\n" && return 0 || select_timezone } -select_wm_or_de() { +select_wm_or_de() +{ declare -g PACKAGES="" tput civis @@ -348,7 +360,8 @@ select_wm_or_de() { return 0 } -select_login_method() { +select_login_method() +{ if ! LOGIN_TYPE="$(menubox "$_WMLogin" "$_LoginTypeBody" 0 0 0 \ "xinit" "Console login without a display manager" \ "lightdm" "Lightweight display manager with a gtk greeter")"; then @@ -362,7 +375,8 @@ select_login_method() { fi } -select_packages() { +select_packages() +{ if [[ $CURRENT_MENU != "packages" ]]; then declare -g SAVED=$SELECTED SELECTED=1 @@ -402,7 +416,8 @@ select_packages() { fi } -select_mirrorcmd() { +select_mirrorcmd() +{ local ip c local key="5f29642060ab983b31fdf4c2935d8c56" @@ -444,7 +459,8 @@ select_mirrorcmd() { return 0 } -display_system_settings() { +display_system_settings() +{ local cmd mnt pkgs cmd="${BCMDS[$BOOTLDR]}" mnt="${BMNTS[$SYS-$BOOTLDR]}" @@ -498,7 +514,8 @@ display_system_settings() { " } -configure_system_settings() { +configure_system_settings() +{ tput cnorm if ! HOSTNAME="$(getinput "$_ConfHost" "$_HostNameBody" "${DIST,,}")"; then return 1 @@ -540,7 +557,8 @@ configure_system_settings() { return 0 } -edit_system_configs() { +edit_system_configs() +{ if [[ $CURRENT_MENU != "edit" ]]; then SELECTED=1; CURRENT_MENU="edit" elif (( SELECTED < 11 )); then diff --git a/src/lib/install.sh b/src/lib/install.sh index 7789daf..11b0c05 100644 --- a/src/lib/install.sh +++ b/src/lib/install.sh @@ -1,19 +1,23 @@ #!/usr/bin/bash # vim:ft=sh:fdm=marker:fmr={,} -# shellcheck disable=2153 # archlabs installer library script file # this file is not meant to be run directly # sourcing this file in a non bash shell is not advised +# shellcheck disable=2153 + readonly RUN="/run/archiso/bootmnt/arch/boot" readonly VM="$(dmesg | grep -i "hypervisor")" -install() { - # function calls prefixed with 'oneshot' will only ever be run once - # otherwise the main function can be called repeatedly - clear; tput cnorm +install() +{ + # NOTE: function calls prefixed with 'oneshot' will only ever be run once + # this allows running install() multiple times without redoing things + + clear + tput cnorm # unpack the file system oneshot install_base @@ -52,11 +56,14 @@ install() { edit_system_configs } -install_base() { +install_base() +{ + # compressed image? if [[ -e /run/archiso/sfs/airootfs/ ]]; then printf "\nUnpacking base system --- Total: ~ 2.9G\n\n" rsync -ah --info=progress2 /run/archiso/sfs/airootfs/ $MNT/ else + # update the mirrorlist.. MUST be done before pacstrapping or it may be slow oneshot mirrorlist_sort @@ -108,7 +115,8 @@ EOF [[ -e /etc/NetworkManager/system-connections ]] && cp -rf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/ cp -f /etc/resolv.conf $MNT/etc/ - # set the locale and timezone + + # set the locale cat > $MNT/etc/locale.conf << EOF LANG=$LOCALE EOF @@ -117,8 +125,12 @@ LANG=$LOCALE EOF sed -i "s/#en_US.UTF-8/en_US.UTF-8/g; s/#${LOCALE}/${LOCALE}/g" $MNT/etc/locale.gen chrun "locale-gen" 2>/dev/null + + + # set the timezone chrun "ln -sf /usr/share/zoneinfo/$ZONE/$SUBZONE /etc/localtime" 2>/dev/null + # set the keymaps cat > $MNT/etc/X11/xorg.conf.d/00-keyboard.conf <<EOF # Use localectl(1) to instruct systemd-localed to update it. @@ -137,11 +149,15 @@ XKBVARIANT="" XKBOPTIONS="" BACKSPACE="guess" EOF + + # console keymap cat > $MNT/etc/vconsole.conf <<EOF KEYMAP=$CMAP FONT=$FONT EOF + + # set the hostname cat > $MNT/etc/hostname << EOF $HOSTNAME @@ -153,27 +169,31 @@ EOF ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF - return 0 + } -create_user() { +create_user() +{ # set root password chrun "chpasswd <<< 'root:$(openssl enc -pbkdf2 -a -d -salt -pass pass:$SALT <<< "$ROOT_PASS")'" - # Create the user, set password, then remove temporary password file local groups='audio,autologin,floppy,log,network,rfkill,scanner,storage,optical,power,wheel' + + # setup the autologin group chrun "groupadd -r autologin" + + # Create the user, set password, and make sure the ownership of ~/ is correct chrun "useradd -m -u 1000 -g users -G $groups -s $MYSHELL $NEWUSER" 2>$ERR chrun "chpasswd <<< '$NEWUSER:$(openssl enc -pbkdf2 -a -d -salt -pass pass:$SALT <<< "$USER_PASS")'" chrun "chown -Rf $NEWUSER:users /home/$NEWUSER" - # remove welcome message + # remove configs for window managers that were never installed [[ $INSTALL_WMS =~ i3-gaps ]] || rm -rf $MNT/home/$NEWUSER/.config/i3 [[ $INSTALL_WMS =~ bspwm ]] || rm -rf $MNT/home/$NEWUSER/.config/{bspwm,sxhkd} [[ $INSTALL_WMS =~ openbox ]] || rm -rf $MNT/home/$NEWUSER/.config/{openbox,skippy-xd,jgmenu,conky,tint2} [[ $INSTALL_WMS =~ (openbox|i3-gaps|bspwm) ]] || rm -rf $MNT/home/$NEWUSER/.config/polybar - # for neovim copy the default vimrc and colorscheme to ~/.config/nvim + # for neovim set up ~/.config/nvim if [[ $PACKAGES =~ neovim ]]; then mkdir -p $MNT/home/$NEWUSER/.config/nvim cp -f $MNT/home/$NEWUSER/.vimrc $MNT/home/$NEWUSER/.config/nvim/init.vim @@ -184,15 +204,19 @@ create_user() { return 0 } -login_manager() { +login_manager() +{ local service="$MNT/etc/systemd/system/getty@tty1.service.d" # remove welcome message sed -i '/printf/d' $MNT/root/.zshrc + if [[ $LOGIN_TYPE == 'lightdm' ]]; then + rm -rf $service chrun 'systemctl enable lightdm.service && systemctl set-default graphical.target' + cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf << EOF # LightDM GTK+ Configuration @@ -205,8 +229,9 @@ icon-theme-name=Adwaita font-name=DejaVu Sans Mono 11 position=30%,end 50%,end EOF - else - # xinit login + + else # xinit login + if [[ -e $MNT/home/$NEWUSER/.xinitrc ]]; then sed -i "s/openbox-session/${LOGIN_WM}/g" $MNT/home/$NEWUSER/.xinitrc else @@ -214,8 +239,14 @@ EOF fi # automatic startx for login shells - [[ $MYSHELL == '/bin/bash' ]] && local loginrc=".bash_profile" || local loginrc=".zprofile" - EDIT_FILES[11]+="/home/$NEWUSER/$loginrc" + case $MYSHELL in + /bin/bash) local loginrc=".bash_profile" ;; + /usr/bin/zsh) local loginrc=".zprofile" ;; + /usr/bin/mksh) local loginrc=".profile" ;; + esac + + # add the shell login file to the edit list after install + EDIT_FILES[11]+=" /home/$NEWUSER/$loginrc" cat >> $MNT/home/$NEWUSER/$loginrc << EOF # ~/$loginrc @@ -234,7 +265,8 @@ EOF fi } -run_mkinitcpio() { +run_mkinitcpio() +{ local add="" # setup a keyfile for LUKS.. Only when choosing grub and system is UEFI [[ $LUKS && ! $LVM && $SYS == 'UEFI' && $BOOTLDR == 'grub' ]] && luks_keyfile @@ -248,7 +280,8 @@ run_mkinitcpio() { echeck "mkinitcpio -p $KERNEL" } -mirrorlist_sort() { +mirrorlist_sort() +{ printf "\n\n%s\n\n" "Sorting the mirrorlist" if hash reflector >/dev/null 2>&1; then $MIRROR_CMD --save $MNT/etc/pacman.d/mirrorlist --verbose || @@ -259,19 +292,24 @@ mirrorlist_sort() { fi } -package_operations() { +package_operations() +{ local inpkg="$PACKAGES" # add the packages chosen during setup local rmpkg="archlabs-installer" # always remove the installer - # the LTS kernel uses different packages if [[ $KERNEL == 'linux-lts' ]]; then - rmpkg+=" virtualbox-guest-modules-arch linux" + rmpkg+=" linux" inpkg+=" linux-lts" - # if the system is a VM then install the needed packages otherwise remove the guest utils - [[ $VM ]] && inpkg+=" virtualbox-guest-dkms linux-lts-headers" || rmpkg+=" virtualbox-guest-utils" - else - # if the system is not a VM then remove the guest utils - [[ $VM ]] || rmpkg+=" virtualbox-guest-modules-arch virtualbox-guest-utils" + fi + + # if the system is a VM then install the needed packages + if [[ $VM ]]; then + inpkg+=" virtualbox-guest-utils" + if [[ $KERNEL == 'linux-lts' ]]; then + inpkg+=" virtualbox-guest-dkms linux-lts-headers" + else + inpkg+=" virtualbox-guest-modules-arch" + fi fi # for only gnome or cinnamon we don't need the xfce provided stuff @@ -295,7 +333,8 @@ package_operations() { return 0 } -suckless_install() { +suckless_install() +{ # install and setup dwm printf "\n\n%s\n\n" "Installing and setting up dwm." mkdir -pv $MNT/home/$NEWUSER/suckless diff --git a/src/lib/luks.sh b/src/lib/luks.sh index 8f43f81..16ffe14 100644 --- a/src/lib/luks.sh +++ b/src/lib/luks.sh @@ -15,7 +15,8 @@ declare -g LUKS_PASS="" declare -g LUKS_UUID="" declare -g LUKS_NAME="cryptroot" -luks_open() { +luks_open() +{ LUKS_PART="" modprobe -a dm-mod dm_crypt umount_dir $MNT @@ -44,7 +45,8 @@ luks_open() { return 0 } -luks_pass() { +luks_pass() +{ local title="$1" local name="$2" LUKS_PASS="" @@ -86,7 +88,8 @@ luks_pass() { return 0 } -luks_setup() { +luks_setup() +{ LUKS_PART="" modprobe -a dm-mod dm_crypt umount_dir $MNT @@ -114,7 +117,8 @@ luks_setup() { return 0 } -luks_default() { +luks_default() +{ luks_setup || return 1 infobox "$_LuksEncrypt" "$_LuksWaitBody $LUKS_NAME $_LuksWaitBody2 $LUKS_PART\n" 0 @@ -129,7 +133,8 @@ luks_default() { return 0 } -luks_keycmd() { +luks_keycmd() +{ if luks_setup; then tput cnorm local cipher @@ -151,13 +156,15 @@ luks_keycmd() { return 1 } -luks_show() { +luks_show() +{ tput civis sleep 0.5 msgbox "$_LuksEncrypt" "${_LuksEncryptSucc}\n$(lsblk $LUKS_PART -o NAME,MODEL,TYPE,FSTYPE,SIZE)" } -luks_menu() { +luks_menu() +{ tput civis local choice choice="$(menubox "$_PrepLUKS" "${_LuksMenuBody}${_LuksMenuBody2}${_LuksMenuBody3}" 0 0 0 \ @@ -176,7 +183,8 @@ luks_menu() { luks_menu } -luks_keyfile() { +luks_keyfile() +{ # Only used when choosing grub as bootloader. # Without a keyfile, during boot the user will be asked # to enter password for decryption twice, this is annoying diff --git a/src/lib/lvm.sh b/src/lib/lvm.sh index 76c89a0..351558c 100644 --- a/src/lib/lvm.sh +++ b/src/lib/lvm.sh @@ -12,7 +12,8 @@ declare -g LVM="" declare -g VOL_GROUP_MB=0 declare -g GROUP_PARTS=0 -lvm_detect() { +lvm_detect() +{ PHYSICAL_VOLUMES="$(pvs -o pv_name --noheading 2>/dev/null)" VOLUME_GROUP="$(vgs -o vg_name --noheading 2>/dev/null)" VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)" @@ -28,7 +29,8 @@ lvm_detect() { fi } -lvm_show_vg() { +lvm_show_vg() +{ DEL_VG="" VOL_GROUP_LIST="" @@ -48,7 +50,8 @@ lvm_show_vg() { return 0 } -get_lv_size() { +get_lv_size() +{ tput cnorm local ttl=" $_LvmCreateVG (LV:$VOL_COUNT) " local msg="${VOLUME_GROUP}: ${GROUP_SIZE}$GROUP_SIZE_TYPE (${VOL_GROUP_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" @@ -98,7 +101,8 @@ get_lv_size() { return 0 } -lvm_volume_name() { +lvm_volume_name() +{ local msg="$1" local default="volmain" @@ -120,7 +124,8 @@ lvm_volume_name() { return 0 } -lvm_group_name() { +lvm_group_name() +{ tput cnorm local group if ! group="$(getinput "$_LvmCreateVG" "$_LvmNameVgBody" "VolGroup")"; then @@ -137,7 +142,8 @@ lvm_group_name() { return 0 } -lvm_extra_lvs() { +lvm_extra_lvs() +{ while (( VOL_COUNT > 1 )); do # get the name and size lvm_volume_name "$_LvmLvNameBody1" || { break; return 1; } @@ -154,7 +160,8 @@ lvm_extra_lvs() { return 0 } -lvm_volume_count() { +lvm_volume_count() +{ if ! VOL_COUNT=$(dialog --cr-wrap --stdout --backtitle "$BT" --title " $_LvmCreateVG " \ --radiolist "$_LvmLvNumBody1 $VOLUME_GROUP\n$_LvmLvNumBody2" 0 0 0 \ "1" "-" off "2" "-" off "3" "-" off "4" "-" off "5" "-" off \ @@ -164,7 +171,8 @@ lvm_volume_count() { return 0 } -lvm_partitions() { +lvm_partitions() +{ find_partitions 'part|crypt' || return 1 PARTS="$(awk 'NF > 0 {print $0 " off"}' <<< "$PARTS")" @@ -177,7 +185,8 @@ lvm_partitions() { return 0 } -lvm_create_group() { +lvm_create_group() +{ # get volume group name lvm_group_name || return 1 @@ -203,7 +212,8 @@ lvm_create_group() { return 0 } -lvm_create() { +lvm_create() +{ VOLUME_GROUP="" GROUP_PARTS="" VOL_GROUP_MB=0 @@ -230,14 +240,16 @@ lvm_create() { return 0 } -lvm_del_vg() { +lvm_del_vg() +{ if lvm_show_vg; then yesno "$_LvmDelVG" "$_LvmDelQ" && vgremove -f "$DEL_VG" >/dev/null 2>&1 fi return 0 } -lvm_del_all() { +lvm_del_all() +{ PHYSICAL_VOLUMES="$(pvs -o pv_name --noheading 2>/dev/null)" VOLUME_GROUP="$(vgs -o vg_name --noheading 2>/dev/null)" VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)" @@ -258,7 +270,8 @@ lvm_del_all() { return 0 } -lvm_menu() { +lvm_menu() +{ lvm_detect tput civis diff --git a/src/lib/mount.sh b/src/lib/mount.sh index 03d1acf..e808106 100644 --- a/src/lib/mount.sh +++ b/src/lib/mount.sh @@ -13,7 +13,8 @@ readonly SALT="$(tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 32 | head -n 1)" readonly LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if($1) print $1 " -"}' /etc/locale.gen)" readonly CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " -"}')" -mount_install_partitions() { +mount_install_partitions() +{ # prepare partition list PARTS for dialog lvm_detect umount_dir $MNT @@ -39,7 +40,8 @@ mount_install_partitions() { return 0 } -select_swap() { +select_swap() +{ # Ask user to select partition or create swapfile tput civis if ! SWAP_PART="$(menubox "$_SelSwpSetup" "$_SelSwpBody" 0 0 0 \ @@ -70,7 +72,8 @@ select_swap() { return 0 } -select_mountpoint() { +select_mountpoint() +{ tput cnorm if ! EXTRA_MNT="$(getinput "$_PrepMount $part" "$_ExtPartBody1 /home /var\n" "/")"; then return 1 @@ -84,7 +87,8 @@ select_mountpoint() { return 0 } -select_boot_setup() { +select_boot_setup() +{ # choose bootloader and mountpoint (if needed) tput civis if ! BOOTLDR="$(menubox "$_PrepMount" "$_MntBootBody" 0 0 0 ${BOOTLDRS[$SYS]})"; then @@ -132,7 +136,8 @@ select_boot_setup() { return 0 } -select_mount_opts() { +select_mount_opts() +{ local part="$1" local fs="$2" local title="${fs^} Mount Options" @@ -152,7 +157,8 @@ select_mount_opts() { return 0 } -select_filesystem() { +select_filesystem() +{ local part="$1" local fs cur_fs str title cur_fs="$(lsblk -lno FSTYPE $part)" @@ -177,7 +183,8 @@ select_filesystem() { return 0 } -select_efi_partition() { +select_efi_partition() +{ tput civis if (( COUNT == 1 )); then BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")" @@ -198,7 +205,8 @@ select_efi_partition() { return 0 } -select_boot_partition() { +select_boot_partition() +{ tput civis if ! BOOT_PART="$(menubox "$_PrepMount" "$_SelBiosBody" 0 0 0 "$_Skip" "-" $PARTS)" || [[ $BOOT_PART == "$_Skip" ]]; then BOOT_PART="" @@ -213,7 +221,8 @@ select_boot_partition() { return 0 } -select_root_partition() { +select_root_partition() +{ # if we used LUKS and no LVM or LUKS+LVM remove the relevant partition labels from the list if [[ $LUKS && ! $LVM ]]; then ROOT_PART="/dev/mapper/$LUKS_NAME" @@ -242,7 +251,8 @@ select_root_partition() { return 0 } -select_extra_partitions() { +select_extra_partitions() +{ while (( COUNT > 0 )); do tput civis local part diff --git a/src/lib/package.sh b/src/lib/package.sh index f1a0ee6..92a165b 100644 --- a/src/lib/package.sh +++ b/src/lib/package.sh @@ -27,7 +27,8 @@ declare -gA PKG_EXT=( [qutebrowser]="qt5ct qt5-styleplugins" ) -select_browsers() { +select_browsers() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "firefox" "A popular open-source graphical web browser from Mozilla" off \ @@ -38,7 +39,8 @@ select_browsers() { printf "%s" "$pkgs" } -select_editors() { +select_editors() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "atom" "An open-source text editor developed by GitHub that is licensed under the MIT License" off \ @@ -49,7 +51,8 @@ select_editors() { printf "%s" "$pkgs" } -select_terminals() { +select_terminals() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "termite" "A minimal VTE-based terminal emulator" off \ @@ -61,7 +64,8 @@ select_terminals() { printf "%s" "$pkgs" } -select_music_and_video() { +select_music_and_video() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "vlc" "A free and open source cross-platform multimedia player" off \ @@ -77,7 +81,8 @@ select_music_and_video() { printf "%s" "$pkgs" } -select_mail_and_chat() { +select_mail_and_chat() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "thunderbird" "Standalone mail and news reader from mozilla" off \ @@ -91,7 +96,8 @@ select_mail_and_chat() { printf "%s" "$pkgs" } -select_office_and_editing() { +select_office_and_editing() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "libreoffice-fresh" "Full featured office suite" off \ @@ -109,7 +115,8 @@ select_office_and_editing() { printf "%s" "$pkgs" } -select_managment() { +select_managment() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "thunar" "A modern file manager for the Xfce Desktop Environment" off \ @@ -126,7 +133,8 @@ select_managment() { printf "%s" "$pkgs" } -select_extra() { +select_extra() +{ local pkgs="" pkgs="$(checkbox "$_Packages" "$_PackageBody" 0 0 0 \ "steam" "A popular game distribution platform by Valve" off \ diff --git a/src/lib/part.sh b/src/lib/part.sh index 809348c..59ba08d 100644 --- a/src/lib/part.sh +++ b/src/lib/part.sh @@ -23,13 +23,15 @@ declare -Agr FS_OPTS=([vfat]="" [ntfs]="" [ext2]="" [ext3]="" [f2fs]="data_flush - off disable_roll_forward - off disable_ext_identify - off discard - off fastboot - off flush_merge - off inline_xattr - off inline_data - off inline_dentry - off no_heap - off noacl - off nobarrier - off noextent_cache - off noinline_data - off norecovery - off" ) -format() { +format() +{ infobox "$_FSTitle" "\nFormatting: $1\n\nCommand: ${FS_CMDS[$2]}\n" 0 ${FS_CMDS[$2]} $1 >/dev/null 2>$ERR echeck "${FS_CMDS[$2]} $1" } -partition() { +partition() +{ local device if [[ $# -eq 0 ]]; then select_device 'root' || return 1 @@ -61,7 +63,8 @@ partition() { fi } -decr_count() { +decr_count() +{ # remove a partition from the dialog list and decrement the number partitions left (( $# == 1 )) || return 1 @@ -71,7 +74,8 @@ decr_count() { return 0 } -enable_swap() { +enable_swap() +{ if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then fallocate -l $SWAP_SIZE $1 2>$ERR echeck "fallocate -l $SWAP_SIZE $1" @@ -85,7 +89,8 @@ enable_swap() { return 0 } -device_tree() { +device_tree() +{ tput civis local msg if [[ $IGNORE_DEV != "" ]]; then @@ -98,7 +103,8 @@ device_tree() { msgbox "$_PrepShowDev" "$msg" } -select_device() { +select_device() +{ local dev local msg [[ $1 == 'boot' ]] && msg="$_DevSelTitle for bootloader\n" || umount_dir $MNT @@ -121,7 +127,8 @@ select_device() { return 0 } -confirm_mount() { +confirm_mount() +{ local part="$1" local mount="$2" local msg="Partition: $part\n" @@ -135,7 +142,8 @@ confirm_mount() { return 0 } -check_cryptlvm() { +check_cryptlvm() +{ local dev="" local part="$1" local devs @@ -182,7 +190,8 @@ check_cryptlvm() { fi } -auto_partition() { +auto_partition() +{ local device="$1" local size size=$(lsblk -lno SIZE $device | awk 'NR == 1 { @@ -246,7 +255,8 @@ auto_partition() { msgbox "$_PrepParts" "\nAuto partitioning complete.\n\n$(lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE $device)" } -mount_partition() { +mount_partition() +{ local part="$1" local mountp="${MNT}$2" local fs @@ -267,7 +277,8 @@ mount_partition() { return 0 } -find_partitions() { +find_partitions() +{ local str="$1" local err='' @@ -300,7 +311,8 @@ find_partitions() { return 0 } -setup_boot_device() { +setup_boot_device() +{ [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEVICE="${BOOT_PART%p[1-9]}" || BOOT_DEVICE="${BOOT_PART%[1-9]}" BOOT_PART_NUM="${BOOT_PART: -1}" diff --git a/src/lib/utils.sh b/src/lib/utils.sh index bb3c493..494df87 100644 --- a/src/lib/utils.sh +++ b/src/lib/utils.sh @@ -8,23 +8,27 @@ # shellcheck disable=2154 -chrun() { +chrun() +{ # run a shell command in the chroot dir $MNT arch-chroot $MNT /bin/bash -c "$1" } -json() { +json() +{ # get a value from http://api.ipstack.com in json format using my API key # this includes: ip, geolocation, country name curl -s "http://api.ipstack.com/$2" | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])" } -src() { +src() +{ # source a file ($1), if it fails we die with an error message . "$1" || { printf "\nFailed to source file %s\n" "$1"; die 1; } } -ssd() { +ssd() +{ # returns 0 (true) when the device passed ($1) is NOT a rotational device local dev=$1 dev=${dev#/dev/} @@ -32,7 +36,8 @@ ssd() { [[ $(cat /sys/block/$dev/queue/rotational) -eq 0 ]] || return 1 } -die() { +die() +{ # die peacefully local exitcode=0 (( $# == 0 )) || exitcode=$1 @@ -52,13 +57,15 @@ die() { exit $exitcode } -sigint() { +sigint() +{ # used to trap SIGINT and cleanly exit the program printf "\n** CTRL-C caught" die 1 } -print4() { +print4() +{ # takes an arbitrary number of input fields and prints them out in fourths on separate lines local str="$*" if [[ ${#str} -gt $(( ${COLUMNS:-$(tput cols)} / 2 )) ]]; then @@ -87,14 +94,16 @@ print4() { printf "%s\n" "$str" } -oneshot() { +oneshot() +{ [[ -e /tmp/.ai_$1 || ! $(type $1) ]] && return 0 $1 || return 1 touch "/tmp/.ai_$1" return 0 } -system_devices() { +system_devices() +{ IGNORE_DEV="$(lsblk -lno NAME,MOUNTPOINT | awk '/\/run\/archiso\/bootmnt/ {sub(/[1-9]/, ""); print $1}')" if [[ $IGNORE_DEV ]]; then SYS_DEVS="$(lsblk -lno NAME,SIZE,TYPE | awk '/disk/ && !'"/$IGNORE_DEV/"' {print "/dev/" $1 " " $2}')" @@ -105,7 +114,8 @@ system_devices() { declare -grx SYS_DEVS IGNORE_DEV DEV_COUNT } -system_identify() { +system_identify() +{ declare -g IS_64BIT=false local efidir="/sys/firmware/efi" @@ -129,11 +139,13 @@ system_identify() { SYS="BIOS" fi + # shellcheck disable=2034 declare -g BT="$DIST Installer - $SYS (x86_64) - Version $VER" return 0 } -system_checks() { +system_checks() +{ [[ $(whoami) == "root" ]] || { infobox "$_ErrTitle" "$_NotRoot\n$_Exit" && die 1; } grep -qw 'lm' /proc/cpuinfo || { infobox "$_ErrTitle" "$_Not64Bit\n$_Exit" && die 1; } @@ -152,7 +164,8 @@ system_checks() { return 0 } -preinstall_checks() { +preinstall_checks() +{ [[ $(lsblk -o MOUNTPOINT) =~ $MNT ]] || { msgbox "$_ErrTitle" "$_ErrNoMount"; export SELECTED=4; return 1; } if [[ $# -eq 1 ]]; then [[ $CONFIG_DONE == true ]] || { msgbox "$_ErrTitle" "$_ErrNoConfig"; export SELECTED=5; return 1; } @@ -160,7 +173,8 @@ preinstall_checks() { return 0 } -echeck() { +echeck() +{ # return if the last process exited normally local last_exit_code=$? (( last_exit_code == 0 )) && return 0 @@ -182,7 +196,8 @@ echeck() { return 0 } -debug() { +debug() +{ set -x exec 3>| $DBG BASH_XTRACEFD=3 @@ -196,7 +211,8 @@ debug() { export DEBUG=true } -umount_dir() { +umount_dir() +{ swapoff -a [[ -d $1 ]] && umount -R $1 >/dev/null 2>&1 return 0