Fix a number of issues and move global declarations

This commit is contained in:
natemaia 2019-01-15 22:58:52 -08:00
parent 2cee0cd38f
commit af0067199e
2 changed files with 296 additions and 331 deletions

View File

@ -15,7 +15,7 @@ _OnlyOne="\nOnly one partition available"
# Welcome # Welcome
_WelTitle="Welcome to" _WelTitle="Welcome to"
_WelBody="\nThis will unpack and help you setup $DIST on your system.\n\n\nMenu Navigation:\n\n - Select items by pressing the option number or using the arrow keys.\n\n - Use [Space] to (de)select options and [Enter] to confirm.\n\n - Switch between buttons using [Tab] or the arrow keys.\n\n - Long lists can be navigated using [Page Up] and [Page Down], or by pressing the highlighted letter of the desired option.\n" _WelBody="\nThis will unpack and help you setup $DIST on your system.\n\n\nMenu Navigation:\n\n - Select items by pressing the option number or using the arrow keys.\n - Use [Space] to (de)select options and [Enter] to confirm.\n - Switch between buttons 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 will select that option.\n"
# Requirements # Requirements
_NotRoot="\nThis installer must be run as root or using sudo.\n" _NotRoot="\nThis installer must be run as root or using sudo.\n"
@ -31,7 +31,7 @@ _PrepParts="Edit partitions (optional)"
_PrepLUKS="LUKS encryption (optional)" _PrepLUKS="LUKS encryption (optional)"
_PrepLVM="Logical volume management (optional)" _PrepLVM="Logical volume management (optional)"
_PrepMount="Mount and format partitions" _PrepMount="Mount and format partitions"
_PrepUser="Create user and set root Password" _PrepUser="Create user and set root password"
_PrepConfig="Configure system settings" _PrepConfig="Configure system settings"
_PrepWM="Select window manager or desktop (optional)" _PrepWM="Select window manager or desktop (optional)"
_PrepPkg="Select additional packages (optional)" _PrepPkg="Select additional packages (optional)"
@ -44,7 +44,7 @@ _EditBody="\nBefore exiting you can select configuration files from below to rev
# Close Installer # Close Installer
_CloseInst="Close Installer" _CloseInst="Close Installer"
_CloseInstBody="\nUnmount partitions and close the installer?\n" _CloseInstBody="\nUnmount partitions (if any) and close the installer?\n"
# error message # error message
_ErrChoice="\nUnmount the partitions and shutdown or keep them mounted and continue?\n" _ErrChoice="\nUnmount the partitions and shutdown or keep them mounted and continue?\n"
@ -87,26 +87,25 @@ _XMapBody="\nSelect the system wide keymap, this is the keyboard layout used onc
_LocaleBody="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n en_GB is: english Great Britain" _LocaleBody="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n en_GB is: english Great Britain"
# Configure # Configure
_ConfLocale="System Language and Locale"
_ConfHost="System Hostname" _ConfHost="System Hostname"
_ConfLocale="System Language and Locale"
_HostNameBody="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end." _HostNameBody="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end."
# Create new user and set password # Create new user and set password
_UserTitle="Create New User" _UserTitle="Create New User"
_UserBody="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the arrow keys to switch between input fields, [Tab] to toggle between input fields and the buttons, or just press [Enter] to accept."
_UserSetBody="\nCreating user and setting groups..\n"
_Username="Username:" _Username="Username:"
_Password="Password:" _Password="Password:"
_Password2="Password2:" _Password2="Password2:"
_RootBody="--- Enter root password (empty uses the password entered above) ---" _RootBody="--- Enter root password (empty uses the password entered above) ---"
_UserBody="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the arrow keys to switch between input fields, [Tab] to toggle between input fields and the buttons, or just press [Enter] to accept."
# Mounting (Partitions) # Mounting (Partitions)
_MntTitle="Mount Status" _MntTitle="Mount Status"
_MntSucc="\nMount Succeeded!\n"
_MntFail="\nMount Failed!\n" _MntFail="\nMount Failed!\n"
_MntSucc="\nMount Succeeded!\n"
_MntConfBody="\nConfirm mount options:"
_WarnMount="\nIMPORTANT: Please choose carefully during mounting and formatting.\n\nDuring mounting, partitions can be mounted without formatting by selecting '$_Skip'.\nThis can be useful for data partitions or previously formatted partitions.\n\nThe one exception to this is the root (/) partition, it must be formatted before unpacking to ensure the system stability.\n" _WarnMount="\nIMPORTANT: Please choose carefully during mounting and formatting.\n\nDuring mounting, partitions can be mounted without formatting by selecting '$_Skip'.\nThis can be useful for data partitions or previously formatted partitions.\n\nThe one exception to this is the root (/) partition, it must be formatted before unpacking to ensure the system stability.\n"
_MntBody="\nUse [Space] to de/select the desired mount options.\n\nIf the device is an SSD the 'discard' option provides active TRIM support and will be automatically selected.\n\nChoosing none will result in an automatic mount with system applied options." _MntBody="\nUse [Space] to de/select the desired mount options.\n\nIf the device is an SSD the 'discard' option provides active TRIM support and will be automatically selected.\n\nChoosing none will result in an automatic mount with system applied options."
_MntConfBody="\nConfirm mount options:"
# Select Device # Select Device
_DevSelTitle="Select Device" _DevSelTitle="Select Device"
@ -126,10 +125,10 @@ _ShellBody="\nChoose a shell for the new user and root."
# Partitioning Menu # Partitioning Menu
_PartTitle="Partitioning Tool" _PartTitle="Partitioning Tool"
_PartBody="\nWhole device auto partitioning is available for beginners.\n\nUEFI systems require a vfat/fat32 partition between 100-512M in size to be mounted at /boot or /boot/efi, additionally BIOS systems using LUKS require a separate /boot partition, between 100-512M and formatted as ext3 or ext4."
_PartAuto="Automatic Partitioning"
_PartWipe="Secure Wipe Device" _PartWipe="Secure Wipe Device"
_PartAuto="Automatic Partitioning"
_PartShowTree="Show Partition Tree" _PartShowTree="Show Partition Tree"
_PartBody="\nWhole device auto partitioning is available for beginners.\n\nUEFI systems require a vfat/fat32 partition between 100-512M in size to be mounted at /boot or /boot/efi, BIOS systems using LUKS will also require this but formatted as ext3 or ext4 instead."
# Auto partition # Auto partition
_PartBody1="\nWARNING:\n\nALL data on" _PartBody1="\nWARNING:\n\nALL data on"
@ -147,11 +146,10 @@ _FSBody="\nDefault Filesystem: ext4\n\nNOTE: Not all filesystems are usable for
_SelRootBody="\nSelect root (/) partition.\n\nThis is the partition where $DIST will be installed." _SelRootBody="\nSelect root (/) partition.\n\nThis is the partition where $DIST will be installed."
_SelBiosBody="\nDo you want to use a separate boot partition? (required for LUKS)\n\nThis partition is where the bootloader will be installed.\n" _SelBiosBody="\nDo you want to use a separate boot partition? (required for LUKS)\n\nThis partition is where the bootloader will be installed.\n"
_SelSwpNone="None"
_SelSwpFile="Swapfile" _SelSwpFile="Swapfile"
_SelSwpSetup="Swap Setup" _SelSwpSetup="Swap Setup"
_SelSwpBody="\nSelect whether to use a swap partition, swapfile, or none." _SelSwpBody="\nSelect whether to use a swap partition, swapfile, or none."
_SelSwpNone="None"
_SelSwpErr="Swap Setup Error: Must be 1(M|G) or greater, and can only contain whole numbers\n\nSize Entered:" _SelSwpErr="Swap Setup Error: Must be 1(M|G) or greater, and can only contain whole numbers\n\nSize Entered:"
_SelSwpSize="\nEnter the size to use for swap in MB or GB.\n\nFor ease of use and as an example the size has been filled in to the size of your system memory (RAM).\n\nMust be greater than 1, end in either M or G, and contain only whole numbers." _SelSwpSize="\nEnter the size to use for swap in MB or GB.\n\nFor ease of use and as an example the size has been filled in to the size of your system memory (RAM).\n\nMust be greater than 1, end in either M or G, and contain only whole numbers."
@ -208,16 +206,15 @@ _LvmLvNameErrBody="Invalid name entered.\n\nThe logical volume (LV) name may be
_LvmLvSizeErrBody="\nInvalid value Entered.\n\nMust be a numeric value with 'M' (megabytes) or 'G' (gigabytes) at the end.\n\neg. 400M, 10G, 250G, etc...\n\nThe value may also not be equal to or greater than the remaining size of the volume group.\n" _LvmLvSizeErrBody="\nInvalid value Entered.\n\nMust be a numeric value with 'M' (megabytes) or 'G' (gigabytes) at the end.\n\neg. 400M, 10G, 250G, etc...\n\nThe value may also not be equal to or greater than the remaining size of the volume group.\n"
# Error Messages # Error Messages
_ErrNoMount="\nPartition(s) must be mounted first.\n"
_ErrNoBase="\nThe base system must be unpacked first.\n"
_ErrNoConfig="\nBasic configuration for the system must be done first.\n"
_ExtErrBody="\nCannot mount partition due to a problem with the mountpoint name.\n\nA name must be given after a forward slash.\n"
_PartErrBody="\nBIOS systems require at least one partition (ROOT).\n\nUEFI systems require at least two (ROOT and EFI).\n"
_UserErrTitle="User Name Error" _UserErrTitle="User Name Error"
_UserErrBody="\nIncorrect user name.\n\nPlease try again.\n"
_PassErr="\nThe passwords entered do not match.\n" _PassErr="\nThe passwords entered do not match.\n"
_UserErrBody="\nIncorrect user name.\n\nPlease try again.\n"
_UserPassErr="\nThe user passwords entered do not match.\n" _UserPassErr="\nThe user passwords entered do not match.\n"
_RootPassErr="\nThe root passwords entered do not match.\n" _RootPassErr="\nThe root passwords entered do not match.\n"
_UserPassEmpty="\nThe user password cannot be left empty.\n" _UserPassEmpty="\nThe user password cannot be left empty.\n"
_ErrNoMount="\nPartition(s) must be mounted first.\n"
_ErrNoConfig="\nYou need to configure the system first.\n"
_ExtErrBody="\nCannot mount partition due to a problem with the mountpoint name.\n\nA name must be given after a forward slash.\n"
_PartErrBody="\nYou'll need create the partiton(s) first.\n\n\nBIOS systems require at least one partition (ROOT).\n\nUEFI systems require at least two (ROOT and EFI).\n"
# vim:tw=9999:syntax=off:nospell # vim:tw=9999:syntax=off:nospell

View File

@ -8,23 +8,15 @@
# Some ideas and code has been taken from other installers # Some ideas and code has been taken from other installers
# AIF, Cnichi, Calamares, The Arch Wiki.. Credit where credit is due # AIF, Cnichi, Calamares, The Arch Wiki.. Credit where credit is due
VER="1.8.28" # version VER="1.8.33" # version
DIST="ArchLabs" # distributor DIST="ArchLabs" # distributor
MNT="/mnt" # mountpoint MNT="/mnt" # install mountpoint
# Bulk defaults # bulk default values {
# {
ERR="/tmp/errlog" # error log used internally
DBG="/tmp/debuglog" # debug log when passed -d
RUN="/run/archiso/bootmnt/arch/boot" # path for live /boot
BT="$DIST Installer - v$VER" # backtitle used for dialogs
VM="$(dmesg | grep -i "hypervisor")" # is the system a vm
ROOT_PART="" # root partition ROOT_PART="" # root partition
BOOT_PART="" # boot partition BOOT_PART="" # boot partition
BOOT_DEVICE="" # device used for BIOS grub install BOOT_DEVICE="" # device used for BIOS grub install
AUTO_BOOT_PART="" # filled with the boot partition from auto_partiton()
BOOTLDR="" # bootloader selected BOOTLDR="" # bootloader selected
EXTRA_MNT="" # holder for additional partitions while mounting EXTRA_MNT="" # holder for additional partitions while mounting
EXTRA_MNTS="" # when an extra partition is mounted append it's info EXTRA_MNTS="" # when an extra partition is mounted append it's info
@ -44,15 +36,6 @@ UCODE="" # cpu manufacturer microcode filename (if any)
HOOKS="shutdown" # list of additional HOOKS to add in /etc/mkinitcpio.conf HOOKS="shutdown" # list of additional HOOKS to add in /etc/mkinitcpio.conf
FONT="ter-i16n" # font used in the linux console FONT="ter-i16n" # font used in the linux console
# sane baseline
BASE_PKGS="archlabs-scripts archlabs-skel-base archlabs-themes archlabs-dARK archlabs-icons archlabs-wallpapers "
BASE_PKGS+="base-devel xorg xorg-drivers sudo git gtk3 gtk-engines gtk-engine-murrine pavucontrol tumbler "
BASE_PKGS+="playerctl ffmpeg gstreamer libmad libmatroska gst-libav gst-plugins-base gst-plugins-good"
# sane extras for window managers
WM_BASE_PKGS="arandr archlabs-networkmanager-dmenu xdg-user-dirs nitrogen polkit-gnome volumeicon xclip "
WM_BASE_PKGS+="xdotool compton gnome-keyring dunst feh gsimplecal xfce4-power-manager xfce4-settings laptop-detect"
LUKS="" # empty when not using luks encryption LUKS="" # empty when not using luks encryption
LUKS_DEV="" # boot parameter string for LUKS LUKS_DEV="" # boot parameter string for LUKS
LUKS_PART="" # partition used for encryption LUKS_PART="" # partition used for encryption
@ -70,6 +53,159 @@ AUTOLOGIN=false # enable autologin for xinit
CONFIG_DONE=false # basic configuration is finished CONFIG_DONE=false # basic configuration is finished
BROADCOM_WL=false # fixes for broadcom cards eg. BCM4352 BROADCOM_WL=false # fixes for broadcom cards eg. BCM4352
# sane baseline
BASE_PKGS="archlabs-scripts archlabs-skel-base archlabs-themes archlabs-dARK archlabs-icons archlabs-wallpapers "
BASE_PKGS+="base-devel xorg xorg-drivers sudo git gtk3 gtk-engines gtk-engine-murrine pavucontrol tumbler "
BASE_PKGS+="playerctl ffmpeg gstreamer libmad libmatroska gst-libav gst-plugins-base gst-plugins-good"
# sane extras for window managers
WM_BASE_PKGS="arandr archlabs-networkmanager-dmenu xdg-user-dirs nitrogen polkit-gnome volumeicon xclip exo "
WM_BASE_PKGS+="xdotool compton gnome-keyring dunst feh gsimplecal xfce4-power-manager xfce4-settings laptop-detect"
ERR="/tmp/errlog" # error log used internally
DBG="/tmp/debuglog" # debug log when passed -d
RUN="/run/archiso/bootmnt/arch/boot" # path for live /boot
BT="$DIST Installer - v$VER" # backtitle used for dialogs
VM="$(dmesg | grep -i "hypervisor")" # is the system a vm
AUTO_ROOT_PART="" # values from auto partition
AUTO_BOOT_PART=""
# }
# giant ugly container :P {
# amount of RAM in the system in Mb
SYS_MEM="$(awk '/MemTotal/ {
print int($2 / 1024)"M"
}' /proc/meminfo)"
# parsed string of locales from /etc/locale.gen
LOCALES="$(awk '/\.UTF-8/ {
gsub(/# .*|#/, "")
if ($1) {
print $1 " -"
}
}' /etc/locale.gen)"
# parsed string of linux console keyboard mappings
CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{
gsub(/\.map\.gz|.*\//, "")
print $1 " -"
}' | sort)"
# make sure these are defined for some dialog size calculation
[[ $LINES ]] || LINES=$(tput lines)
[[ $COLUMNS ]] || COLUMNS=$(tput cols)
# various associative arrays
# {
# command used to install each bootloader
declare -A BCMDS=(
[grub]="grub-install --recheck --force"
[syslinux]="syslinux-install_update -iam"
[systemd-boot]="bootctl --path=/boot install"
)
# boot partition mount points for each bootloader
declare -A BMNTS=(
[BIOS-grub]="/boot"
[UEFI-grub]="/boot/efi"
[BIOS-syslinux]="/boot"
[UEFI-systemd-boot]="/boot"
)
# bootloader options with respective boot partition mountpoint
declare -A BOOTLDRS=(
[BIOS]="grub ${BMNTS[BIOS-grub]} syslinux ${BMNTS[BIOS-syslinux]}"
[UEFI]="systemd-boot ${BMNTS[UEFI-systemd-boot]} grub ${BMNTS[UEFI-grub]}"
)
# match the wm name with the actual session name used for xinit
declare -A WM_SESSIONS=(
[dwm]='dwm'
[i3-gaps]='i3'
[bspwm]='bspwm'
[xfce4]='startxfce4'
[plasma]='startkde'
[gnome]='gnome-session'
[openbox]='openbox-session'
[cinnamon]='cinnamon-session'
)
# additional packages installed for each wm/de
declare -A WM_EXT=(
[gnome]=""
[plasma]="kdebase-meta"
[bspwm]="sxhkd archlabs-skel-bspwm rofi archlabs-polybar"
[i3-gaps]="i3status perl-anyevent-i3 archlabs-skel-i3-gaps rofi archlabs-polybar"
[openbox]="obconf archlabs-skel-openbox jgmenu archlabs-polybar tint2 conky rofi lxmenu-data"
[xfce4]="xfce4-goodies xfce4-pulseaudio-plugin network-manager-applet volumeicon rofi archlabs-skel-xfce4"
)
# files the user can edit during the final stage of install
declare -A EDIT_FILES=(
[login]=""
[fstab]="/etc/fstab"
[sudoers]="/etc/sudoers"
[crypttab]="/etc/crypttab"
[pacman]="/etc/pacman.conf"
[console]="/etc/vconsole.conf"
[mkinitcpio]="/etc/mkinitcpio.conf"
[hostname]="/etc/hostname /etc/hosts"
[bootloader]="/boot/loader/entries/$DIST.conf"
[locale]="/etc/locale.conf /etc/default/locale"
[keyboard]="/etc/X11/xorg.conf.d/00-keyboard.conf /etc/default/keyboard"
)
# PKG_EXT: if you add a package to $PACKAGES in any dialog
# and it uses/requires some additional packages,
# you can add them here to keep it simple: [package]="extra"
# duplicates are removed with `uniq` before install
declare -A PKG_EXT=(
[vlc]="qt4"
[mpd]="mpc"
[mupdf]="mupdf-tools"
[qutebrowser]="qt5ct qt5-styleplugins"
[qt5ct]="qt5-styleplugins"
[vlc]="qt5ct qt5-styleplugins"
[zathura]="zathura-pdf-poppler"
[noto-fonts]="noto-fonts-emoji"
[cairo-dock]="cairo-dock-plug-ins"
[qbittorrent]="qt5ct qt5-styleplugins"
[kdenlive]="kdebase-meta dvdauthor frei0r-plugins breeze breeze-gtk qt5ct qt5-styleplugins"
)
# mkfs command to format a partition as a given file system
declare -A FS_CMDS=(
[ext2]="mkfs.ext2 -q"
[ext3]="mkfs.ext3 -q"
[ext4]="mkfs.ext4 -q"
[f2fs]="mkfs.f2fs"
[jfs]="mkfs.jfs -q"
[xfs]="mkfs.xfs -f"
[vfat]="mkfs.vfat -F32"
[nilfs2]="mkfs.nilfs2 -q"
[ntfs]="mkfs.ntfs -q"
[reiserfs]="mkfs.reiserfs -q"
)
# mount options for a given file system
declare -A FS_OPTS=(
[vfat]=""
[ntfs]=""
[ext2]=""
[ext3]=""
[jfs]="discard - off errors=continue - off errors=panic - off nointegrity - off"
[reiserfs]="acl - off nolog - off notail - off replayonly - off user_xattr - off"
[ext4]="discard - off dealloc - off nofail - off noacl - off relatime - off noatime - off nobarrier - off nodelalloc - off"
[xfs]="discard - off filestreams - off ikeep - off largeio - off noalign - off nobarrier - off norecovery - off noquota - off wsync - off"
[nilfs2]="discard - off nobarrier - off errors=continue - off errors=panic - off order=relaxed - off order=strict - off norecovery - off"
[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"
)
# }
# } # }
main() main()
@ -466,7 +602,8 @@ select_mirrorcmd()
'country': Server location; 'country': Server location;
'score': MirrorStatus score; 'score': MirrorStatus score;
'delay': MirrorStatus delay.\n" 0 0 "$MIRROR_CMD")" 'delay': MirrorStatus delay.\n" 0 0 "$MIRROR_CMD")"
else elif hash rankmirrors >/dev/null 2>&1; then
infobox "$_MirrorTitle" "\nQuerying mirrors near your location\n"
c="$(json 'country_code' "$(json 'ip' "check&?access_key=${key}&fields=ip")?access_key=${key}&fields=country_code")" c="$(json 'country_code' "$(json 'ip' "check&?access_key=${key}&fields=ip")?access_key=${key}&fields=country_code")"
local w="https://www.archlinux.org/mirrorlist" local w="https://www.archlinux.org/mirrorlist"
if [[ $c ]]; then if [[ $c ]]; then
@ -479,6 +616,7 @@ select_mirrorcmd()
MIRROR_CMD="curl -s '$w/?country=US&country=CA&country=NZ&country=GB&country=AU&use_mirror_status=on'" MIRROR_CMD="curl -s '$w/?country=US&country=CA&country=NZ&country=GB&country=AU&use_mirror_status=on'"
fi fi
fi fi
return 0 return 0
} }
@ -663,7 +801,7 @@ select_extra()
format() format()
{ {
infobox "$_FSTitle" "\nRunning: ${FS_CMDS[$2]} $1\n" 0 infobox "$_FSTitle" "\nRunning: ${FS_CMDS[$2]} $1\n" 0
${FS_CMDS[$2]} $1 >/dev/null 2>$ERR ${FS_CMDS[$2]} "$1" >/dev/null 2>$ERR
errshow "${FS_CMDS[$2]} $1" errshow "${FS_CMDS[$2]} $1"
} }
@ -706,17 +844,37 @@ partition()
if [[ $choice == "$_Done" || $choice == "" ]]; then if [[ $choice == "$_Done" || $choice == "" ]]; then
return 0 return 0
elif [[ $choice != "$_PartWipe" && $choice != "$_PartAuto" && $choice != "$_PartShowTree" ]]; then elif [[ $choice != "$_PartWipe" && $choice != "$_PartAuto" && $choice != "$_PartShowTree" ]]; then
clear; tput cnorm; $choice $device clear; tput cnorm; $choice "$device"; partition "$device"
elif [[ $choice == "$_PartShowTree" ]]; then elif [[ $choice == "$_PartShowTree" ]]; then
msgbox "$_PrepShowDev" "\n$(lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT "$device")\n" msgbox "$_PrepShowDev" "\n$(lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT "$device")\n"
partition $device partition "$device"
elif [[ $choice == "$_PartWipe" ]]; then elif [[ $choice == "$_PartWipe" ]]; then
yesno "$_PartWipe" "$_PartBody1 $device $_PartWipeBody2" && wipe -Ifrev $device yesno "$_PartWipe" "$_PartBody1 $device $_PartWipeBody2" && wipe -Ifrev $device
partition $device partition "$device"
else else
# if auto_partition fails we need to empty the partition variables local root_size msg ret table boot_fs
auto_partition $device || return 1 root_size=$(lsblk -lno SIZE "$device" | awk 'NR == 1 {
if ($1 ~ "G") {
sub(/G/, ""); print ($1 * 1000 - 512) / 1000"G"
} else {
sub(/M/, ""); print ($1 - 512)"M"
}
}')
if [[ $SYS == 'BIOS' ]]; then
msg="$(sed 's|vfat/fat32|ext4|' <<< "$_PartBody2")"; table="msdos"; boot_fs="ext4"
else
msg="$_PartBody2"; table="gpt"; boot_fs="fat32"
fi fi
if yesno "$_PrepParts" "$_PartBody1 $device $msg ($size)$_PartBody3"; then
auto_partition "$device" "$table" "$boot_fs" "$root_size" || return 1
else
partition "$device"
fi
fi
return 0
} }
decr_count() decr_count()
@ -852,38 +1010,17 @@ check_cryptlvm()
auto_partition() auto_partition()
{ {
local device="$1" local device="$1" table="$2" boot_fs="$3" size="$4"
local size local dev_info="$(parted -s $device print)"
size=$(lsblk -lno SIZE $device | awk 'NR == 1 {
if ($1 ~ "G") {
sub(/G/, ""); print ($1 * 1000 - 512) / 1000"G"
} else {
sub(/M/, ""); print ($1 - 512)"M"
}
}')
if [[ $SYS == 'BIOS' ]]; then
local msg
msg="$(sed 's|vfat/fat32|ext4|' <<< "$_PartBody2")"
local table="msdos"
local fs="ext4"
else
local msg="$_PartBody2"
local table="gpt"
local fs="fat32";
fi
# confirm or bail
yesno "$_PrepParts" "$_PartBody1 $device $msg ($size)$_PartBody3" || return 0
infobox "$_PrepParts" "\nRemoving partitions on $device and setting table to $table\n" 2 infobox "$_PrepParts" "\nRemoving partitions on $device and setting table to $table\n" 2
swapoff -a # in case the device was previously used for swap
local dev_info # in case the device was previously used for swap
dev_info="$(parted -s $device print)" swapoff -a
# walk the partitions on the device in reverse order and delete them # walk the partitions on the device in reverse order and delete them
while read -r i; do while read -r PART; do
parted -s $device rm $i >/dev/null 2>&1 parted -s $device rm $PART >/dev/null 2>&1
done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)" done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)"
if [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]]; then if [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]]; then
@ -897,7 +1034,7 @@ auto_partition()
parted -s $device mkpart ESP $fs 1MiB 513MiB >/dev/null 2>&1 parted -s $device mkpart ESP $fs 1MiB 513MiB >/dev/null 2>&1
fi fi
sleep 0.1 sleep 0.5
BOOT_DEVICE="$device" BOOT_DEVICE="$device"
AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE $device | awk 'NR == 2 {print "/dev/"$1}') AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE $device | awk 'NR == 2 {print "/dev/"$1}')
@ -909,10 +1046,10 @@ auto_partition()
infobox "$_PrepParts" "\nCreating a $size ext4 root partition.\n" 0 infobox "$_PrepParts" "\nCreating a $size ext4 root partition.\n" 0
parted -s $device mkpart primary ext4 513MiB 100% >/dev/null 2>&1 parted -s $device mkpart primary ext4 513MiB 100% >/dev/null 2>&1
sleep 0.1
local rp sleep 0.5
rp="$(lsblk -lno NAME,TYPE $device | awk 'NR == 3 {print "/dev/"$1}')" AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE $device | awk 'NR == 3 {print "/dev/"$1}')"
mkfs.ext4 -q $rp >/dev/null 2>&1 mkfs.ext4 -q $AUTO_ROOT_PART >/dev/null 2>&1
tput civis tput civis
sleep 0.5 sleep 0.5
@ -929,10 +1066,8 @@ mount_partition()
if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" ]] && select_mount_opts "$part" "$fs"; then if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" ]] && select_mount_opts "$part" "$fs"; then
mount -o $MNT_OPTS "$part" "$mountp" 2>$ERR mount -o $MNT_OPTS "$part" "$mountp" 2>$ERR
errshow "mount -o $MNT_OPTS $part $mountp"
else else
mount "$part" "$mountp" 2>$ERR mount "$part" "$mountp" 2>$ERR
errshow "mount $part $mountp"
fi fi
confirm_mount $part "$mountp" || return 1 confirm_mount $part "$mountp" || return 1
@ -964,20 +1099,21 @@ find_partitions()
fi fi
# number of partitions total # number of partitions total
if [[ $PARTS ]]; then
COUNT=$(wc -l <<< "$PARTS") COUNT=$(wc -l <<< "$PARTS")
else
COUNT=0
fi
# ensure we have enough partitions for the system and action type # ensure we have enough partitions for the system and action type
case $str in case "$str" in
'part|lvm|crypt') [[ $COUNT -eq 0 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_PartErrBody" ;; 'part|lvm|crypt') [[ $COUNT -lt 1 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_PartErrBody" ;;
'part|crypt') (( COUNT == 0 )) && err="$_LvmPartErrBody" ;; 'part|crypt') (( COUNT < 1 )) && err="$_LvmPartErrBody" ;;
'part|lvm') (( COUNT < 2 )) && err="$_LuksPartErrBody" ;; 'part|lvm') (( COUNT < 2 )) && err="$_LuksPartErrBody" ;;
esac esac
# if there aren't enough partitions show the error message # if there aren't enough partitions show the relevant error message
if [[ $err ]]; then [[ $err ]] && { msgbox "$_ErrTitle" "$err"; return 1; }
msgbox "$_ErrTitle" "$err"
return 1
fi
return 0 return 0
} }
@ -1011,7 +1147,7 @@ mnt_menu()
# prepare partition list PARTS for dialog # prepare partition list PARTS for dialog
lvm_detect lvm_detect
umount_dir $MNT umount_dir $MNT
find_partitions 'part|lvm|crypt' || return 1 find_partitions 'part|lvm|crypt' || { SELECTED=2; return 1; }
select_root_partition || return 1 select_root_partition || return 1
if [[ $SYS == "UEFI" ]]; then if [[ $SYS == "UEFI" ]]; then
@ -1100,7 +1236,7 @@ select_filesystem()
{ {
local part="$1" local part="$1"
local fs cur_fs local fs cur_fs
cur_fs="$(lsblk -lno FSTYPE $part 2>/dev/null)" cur_fs="$(lsblk -lno FSTYPE "$part" 2>/dev/null)"
local msg="\nSelect which filesystem you want to use for $part\n\nPartition Name: " local msg="\nSelect which filesystem you want to use for $part\n\nPartition Name: "
tput civis tput civis
@ -1135,9 +1271,9 @@ select_filesystem()
[[ $fs ]] || return 1 [[ $fs ]] || return 1
if yesno "$_FSTitle" "\nFormat $part as $fs?\n" "Format" "Go Back"; then if yesno "$_FSTitle" "\nFormat $part as $fs?\n" "Format" "Go Back"; then
format $part $fs format "$part" "$fs"
else else
select_filesystem $part || return 1 select_filesystem "$part" || return 1
fi fi
return 0 return 0
@ -1151,11 +1287,13 @@ select_efi_partition()
infobox "$_PrepMount" "$_OnlyOne for EFI: $BOOT_PART\n" 1 infobox "$_PrepMount" "$_OnlyOne for EFI: $BOOT_PART\n" 1
elif ! BOOT_PART="$(menubox "$_PrepMount" "$_SelUefiBody" $PARTS)"; then elif ! BOOT_PART="$(menubox "$_PrepMount" "$_SelUefiBody" $PARTS)"; then
return 1 return 1
elif [[ $BOOT_PART == "$AUTO_BOOT_PART" ]]; then
return 0 # were done here
fi fi
if grep -q 'fat' <<< "$(fsck -N "$BOOT_PART")"; then if grep -q 'fat' <<< "$(fsck -N "$BOOT_PART")"; then
local msg="$_FormUefiBody $BOOT_PART $_FormUefiBody2" local msg="$_FormUefiBody $BOOT_PART $_FormUefiBody2"
if [[ $AUTO_BOOT_PART != "$BOOT_PART" ]] && yesno "$_PrepMount" "$msg" "Format $BOOT_PART" "Do Not Format" "no"; then if yesno "$_PrepMount" "$msg" "Format $BOOT_PART" "Do Not Format" "no"; then
format "$BOOT_PART" "vfat" format "$BOOT_PART" "vfat"
sleep 1 sleep 1
fi fi
@ -1163,6 +1301,7 @@ select_efi_partition()
format "$BOOT_PART" "vfat" format "$BOOT_PART" "vfat"
sleep 1 sleep 1
fi fi
return 0 return 0
} }
@ -1171,10 +1310,13 @@ select_boot_partition()
tput civis tput civis
if ! BOOT_PART="$(menubox "$_PrepMount" "$_SelBiosBody" "$_Skip" "-" $PARTS)" || [[ $BOOT_PART == "$_Skip" ]]; then if ! BOOT_PART="$(menubox "$_PrepMount" "$_SelBiosBody" "$_Skip" "-" $PARTS)" || [[ $BOOT_PART == "$_Skip" ]]; then
BOOT_PART="" BOOT_PART=""
else elif [[ $AUTO_BOOT_PART == "$BOOT_PART" ]]; then
return 0 # were done here
fi
if grep -q 'ext[34]' <<< "$(fsck -N "$BOOT_PART")"; then if grep -q 'ext[34]' <<< "$(fsck -N "$BOOT_PART")"; then
local msg="$_FormBiosBody $BOOT_PART $_FormBiosBody2" local msg="$_FormBiosBody $BOOT_PART $_FormBiosBody2"
if [[ $AUTO_BOOT_PART != "$BOOT_PART" ]] && yesno "$_PrepMount" "$msg" "Format $BOOT_PART" "Skip Formatting" "no"; then if yesno "$_PrepMount" "$msg" "Format $BOOT_PART" "Skip Formatting" "no"; then
format "$BOOT_PART" "ext4" format "$BOOT_PART" "ext4"
sleep 1 sleep 1
fi fi
@ -1182,14 +1324,13 @@ select_boot_partition()
format "$BOOT_PART" "ext4" format "$BOOT_PART" "ext4"
sleep 1 sleep 1
fi fi
fi
return 0 return 0
} }
select_root_partition() select_root_partition()
{ {
tput civis tput civis
if [[ $COUNT -eq 1 ]]; then if (( COUNT == 1 )); then
ROOT_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")" ROOT_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")"
infobox "$_PrepMount" "$_OnlyOne for root (/): $ROOT_PART\n" 1 infobox "$_PrepMount" "$_OnlyOne for root (/): $ROOT_PART\n" 1
elif ! ROOT_PART="$(menubox "$_PrepMount" "$_SelRootBody" $PARTS)"; then elif ! ROOT_PART="$(menubox "$_PrepMount" "$_SelRootBody" $PARTS)"; then
@ -1349,9 +1490,11 @@ create_user()
{ {
printf "Creating user $NEWUSER, setting passwords, and setting shell\n" printf "Creating user $NEWUSER, setting passwords, and setting shell\n"
chrun "chpasswd <<< 'root:$ROOT_PASS'" chrun "chpasswd <<< 'root:$ROOT_PASS'" 2>$ERR
errshow 1 "Setting root password"
if [[ $MYSHELL != *zsh ]]; then if [[ $MYSHELL != *zsh ]]; then
chrun "usermod -s $MYSHELL root" chrun "usermod -s $MYSHELL root" 2>$ERR
errshow 1 "Setting root shell"
if [[ $MYSHELL == "/usr/bin/mksh" ]]; then if [[ $MYSHELL == "/usr/bin/mksh" ]]; then
cp -fv $MNT/etc/skel/.mkshrc /root/.mkshrc cp -fv $MNT/etc/skel/.mkshrc /root/.mkshrc
fi fi
@ -1514,21 +1657,19 @@ mirrorlist_sort()
package_operations() package_operations()
{ {
local rmpkg="archlabs-installer" if [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|dwm) ]]; then
if [[ $inpkg =~ (openbox|bspwm|i3) || $INSTALL_WMS == *dwm* ]]; then
local inpkg="$PACKAGES $BASE_PKGS $WM_BASE_PKGS" local inpkg="$PACKAGES $BASE_PKGS $WM_BASE_PKGS"
else else
local inpkg="$PACKAGES $BASE_PKGS" local inpkg="$PACKAGES $BASE_PKGS"
fi fi
if ! [[ $INSTALL_WMS == 'plasma' || $INSTALL_WMS == 'gnome' || $INSTALL_WMS == 'cinnamon' ]]; then [[ $INSTALL_WMS =~ ^(plasma|gnome|cinnamon)$ ]] || inpkg+=" archlabs-ksuperkey"
inpkg+=" archlabs-ksuperkey"
fi
if [[ $KERNEL == 'linux-lts' ]]; then if [[ $KERNEL == 'linux-lts' ]]; then
inpkg+=" linux-lts" inpkg+=" linux-lts"
rmpkg+=" linux" local rmpkg="archlabs-installer linux"
else
local rmpkg="archlabs-installer"
fi fi
[[ $BOOTLDR == 'grub' ]] && inpkg+=" grub" [[ $BOOTLDR == 'grub' ]] && inpkg+=" grub"
@ -1549,15 +1690,13 @@ suckless_install()
mkdir -pv $MNT/home/$NEWUSER/suckless mkdir -pv $MNT/home/$NEWUSER/suckless
for i in dwm dmenu st; do for i in dwm dmenu st; do
p="/home/$NEWUSER/suckless/$i" if chrun "git clone https://bitbucket.org/natemaia/$i /home/$NEWUSER/suckless/$i"; then
chrun "git clone https://bitbucket.org/natemaia/$i $p" chrun "cd /home/$NEWUSER/suckless/$i; rm -f config.h; make clean install; make clean"
e=$?
if (( e == 0 )); then
chrun "cd $p; rm -f config.h; make clean install; make clean"
else else
printf "Failed to clone $i repo\n" printf "Failed to clone $i repo\n"
fi fi
done done
if [[ -d /home/$NEWUSER/suckless/dwm ]]; then if [[ -d /home/$NEWUSER/suckless/dwm ]]; then
printf "To configure dwm edit /home/$NEWUSER/suckless/dwm/config.h\n" printf "To configure dwm edit /home/$NEWUSER/suckless/dwm/config.h\n"
printf "You can then recompile it with 'sudo make clean install'\n" printf "You can then recompile it with 'sudo make clean install'\n"
@ -1585,6 +1724,8 @@ setup_boot()
setup_grub() setup_grub()
{ {
local efidir="/sys/firmware/efi"
# grub has by far the worst setup of the three however # grub has by far the worst setup of the three however
# the configuration is shorter due to grub-mkconfig # the configuration is shorter due to grub-mkconfig
EDIT_FILES[bootloader]="/etc/default/grub" EDIT_FILES[bootloader]="/etc/default/grub"
@ -1595,9 +1736,13 @@ setup_grub()
if [[ $ROOT_PART == */dev/mapper/* && ! $LVM && ! $LUKS_PASS ]]; then if [[ $ROOT_PART == */dev/mapper/* && ! $LVM && ! $LUKS_PASS ]]; then
luks_pass "$_LuksOpen" "" || return 1 luks_pass "$_LuksOpen" "" || return 1
fi fi
BCMDS[grub]="${BCMDS[grub]} --bootloader-id=$DIST" BCMDS[grub]="mount -t efivarfs efivarfs $efidir/efivars; \
${BCMDS[grub]} --bootloader-id=$DIST"
fi fi
grep -q $efidir/efivars <<< "$(mount)" ||
mount -t efivarfs efivarfs $efidir/efivars
BCMDS[grub]="mkdir -p /run/udev && mkdir -p /run/lvm && BCMDS[grub]="mkdir -p /run/udev && mkdir -p /run/lvm &&
mount --bind /hostrun/udev /run/udev && mount --bind /hostrun/udev /run/udev &&
mount --bind /hostrun/lvm /run/lvm && mount --bind /hostrun/lvm /run/lvm &&
@ -2047,7 +2192,7 @@ luks_menu()
tput civis tput civis
local choice local choice
choice="$(dialog --cr-wrap --stdout --backtitle "$BT" --title " $_PrepLUKS " \ choice="$(dialog --cr-wrap --stdout --backtitle "$BT" --title " $_PrepLUKS " \
--menu "${_LuksMenuBody}${_LuksMenuBody2}${_LuksMenuBody3}" 0 0 6 \ --menu "${_LuksMenuBody}${_LuksMenuBody2}${_LuksMenuBody3}" 0 0 0 \
"$_LuksEncrypt" "cryptsetup -q luksFormat" \ "$_LuksEncrypt" "cryptsetup -q luksFormat" \
"$_LuksOpen" "cryptsetup open --type luks" \ "$_LuksOpen" "cryptsetup open --type luks" \
"$_LuksEncryptAdv" "cryptsetup -q -s -c luksFormat" \ "$_LuksEncryptAdv" "cryptsetup -q -s -c luksFormat" \
@ -2217,14 +2362,12 @@ chrun()
} }
json() json()
{ { # extract a value from http://api.ipstack.com json output
# extract a value from http://api.ipstack.com json output
curl -s "http://api.ipstack.com/$2" | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])" curl -s "http://api.ipstack.com/$2" | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])"
} }
src() src()
{ { # source file ($1), if it fails we die with an error message
# source file ($1), if it fails we die with an error message
if ! . "$1" 2>/dev/null; then if ! . "$1" 2>/dev/null; then
printf "Failed to source file %s\n" "$1" printf "Failed to source file %s\n" "$1"
die 1 die 1
@ -2233,8 +2376,7 @@ src()
} }
ssd() ssd()
{ { # returns 0 (true) when the device passed ($1) is NOT a rotational device
# returns 0 (true) when the device passed ($1) is NOT a rotational device
local i dev=$1 local i dev=$1
# check for LVM and or LUKS for their origin devices # check for LVM and or LUKS for their origin devices
@ -2252,47 +2394,51 @@ ssd()
die() die()
{ {
if (( $# >= 1 )); then (( $# >= 1 )) && local exitcode=$1 || local exitcode=0
local exitcode=$1
else
local exitcode=0
fi
# reset SIGINT # reset SIGINT and terminal
trap - INT trap - INT
tput cnorm tput cnorm
if [[ -d $MNT ]] && command cd /; then if [[ -d $MNT ]] && command cd /; then
umount_dir $MNT umount_dir $MNT
if (( exitcode == 127 )); then if (( exitcode == 127 )); then
umount -l /run/archiso/bootmnt umount -l /run/archiso/bootmnt
sleep 0.5
systemctl -i reboot systemctl -i reboot
fi fi
fi fi
if [[ $TERM == 'linux' ]]; then
# restore custom linux console 0-15 colors when not rebooting
colors=("\e]P0191919" "\e]P1D15355" "\e]P2609960" "\e]P3FFCC66"
"\e]P4255A9B" "\e]P5AF86C8" "\e]P62EC8D3" "\e]P7949494" "\e]P8191919" "\e]P9D15355"
"\e]PA609960" "\e]PBFF9157" "\e]PC4E88CF" "\e]PDAF86C8" "\e]PE2ec8d3" "\e]PFE1E1E1"
)
for col in "${colors[@]}"; do
printf "$col"
done
fi
exit $exitcode exit $exitcode
} }
sigint() sigint()
{ { # used to trap SIGINT (^C) and cleanly exit
# used to trap SIGINT and cleanly exit the program
printf "CTRL-C caught\nCleaning up...\n" printf "CTRL-C caught\nCleaning up...\n"
die 1 die 1
} }
print4() print4()
{ { # takes an arbitrary number of input fields and prints them out in fourths on separate lines
# takes an arbitrary number of input fields and prints them out in fourths on separate lines
local str="$*" local str="$*"
if [[ ${#str} -gt $((COLUMNS - 10)) ]]; then if [[ $COLUMNS -gt 110 && ${#str} -gt $((COLUMNS - 10)) ]]; then
str="$(awk '{ str="$(awk '{
p1=p2=p3=p4="" i=2; p1=p2=p3=p4=""; p1=$1; q=int(NF / 4)
p1=$1 for (;i<=q; i++) { p1=p1" "$i }
q=int(NF / 4) for (;i<=q*2; i++) { p2=p2" "$i }
for (i=2; i<=q; i++) { p1=p1" "$i } for (;i<=q*3; i++) { p3=p3" "$i }
for (i=q; i<=q*2; i++) { p2=p2" "$i } for (;i<=NF; i++) { p4=p4" "$i }
for (i=q*2; i<=q*3; i++) { p3=p3" "$i }
for (i=q*3; i<=NF; i++) { p4=p4" "$i }
printf "%s\n %s\n %s\n %s", p1, p2, p3, p4 printf "%s\n %s\n %s\n %s", p1, p2, p3, p4
}' <<< "$str")" }' <<< "$str")"
printf "%s\n" "$str" printf "%s\n" "$str"
@ -2314,6 +2460,7 @@ system_devices()
awk '/disk/ {print "/dev/" $1 " " $2}')" awk '/disk/ {print "/dev/" $1 " " $2}')"
fi fi
[[ $SYS_DEVS ]] || { infobox "$_ErrTitle" "\nNo available devices...$_Exit\n"; die 1; }
DEV_COUNT="$(wc -l <<< "$SYS_DEVS")" DEV_COUNT="$(wc -l <<< "$SYS_DEVS")"
} }
@ -2338,8 +2485,7 @@ system_identify()
if [[ -d $efidir ]]; then if [[ -d $efidir ]]; then
SYS="UEFI" SYS="UEFI"
grep -q $efidir/efivars <<< "$(mount)" || grep -q $efidir/efivars <<< "$(mount)" || mount -t efivarfs efivarfs $efidir/efivars
mount -t efivarfs efivarfs $efidir/efivars
else else
SYS="BIOS" SYS="BIOS"
fi fi
@ -2349,7 +2495,7 @@ system_identify()
load_bcm() load_bcm()
{ {
infobox "Broadcom Wireless Setup" "\nLoading wifi kernel modules please wait...\n" 1 infobox "Broadcom Wireless Setup" "\nLoading broadcom wifi kernel modules please wait...\n" 0
rmmod wl >/dev/null 2>&1 rmmod wl >/dev/null 2>&1
rmmod bcma >/dev/null 2>&1 rmmod bcma >/dev/null 2>&1
rmmod b43 >/dev/null 2>&1 rmmod b43 >/dev/null 2>&1
@ -2359,9 +2505,14 @@ load_bcm()
BROADCOM_WL=true BROADCOM_WL=true
} }
chk_connect()
{
infobox "Network Connect" "\nVerifying connection to https://www.archlinux.org\n"
curl -sI --connect-timeout 5 'https://www.archlinux.org/' | sed '1q' | grep -q '200'
}
net_connect() net_connect()
{ {
chk_connect() { curl -s --head 'https://www.archlinux.org/mirrorlist/all/' | sed '1q' | grep -qw '200'; }
if ! chk_connect; then if ! chk_connect; then
if [[ $(systemctl is-active NetworkManager) == "active" ]] && hash nmtui >/dev/null 2>&1; then if [[ $(systemctl is-active NetworkManager) == "active" ]] && hash nmtui >/dev/null 2>&1; then
tput civis tput civis
@ -2400,7 +2551,7 @@ prechecks()
{ {
if [[ $1 -ge 0 ]] && ! [[ $(lsblk -lno MOUNTPOINT) =~ $MNT ]]; then if [[ $1 -ge 0 ]] && ! [[ $(lsblk -lno MOUNTPOINT) =~ $MNT ]]; then
msgbox "$_ErrTitle" "$_ErrNoMount"; SELECTED=4; return 1 msgbox "$_ErrTitle" "$_ErrNoMount"; SELECTED=4; return 1
elif [[ $1 -ge 1 && ! $NEWUSER ]]; then elif [[ $1 -ge 1 && ($NEWUSER == "" || $USER_PASS == "") ]]; then
msgbox "$_ErrTitle" "\nYou need to create a user first.\n"; SELECTED=5; return 1 msgbox "$_ErrTitle" "\nYou need to create a user first.\n"; SELECTED=5; return 1
elif [[ $1 -ge 2 && $CONFIG_DONE != true ]]; then elif [[ $1 -ge 2 && $CONFIG_DONE != true ]]; then
msgbox "$_ErrTitle" "$_ErrNoConfig"; SELECTED=6; return 1 msgbox "$_ErrTitle" "$_ErrNoConfig"; SELECTED=6; return 1
@ -2508,189 +2659,9 @@ yesno()
fi fi
} }
select_language()
{
LNG="/usr/share/archlabs/installer/lang" # translation file path
tput civis
local lang
lang=$(menubox "Select Language" \
"\nLanguage - sprache - taal - språk - lingua - idioma - nyelv - língua\n" \
"1" "English (en_**)" \
"2" "Español (es_ES)" \
"3" "Português [Brasil] (pt_BR)" \
"4" "Português (pt_PT)" \
"5" "Français (fr_FR)" \
"6" "Russkiy (ru_RU)" \
"7" "Italiano (it_IT)" \
"8" "Nederlands (nl_NL)" \
"9" "Magyar (hu_HU)" \
"10" "Chinese (zh_CN)")
src $LNG/english.trans
FONT="ter-i16n"
case $lang in
1) LOC="en_US.UTF-8" ;;
2) src $LNG/spanish.trans && LOC="es_ES.UTF-8" ;;
3) src $LNG/p_brasil.trans && LOC="pt_BR.UTF-8" ;;
4) src $LNG/portuguese.trans && LOC="pt_PT.UTF-8" ;;
5) src $LNG/french.trans && LOC="fr_FR.UTF-8" ;;
6) src $LNG/russian.trans && LOC="ru_RU.UTF-8" FONT="LatKaCyrHeb-16" ;;
7) src $LNG/italian.trans && LOC="it_IT.UTF-8" ;;
8) src $LNG/dutch.trans && LOC="nl_NL.UTF-8" ;;
9) src $LNG/hungarian.trans && LOC="hu_HU.UTF-8" FONT="lat2-16" ;;
10) src $LNG/chinese.trans && LOC="zh_CN.UTF-8" ;;
*) die
esac
sed -i "s/#en_US.UTF-8/en_US.UTF-8/" /etc/locale.gen
if [[ $LOC != "en_US.UTF-8" ]]; then
sed -i "s/#${LOC}/${LOC}/" /etc/locale.gen
locale-gen >/dev/null 2>&1
fi
[[ $TERM == 'linux' ]] && setfont $FONT >/dev/null 2>&1
export LANG="$LOC"
return 0
}
############################################################################### ###############################################################################
# entry point # entry point
# giant ugly variable container :P {
# amount of RAM in the system in Mb
SYS_MEM="$(awk '/MemTotal/ {
print int($2 / 1024)"M"
}' /proc/meminfo)"
# parsed string of locales from /etc/locale.gen
LOCALES="$(awk '/\.UTF-8/ {
gsub(/# .*|#/, "")
if ($1) {
print $1 " -"
}
}' /etc/locale.gen)"
# parsed string of linux console keyboard mappings
CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{
gsub(/\.map\.gz|.*\//, "")
print $1 " -"
}' | sort)"
# make sure these are defined for some dialog size calculation
[[ $LINES ]] || LINES=$(tput lines)
[[ $COLUMNS ]] || COLUMNS=$(tput cols)
# various associative arrays
# {
# command used to install each bootloader
declare -A BCMDS=(
[grub]="grub-install --recheck --force"
[syslinux]="syslinux-install_update -iam"
[systemd-boot]="bootctl --path=/boot install"
)
# boot partition mount points for each bootloader
declare -A BMNTS=(
[BIOS-grub]="/boot"
[UEFI-grub]="/boot/efi"
[BIOS-syslinux]="/boot"
[UEFI-systemd-boot]="/boot"
)
# bootloader options with respective boot partition mountpoint
declare -A BOOTLDRS=(
[BIOS]="grub ${BMNTS[BIOS-grub]} syslinux ${BMNTS[BIOS-syslinux]}"
[UEFI]="systemd-boot ${BMNTS[UEFI-systemd-boot]} grub ${BMNTS[UEFI-grub]}"
)
# match the wm name with the actual session name used for xinit
declare -A WM_SESSIONS=(
[dwm]='dwm'
[i3-gaps]='i3'
[bspwm]='bspwm'
[xfce4]='startxfce4'
[plasma]='startkde'
[gnome]='gnome-session'
[openbox]='openbox-session'
[cinnamon]='cinnamon-session'
)
# additional packages installed for each wm/de
declare -A WM_EXT=(
[gnome]=""
[plasma]="kdebase-meta"
[bspwm]="sxhkd archlabs-skel-bspwm rofi archlabs-polybar"
[i3-gaps]="i3status perl-anyevent-i3 archlabs-skel-i3-gaps rofi archlabs-polybar"
[openbox]="obconf archlabs-skel-openbox jgmenu archlabs-polybar tint2 conky rofi"
[xfce4]="xfce4-goodies xfce4-pulseaudio-plugin network-manager-applet volumeicon rofi archlabs-skel-xfce4 xdg-user-dirs"
)
# files the user can edit during the final stage of install
declare -A EDIT_FILES=(
[login]="" # login files.. Populated later once login method is chosen
[fstab]="/etc/fstab"
[sudoers]="/etc/sudoers"
[crypttab]="/etc/crypttab"
[pacman]="/etc/pacman.conf"
[console]="/etc/vconsole.conf"
[mkinitcpio]="/etc/mkinitcpio.conf"
[hostname]="/etc/hostname /etc/hosts"
[bootloader]="/boot/loader/entries/$DIST.conf"
[locale]="/etc/locale.conf /etc/default/locale"
[keyboard]="/etc/X11/xorg.conf.d/00-keyboard.conf /etc/default/keyboard"
)
# PKG_EXT: if you add a package to $PACKAGES in any dialog
# and it uses/requires some additional packages,
# you can add them here to keep it simple: [package]="extra"
# duplicates are removed with `uniq` before install
declare -A PKG_EXT=(
[vlc]="qt4"
[mpd]="mpc"
[mupdf]="mupdf-tools"
[qutebrowser]="qt5ct qt5-styleplugins"
[qt5ct]="qt5-styleplugins"
[vlc]="qt5ct qt5-styleplugins"
[zathura]="zathura-pdf-poppler"
[noto-fonts]="noto-fonts-emoji"
[cairo-dock]="cairo-dock-plug-ins"
[qbittorrent]="qt5ct qt5-styleplugins"
[kdenlive]="kdebase-meta dvdauthor frei0r-plugins breeze breeze-gtk qt5ct qt5-styleplugins"
)
# mkfs command to format a partition as a given file system
declare -A FS_CMDS=(
[ext2]="mkfs.ext2 -q"
[ext3]="mkfs.ext3 -q"
[ext4]="mkfs.ext4 -q"
[f2fs]="mkfs.f2fs"
[jfs]="mkfs.jfs -q"
[xfs]="mkfs.xfs -f"
[vfat]="mkfs.vfat -F32"
[nilfs2]="mkfs.nilfs2 -q"
[ntfs]="mkfs.ntfs -q"
[reiserfs]="mkfs.reiserfs -q"
)
# mount options for a given file system
declare -A FS_OPTS=(
[vfat]=""
[ntfs]=""
[ext2]=""
[ext3]=""
[jfs]="discard - off errors=continue - off errors=panic - off nointegrity - off"
[reiserfs]="acl - off nolog - off notail - off replayonly - off user_xattr - off"
[ext4]="discard - off dealloc - off nofail - off noacl - off relatime - off noatime - off nobarrier - off nodelalloc - off"
[xfs]="discard - off filestreams - off ikeep - off largeio - off noalign - off nobarrier - off norecovery - off noquota - off wsync - off"
[nilfs2]="discard - off nobarrier - off errors=continue - off errors=panic - off order=relaxed - off order=strict - off norecovery - off"
[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"
)
# }
# }
# trap Ctrl-C to properly exit # trap Ctrl-C to properly exit
trap sigint INT trap sigint INT
@ -2699,10 +2670,7 @@ for arg in "$@"; do
done done
# initial prep # initial prep
#select_language
src /usr/share/archlabs/installer/lang/english.trans src /usr/share/archlabs/installer/lang/english.trans
select_keymap select_keymap
system_checks system_checks
system_identify system_identify