From 18a1170af704ef8411b842235bcdf54ed0f0af42 Mon Sep 17 00:00:00 2001 From: natemaia Date: Sun, 17 Mar 2019 12:17:43 -0700 Subject: [PATCH] Fix: awk // search syntax error in part_resize() --- archlabs-installer | 152 +++++++++++++++++++++------------------------ 1 file changed, 70 insertions(+), 82 deletions(-) diff --git a/archlabs-installer b/archlabs-installer index 83276c8..09c8dde 100755 --- a/archlabs-installer +++ b/archlabs-installer @@ -5,7 +5,7 @@ # Some ideas and code reworked from other resources # AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due -VER="2.0.25" # version +VER="2.0.27" # version DIST="ArchLabs" # distributor MNT="/mnt" # mountpoint ANS="/tmp/ans" @@ -250,7 +250,7 @@ declare -A PKG_EXT=( _keymap="\nPick which keymap to use for the system from the list below\n\nThis is used once a graphical environment is running (Xorg).\n\nSystem default: us" _vconsole="\nSelect the console keymap, the console is the tty shell you reach before starting a graphical environment (Xorg).\n\nIts keymap is seperate from the one used by the graphical environments, though many do use the same such as 'us' English.\n\nSystem default: us" _device="\nSelect a device to use from the list below.\n\nDevices (/dev) are the available drives on the system. /sda, /sdb, /sdc ..." -_resize="\n\nSelect the new filesystem size, a new partition will then be created from the free space.\nThe lowest size is just enough to fit the currently in use space on the partition while the default is set to split the free space evenly.\n\nUse Tab or the arrow keys move the cursor between the buttons and the value, when the cursor is on the value, you can edit it by:\n\n - left/right cursor movement to select a digit to modify\n - +/- characters to increment/decrement the digit by one\n - 0 through 9 to set the digit to the given value\n\nSome keys are also recognized in all cursor positions:\n\n - Home/End set the value to its maximum or minimum\nPageup/Pagedown increment the value so that the slider moves by one column." +_resize="\nSelect a new filesystem size in MB, a new partition will be created from the free space but will be left unformatted.\nThe lowest size is just enough to fit the currently in use space on the partition while the default is set to split the free space evenly.\n\nUse Tab or the arrow keys move the cursor between the buttons and the value, when the cursor is on the value, you can edit it by:\n\n - left/right cursor movement to select a digit to modify\n - +/- characters to increment/decrement the digit by one\n - 0 through 9 to set the digit to the given value\n\nSome keys are also recognized in all cursor positions:\n\n - Home/End set the value to its maximum or minimum\n - Pageup/Pagedown increment the value so that the slider moves by one column." _mount="\nUse [Space] to toggle mount options from below, press [Enter] when done to confirm selection.\n\nNot selecting any and confirming will run an automatic mount." _warn="\nIMPORTANT:\n\nChoose carefully when editing, formatting, and mounting partitions or your DATA MAY BE LOST.\n\nTo mount a partition without formatting it, select 'skip' when prompted to choose a filesystem during the mounting stage.\nThis can only be used for partitions that already contain a filesystem and cannot be the root (/) partition, it needs to be formatted before install.\n" _part="\nFull device auto partitioning is available for beginners otherwise cfdisk is recommended.\n\n - All systems will require a root partition (8G or greater).\n - UEFI (and BIOS using LUKS without LVM) require a separate boot partition (100-512M)." @@ -310,26 +310,21 @@ select_main() (( SEL < 12 )) && (( SEL++ )) tput civis dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \ - 1 "Show lsblk output (optional)" \ - 2 "Edit partitions (optional)" \ - 3 "LUKS encryption (optional)" \ - 4 "Logical volume management (optional)" \ - 5 "Mount and format partitions" \ - 6 "Select system bootloader" \ - 7 "Create user and set password" \ - 8 "Configure system settings" \ - 9 "Select window manager or desktop (optional)" \ - 10 "Select additional packages (optional)" \ - 11 "Check configuration choices (optional)" \ + 1 "Device tree (optional)" \ + 2 "Partitioning (optional)" \ + 3 "LUKS setup (optional)" \ + 4 "LVM setup (optional)" \ + 5 "Mount partitions" \ + 6 "System bootloader" \ + 7 "User and password" \ + 8 "System configuration" \ + 9 "Select WM/DE (optional)" \ + 10 "Select Packages (optional)" \ + 11 "View configuration (optional)" \ 12 "Start the installation" 2>"$ANS" read -r SEL < "$ANS" - - if [[ -z $WARN && $SEL =~ (2|5) ]]; then - msg "Data Warning" "$_warn" - WARN=true - fi - + [[ -z $WARN && $SEL =~ (2|5) ]] && { msg "Data Warning" "$_warn"; WARN=true; } case $SEL in 1) part_show ;; 2) part_menu || (( SEL-- )) ;; @@ -352,31 +347,24 @@ select_boot() if [[ $SYS == 'BIOS' ]]; then dlg BOOTLDR menu "BIOS Bootloader" "\nSelect which bootloader to use." \ "grub" "The Grand Unified Bootloader, standard among many Linux distributions" \ - "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network" - + "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network" || return 1 else dlg BOOTLDR menu "UEFI Bootloader" "\nSelect which bootloader to use." \ "systemd-boot" "A simple UEFI boot manager which executes configured EFI images" \ "grub" "The Grand Unified Bootloader, standard among many Linux distributions" \ "refind-efi" "A UEFI boot manager that aims to be platform neutral and simplify multi-boot" \ "efistub" "Boot the kernel image directly (no chainloading support)" \ - "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network (no chainloading support)" - + "syslinux" "A collection of boot loaders for booting drives, CDs, or over the network (no chainloading support)" || return 1 fi - [[ $BOOTLDR ]] || return 1 setup_${BOOTLDR} } select_show() { + local mnt="none" local cmd="${BCMDS[$BOOTLDR]}" - if [[ $BOOT_PART ]]; then - local mnt="/$BOOTDIR" - else - local mnt="none" - fi - local pkgs="$USER_PKGS $PACKAGES" + [[ $BOOT_PART ]] && mnt="/$BOOTDIR" [[ $INSTALL_WMS == *dwm* ]] && pkgs="dwm st dmenu $pkgs" msg "Show Configuration" " @@ -431,11 +419,9 @@ select_login() { dlg LOGIN_TYPE menu "Login Management" "\nSelect which login management to use." \ "xinit" "Console login without a display manager" \ - "lightdm" "Lightweight display manager with a gtk greeter" + "lightdm" "Lightweight display manager with a gtk greeter" || return 1 - if [[ -z $LOGIN_TYPE ]]; then - return 1 - elif [[ $LOGIN_TYPE == 'lightdm' ]]; then + if [[ $LOGIN_TYPE == 'lightdm' ]]; then WM_PKGS+=" lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice" EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf" AUTOLOGIN='' @@ -458,7 +444,6 @@ select_login() select_config() { local i=0 - CONFIG_DONE='' until [[ $CONFIG_DONE ]]; do @@ -468,24 +453,22 @@ select_config() /usr/bin/zsh 'A very advanced and programmable command interpreter (shell) for UNIX' \ /bin/bash 'The GNU Bourne Again shell, standard in many GNU/Linux distributions' \ /usr/bin/mksh 'The MirBSD Korn Shell - an enhanced version of the public domain ksh' || return 1 - ;; - 1) dlg MYHOST input "Hostname" "$_hostname" "${DIST,,}" limit || continue ;; - 2) dlg MYLOCALE menu "Locale" "$_locale" $LOCALES || continue ;; + 1) dlg MYHOST input "Hostname" "$_hostname" "${DIST,,}" limit || { i=0; continue; } ;; + 2) dlg MYLOCALE menu "Locale" "$_locale" $LOCALES || { i=1; continue; } ;; 3) ZONE='' SUBZ='' until [[ $ZONE && $SUBZ ]]; do dlg ZONE menu "Timezone" "$_timez" America - Australia - Asia - Atlantic - Africa - Europe - Indian - Pacific - Arctic - Antarctica - || break dlg SUBZ menu "Timezone" "$_timesubz" $(awk '/'"$ZONE"'\// {gsub(/'"$ZONE"'\//, ""); print $3 " - "}' /usr/share/zoneinfo/zone.tab | sort) || continue yesno "Timezone" "\nConfirm time zone: $ZONE/$SUBZ\n" || unset ZONE done - [[ $ZONE && $SUBZ ]] || continue ;; + [[ $ZONE && $SUBZ ]] || { i=2; continue; } ;; 4) dlg KERNEL menu "Kernel" "\nChoose which kernel to use." \ linux 'Vanilla linux kernel and modules, with a few patches applied' \ linux-lts 'Long-term support (LTS) linux kernel and modules' \ linux-zen 'A effort of kernel hackers to provide the best kernel for everyday systems' \ - linux-hardened 'A security-focused linux kernel with hardening patches to mitigate exploits' || continue - + linux-hardened 'A security-focused linux kernel with hardening patches to mitigate exploits' || { i=3; continue; } CONFIG_DONE=true ;; esac @@ -601,9 +584,7 @@ select_sessions() gnome "A desktop environment that aims to be simple and easy to use" "$(ofn gnome "${INSTALL_WMS[*]}")" \ cinnamon "A desktop environment combining traditional desktop with modern effects" "$(ofn cinnamon "${INSTALL_WMS[*]}")" \ plasma "A kde software project currently comprising a full desktop environment" "$(ofn plasma "${INSTALL_WMS[*]}")" \ - xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" - - [[ $INSTALL_WMS ]] || return 1 + xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" || return 1 WM_NUM=0 while IFS=' ' read -r i; do @@ -746,8 +727,7 @@ part_menu() "cfdisk" "Curses based variant of fdisk" \ "parted" "GNU partition editor" \ "fdisk" "Dialog-driven creation and manipulation of partitions" \ - "done" "Return to the main menu" || return 1 - + "done" "Return to the main menu" || return 0 else dlg choice menu "Edit Partitions" "$_part" \ "auto" "Whole device automatic partitioning" \ @@ -755,11 +735,10 @@ part_menu() "cfdisk" "Curses based variant of fdisk" \ "parted" "GNU partition editor" \ "fdisk" "Dialog-driven creation and manipulation of partitions" \ - "done" "Return to the main menu" || return 1 - + "done" "Return to the main menu" || return 0 fi - if [[ -z $choice || $choice == 'done' ]]; then + if [[ $choice == 'done' ]]; then return 0 elif [[ $choice == 'resize' ]]; then part_resize "$device" @@ -789,7 +768,10 @@ part_menu() tput cnorm $choice "$device" fi - [[ $devhash == "$(lsblk -f | base64)" ]] || { msg "Probing Partitions" "\nInforming the kernel of partition changes using partprobe.\n"; partprobe >/dev/null 2>&1; } + if [[ $devhash != "$(lsblk -f | base64)" ]]; then + msg "Probing Partitions" "\nInforming the kernel of partition changes using partprobe.\n" 0 + partprobe >/dev/null 2>&1 + fi done } @@ -907,7 +889,7 @@ part_mount() mkdir -p "$mountp" if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" ]] && select_mntopts "$fs"; then - mount -o $MNT_OPTS "$part" "$mountp" >/dev/null 2>&1 + mount -o "$MNT_OPTS" "$part" "$mountp" >/dev/null 2>&1 else mount "$part" "$mountp" >/dev/null 2>&1 fi @@ -932,36 +914,35 @@ part_format() part_resize() { part="" - local device="$1" fs="" num=0 + typeset -i size num + local device="$1" fs="" part_find "${device##*/}[^ ]" || return 1 (( COUNT == 1 )) && part="$(awk '{print $1}' <<< "${PARTS[@]}" )" if (( COUNT == 1 )) || dlg part menu "Resize" "\nWhich partition on $device do you want to resize?" $PARTS && [[ $part ]]; then - num="${part: -1}" - end=$(parted -s "$device" print | awk '/^\s*'"$num"'/ {print $3}') - devsize=$(parted -s "$device" print | awk '/Disk '"$device"':/ {print $3}') fs=$(lsblk -lno FSTYPE "$part") case "$fs" in ext[2-4]|ntfs) + num="${part: -1}" + end=$(parted -s "$device" print | awk '/^\s*'"$num"'/ {print $3}') + devsize=$(parted -s "$device" print | awk '/Disk '"${device//\//\\/}"':/ {print $3}') mount "$part" $MNT >/dev/null 2>&1 sleep 0.5 min=$(df "$part" | awk '/'"${part//\//\\/}"'/ {print int($3 / 1024)}') # used max=$(df "$part" | awk '/'"${part//\//\\/}"'/ {print int($4 / 1024)}') # available - def=$((max / 2)) # 1/2 available umount $MNT >/dev/null 2>&1 tput cnorm - if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $def 2>$ANS; then - (( (size = $(< "$ANS") * 1024) + 1025 <= max )) || return 1 - size=$(( (size / 4) * 4 )) + if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $((max / 2)) 2>$ANS; then + (( (size = $(< "$ANS")) + 1025 <= max )) || return 1 + size=$((( (size * 1024) / 4 ) * 4)) # 4K block alignment else return 1 fi clear case "$fs" in ext[2-4]) - e2fsck -f "$part" - sleep 0.5 + e2fsck -f "$part"; sleep 0.5 resize2fs -f "$part" ${size}K 2>$ERR errshow "resize2fs -f $part ${size}K" || return 1 ;; @@ -971,10 +952,10 @@ part_resize() ;; esac sleep 0.5 - size=$(( size + 1024 )) + (( size += 1024 )) parted "$device" resizepart "$num" ${size}Kib || return 1 sleep 0.5 - if (( (size += 1) < max )); then + if (( ++size < (max * 1024) )); then if [[ $devsize == "$end" ]]; then parted -s "$device" mkpart primary ext4 ${size}Kib 100% 2>$ERR else @@ -982,11 +963,11 @@ part_resize() fi errshow "parted -s $device mkpart primary ext4 ${size}Kib 100%" || return 1 fi - sleep 0.5 - msg "Resize Finished" "\nThe resize of $part is now complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINT "$device")\n\n" + sleep 1 + msg "Resize Complete" "\n$part has been successfully resized to $(( (size - 1025) / 1024 ))M.\n" ;; *) - msg "Invalid Filesystem: $fs" "\nResizing currently has support for ext2/3/4 and ntfs filesystems.\n" + msg "Invalid Filesystem: $fs" "\nCurrently resizing is only supported for ext2/3/4 and ntfs filesystems.\n\nFor unformatted partitions, cfdisk can be used without the need to resize the filesystem.\n" ;; esac fi @@ -1014,9 +995,9 @@ part_device() part_bootdev() { - msg "Boot Device" "\nSetting flags for boot partition $BOOT_PART\n" 1 - [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEV="${BOOT_PART%p[1-9]}" || BOOT_DEV="${BOOT_PART%[1-9]}" + BOOT_DEV="${BOOT_PART%[1-9]}" BOOT_PART_NUM="${BOOT_PART: -1}" + [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEV="${BOOT_PART%p[1-9]}" if [[ $SYS == 'UEFI' ]]; then parted -s $BOOT_DEV set $BOOT_PART_NUM esp on >/dev/null 2>&1 else @@ -1259,12 +1240,19 @@ select_boot_partition() select_root_partition() { + typeset -i num + local pts + pts="$(awk '/[0-9.]*[GT]$/ {sub(/[GT]$/, ""); if ($2 > 8) {print $0 "G"} }' <<< "$PARTS")" + while read -r line; do + (( num++ )) + done <<< "$pts" + if [[ $AUTO_ROOT_PART && ! $LVM && ! $LUKS ]]; then ROOT_PART="$AUTO_ROOT_PART" - elif (( COUNT == 1 )); then - ROOT_PART="$(awk 'NR==1 {print $1}' <<< "$PARTS")" + elif (( num == 1 )); then + ROOT_PART="$(awk 'NR==1 {print $1}' <<< "$pts")" else - dlg ROOT_PART menu "Mount Root" "\nSelect the root (/) partition, this is where $DIST will be installed." $PARTS + dlg ROOT_PART menu "Mount Root" "\nSelect the root (/) partition, this is where $DIST will be installed.\n\nDevices smaller than 8G will not be shown here." $pts fi [[ $ROOT_PART ]] || return 1 @@ -1278,11 +1266,10 @@ select_root_partition() select_extra_partitions() { local part - while (( COUNT > 0 )); do part='' - dlg part menu 'Mount Boot' "$_expart" 'done' 'finish mounting step' $PARTS - if [[ $part == 'done' || -z $part ]]; then + dlg part menu 'Mount Boot' "$_expart" 'done' 'finish mounting step' $PARTS || break + if [[ $part == 'done' ]]; then break elif select_filesystem "$part" && select_mountpoint && part_mount "$part" "$EXMNT"; then EXMNTS+="$part: $EXMNT " @@ -1291,7 +1278,6 @@ select_extra_partitions() return 1 fi done - return 0 } @@ -1579,8 +1565,10 @@ install_lightdm() { rm -rf $SERVICE rm -rf $MNT/home/$NEWUSER/.{xinitrc,profile,zprofile,bash_profile} - chrun 'systemctl set-default graphical.target && systemctl enable lightdm.service' 2>$ERR - errshow 1 "systemctl set-default graphical.target && systemctl enable lightdm.service" + chrun 'systemctl set-default graphical.target' 2>$ERR + errshow 1 "systemctl set-default graphical.target" + chrun 'systemctl enable lightdm.service' 2>$ERR + errshow 1 "systemctl enable lightdm.service" cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf << EOF # LightDM GTK+ Configuration @@ -1597,8 +1585,8 @@ EOF install_packages() { - local inpkg="$PACKAGES $USER_PKGS" local rmpkg="" + local inpkg="$PACKAGES $USER_PKGS" if pacman -Qsq 'archlabs-installer' >/dev/null 2>&1; then rmpkg+=" archlabs-installer" @@ -1695,10 +1683,10 @@ install_mirrorlist() install_background() { if [[ -d /run/archiso/sfs/airootfs/etc/skel ]] && grep -qw "$MNT" /proc/mounts && (grep -qw "$MNT/$BOOTDIR" /proc/mounts || [[ $SYS == 'BIOS' && -z $LUKS ]]); then - yesno "Background Install" "\nA portion of the install can be done in the background while you continue.\n\nUtilize background install?\n" || return 0 + yesno "Background Install" "\nSome slower steps of the install can be done in the background before other configuration is needed, base system unpack, mirrorlist sort, updates, and base packages.\n\nThis will allow you to continue setting up the configuration and proceed at your own pace, while the installer is working.\n\nDo you want to use/start the background process?\n" || return 0 rsync -a /run/archiso/sfs/airootfs/ $MNT/ & RSYNC_PID=$! - ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && chrun "pacman -Syyu --noconfirm" && chrun "pacman -S $BASE_PKGS --needed --noconfirm" ) >/dev/null 2>&1 & + ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm" ) >/dev/null 2>&1 & MIRROR_PID=$! trap "kill $RSYNC_PID 2>/dev/null; kill $MIRROR_PID 2>/dev/null" EXIT fi @@ -2544,7 +2532,7 @@ system_identify() modprobe -q efivarfs >/dev/null 2>&1 - _prep="\nWelcome to the installer primary menu.\nOnce a step is finished a step you will be returned here, if the step was successful (ie. no errors were encountered) the cursor will be advanced to the next step.\nIf a step is unsuccessful the cursor will be placed on the step required to advance (when possible).\nTo begin the install you should have:\n\n - A root (/) partition mounted." + _prep="\nOnce a step is finished a step you will be returned here, if the step was successful the cursor will be advanced to the next step.\nIf a step is unsuccessful the cursor will be placed on the step required to advance (when possible).\n\nTo begin the install you should have:\n\n - A root (/) partition mounted." if [[ -d /sys/firmware/efi/efivars ]]; then export SYS="UEFI" grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars @@ -2554,7 +2542,7 @@ system_identify() fi _prep+="\n\nOnce finished mounting, a portion of the install can be done in the background while you continue configuring the system:\n" _prep+="\n - Choose the system bootloader.\n - Create a user and password." - _prep+="\n - Basic system configuration, kernel, shell, login, packages, etc..\n\nLastly once you're happy with your choices and the required steps are complete, the main install can be started." + _prep+="\n - Basic system configuration, kernel, shell, login, packages, etc..\n\nOnce you're happy with the choices and the required steps are complete, the main install can be started." } check_background_install()