diff --git a/installer b/installer index 7c8667a..1589f2d 100755 --- a/installer +++ b/installer @@ -6,28 +6,39 @@ # AIF, Calamares, and the Arch Wiki.. Credit where credit is due # shellcheck disable=SC2086,SC2046,SC2254,SC2164 -VER=2.1.53 +VER=2.1.54 # default values { : "${DIST=ArchLabs}" # distro name if not set : "${MNT=/mnt}" # installation root mountpoint if not set -ANS=/tmp/ans # dialog answer output file +SYS=Unknown # boot type, to be determined: UEFI/BIOS FONT=ter-i16n # font used for the linux console HOOKS=shutdown # additional mkinitcpio HOOKS -SEL=0 # currently selected menu item -PACSTRAP=1 # use a fresh pacstrap or copy the iso filesystem -SYS=Unknown # bios type, to be determined: UEFI/BIOS +SEL=0 # currently selected main menu item +BTRFS=0 # is btrfs used, 1 = btrfs alone, 2 = btrfs + subvolume(s) +PACSTRAP=1 # use pacstrap or copy the iso filesystem +EXMNTS='' # extra partitions that were mounted, used to verify mountpoint and show user +USERCMD='' # optional command(s) entered by the user to run in the chroot +ANS=/tmp/ans # dialog answer output file BG=/tmp/bgout # output from background process ERR=/tmp/errlog # stderr log used internally by errshow() DBG=/tmp/debuglog # debug log file when passed -d RUN=/run/archiso/bootmnt/arch/boot # path for live system /boot -BTRFS=0 # is btrfs used, 1 = btrfs alone, 2 = btrfs + subvolume(s) -EXMNTS="" # extra partitions that were mounted, used to verify mountpoint and show user -USER_CMD="" # optional command(s) entered by the user to run in the chroot -VM="$(systemd-detect-virt)" # system running in a virtual machine -export DIALOGOPTS="--cr-wrap" # dialog environment variable to hold default options, see `man dialog` +VIRT="$(systemd-detect-virt)" +MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)" +LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if ($1) {print $1 " - "}}' /etc/locale.gen)" +CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " - "}' | sort)" + +[[ $LINES ]] || LINES=$(tput lines) +[[ $COLUMNS ]] || COLUMNS=$(tput cols) + +export DIALOGOPTS="--cr-wrap" + +# } + +# package arrays { # package arrays built later from user selections typeset -a SES_PKGS USER_PKGS @@ -161,12 +172,50 @@ typeset -a ISO_PKGS=( "wvdial" ) # } -SYS_MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)" -LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if ($1) {print $1 " - "}}' /etc/locale.gen)" -CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " - "}' | sort)" +# packages installed for each wm/de, most are depends of the skel packages { +declare -A WM_EXT=( +[awesome]='archlabs-skel-awesome' +[bspwm]='archlabs-skel-bspwm' +[cinnamon]='gnome-terminal' +[deepin]='deepin-extra' +[dwm]='nitrogen polkit-gnome gnome-keyring dunst lxappearance' +[fluxbox]='archlabs-skel-fluxbox' +[gnome]='gnome-tweaks' +[i3-gaps]='archlabs-skel-i3-gaps' +[jwm]='' +[lxqt]='breeze breeze-icons picom libpulse network-manager-applet' +[openbox]='archlabs-skel-openbox' +[plasma]='kde-applications-meta powerdevil' +[xfce4]='archlabs-skel-xfce4 xfce4-goodies' +) # } -[[ $LINES ]] || LINES=$(tput lines) -[[ $COLUMNS ]] || COLUMNS=$(tput cols) +# packages installed for each login option { +declare -A LOGIN_PKGS=( +[gdm]='gdm' +[lightdm]='lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice' +[sddm]='sddm' +[xinit]='xorg-xinit' +) # } + +# extras installed for user selected packages { +# if a package requires additional packages that aren't already dependencies +# they can be added here e.g. [package]="extra" +declare -A PKG_EXT=( +[bluez]='bluez-libs bluez-utils bluez-tools bluez-plugins bluez-hid2hci' +[cairo-dock]='cairo-dock-plug-ins' +[kdenlive]='qt5ct qt5-styleplugins' +[mpd]='mpc' +[mupdf]='mupdf-tools' +[noto-fonts]='noto-fonts-emoji' +[pcmanfm]='tumbler' +[qbittorrent]='qt5ct qt5-styleplugins' +[qt5ct]='qt5-styleplugins' +[qutebrowser]='qt5ct qt5-styleplugins' +[thunar]='tumbler thunar-volman' +[transmission-qt]='qt5ct qt5-styleplugins' +[vlc]='qt5ct qt5-styleplugins' +[zathura]='zathura-pdf-poppler' +) # } # } @@ -202,23 +251,6 @@ declare -A WM_SESSIONS=( [xfce4]='startxfce4' ) # } -# Packages installed for each wm/de, most are depends of the skel packages { -declare -A WM_EXT=( -[awesome]='archlabs-skel-awesome' -[bspwm]='archlabs-skel-bspwm' -[cinnamon]='gnome-terminal' -[deepin]='deepin-extra' -[dwm]='nitrogen polkit-gnome gnome-keyring dunst lxappearance' -[fluxbox]='archlabs-skel-fluxbox' -[gnome]='gnome-tweaks' -[i3-gaps]='archlabs-skel-i3-gaps' -[jwm]='' -[lxqt]='breeze breeze-icons picom libpulse network-manager-applet' -[openbox]='archlabs-skel-openbox' -[plasma]='kde-applications-meta powerdevil' -[xfce4]='archlabs-skel-xfce4 xfce4-goodies' -) # } - # files offered for editing after install is complete { declare -A EDIT_FILES=( [login]='' # login is populated once we know the username and shell @@ -264,105 +296,77 @@ declare -A FS_OPTS=( [btrfs]='autodefrag compress=zlib compress=lzo compress=no compress-force=zlib compress-force=lzo discard noacl noatime nodatasum nospace_cache recovery skip_balance space_cache ssd ssd_spread' ) # } -# packages installed for each login option { -declare -A LOGIN_PKGS=( -[gdm]='gdm' -[lightdm]='lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice' -[sddm]='sddm' -[xinit]='xorg-xinit' -) # } - -# extras installed for user selected packages { -# if a package requires additional packages that aren't already dependencies -# they can be added here e.g. [package]="extra" -declare -A PKG_EXT=( -[bluez]='bluez-libs bluez-utils bluez-tools bluez-plugins bluez-hid2hci' -[cairo-dock]='cairo-dock-plug-ins' -[kdenlive]='qt5ct qt5-styleplugins' -[mpd]='mpc' -[mupdf]='mupdf-tools' -[noto-fonts]='noto-fonts-emoji' -[pcmanfm]='tumbler' -[qbittorrent]='qt5ct qt5-styleplugins' -[qt5ct]='qt5-styleplugins' -[qutebrowser]='qt5ct qt5-styleplugins' -[thunar]='tumbler thunar-volman' -[transmission-qt]='qt5ct qt5-styleplugins' -[vlc]='qt5ct qt5-styleplugins' -[zathura]='zathura-pdf-poppler' -) # } - # mirrorlist country codes to names table { typeset -A COUNTRIES=( -[AU]="Australia" -[AT]="Austria" -[BD]="Bangladesh" -[BY]="Belarus" -[BE]="Belgium" -[BA]="Bosnia and Herzegovina" -[BR]="Brazil" -[BG]="Bulgaria" -[CA]="Canada" -[CL]="Chile" -[CN]="China" -[CO]="Colombia" -[HR]="Croatia" -[CZ]="Czechia" -[DK]="Denmark" -[EC]="Ecuador" -[FI]="Finland" -[FR]="France" -[GE]="Georgia" -[DE]="Germany" -[GR]="Greece" -[HK]="Hong Kong" -[HU]="Hungary" -[IS]="Iceland" -[IN]="India" -[ID]="Indonesia" -[IR]="Iran" -[IE]="Ireland" -[IL]="Israel" -[IT]="Italy" -[JP]="Japan" -[KZ]="Kazakhstan" -[KE]="Kenya" -[LV]="Latvia" -[LT]="Lithuania" -[LU]="Luxembourg" -[NL]="Netherlands" -[NC]="New Caledonia" -[NZ]="New Zealand" -[MK]="North Macedonia" -[NO]="Norway" -[PY]="Paraguay" -[PH]="Philippines" -[PL]="Poland" -[PT]="Portugal" -[RO]="Romania" -[RU]="Russia" -[RS]="Serbia" -[SG]="Singapore" -[SK]="Slovakia" -[SI]="Slovenia" -[ZA]="South Africa" -[KR]="South Korea" -[ES]="Spain" -[SE]="Sweden" -[CH]="Switzerland" -[TW]="Taiwan" -[TH]="Thailand" -[TR]="Turkey" -[UA]="Ukraine" -[GB]="United Kingdom" -[US]="United States" -[VN]="Vietnam" +[AU]='Australia' +[AT]='Austria' +[BD]='Bangladesh' +[BY]='Belarus' +[BE]='Belgium' +[BA]='Bosnia and Herzegovina' +[BR]='Brazil' +[BG]='Bulgaria' +[CA]='Canada' +[CL]='Chile' +[CN]='China' +[CO]='Colombia' +[HR]='Croatia' +[CZ]='Czechia' +[DK]='Denmark' +[EC]='Ecuador' +[FI]='Finland' +[FR]='France' +[GE]='Georgia' +[DE]='Germany' +[GR]='Greece' +[HK]='Hong Kong' +[HU]='Hungary' +[IS]='Iceland' +[IN]='India' +[ID]='Indonesia' +[IR]='Iran' +[IE]='Ireland' +[IL]='Israel' +[IT]='Italy' +[JP]='Japan' +[KZ]='Kazakhstan' +[KE]='Kenya' +[LV]='Latvia' +[LT]='Lithuania' +[LU]='Luxembourg' +[NL]='Netherlands' +[NC]='New Caledonia' +[NZ]='New Zealand' +[MK]='North Macedonia' +[NO]='Norway' +[PY]='Paraguay' +[PH]='Philippines' +[PL]='Poland' +[PT]='Portugal' +[RO]='Romania' +[RU]='Russia' +[RS]='Serbia' +[SG]='Singapore' +[SK]='Slovakia' +[SI]='Slovenia' +[ZA]='South Africa' +[KR]='South Korea' +[ES]='Spain' +[SE]='Sweden' +[CH]='Switzerland' +[TW]='Taiwan' +[TH]='Thailand' +[TR]='Turkey' +[UA]='Ukraine' +[GB]='United Kingdom' +[US]='United States' +[VN]='Vietnam' ) # } # dialog text variables { # Basics (somewhat in order) -_keymap="\nSelect which keymap to use from the list below.\n\nThis will determine the installed system keymap, NOT locale which is chosen later.\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 separate from the one used by the graphical environments, though many do use the same such as 'us' English.\n\nSystem default: us" +_keymap="\nSelect which keymap to use from the list below.\n\nThis will determine the installed system keymap once entering a graphical environment.\n\ndefault: us" +_vconsole="\nSelect the console keymap, the console is the tty shell you reach before starting a graphical environment (Xorg).\n\nIts keymap is separate from the one used by the graphical environments, though many do use the same such as 'us' English.\n\ndefault: us" _prep="\nThis is the installer main menu, once a step is complete you will return here.\n\nOn successful completion of a step the cursor will advance to the next step.\nOn failure the cursor will be placed on the step required to advance (when possible).\n\nSteps beginning with an asterisk (*) are required.\n\nOnce all required steps are complete, selecting the last step will finalize the install." _device="\nSelect a device to use from the list below.\n\nDevices (/dev) are the available drives on the system. /sda, /sdb, /sdc ..." _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." @@ -509,7 +513,7 @@ select_show() Hostname: ${NEWHOST:-none} Timezone: ${ZONE:-none}/${SUBZ:-none} - Chroot cmd: ${USER_CMD:-none} + Chroot cmd: ${USERCMD:-none} ------------ USER CONFIGURATION --------------- @@ -538,9 +542,16 @@ select_login() "sddm" "Simple desktop display manager (plasma and lxqt default)" || return 1 case $LOGIN_TYPE in - gdm|sddm) + gdm) EDIT_FILES[login]="none" ;; + sddm) + if [[ $INSTALL_WMS =~ (plasma|lxqt) ]]; then + EDIT_FILES[login]="/etc/sddm.conf.d/theme.conf" + else + EDIT_FILES[login]="none" + fi + ;; lightdm) LIGHTDM_GREETER='gtk-greeter' EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf" @@ -689,6 +700,7 @@ select_keymap() echo "$KEYMAP" > /tmp/xkeys else KEYMAP="$(< /tmp/xkeys)" + : "${KEYMAP='us'}" fi if [[ ! -f /tmp/ckeys ]]; then @@ -700,6 +712,7 @@ select_keymap() echo "$CMAP" > /tmp/ckeys else CMAP="$(< /tmp/ckeys)" + : "${CMAP='us'}" fi if [[ $TERM == 'linux' ]]; then @@ -713,7 +726,58 @@ select_keymap() select_usercmd() { - dlg USER_CMD input "Command" "$_usercmd" "$USER_CMD" nolimit + dlg USERCMD input "Command" "$_usercmd" "$USERCMD" nolimit +} + +select_mirrors() +{ + codes='' + MIRROR_URL='' + typeset -ga MIRROR_COUNTRY + + while :; do + dlg codes check "Mirror Countries" "\nSelect which countries to use mirrors from.\n\nNot choosing any will result in an automatic selection." \ + AU Australia "$(ofn AU "$codes")" AT Austria "$(ofn AT "$codes")" \ + BA "Bosnia Herzegovina" "$(ofn BA "$codes")" BY Belarus "$(ofn BY "$codes")" \ + BE Belgium "$(ofn BE "$codes")" BR Brazil "$(ofn BR "$codes")" \ + BG Bulgaria "$(ofn BG "$codes")" CA Canada "$(ofn CA "$codes")" \ + CL Chile "$(ofn CL "$codes")" CN China "$(ofn CN "$codes")" \ + CO Colombia "$(ofn CO "$codes")" CZ "Czech Republic" "$(ofn CZ "$codes")" \ + DK Denmark "$(ofn DK "$codes")" EE Estonia "$(ofn EE "$codes")" \ + FI Finland "$(ofn FI "$codes")" FR France "$(ofn FR "$codes")" \ + DE Germany "$(ofn DE "$codes")" GB "United Kingdom" "$(ofn GB "$codes")" \ + GR Greece "$(ofn GR "$codes")" HU Hungary "$(ofn HU "$codes")" \ + IN India "$(ofn IN "$codes")" IE Ireland "$(ofn IE "$codes")" \ + IL Israel "$(ofn IL "$codes")" IT Italy "$(ofn IT "$codes")" \ + JP Japan "$(ofn JP "$codes")" KZ Kazakhstan "$(ofn KZ "$codes")" \ + KR Korea "$(ofn KR "$codes")" LT Lithuania "$(ofn LT "$codes")" \ + LV Latvia "$(ofn LV "$codes")" LU Luxembourg "$(ofn LU "$codes")" \ + MK Macedonia "$(ofn MK "$codes")" NL Netherlands "$(ofn NL "$codes")" \ + NC "New Caledonia" "$(ofn NC "$codes")" NZ "New Zealand" "$(ofn NZ "$codes")" \ + NO Norway "$(ofn NO "$codes")" PL Poland "$(ofn PL "$codes")" \ + PT Portugal "$(ofn PT "$codes")" RO Romania "$(ofn RO "$codes")" \ + RU Russia "$(ofn RU "$codes")" RS Serbia "$(ofn RS "$codes")" \ + SG Singapore "$(ofn SG "$codes")" SK Slovakia "$(ofn SK "$codes")" \ + ZA "South Africa" "$(ofn ZA "$codes")" ES Spain "$(ofn ES "$codes")" \ + LK "Sri Lanka" "$(ofn LK "$codes")" SE Sweden "$(ofn SE "$codes")" \ + CH Switzerland "$(ofn CH "$codes")" TW Taiwan "$(ofn TW "$codes")" \ + TR Turkey "$(ofn TR "$codes")" UA Ukraine "$(ofn UA "$codes")" \ + US "United States" "$(ofn US "$codes")" UZ Uzbekistan "$(ofn UZ "$codes")" \ + VN Vietnam "$(ofn VN "$codes")" || return 1 + + yesno "Mirror Countries" "\nConfirm the following countries: $(for i in $codes; do printf "%s, " "${COUNTRIES[$i]}"; done)" && break + done + + for i in $codes; do + if [[ $MIRROR_URL ]]; then + MIRROR_URL+="&country=$i" + else + MIRROR_URL="https://www.archlinux.org/mirrorlist/?country=$i" + fi + MIRROR_COUNTRY+=("--country" "${COUNTRIES[$i]}") + done + MIRROR_URL+='&use_mirror_status=on' + return 0 } select_bootldr() @@ -763,7 +827,7 @@ select_sessions() for i in $INSTALL_WMS; do LOGIN_CHOICES+="$i - " if [[ $i =~ (plasma|deepin) ]]; then - local pretxt="\nThere are some extra packages available for $i that you may want installed:" + local pretxt="\nThere are some extra packages available for $i that can be installed:" local txt="These are larger package groups containing applications that are a part of $i" txt+=" but are not included in the $i package group." yesno "${i^} Extra" "$pretxt ${WM_EXT[$i]}\n\n$txt\n\nWould you like to install them?\n" || continue @@ -907,57 +971,6 @@ select_packages() return 0 } -select_mirror_country() -{ - codes='' - MIRROR_URL='' - typeset -ga MIRROR_COUNTRY - - while :; do - dlg codes check "Mirror Countries" "\nSelect which countries to use mirrors from.\n\nNot choosing any will result in an automatic selection." \ - AU Australia "$(ofn AU "$codes")" AT Austria "$(ofn AT "$codes")" \ - BA "Bosnia Herzegovina" "$(ofn BA "$codes")" BY Belarus "$(ofn BY "$codes")" \ - BE Belgium "$(ofn BE "$codes")" BR Brazil "$(ofn BR "$codes")" \ - BG Bulgaria "$(ofn BG "$codes")" CA Canada "$(ofn CA "$codes")" \ - CL Chile "$(ofn CL "$codes")" CN China "$(ofn CN "$codes")" \ - CO Colombia "$(ofn CO "$codes")" CZ "Czech Republic" "$(ofn CZ "$codes")" \ - DK Denmark "$(ofn DK "$codes")" EE Estonia "$(ofn EE "$codes")" \ - FI Finland "$(ofn FI "$codes")" FR France "$(ofn FR "$codes")" \ - DE Germany "$(ofn DE "$codes")" GB "United Kingdom" "$(ofn GB "$codes")" \ - GR Greece "$(ofn GR "$codes")" HU Hungary "$(ofn HU "$codes")" \ - IN India "$(ofn IN "$codes")" IE Ireland "$(ofn IE "$codes")" \ - IL Israel "$(ofn IL "$codes")" IT Italy "$(ofn IT "$codes")" \ - JP Japan "$(ofn JP "$codes")" KZ Kazakhstan "$(ofn KZ "$codes")" \ - KR Korea "$(ofn KR "$codes")" LT Lithuania "$(ofn LT "$codes")" \ - LV Latvia "$(ofn LV "$codes")" LU Luxembourg "$(ofn LU "$codes")" \ - MK Macedonia "$(ofn MK "$codes")" NL Netherlands "$(ofn NL "$codes")" \ - NC "New Caledonia" "$(ofn NC "$codes")" NZ "New Zealand" "$(ofn NZ "$codes")" \ - NO Norway "$(ofn NO "$codes")" PL Poland "$(ofn PL "$codes")" \ - PT Portugal "$(ofn PT "$codes")" RO Romania "$(ofn RO "$codes")" \ - RU Russia "$(ofn RU "$codes")" RS Serbia "$(ofn RS "$codes")" \ - SG Singapore "$(ofn SG "$codes")" SK Slovakia "$(ofn SK "$codes")" \ - ZA "South Africa" "$(ofn ZA "$codes")" ES Spain "$(ofn ES "$codes")" \ - LK "Sri Lanka" "$(ofn LK "$codes")" SE Sweden "$(ofn SE "$codes")" \ - CH Switzerland "$(ofn CH "$codes")" TW Taiwan "$(ofn TW "$codes")" \ - TR Turkey "$(ofn TR "$codes")" UA Ukraine "$(ofn UA "$codes")" \ - US "United States" "$(ofn US "$codes")" UZ Uzbekistan "$(ofn UZ "$codes")" \ - VN Vietnam "$(ofn VN "$codes")" || return 1 - - yesno "Mirror Countries" "\nConfirm the following countries: $(for i in $codes; do printf "%s, " "${COUNTRIES[$i]}"; done)" && break - done - - for i in $codes; do - if [[ $MIRROR_URL ]]; then - MIRROR_URL+="&country=$i" - else - MIRROR_URL="https://www.archlinux.org/mirrorlist/?country=$i" - fi - MIRROR_COUNTRY+=("--country" "${COUNTRIES[$i]}") - done - MIRROR_URL+='&use_mirror_status=on' - return 0 -} - ############################################################################### # device management menus # acts as an in-between function to avoid cluttering the main menu @@ -977,21 +990,21 @@ dev_menu() 'part' 'Modify the partition layout of a device' \ 'luks' 'Setup LUKS encryption on a partition or LVM' \ 'lvm' 'Setup logical volume management on partition(s)' \ - 'back' "$back" || return 0 + 'back' "$back" - if [[ $choice == 'back' ]]; then - return 0 - elif [[ -z $WARN && $choice != 'view' ]]; then + if [[ -z $WARN && $choice != 'view' ]]; then msg "Data Warning" "$_warn" WARN=true fi case "$choice" in 'view') part_show ;; 'part') part_menu && [[ "$AUTO_ROOT" ]] && return 0 ;; - 'luks') luks_menu ;; - 'lvm') lvm_menu ;; + 'luks') luks_menu || return 1 ;; + 'lvm') lvm_menu || return 1 ;; + *) break; esac done + return 0 } ############################################################################### @@ -1115,7 +1128,6 @@ part_auto() part_find() { local regexp="$1" err='' - local s dev size isize model PARTS="$(part_pretty "" "$regexp")" PART_COUNT=$(wc -l <<< "$PARTS") @@ -1206,14 +1218,13 @@ part_pretty() [[ $dev && $size ]] || continue s=${size%%__*} size_t="${s: -1:1}" - isize=${s:0: -1} - isize=${isize%.*} + isize=${s:0:-1} if [[ $dev = /dev/nvme* ]]; then model=$(lsblk -lno MODEL "${dev%p[1-9]}" | awk '{gsub(/ |\t/, "_"); print}') else model=$(lsblk -lno MODEL "${dev%[1-9]}" | awk '{gsub(/ |\t/, "_"); print}') fi - [[ $size_t == 'K' || ($size_t == 'M' && $isize -lt 80) ]] || printf "%s\n" "$dev ${size}__$model" + [[ $size_t == 'K' || ($size_t == 'M' && ${isize%.*} -lt 80) ]] || printf "%s\n" "$dev ${size}__$model" done < <(lsblk -lno TYPE,PATH,SIZE,FSTYPE,LABEL $part | awk "/$regexp/"' && !'"/${IGNORE_DEV:-NONEXX}/"' { if ($4 == "") { @@ -1381,11 +1392,11 @@ select_boot() if (( PART_COUNT )); then while read -r dev size; do # walk partition list and skip ones that are too small/big for boot + [[ $dev && $size ]] || continue s=${size%%__*} size_t="${s: -1:1}" isize=${s:0:-1} - isize=${isize%.*} - if ! [[ $size_t == 'T' || ($size_t == 'G' && $isize -gt 2) ]]; then + if ! [[ $size_t == 'T' || ($size_t == 'G' && ${isize%.*} -gt 2) ]]; then pts+="$dev $size " (( ptcount++ )) fi @@ -1472,11 +1483,11 @@ select_root() return 0 # we're done here else # walk partition list and skip ones that are < 8G while read -r dev size; do + [[ $dev && $size ]] || continue s=${size%%__*} size_t="${s: -1:1}" - isize=${s:0: -1} - isize=${isize%.*} - if ! [[ $size_t == 'M' || ($size_t == 'G' && $isize -lt 8) ]]; then + isize=${s:0:-1} + if ! [[ $size_t == 'M' || ($size_t == 'G' && ${isize%.*} -lt 8) ]]; then pts+="$dev $size " (( ptcount++ )) fi @@ -1514,11 +1525,11 @@ select_swap() if (( PART_COUNT )) ; then while read -r dev size; do # walk partition list and skip ones that are > 64G + [[ $dev && $size ]] || continue s=${size%%__*} size_t="${s: -1:1}" - isize=${s:0: -1} - isize=${isize%.*} - if ! [[ $size_t == 'T' || ($size_t == 'G' && $isize -gt 64) ]]; then + isize=${s:0:-1} + if ! [[ $size_t == 'T' || ($size_t == 'G' && ${isize%.*} -gt 64) ]]; then pts+="$dev $size " fi done <<< "$PARTS" @@ -1539,7 +1550,7 @@ select_swap() msg "Swap Size Error" \ "\nSwap size must be 1(M|G) or greater, and can only contain whole numbers\n\nSize entered: $SWAP_S\n" 2 fi - if ! dlg SWAP_S input "Swap Setup" "$_swapsize" "$SYS_MEM"; then + if ! dlg SWAP_S input "Swap Setup" "$_swapsize" "$MEM"; then SWAP='' SWAP_S='' return 1 @@ -1563,6 +1574,7 @@ select_extra() # walk partition list and skip ones that are < 1G if (( PART_COUNT )); then while read -r dev size; do + [[ $dev && $size ]] || continue s=${size%%__*} [[ ${s: -1:1} == 'M' ]] && part_countdec "$dev" done <<< "$PARTS" @@ -1698,9 +1710,9 @@ install_main() chrun "chown -Rf $NEWUSER:users /home/$NEWUSER" - if [[ "$USER_CMD" ]]; then - chrun "$USER_CMD" 2> "$ERR" 2>&1 - errshow 0 "chrun '$USER_CMD'" + if [[ "$USERCMD" ]]; then + chrun "$USERCMD" 2> "$ERR" 2>&1 + errshow 0 "chrun '$USERCMD'" fi while :; do @@ -1759,9 +1771,9 @@ install_base() errshow 1 "cp -vf '$RUN/x86_64/vmlinuz' '$MNT/boot/vmlinuz-linux'" # remove/disable customizations done to airootfs during building - chrun "systemctl disable pacman-init.service choose-mirror.service" > /dev/null 2>&1 - rm -f "$MNT/etc/systemd/scripts/choose-mirror" - rm -f "$MNT/etc/systemd/system/"{choose-mirror.service,etc-pacman.d-gnupg.mount,pacman-init.service} + chrun "systemctl disable pacman-init.service" > /dev/null 2>&1 + rm -f "$MNT/etc/systemd/system/pacman-init.service" + rm -f "$MNT/etc/systemd/system/etc-pacman.d-gnupg.mount" sed -i 's/#\(Storage=\)volatile/\1auto/' "$MNT/etc/systemd/journald.conf" sed -i 's/\(HandleLidSwitch=\)ignore/#\1suspend/' "$MNT/etc/systemd/logind.conf" sed -i 's/\(HandleSuspendKey=\)ignore/#\1suspend/' "$MNT/etc/systemd/logind.conf" @@ -1830,6 +1842,7 @@ install_user() rm -f "$MNT/root/.zlogin" # remove welcome message + echo "Setting root user password and shell" chrun "chpasswd <<< 'root:$ROOT_PASS'" 2> "$ERR" 2>&1 errshow 1 "chrun 'chpasswd <<< \"root:$ROOT_PASS\"'" if [[ $NEWSHELL != 'zsh' ]]; then # root uses zsh by default @@ -1839,7 +1852,7 @@ install_user() [[ $NEWSHELL == 'mksh' ]] && cp -fv "$MNT/etc/skel/.mkshrc" "$MNT/root/.mkshrc" fi - echo "Creating new user $NEWUSER and setting password" + echo "Creating user $NEWUSER and setting password" # check if there's an existing user home for new user (separate /home) [[ -d "$MNT/home/$NEWUSER" ]] && i=1 @@ -1851,8 +1864,8 @@ install_user() [[ $INSTALL_WMS == *dwm* ]] && install_suckless "/home/$NEWUSER" chroot - # upgrade existing home with new skeleton configs - [[ $i == 1 ]] && cp -aT "$MNT/etc/skel/" "$MNT/home/$NEWUSER" + # upgrade existing home with new skeleton configs, making backups when needed + (( i )) && cp -rfaT -b --suffix='.bak' "$MNT/etc/skel/" "$MNT/home/$NEWUSER" install_cleanup "$NEWUSER" @@ -2053,7 +2066,7 @@ install_packages() errshow 1 "chrun 'pacman -S efibootmgr --needed --noconfirm'" fi - if [[ $VM == 'oracle' ]]; then + if [[ $VIRT == 'oracle' ]]; then chrun "pacman -S ${KERNEL}-headers virtualbox-guest-utils virtualbox-guest-dkms --needed --noconfirm" fi @@ -2090,7 +2103,7 @@ install_tearfree() { local xpath="$1" - if [[ $VM != 'none' ]]; then + if [[ $VIRT != 'none' ]]; then [[ -e "$xpath/40-touchpad.conf" ]] && rm -fv "$xpath/40-touchpad.conf" elif [[ $TEARFREE ]]; then if lspci | grep ' VGA ' | grep -q 'Intel'; then @@ -2234,7 +2247,7 @@ install_background() [[ ! -d /etc/NetworkManager/system-connections ]] && net='netctl' [[ $LUKS ]] && luks='cryptsetup' - select_mirror_country || AUTO_MIRROR=true + select_mirrors || AUTO_MIRROR=true if hash rsync > /dev/null 2>&1; then # ask whether to pacstrap or copy if rsync is installed yesno 'Background Install' "$_bginstall" 'Pacstrap' 'Copy ISO' || PACSTRAP=0 @@ -3334,7 +3347,7 @@ chk_connect() { if [[ ! -f /tmp/new ]]; then msg "Network Connect" "\nVerifying network connection\n" 0 - if [[ $VM != 'none' ]] && hash nm-online > /dev/null 2>&1; then + if [[ $VIRT != 'none' ]] && hash nm-online > /dev/null 2>&1; then nm-online > /dev/null 2>&1 else ping -qc1 'archlinux.org' > /dev/null 2>&1 @@ -3398,7 +3411,7 @@ system_devices() system_identify() { - if [[ $VM != 'none' ]]; then + if [[ $VIRT != 'none' ]]; then UCODE='' elif grep -q 'AuthenticAMD' /proc/cpuinfo; then UCODE="amd-ucode" @@ -3491,11 +3504,12 @@ fi if [[ $TERM == 'linux' ]]; then if [[ -f /tmp/font ]]; then FONT="$(< /tmp/font)" + : "${FONT=ter-i16n}" setfont "$FONT" else fontsize=16 while [[ $TERM == 'linux' && ! -f /tmp/font ]]; do - dlg fontsize menu "Font Size" "\nSelect a font size from the list below.\n\nDefault: 16" \ + dlg fontsize menu "Font Size" "\nSelect a font size from the list below.\n\ndefault: 16" \ 12 "setfont ter-i12n" 14 "setfont ter-i14n" 16 "setfont ter-i16n" 18 "setfont ter-i18n" \ 20 "setfont ter-i20n" 22 "setfont ter-i22n" 24 "setfont ter-i24n" 28 "setfont ter-i28n" \ 32 "setfont ter-i32n" || break @@ -3508,7 +3522,7 @@ if [[ $TERM == 'linux' ]]; then fi if [[ ! -f /tmp/weld ]]; then - msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST installed and setup on your system.\n\nIf you are unsure about an option, the default or most common\nwill be mentioned or the first selected entry will be the default.\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle check boxes and [Enter] to accept.\n - Switch between fields using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n" + msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST installed and setup on your system.\n\nIf you are unsure about an option, the default or most common option\nwill be described, if it is not the first selected entry will be the default.\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the highlighted key.\n - Repeatedly pressing the highlighted key for an option will cycle through options beginning with that key.\n - Use [Space] to toggle check boxes and [Enter] to accept selection.\n - Use [Escape] or select the cancel/exit button to exit a menu or dialog.\n - Switch between fields using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages.\n" touch /tmp/weld fi