# This program is free software, provided under the GNU GPL
# Written by Nathaniel Maia for use in Archlabs
# Some ideas and code reworked from other resources
-# AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due
+# AIF, Calamares, and the Arch Wiki.. Credit where credit is due
-VER=2.0.74
+# check for syntax errors
+# set -n
-# bulk default values {
+VER=2.1.6
+
+# default values {
: ${DIST=ArchLabs} # distro name if not set
-MNT=/mnt # install mountpoint
-ANS=/tmp/ans # dialog answer file
-BOOTDIR=boot # location to mount boot partition
+MNT=/mnt # installation root mountpoint
+ANS=/tmp/ans # dialog answer output file
FONT=ter-i16n # font used for the linux console
-HOOKS=shutdown # list of additional mkinitcpio HOOKS
+HOOKS=shutdown # additional mkinitcpio HOOKS
SEL=0 # currently selected menu item
-SYS=Unknown # bios type to be determined: UEFI/BIOS
-ERR=/tmp/errlog # error log used internally
-DBG=/tmp/debuglog # debug log when passed -d
+SYS=Unknown # bios type, to be determined: UEFI/BIOS
+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
VM="$(dmesg | grep -i hypervisor)" # system running in a virtual machine
-export DIALOGOPTS="--cr-wrap" # see `man dialog`
+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
+export DIALOGOPTS="--cr-wrap" # dialog environment variable to hold default options, see `man dialog`
-BASE_PKGS="base-devel xorg xorg-drivers sudo git gvfs gtk3 libmad libmatroska tumbler "
+BASE_PKGS="base xorg xorg-drivers sudo git gvfs gtk3 libmad libmatroska tumbler "
BASE_PKGS+="playerctl pulseaudio pulseaudio-alsa pavucontrol pamixer scrot xdg-user-dirs "
-BASE_PKGS+="ffmpeg gstreamer gst-libav gst-plugins-base gst-plugins-good bash-completion "
+BASE_PKGS+="ffmpeg gstreamer gst-libav gst-plugins-base gst-plugins-good bash-completion xterm"
-AL_BASE_PKGS="archlabs-icons archlabs-fonts archlabs-themes archlabs-baph "
-AL_BASE_PKGS+="archlabs-wallpapers archlabs-scripts archlabs-skel-base"
+AL_BASE_PKGS="archlabs-keyring archlabs-icons archlabs-fonts archlabs-themes "
+AL_BASE_PKGS+="archlabs-baph archlabs-wallpapers archlabs-scripts archlabs-skel-base"
-WM_BASE_PKGS="arandr archlabs-networkmanager-dmenu nitrogen polkit-gnome "
-WM_BASE_PKGS+="volumeicon xclip exo laptop-detect xdotool compton wmctrl feh "
+WM_BASE_PKGS="arandr nitrogen polkit-gnome network-manager-applet "
+WM_BASE_PKGS+="volumeicon xclip exo laptop-detect xdotool picom wmctrl feh "
WM_BASE_PKGS+="gnome-keyring dunst gsimplecal xfce4-power-manager xfce4-settings"
SYS_MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)"
[efistub]='efibootmgr -v -d /dev/sda -p 1 -c -l' [systemd-boot]='bootctl --path=/boot install'
) # }
+# sessions that provide their own super bind and set the wallpaper {
+declare SELF_CONTAINED='plasma|gnome|cinnamon|deepin'
+declare SELF_CONTAINED_SES='startplasma-x11|gnome-session|startdde|cinnamon-session'
+# }
+
# executable name for each wm/de used in ~/.xinitrc {
declare -A WM_SESSIONS=(
-[dwm]='dwm' [i3-gaps]='i3' [bspwm]='bspwm' [awesome]='awesome' [plasma]='startkde' [xfce4]='startxfce4'
-[gnome]='gnome-session' [fluxbox]='startfluxbox' [openbox]='openbox-session' [cinnamon]='cinnamon-session'
+[dwm]='dwm' [jwm]='jwm' [i3-gaps]='i3' [bspwm]='bspwm' [awesome]='awesome' [plasma]='startplasma-x11' [xfce4]='startxfce4'
+[deepin]='startdde' [gnome]='gnome-session' [fluxbox]='startfluxbox' [openbox]='openbox-session' [cinnamon]='cinnamon-session'
) # }
# packages installed for each wm/de, most are depends of the skel packages {
declare -A WM_EXT=(
-[dwm]='' [gnome]='' [cinnamon]='gnome-terminal' [plasma]='kdebase-meta'
+[dwm]='nitrogen polkit-gnome gnome-keyring dunst lxappearance' [jwm]='' [deepin]='deepin-extra'
+[gnome]='gnome-tweaks' [cinnamon]='gnome-terminal' [plasma]='kde-applications-meta powerdevil'
[awesome]='archlabs-skel-awesome' [bspwm]='archlabs-skel-bspwm' [fluxbox]='archlabs-skel-fluxbox'
[i3-gaps]='archlabs-skel-i3-gaps' [openbox]='archlabs-skel-openbox' [xfce4]='archlabs-skel-xfce4 xfce4-goodies'
) # }
# they can be added here eg. [package]="extra"
declare -A PKG_EXT=(
[vlc]='qt4' [mpd]='mpc' [mupdf]='mupdf-tools'
-[rxvt-unicode]='urxvt-pearls' [zathura]='zathura-pdf-poppler' [noto-fonts]='noto-fonts-emoji' [cairo-dock]='cairo-dock-plug-ins' [qt5ct]='qt5-styleplugins'
+[rxvt-unicode]='urxvt-perls' [zathura]='zathura-pdf-poppler' [noto-fonts]='noto-fonts-emoji' [cairo-dock]='cairo-dock-plug-ins' [qt5ct]='qt5-styleplugins'
[vlc]='qt5ct qt5-styleplugins' [qutebrowser]='qt5ct qt5-styleplugins' [qbittorrent]='qt5ct qt5-styleplugins' [transmission-qt]='qt5ct qt5-styleplugins'
-[bluez]='bluez-libs bluez-utils bluez-tools bluez-plugins bluez-hid2hci' [kdenlive]='kdebase-meta dvdauthor frei0r-plugins breeze breeze-gtk qt5ct qt5-styleplugins'
+[bluez]='bluez-libs bluez-utils bluez-tools bluez-plugins bluez-hid2hci' [kdenlive]='dvdauthor frei0r-plugins breeze breeze-gtk qt5ct qt5-styleplugins'
) # }
# dialog text variables {
_welcome="\nThis will help you get $DIST installed and setup on your system.\n\nIf you are unsure about a section the default option will be listed or\nthe first selected item 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"
_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"
+_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 be advanced to the next step\nOn failure the cursor will be placed on the step required to advance (when possible).\n\nSteps beginning with an asterix (*) are required.\n\nOnce you're happy with the choices and the required steps are complete, selecting the final step will begin 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 ..."
_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)."
+_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 or BIOS using LUKS without LVM require a separate boot partition (100-512M)."
_uefi="\nSelect the EFI boot partition (/boot), required for UEFI boot.\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as vfat/fat32 if not already."
_bios="\nDo you want to use a separate boot partition? (optional)\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as ext3/4 if not already."
_biosluks="\nSelect the boot partition (/boot), required for LUKS.\n\nIt's usually the first partition on the device, 100-512M, and will be formatted as ext3/4 if not already."
_login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc"
_autologin="\nDo you want autologin enabled for USER?\n\nIf so the following two files will be created (disable autologin by removing them):\n\n - /home/USER/RC (run startx when logging in on tty1)\n - /etc/systemd/system/getty@tty1.service.d/autologin.conf (login USER without password)\n"
_packages="\nUse [Space] to move a package into the selected area and press [Enter] to accept the selection.\n\nPackages may be installed by your DE/WM (if any), or for the packages you select."
+_usercmd="\nEnter command to be run in the newly installed system (chroot) below.\n\nAn example use case would be installing packages or editing files not offered in the menus.\n\nBecause the command will be run in a chroot not every command will function correctly, additionally the command will not be sanity checked, it's your system so exercise caution.\n\nMore than one command may be run using standard bash syntax.\n"
_edit="\nBefore exiting you can select configuration files to review/change.\n\nIf you need to make other changes with the drives still mounted, use Ctrl-z to pause the installer, when finished type 'fg' and [Enter] to resume the installer, if you want to avoid the automatic reboot using Ctrl-c will cleanly exit."
# LUKS
main()
{
- (( SEL < 12 )) && (( SEL++ ))
+ (( SEL < 13 )) && (( SEL++ ))
tput civis
dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \
- 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"
+ 1 "Show device tree" \
+ 2 "Partitioning" \
+ 3 "LUKS encryption" \
+ 4 "Logical volume management" \
+ 5 "* Mount partitions" \
+ 6 "* Select bootloader" \
+ 7 "* Username and password" \
+ 8 "* System configuration" \
+ 9 "Select window manager or desktop" \
+ 10 "Select additional packages" \
+ 11 "Run a command on the installed system" \
+ 12 "View configuration and command selections" \
+ 13 "* Confirm choices and start the installation" 2> "$ANS"
read -r SEL < "$ANS"
[[ -z $WARN && $SEL =~ (2|5) ]] && { msg "Data Warning" "$_warn"; WARN=true; }
8) prechecks 2 && { select_config || (( SEL-- )); } ;;
9) prechecks 3 && { select_sessions || (( SEL-- )); } ;;
10) prechecks 3 && { select_packages || (( SEL-- )); } ;;
- 11) prechecks 3 && select_show ;;
- 12) prechecks 3 && install_main ;;
+ 11) prechecks 3 && select_usercmd ;;
+ 12) prechecks 3 && select_show ;;
+ 13) prechecks 3 && install_main ;;
*) yesno "Exit" "\nUnmount partitions (if any) and exit the installer?\n" && die 0
esac
}
select_show()
{
local pkgs="${USER_PKGS// / } ${PACKAGES// / }"
- [[ $BOOT_PART ]] && local mnt="/$BOOTDIR"
[[ $INSTALL_WMS == *dwm* ]] && pkgs="dwm st dmenu $pkgs"
pkgs="${pkgs// / }" pkgs="${pkgs# }"
msg "Show Configuration" "
---------- PARTITION CONFIGURATION ------------
- Root: ${ROOT_PART:-none}
- Boot: ${BOOT_PART:-${BOOT_DEV:-none}}
- Mount: ${mnt:-none}
- Swap: ${SWAP_PART:-none}
- Size: ${SWAP_SIZE:-none}
- Extra: ${EXMNTS:-${EXMNT:-none}}
- Hooks: ${HOOKS:-none}
-
- LVM: ${LVM:-none}
- LUKS: ${LUKS:-none}
+ Root Part: $ROOT
+ Boot Part: ${BOOT:-none}
+ Boot Device: ${BOOT_D:-none}
+ Swap Part/File: ${SWAP:-none}
+ Swap Size: ${SWAP_S:-none}
+ Extra Mounts: ${EXMNTS:-none}
+ Mkinit Hooks: ${HOOKS:-none}
+ LVM used: ${LVM:-unused}
+ LUKS used: ${LUKS:-unused}
------------ SYSTEM CONFIGURATION -------------
- Locale: ${MYLOCALE:-none}
+ Locale: ${LOCALE:-none}
Keymap: ${KEYMAP:-none}
- Hostname: ${MYHOST:-none}
+ Hostname: ${NEWHOST:-none}
Timezone: ${ZONE:-none}/${SUBZ:-none}
+ Chroot cmd: ${USER_CMD:-none}
------------ USER CONFIGURATION ---------------
Autologin: ${AUTOLOGIN:-none}
Login Type: ${LOGIN_TYPE:-none}
-
----------- PACKAGE CONFIGURATION -------------
Kernel: ${KERNEL:-none}
select_login()
{
- [[ $INSTALL_WMS ]] || return 0
+ AUTOLOGIN=''
- AUTOLOGIN='' # no autologin unless using xinit
-
- dlg LOGIN_TYPE menu "Login Management" "\nSelect what kind of login management to use." \
+ dlg LOGIN_TYPE menu "Login" "\nSelect what kind of login management to use." \
"xinit" "Console login without a display manager" \
"ly" "TUI display manager with a ncurses-like interface" \
"lightdm" "Lightweight display manager with a gtk greeter" \
"sddm" "Simple desktop display manager" || return 1
case $LOGIN_TYPE in
- ly) EDIT_FILES[login]="/etc/ly/config.ini" ;;
gdm|sddm) EDIT_FILES[login]="" ;;
- lightdm) EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf" ;;
+ ly) EDIT_FILES[login]="/etc/ly/config.ini" ;;
+ lightdm)
+ LIGHTDM_GREETER='gtk-greeter'
+ EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf"
+ local txt="\nBecause you chose to install deepin you can choose to use their greeter for lightdm\n\nUse the deepin greeter?\n"
+ [[ $INSTALL_WMS == *deepin* ]] && yesno "Greeter" "$txt" && LIGHTDM_GREETER="deepin-greeter"
+ ;;
xinit) EDIT_FILES[login]="/home/$NEWUSER/.xinitrc /home/$NEWUSER/.xprofile"
if (( $(wc -w <<< "$INSTALL_WMS") > 1 )); then
- dlg LOGIN_WM menu "Login Management" "$_login" $LOGIN_CHOICES || return 1
+ dlg LOGIN_WM menu "Session" "$_login" $LOGIN_CHOICES || return 1
LOGIN_WM="${WM_SESSIONS[$LOGIN_WM]}"
fi
[[ -z $LOGIN_WM ]] && LOGIN_WM="${WM_SESSIONS[${INSTALL_WMS%% *}]}"
- yesno "Autologin" "$(sed "s|USER|$NEWUSER|g; s|RC|$LOGINRC|g" <<< "$_autologin")" && AUTOLOGIN=true || AUTOLOGIN=''
+ yesno "Autologin" "$(sed "s|USER|$NEWUSER|g; s|RC|$LOGINRC|g" <<< "$_autologin")" && AUTOLOGIN=true
;;
esac
}
bash 'The GNU Bourne Again shell, standard in many GNU/Linux distributions' \
mksh 'The MirBSD Korn Shell - an enhanced version of the public domain ksh' || return 1
;;
- 1) dlg MYHOST input "Hostname" "$_hostname" "${DIST,,}" limit || { i=0; continue; } ;;
- 2) dlg MYLOCALE menu "Locale" "$_locale" $LOCALES || { i=1; continue; } ;;
+ 1) dlg NEWHOST input "Hostname" "$_hostname" "${DIST,,}" limit || { i=0; continue; } ;;
+ 2) dlg LOCALE 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
(( i++ )) # progress through to the next choice
done
- case $MYSHELL in bash) LOGINRC='.bash_profile' ;; zsh) LOGINRC='.zprofile' ;; mksh) LOGINRC='.profile' ;; esac
+ case $MYSHELL in
+ bash) LOGINRC='.bash_profile' ;;
+ zsh) LOGINRC='.zprofile' ;;
+ mksh) LOGINRC='.profile' ;;
+ esac
return 0
}
select_mkuser()
{
NEWUSER=''
- local v='' u='' p='' p2='' rp='' rp2=''
+ typeset -a ans
until [[ $NEWUSER ]]; do
- i=0
tput cnorm
dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " User " --mixedform "$_user" 0 0 0 \
- "Username:" 1 1 "$u" 1 11 "$COLUMNS" 0 0 \
- "Password:" 2 1 '' 2 11 "$COLUMNS" 0 1 \
- "Password2:" 3 1 '' 3 12 "$COLUMNS" 0 1 \
- "--- Root password, if left empty the user password will be used ---" 6 1 '' 6 68 "$COLUMNS" 0 2 \
- "Password:" 8 1 '' 8 11 "$COLUMNS" 0 1 \
- "Password2:" 9 1 '' 9 12 "$COLUMNS" 0 1 2>"$ANS" || return 1
-
- while read -r line; do
- case $i in 0) u="$line" ;; 1) p="$line" ;; 2) p2="$line" ;; 4) rp="$line" ;; 5) rp2="$line" ;; esac
- (( i++ ))
- done < "$ANS"
+ "Username:" 1 1 "${ans[0]}" 1 11 "$COLUMNS" 0 0 \
+ "Password:" 2 1 '' 2 11 "$COLUMNS" 0 1 \
+ "Password2:" 3 1 '' 3 12 "$COLUMNS" 0 1 \
+ "--- Root password, if left empty the user password will be used ---" 6 1 '' 6 68 "$COLUMNS" 0 2 \
+ "Password:" 8 1 '' 8 11 "$COLUMNS" 0 1 \
+ "Password2:" 9 1 '' 9 12 "$COLUMNS" 0 1 2> "$ANS" || return 1
+
+ mapfile -t ans <"$ANS"
# root passwords empty, so use the user passwords
- [[ -z $rp && -z $rp2 ]] && { rp="$p"; rp2="$p2"; }
+ if [[ -z "${ans[4]}" && -z "${ans[5]}" ]]; then
+ ans[4]="${ans[1]}"
+ ans[5]="${ans[2]}"
+ fi
# make sure a username was entered and that the passwords match
- if [[ ${#u} -eq 0 || $u =~ \ |\' || $u =~ [^a-z0-9] ]]; then
+ if [[ -z ${ans[0]} || ${ans[0]} =~ \ |\' || ${ans[0]} =~ [^a-z0-9] ]]; then
msg "Invalid Username" "\nInvalid user name.\n\nPlease try again.\n"; u=''
- elif [[ -z $p ]]; then
- msg "Empty Password" "\nThe user password cannot be left empty.\n\nPlease try again.\n"
- elif [[ "$p" != "$p2" ]]; then
+ elif [[ -z "${ans[1]}" || "${ans[1]}" != "${ans[2]}" ]]; then
msg "Password Mismatch" "\nThe user passwords do not match.\n\nPlease try again.\n"
- elif [[ "$rp" != "$rp2" ]]; then
+ elif [[ "${ans[4]}" != "${ans[5]}" ]]; then
msg "Password Mismatch" "\nThe root passwords do not match.\n\nPlease try again.\n"
else
- NEWUSER="$u"
- USER_PASS="$p"
- ROOT_PASS="$rp"
+ NEWUSER="${ans[0]}"
+ USER_PASS="${ans[1]}"
+ ROOT_PASS="${ans[4]}"
fi
done
return 0
select_keymap()
{
- dlg KEYMAP menu "Keyboard Layout" "$_keymap" \
+ dlg KEYMAP menu "Keyboard" "$_keymap" \
us English cm English gb English au English gh English \
za English ng English ca French 'cd' French gn French \
tg French fr French de German at German ch German \
fi
if [[ $TERM == 'linux' ]]; then
- loadkeys "$CMAP" >/dev/null 2>&1
+ loadkeys "$CMAP" > /dev/null 2>&1
else
- setxkbmap "$KEYMAP" >/dev/null 2>&1
+ setxkbmap "$KEYMAP" > /dev/null 2>&1
fi
return 0
}
+select_usercmd()
+{
+ dlg USER_CMD input "Command" "$_usercmd" "$USER_CMD" nolimit
+}
+
select_sessions()
{
LOGIN_CHOICES=''
dlg INSTALL_WMS check "Sessions" "$_sessions\n" \
- openbox "A lightweight, powerful, and highly configurable stacking wm" "$(ofn openbox "${INSTALL_WMS[*]}")" \
i3-gaps "A fork of i3wm with more features including gaps" "$(ofn i3-gaps "${INSTALL_WMS[*]}")" \
+ openbox "A lightweight, powerful, and highly configurable stacking wm" "$(ofn openbox "${INSTALL_WMS[*]}")" \
dwm "A dynamic WM for X that manages windows in tiled, floating, or monocle layouts" "$(ofn dwm "${INSTALL_WMS[*]}")" \
bspwm "A tiling wm that represents windows as the leaves of a binary tree" "$(ofn bspwm "${INSTALL_WMS[*]}")" \
+ jwm "A lightweight window manager for Xorg written in C" "$(ofn jwm "${INSTALL_WMS[*]}")" \
xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" \
awesome "A customized Awesome WM session created by @elanapan" "$(ofn awesome "${INSTALL_WMS[*]}")" \
fluxbox "A lightweight and highly-configurable window manager" "$(ofn fluxbox "${INSTALL_WMS[*]}")" \
- plasma "A kde software project currently comprising a full desktop environment" "$(ofn plasma "${INSTALL_WMS[*]}")" \
+ plasma "A KDE software project currently comprising a full desktop environment" "$(ofn plasma "${INSTALL_WMS[*]}")" \
+ deepin "The desktop environment of the Chinese Deepin Linux distribution." "$(ofn deepin "${INSTALL_WMS[*]}")" \
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[*]}")"
[[ $INSTALL_WMS ]] || return 0
-
- WM_PKGS="${INSTALL_WMS/dwm/}" # remove dwm from package list
- WM_PKGS="${WM_PKGS// / }" # remove double spaces
- WM_PKGS="${WM_PKGS# }" # remove leading space
+ WM_PKGS="${INSTALL_WMS/dwm/}"
+ WM_PKGS="${WM_PKGS// / }"
+ WM_PKGS="${WM_PKGS# }"
for i in $INSTALL_WMS; do
LOGIN_CHOICES+="$i - "
xed "A small and lightweight text editor. X-Apps Project." "$(ofn xed "${USER_PKGS[*]}")" \
xfce4-terminal "A terminal emulator based in the Xfce Desktop Environment" "$(ofn xfce4-terminal "${USER_PKGS[*]}")" \
xreader "Document viewer for files like PDF and Postscript. X-Apps Project." "$(ofn xed "${USER_PKGS[*]}")" \
- xterm "The standard terminal emulator for the X window system" "$(ofn xterm "${USER_PKGS[*]}")" \
zathura "Minimalistic document viewer" "$(ofn zathura "${USER_PKGS[*]}")"
if [[ $USER_PKGS ]]; then # add any needed PKG_EXT to the list
part_menu()
{
- no_bg_install || return 0
+ is_bg_install || return 0
local device choice devhash
devhash="$(lsblk -f | base64)"
- umount_dir $MNT
+ umount_dir "$MNT"
part_device || return 1
device="$DEVICE"
while :; do
choice=""
- dlg choice menu "Edit Partitions" "$_part" \
+ dlg choice menu "Edit Partitions" "$_part\n\n$(lsblk -no NAME,MODEL,SIZE,TYPE,FSTYPE $device)" \
"auto" "Whole device automatic partitioning" \
- "shrink" "Shrink an existing ext2/3/4 or ntfs partition to make room for a new partition" \
"cfdisk" "Curses based variant of fdisk" \
- "parted" "GNU partition editor" \
+ "parted" "GNU partition editor" $([[ $DISPLAY ]] && hash gparted >/dev/null 2>&1 && printf "gparted 'A gui front end to parted'") \
"fdisk" "Dialog-driven creation and manipulation of partitions" \
"done" "Return to the main menu"
+ # "shrink" "Shrink an existing ext or ntfs partition" \
if [[ -z $choice || $choice == 'done' ]]; then
return 0
elif [[ $choice == 'shrink' ]]; then
part_shrink "$device"
elif [[ $choice == 'auto' ]]; then
- local root_size txt table boot_fs
- 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"
- }
- }')
+ local root_size txt label boot_fs boot_type
+ 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"}}')
txt="\nWARNING:\n\nALL data on $device will be destroyed and the following partitions will be created\n\n- "
if [[ $SYS == 'BIOS' ]]; then
- table="msdos" boot_fs="ext4"
+ label="msdos" boot_fs="ext4" boot_type="primary"
txt+="An $boot_fs boot partition with the boot flag enabled (512M)\n- "
else
- table="gpt" boot_fs="fat32"
+ label="gpt" boot_fs="fat32" boot_type="ESP"
txt+="A $boot_fs efi boot partition (512M)\n- "
fi
txt+="An ext4 partition using all remaining space ($root_size)\n\nDo you want to continue?\n"
- yesno "Auto Partition" "$txt" && part_auto "$device" "$table" "$boot_fs" "$root_size"
+ yesno "Auto Partition" "$txt" && part_auto "$device" "$label" "$boot_fs" "$root_size" "$boot_type"
else
clear
tput cnorm
fi
if [[ $devhash != "$(lsblk -f | base64)" ]]; then
msg "Probing Partitions" "\nInforming kernel of partition changes using partprobe\n" 0
- partprobe >/dev/null 2>&1
+ partprobe > /dev/null 2>&1
[[ $choice == 'auto' ]] && return
fi
done
part_auto()
{
- local device="$1" table="$2" boot_fs="$3" size="$4" dev_info=""
- dev_info="$(parted -s "$device" print)"
+ local device="$1" label="$2" boot_fs="$3" size="$4" boot_type="$5" dev_info=""
+
+ msg "Auto Partition" "\nRemoving partitions on $device and setting label to $label\n" 1
- msg "Auto Partition" "\nRemoving partitions on $device and setting table to $table\n" 1
+ dev_info="$(parted -s "$device" print 2> /dev/null)"
swapoff -a
while read -r PART; do
- parted -s "$device" rm "$PART" >/dev/null 2>&1
+ [[ $PART ]] || continue
+ parted -s "$device" rm "$PART" > /dev/null 2> "$ERR"
+ errshow 0 "parted -s $device rm $PART" || return 1
done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)"
- [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s "$device" mklabel "$table" >/dev/null 2>&1
+ [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$label" ]] && parted -s "$device" mklabel "$label" > /dev/null 2> "$ERR"
msg "Auto Partition" "\nCreating a 512M $boot_fs boot partition.\n" 1
- if [[ $SYS == "BIOS" ]]; then
- parted -s "$device" mkpart primary "$boot_fs" 1MiB 513MiB >/dev/null 2>&1
- else
- parted -s "$device" mkpart ESP "$boot_fs" 1MiB 513MiB >/dev/null 2>&1
- fi
+ parted -s "$device" mkpart "$boot_type" "$boot_fs" 1MiB 513MiB > /dev/null 2> "$ERR"
+ errshow 0 "parted -s $device mkpart $boot_type $boot_fs 1MiB 513MiB" || return 1
sleep 0.5
- BOOT_DEV="$device"
- AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE "$device" | awk 'NR==2 {print "/dev/" $1}')
+ BOOT_D="$device"
+ AUTO_BOOT=$(lsblk -lno NAME,TYPE "$device" | awk 'NR==2 {print "/dev/" $1}')
if [[ $SYS == "BIOS" ]]; then
- mkfs.ext4 -q "$AUTO_BOOT_PART" >/dev/null 2>&1
+ mkfs.ext4 -q "$AUTO_BOOT" > /dev/null 2> "$ERR"
+ errshow 0 "mkfs.ext4 -q $AUTO_BOOT" || return 1
else
- mkfs.vfat -F32 "$AUTO_BOOT_PART" >/dev/null 2>&1
+ mkfs.vfat -F32 "$AUTO_BOOT" > /dev/null 2> "$ERR"
+ errshow 0 "mkfs.vfat -F32 $AUTO_BOOT" || return 1
fi
msg "Auto Partition" "\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> "$ERR"
+ errshow 0 "parted -s $device mkpart primary ext4 513MiB 100%" || return 1
sleep 0.5
- AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE "$device" | awk 'NR==3 {print "/dev/" $1}')"
- mkfs.ext4 -q "$AUTO_ROOT_PART" >/dev/null 2>&1
+ AUTO_ROOT="$(lsblk -lno NAME,TYPE "$device" | awk 'NR==3 {print "/dev/" $1}')"
+ mkfs.ext4 -q "$AUTO_ROOT" > /dev/null 2> "$ERR"
+ errshow 0 "mkfs.ext4 -q $AUTO_ROOT" || return 1
sleep 0.5
msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$device")\n"
}
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; then
fs=$(lsblk -lno FSTYPE "$part")
case "$fs" in
num="${part: -1}"
end=$(parted -s "$device" unit KiB print | awk '/^\s*'"$num"'/ {print $3}') # part size in KiB
devsize=$(parted -s "$device" unit KiB print | awk '/Disk '"${device//\//\\/}"':/ {print $3}') # whole device size in KiB
- mount "$part" $MNT >/dev/null 2>&1; sleep 0.5
+ mount "$part" "$MNT" > /dev/null 2>&1; sleep 0.5
min=$(df --output=used --block-size=MiB "$part" | awk 'NR == 2 {print int($1) + 256}')
max=$(df --output=avail --block-size=MiB "$part" | awk 'NR == 2 {print int($1)}')
- umount_dir $MNT
+ umount_dir "$MNT"
tput cnorm
- if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $((max / 2)) 2>$ANS; then
+ if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $((max / 2)) 2> $ANS; then
size=$(< "$ANS")
size=$((size * 1024))
else
case "$fs" in
ntfs)
if ntfsresize -fc "$part"; then
- ntfsresize -ff --size $(( (size * 1024) / 1000 ))k "$part" 2>$ERR # k=10^3 bytes
- errshow "ntfsresize -f -s $(( (size * 1024) / 1000 ))k $part" || return 1
+ ntfsresize -ff --size $(( (size * 1024) / 1000 ))k "$part" 2> "$ERR" # k=10^3 bytes
+ errshow 0 "ntfsresize -f -s $(( (size * 1024) / 1000 ))k $part" || return 1
else
msg "Resize" "\nThe ntfs partition $part cannot be resized because it is scheduled for a consistency check.\n\nTo do a consistency check in windows open command prompt as admin and run:\n\n\tchkdsk /f /r /x\n"
return 1
;;
*)
e2fsck -f "$part"; sleep 0.5
- resize2fs -f "$part" ${size}K 2>$ERR # K=2^10 bytes
- errshow "resize2fs -f $part ${size}K" || return 1
+ resize2fs -f "$part" ${size}K 2> "$ERR" # K=2^10 bytes
+ errshow 0 "resize2fs -f $part ${size}K" || return 1
;;
esac
sleep 0.5
(( size++ ))
sleep 0.5
if [[ $devsize == "$end" ]]; then
- parted -s "$device" mkpart primary ext4 ${size}KiB 100% 2>$ERR
- errshow "parted -s $device mkpart primary ext4 ${size}KiB 100%" || return 1
+ parted -s "$device" mkpart primary ext4 ${size}KiB 100% 2> "$ERR"
+ errshow 0 "parted -s $device mkpart primary ext4 ${size}KiB 100%" || return 1
else
- parted -s "$device" mkpart primary ext4 ${size}KiB ${end}KiB 2>$ERR
- errshow "parted -s $device mkpart primary ext4 ${size}KiB ${end}KiB" || return 1
+ parted -s "$device" mkpart primary ext4 ${size}KiB ${end}KiB 2> "$ERR"
+ errshow 0 "parted -s $device mkpart primary ext4 ${size}KiB ${end}KiB" || return 1
fi
msg "Resize Complete" "\n$part has been successfully resized to $((size / 1024))M.\n" 1
;;
part_find()
{
local regexp="$1" err=''
+ local pts dev size isize ptcount=0
- # string of partitions as /TYPE/PART SIZE
+ # string of partitions as /TYPE/PART SIZE.. eg. /dev/sda1 256G
if [[ $IGNORE_DEV ]]; then
- PARTS="$(lsblk -lno TYPE,NAME,SIZE |
- awk "/$regexp/"' && !'"/$IGNORE_DEV/"' {
- sub(/^part/, "/dev/")
- sub(/^lvm|^crypt/, "/dev/mapper/")
- print $1$2, $3
- }')"
+ PARTS="$(lsblk -lno TYPE,NAME,SIZE | awk "/$regexp/"' && !'"/$IGNORE_DEV/"' {sub(/^part/, "/dev/"); sub(/^lvm|^crypt/, "/dev/mapper/"); print $1$2, $3}')"
else
- PARTS="$(lsblk -lno TYPE,NAME,SIZE |
- awk "/$regexp/"' {
- sub(/^part/, "/dev/")
- sub(/^lvm|^crypt/, "/dev/mapper/")
- print $1$2 " " $3
- }')"
+ PARTS="$(lsblk -lno TYPE,NAME,SIZE | awk "/$regexp/"' {sub(/^part/, "/dev/"); sub(/^lvm|^crypt/, "/dev/mapper/"); print $1$2 " " $3}')"
fi
- # number of partitions total
- COUNT=0
- while read -r line; do
- (( COUNT++ ))
+ # ensure we have enough partitions for the system and action were trying to do
+ COUNT=$(wc -l <<< "$PARTS")
+
+ while read -r dev size; do # walk partition list and skip ones that are too small
+ [[ $dev && $size ]] || continue
+ size_t="${size: -1:1}"
+ isize=${size:0:-1}
+ isize=${isize%.*}
+ [[ $size_t == 'K' || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
done <<< "$PARTS"
- # ensure we have enough partitions for the system and action type
- case "$str" in
- 'part|lvm|crypt') [[ $COUNT -lt 1 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_errpart" ;;
- 'part|crypt') (( COUNT < 1 )) && err="$_lvmerr" ;;
- 'part|lvm') (( COUNT < 2 )) && err="$_lukserr" ;;
+ case "$regexp" in
+ 'part|lvm|crypt') [[ $ptcount -lt 1 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_errpart" ;;
+ 'part|crypt') (( ptcount < 1 )) && err="$_lvmerr" ;;
+ 'part|lvm') (( ptcount < 2 )) && err="$_lukserr" ;;
esac
- # if there aren't enough partitions show the relevant error message
- [[ $err ]] && { msg "Not Enough Partitions" "$err" 2; return 1; }
+ if [[ $err ]]; then
+ msg "Not Enough Partitions" "$err" 2
+ return 1
+ fi
return 0
}
part_swap()
{
- if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then
- fallocate -l $SWAP_SIZE "$1" 2>$ERR
- errshow "fallocate -l $SWAP_SIZE $1"
- chmod 600 "$1" 2>$ERR
- errshow "chmod 600 $1"
+ if [[ $1 == "$MNT/swapfile" && $SWAP_S ]]; then
+ fallocate -l $SWAP_S "$1" 2> "$ERR"
+ errshow 0 "fallocate -l $SWAP_S $1"
+ chmod 600 "$1" 2> "$ERR"
+ errshow 0 "chmod 600 $1"
fi
- mkswap "$1" >/dev/null 2>$ERR
- errshow "mkswap $1"
- swapon "$1" >/dev/null 2>$ERR
- errshow "swapon $1"
+ mkswap "$1" > /dev/null 2> "$ERR"
+ errshow 0 "mkswap $1"
+ swapon "$1" > /dev/null 2> "$ERR"
+ errshow 0 "swapon $1"
return 0
}
part_mount()
{
- local part="$1" mountp="${MNT}$2" fs=""
- fs="$(lsblk -lno FSTYPE "$part")"
- mkdir -p "$mountp"
+ local part="$1"
+ local mntpt="${MNT}$2"
+ shift 2
+ local fs="$(lsblk -lno FSTYPE "$part")"
- if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" && $part != "$AUTO_ROOT_PART" ]] && select_mntopts "$fs"; then
- mount -o "$MNT_OPTS" "$part" "$mountp" >/dev/null 2>&1
+ mkdir -p "$mntpt"
+
+ if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT" && $part != "$AUTO_ROOT" ]] && select_mntopts "$fs"; then
+ mount -o "$MNT_OPTS" "$part" "$mntpt" > /dev/null 2> "$ERR"
+ errshow 0 "mount -o $MNT_OPTS $part $mntpt" || return 1
else
- mount "$part" "$mountp" >/dev/null 2>&1
+ mount "$part" "$mntpt" > /dev/null 2> "$ERR"
+ errshow 0 "mount $part $mntpt" || return 1
fi
- part_mountconf "$part" "$mountp" || return 1
+ msg "Mount Complete" "\nPartition $part mounted at $mntpt\n" 1
+ part_countdec "$part"
part_cryptlv "$part"
return 0
part_format()
{
- local part="$1" fs="$2" delay="$3"
+ local part="$1"
+ local fs="$2"
+ local delay="$3"
+ shift 3
msg "Format" "\nFormatting $part as $fs\n" 0
- mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part" >/dev/null 2>$ERR
- errshow "mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part"" || return 1
- FORMATTED+="$part "
- sleep "${delay:-0}"
+ mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part" > /dev/null 2> "$ERR"
+ errshow 0 "mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part"" || return 1
+ sleep $delay
}
part_device()
die 1
fi
- [[ $1 ]] && BOOT_DEV="$DEVICE"
+ [[ $1 ]] && BOOT_D="$DEVICE"
return 0
}
part_bootdev()
{
- BOOT_DEV="${BOOT_PART%[1-9]}"
- BOOT_PART_NUM="${BOOT_PART: -1}"
- [[ $BOOT_PART = /dev/nvme* ]] && BOOT_DEV="${BOOT_PART%p[1-9]}"
+ BOOT_D="${BOOT%[1-9]}"
+ BOOT_NUM="${BOOT: -1}"
+ [[ $BOOT = /dev/nvme* ]] && BOOT_D="${BOOT%p[1-9]}"
if [[ $SYS == 'UEFI' ]]; then
- parted -s $BOOT_DEV set $BOOT_PART_NUM esp on >/dev/null 2>&1
+ parted -s $BOOT_D set $BOOT_NUM esp on > /dev/null 2>&1
else
- parted -s $BOOT_DEV set $BOOT_PART_NUM boot on >/dev/null 2>&1
+ parted -s $BOOT_D set $BOOT_NUM boot on > /dev/null 2>&1
fi
return 0
}
part_countdec()
{
for pt; do
- if (( COUNT > 0 )); then
+ if (( COUNT )); then
PARTS="$(sed "/${pt//\//\\/}/d" <<< "$PARTS")"
(( COUNT-- ))
fi
done
}
-part_mountconf()
-{
- if grep -qw "$1" /proc/mounts; then
- msg "Mount Success" "\nPartition $1 mounted at $2\n" 1
- part_countdec "$1"
- return 0
- else
- msg "Mount Fail" "\nPartition $1 failed to mount at $2\n" 2
- return 1
- fi
-}
-
###############################################################################
# mounting menus
# mount_menu is the entry point which calls all other functions
mount_menu()
{
- msg "Info" "\nGathering device info.\n" 0
- no_bg_install || return 0
+ msg "Mount Menu" "\nGathering device and partition information.\n" 1
+ is_bg_install || return 0
lvm_detect
- umount_dir $MNT
+ umount_dir "$MNT"
part_find 'part|lvm|crypt' || { SEL=2; return 1; }
-
[[ $LUKS && $LUKS_PART ]] && part_countdec $LUKS_PART
[[ $LVM && $LVM_PARTS ]] && part_countdec $LVM_PARTS
+ select_root || { ROOT=''; return 1; }
+ select_boot || { BOOT=''; return 1; }
+ if [[ $BOOT ]]; then
+ part_mount "$BOOT" "/boot" || return 1
+ part_bootdev
+ SEP_BOOT=true
+ fi
+ select_swap || return 1
+ select_extra || return 1
+ install_background
+ return 0
+}
+
+select_boot()
+{
+ local pts dev size isize ptcount=0
- select_root_partition || return 1
+ if [[ -z $BOOT ]]; then
+ if [[ $AUTO_BOOT && -z $LVM && -z $LUKS ]]; then
+ BOOT="$AUTO_BOOT"
+ return 0
+ fi
- if [[ $SYS == 'UEFI' ]]; then
- select_efi_partition || { BOOT_PART=''; return 1; }
- elif (( COUNT > 0 )); then
- select_boot_partition || { BOOT_PART=''; return 1; }
- fi
+ if (( COUNT )); then
+ while read -r dev size; do # walk partition list and skip ones that are too small/big for boot
+ size_t="${size: -1:1}"
+ isize=${size:0:-1}
+ isize=${isize%.*}
+ [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+ done <<< "$PARTS"
+ fi
- if [[ $BOOT_PART ]]; then
- part_mount "$BOOT_PART" "/$BOOTDIR" && SEP_BOOT=true || return 1
- part_bootdev
+ case "$SYS" in
+ UEFI)
+ case "$ptcount" in
+ 0) msg "EFI Boot Partition" "\nNo partitions available that meet size requirements!!\n\nReturning to the main menu.\n" 2; return 1 ;;
+ 1) msg "EFI Boot Partition" "\nOnly one partition available that meets size requirements.\n" 1; BOOT="$(awk 'NF > 0 {print $1}' <<< "$pts")" ;;
+ *) dlg BOOT menu "EFI Partition" "$_uefi" $pts ;;
+ esac
+ [[ $BOOT ]] || return 1
+ ;;
+ BIOS)
+ if [[ $LUKS && ! $LVM ]]; then
+ case "$ptcount" in
+ 0) msg "Boot Partition" "\nLUKS without LVM requires a separate boot partition.\nNo partitions available that meet size requirements!!\n\nReturning to the main menu.\n" 2; return 1 ;;
+ 1) msg "Boot Partition" "\nOnly one partition available that meets size requirements.\n" 1; BOOT="$(awk 'NF > 0 {print $1}' <<< "$pts")" ;;
+ *) dlg BOOT menu "Boot Partition" "$_biosluks" $pts ;;
+ esac
+ [[ $BOOT ]] || return 1
+ else
+ (( ptcount == 0 )) && return 0
+ dlg BOOT menu "Boot Partition" "$_bios" "skip" "no separate boot" $pts
+ [[ -z $BOOT || $BOOT == "skip" ]] && { BOOT=''; return 0; }
+ fi
+ ;;
+ esac
fi
- select_swap || return 1
- select_extra_partitions || return 1
- install_background
+ if ([[ $SYS == 'BIOS' ]] && grep -q 'ext[34]' <<< "$(fsck -N "$BOOT")") || ([[ $SYS == 'UEFI' ]] && grep -q 'fat' <<< "$(fsck -N "$BOOT")"); then
+ yesno "Format Boot Partition" "\nIMPORTANT:\n\nThe boot partition $BOOT $_format" "Format $BOOT" "Skip Formatting" 1 || return 0
+ fi
+ case "$SYS" in
+ UEFI) part_format "$BOOT" "vfat" 2 || return 1 ;;
+ BIOS) part_format "$BOOT" "ext4" 2 || return 1 ;;
+ esac
return 0
}
+select_root()
+{
+ if [[ -z $ROOT ]]; then
+ if [[ $AUTO_ROOT && -z $LVM && -z $LUKS ]]; then
+ ROOT="$AUTO_ROOT"
+ msg "Mount Menu" "\nUsing partitions created during automatic format.\n" 2
+ part_mount "$ROOT" || { ROOT=''; return 1; }
+ return 0 # we're done here
+ else
+ local pts dev size isize ptcount=0
+
+ # walk partition list and skip ones that are too small for / (root)
+ while read -r dev size; do
+ size_t="${size: -1:1}" # size type eg. K, M, G, T
+ isize=${size:0:-1} # remove trailing size type character
+ isize=${isize%.*} # remove any decimal (round down)
+ [[ $size_t =~ [MK] || ($size_t == 'G' && $isize -lt 4) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+ done <<< "$PARTS"
+
+ if (( ptcount == 1 )); then # only one available device
+ msg "Root Partition (/)" "\nOnly one partition available that meets size requirements.\n" 2
+ ROOT="$(awk 'NF > 0 {print $1}' <<< "$pts")"
+ else
+ local txt="\nSelect the root (/) partition, this is where $DIST will be installed.\n\nDevices smaller than 4G will not be shown here."
+ dlg ROOT menu "Mount Root" "$txt" $pts
+ fi
+ fi
+ fi
+
+ [[ $ROOT ]] && select_filesystem "$ROOT" && part_mount "$ROOT" "" && return 0
+
+ # should never reach here unless an error occurred
+ ROOT=''
+ return 1
+}
+
select_swap()
{
- dlg SWAP_PART menu "Swap Setup" "\nSelect whether to use a swapfile, swap partition, or none." \
+ local pts dev size isize
+
+ if (( COUNT )) ; then
+ while read -r dev size; do # walk partition list and skip ones that are too small/big for swap
+ size_t="${size: -1:1}"
+ isize=${size:0:-1}
+ isize=${isize%.*}
+ [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 16) || ($size_t == 'M' && $isize -lt 100) ]] || pts+="$dev $size "
+ done <<< "$PARTS"
+ fi
+
+ dlg SWAP menu "Swap Setup" "\nSelect whether to use a swapfile, swap partition, or none." \
"none" "Don't allocate any swap space" \
"swapfile" "Allocate $SYS_MEM at /swapfile" \
- $PARTS
+ $pts
- if [[ -z $SWAP_PART || $SWAP_PART == "none" ]]; then
- SWAP_PART=''
+ if [[ -z $SWAP || $SWAP == "none" ]]; then
+ SWAP=''
return 0
- elif [[ $SWAP_PART == "swapfile" ]]; then
+ elif [[ $SWAP == "swapfile" ]]; then
local i=0
- until [[ ${SWAP_SIZE:0:1} =~ [1-9] && ${SWAP_SIZE: -1} =~ (M|G) ]]; do
- (( i > 0 )) && msg "Swap Size Error" "\nSwap size must be 1(M|G) or greater, and can only contain whole numbers\n\nSize entered: $SWAP_SIZE\n" 2
- dlg SWAP_SIZE input "Swap Setup" "$_swapsize" "$SYS_MEM" || { SWAP_PART=''; SWAP_SIZE=''; return 1; }
+ until [[ ${SWAP_S:0:1} =~ [1-9] && ${SWAP_S: -1} =~ (M|G) ]]; do
+ (( i > 0 )) && 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
+ dlg SWAP_S input "Swap Setup" "$_swapsize" "$SYS_MEM" || { SWAP=''; SWAP_S=''; return 1; }
(( i++ ))
done
- part_swap "$MNT/$SWAP_PART"
- SWAP_PART="/$SWAP_PART"
- elif [[ $PARTS == *"$SWAP_PART"* ]]; then
- part_swap $SWAP_PART
- part_countdec $SWAP_PART
- SWAP_SIZE="$(lsblk -lno SIZE $SWAP_PART)"
+ part_swap "$MNT/$SWAP"
+ SWAP="/$SWAP"
else
- return 1
+ part_swap "$SWAP"
+ part_countdec "$SWAP"
+ SWAP_S="$(lsblk -lno SIZE $SWAP)"
fi
+ return 0
+}
+
+select_extra()
+{
+ local part dev size
+
+ # walk partition list and skip ones that are too small to be usable
+ if (( COUNT )); then
+ while read -r dev size; do
+ [[ ${size: -1:1} =~ [KM] ]] && part_countdec "$dev"
+ done <<< "$PARTS"
+ fi
+
+ while (( COUNT )); do
+ part=''
+ dlg part menu 'Mount Extra' "$_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 "
+ [[ $EXMNT == '/usr' && $HOOKS != *usr* ]] && HOOKS+=" usr"
+ else
+ return 1
+ fi
+ done
+ (( COUNT == 0 )) && msg "Mount Extra" "\nMounting Finished\n\nNo more partitions to mount, returning to main menu.\n" 2
return 0
}
select_mntopts()
{
- local fs="$1" opts=''
+ local fs="$1"
+ local opts=''
local title="${fs^} Mount Options"
for i in ${FS_OPTS[$fs]}; do
MNT_OPTS="${MNT_OPTS// /,}"
yesno "$title" "\nConfirm the following options: $MNT_OPTS\n" || MNT_OPTS=''
done
-
- return 0
-}
-
-select_mountpoint()
-{
- EXMNT=''
- until [[ $EXMNT ]]; do
- dlg EXMNT input "Extra Mount $part" "$_exmnt" "/" || return 1
- if [[ ${EXMNT:0:1} != "/" || ${#EXMNT} -le 1 || $EXMNT =~ \ |\' || $EXMNTS == *"$EXMNT"* ]]; then
- msg "Mountpoint Error" "$_errexpart"
- EXMNT=''
- fi
- done
return 0
}
select_filesystem()
{
- local part="$1" fs='' cur=''
+ local part="$1"
+ local fs=''
+ local cur="$(lsblk -lno FSTYPE "$part" 2> /dev/null)"
local txt="\nSelect which filesystem to use for: $part\n\nDefault: ext4"
- cur="$(lsblk -lno FSTYPE "$part" 2>/dev/null)"
# bail early if the partition was created in part_auto()
- [[ $cur && $part == "$AUTO_ROOT_PART" ]] && return 0
+ [[ $cur && $part == "$AUTO_ROOT" ]] && return 0
until [[ $fs ]]; do
- if [[ $cur && $FORMATTED == *"$part"* ]]; then
+ if [[ $cur && $part != "$ROOT" ]]; then
dlg fs menu "Filesystem" "$txt\nCurrent: $cur" skip - ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
else
dlg fs menu "Filesystem" "$txt" ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
[[ $fs == 'skip' ]] && return 0
yesno "Filesystem" "\nFormat $part as $fs?\n" || fs=''
done
- part_format "$part" "$fs"
-}
-
-select_efi_partition()
-{
- if [[ $AUTO_BOOT_PART ]]; then
- msg "EFI Boot Partition" "\nUsing partition created during automatic format.\n" 2
- BOOT_PART="$AUTO_BOOT_PART"
- return 0 # were done here
- else
- local pts size dev isize bsize ptcount=0
-
- # walk partition list and skip ones that are too small/big for boot
- while read -r dev size; do
- size_t="${size: -1:1}" # size type eg. K, M, G, T
- isize=${size:0:-1} # remove trailing size type character
- isize=${isize%.*} # remove any decimal (round down)
- [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
- done <<< "$PARTS"
-
- if (( ptcount == 1 )); then
- msg "EFI Boot Partition" "\nOnly one partition available that meets size requirements.\n" 1
- BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$pts")"
- else
- dlg BOOT_PART menu "EFI Partition" "$_uefi" $pts
- fi
- fi
-
- if [[ -z $BOOT_PART ]]; then
- return 1
- elif grep -q 'fat' <<< "$(fsck -N "$BOOT_PART")"; then
- local txt="\nIMPORTANT:\n\nThe EFI partition $BOOT_PART $_format"
- if yesno "Format EFI Partition" "$txt" "Format $BOOT_PART" "Skip Formatting" 1; then
- part_format "$BOOT_PART" "vfat" 2
- fi
- else
- part_format "$BOOT_PART" "vfat" 2
- fi
-
- return 0
-}
-
-select_boot_partition()
-{
- if [[ $AUTO_BOOT_PART && ! $LVM ]]; then
- msg "Boot Partition" "\nUsing partition created during automatic format.\n" 2
- BOOT_PART="$AUTO_BOOT_PART"
- return 0 # were done here
- else
- local pts size dev isize bsize ptcount=0
-
- # walk partition list and skip ones that are too small/big for boot
- while read -r dev size; do
- size_t="${size: -1:1}" # size type eg. K, M, G, T
- isize=${size:0:-1} # remove trailing size type character
- isize=${isize%.*} # remove any decimal (round down)
- [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
- done <<< "$PARTS"
-
- if [[ $LUKS && ! $LVM ]]; then
- dlg BOOT_PART menu "Boot Partition" "$_biosluks" $pts
- [[ $BOOT_PART ]] || return 1
- else
- dlg BOOT_PART menu "Boot Partition" "$_bios" "skip" "don't use a separate boot" $pts
- [[ -z $BOOT_PART || $BOOT_PART == "skip" ]] && { BOOT_PART=''; return 0; }
- fi
- fi
-
- if grep -q 'ext[34]' <<< "$(fsck -N "$BOOT_PART")"; then
- local txt="\nIMPORTANT:\n\nThe boot partition $BOOT_PART $_format"
- if yesno "Format Boot Partition" "$txt" "Format $BOOT_PART" "Skip Formatting" 1; then
- part_format "$BOOT_PART" "ext4" 2
- fi
- else
- part_format "$BOOT_PART" "ext4" 2
- fi
- return 0
+ part_format "$part" "$fs" 0
}
-select_root_partition()
-{
- if [[ $AUTO_ROOT_PART && -z $LVM && -z $LUKS ]]; then
- ROOT_PART="$AUTO_ROOT_PART"
- msg "Root Partition (/)" "\nUsing partition created during automatic format.\n" 2
- part_mount "$ROOT_PART" || { ROOT_PART=''; return 1; }
- return 0 # we're done here
- else
- local pts size dev isize bsize ptcount=0
-
- # walk partition list and skip ones that are too small for / (root)
- while read -r dev size; do
- size_t="${size: -1:1}" # size type eg. K, M, G, T
- isize=${size:0:-1} # remove trailing size type character
- isize=${isize%.*} # remove any decimal (round down)
- [[ $size_t =~ [MK] || ($size_t == 'G' && $isize -lt 4) ]] || { pts+="$dev $size "; (( ptcount++ )); }
- done <<< "$PARTS"
-
- if (( ptcount == 1 )); then # only one available device
- msg "Root Partition (/)" "\nOnly one partition available that meets size requirements.\n" 2
- ROOT_PART="$(awk 'NF > 0 {print $1}' <<< "$pts")"
- else
- 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
- fi
-
- if [[ -z $ROOT_PART ]] || ! select_filesystem "$ROOT_PART" || ! part_mount "$ROOT_PART"; then
- ROOT_PART=''
- return 1
- fi
-
- return 0
-}
-
-select_extra_partitions()
+select_mountpoint()
{
- local part size dev
-
- # walk partition list and skip ones that are too small to be usable
- while read -r dev size; do
- [[ ${size: -1:1} =~ [KM] ]] && part_countdec "$dev"
- done <<< "$PARTS"
-
- while (( COUNT > 0 )); do
- part=''
- dlg part menu 'Mount Extra' "$_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 "
- [[ $EXMNT == '/usr' && $HOOKS != *usr* ]] && HOOKS="usr $HOOKS"
- else
- return 1
+ EXMNT=''
+ until [[ $EXMNT ]]; do
+ dlg EXMNT input "Extra Mount $part" "$_exmnt" "/" || return 1
+ if [[ ${EXMNT:0:1} != "/" || ${#EXMNT} -le 1 || $EXMNT =~ \ |\' || $EXMNTS == *"$EXMNT"* ]]; then
+ msg "Mountpoint Error" "$_errexpart"
+ EXMNT=''
fi
done
return 0
install_main()
{
install_base
- genfstab -U $MNT >$MNT/etc/fstab 2>$ERR
- errshow 1 "genfstab -U $MNT >$MNT/etc/fstab"
- [[ -f $MNT/swapfile ]] && sed -i "s~${MNT}~~" $MNT/etc/fstab
+ genfstab -U "$MNT" > "$MNT/etc/fstab" 2> "$ERR"
+ errshow 1 "genfstab -U $MNT > $MNT/etc/fstab"
+ [[ -f $MNT/swapfile ]] && sed -i "s~${MNT}~~" "$MNT/etc/fstab"
install_packages
+ install_tearfree "$MNT/etc/X11/xorg.conf.d"
install_mkinitcpio
install_boot
chrun "hwclock --systohc --utc" || chrun "hwclock --systohc --utc --directisa"
install_user
install_login
chrun "chown -Rf $NEWUSER:users /home/$NEWUSER"
+ if [[ "$USER_CMD" ]]; then
+ chrun "$USER_CMD" 2> "$ERR" 2>&1
+ errshow 0 "$USER_CMD"
+ fi
while :; do
dlg choice menu "Finalization" "$_edit" \
login "${EDIT_FILES[login]}"
if [[ -z $choice || $choice == 'finished' ]]; then
- [[ $DEBUG == true && -r $DBG ]] && $EDITOR $DBG
- clear && die 127
+ [[ $DEBUG == true && -r $DBG ]] && ${EDITOR:-vim} "$DBG"
+ clear
+ die 127
else
local exists=''
for f in ${EDIT_FILES[$choice]}; do
- [[ -e ${MNT}$f ]] && exists+=" ${MNT}$f"
+ if [[ -e ${MNT}$f ]]; then
+ ${EDITOR:-vim} "${MNT}$f"
+ else
+ msg "File Missing" "\nThe file(s) selected do not exist:\n\n${MNT}$f\n"
+ fi
done
- if [[ $exists ]]; then
- $EDITOR -O $exists
- else
- msg "File Missing" "\nThe file(s) selected do not exist:\n\n${EDIT_FILES[$choice]}\n"
- fi
fi
done
}
install_base()
{
+ local msg oldmsg
+
clear
tput cnorm
- while kill -0 $BG_PID 2>/dev/null; do
- clear; printf "\nA background install process is still running...\n"; sleep 1
- done
- trap - EXIT
- unset BG_PID
-
- rm -rf $MNT/etc/mkinitcpio-archiso.conf
- find $MNT/usr/lib/initcpio -name 'archiso*' -type f -delete
- sed -i 's/#\(Storage=\)volatile/\1auto/' $MNT/etc/systemd/journald.conf
- find $MNT/boot -name '*-ucode.img' -delete
-
- [[ $DIST != "ArchLabs" ]] || sed -i "s/ArchLabs/$DIST/g" $MNT/etc/{lsb-release,os-release}
-
- if [[ $VM ]]; then
- find $MNT/etc/X11/xorg.conf.d/ -name '*.conf' -delete
- elif lspci | grep ' VGA ' | grep -q 'Intel'; then
- echo "Creating Intel VGA Tear Free config /etc/X11/xorg.conf.d/20-intel.conf"
- cat > $MNT/etc/X11/xorg.conf.d/20-intel.conf <<- EOF
- Section "Device"
- Identifier "Intel Graphics"
- Driver "intel"
- Option "TearFree" "true"
- EndSection
- EOF
+ if [[ $BG_PID ]] && kill -0 $BG_PID 2> /dev/null; then
+ printf "\nA background install process is still running, tailing the output...\n"
+ tail -f --pid=$BG_PID "$BG"
+ trap - EXIT
+ unset BG_PID
fi
- [[ -e /run/archiso/sfs/airootfs && $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux
- [[ -d /etc/netctl ]] && cp -rfv /etc/netctl $MNT/etc/
- [[ -f /etc/resolv.conf ]] && cp -fv /etc/resolv.conf $MNT/etc/
- [[ -e /etc/NetworkManager/system-connections ]] && cp -rvf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/
-
- echo "LANG=$MYLOCALE" > $MNT/etc/locale.conf
- cp -fv $MNT/etc/locale.conf $MNT/etc/default/locale
- sed -i "s/#en_US.UTF-8/en_US.UTF-8/g; s/#${MYLOCALE}/${MYLOCALE}/g" $MNT/etc/locale.gen
+ # archiso files
+ rm -rf "$MNT/etc/mkinitcpio-archiso.conf"
+ find "$MNT/usr/lib/initcpio" -name 'archiso*' -type f -delete
+
+ # 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}
+ sed -i 's/#\(Storage=\)volatile/\1auto/' "$MNT/etc/systemd/journald.conf"
+ sed -i 's/#\(HandleSuspendKey=\)ignore/\1suspend/' "$MNT/etc/systemd/logind.conf"
+ sed -i 's/#\(HandleHibernateKey=\)ignore/\1hibernate/' "$MNT/etc/systemd/logind.conf"
+ sed -i 's/#\(HandleLidSwitch=\)ignore/\1suspend/' "$MNT/etc/systemd/logind.conf"
+ find "$MNT/boot" -name '*-ucode.img' -delete
+
+ # changing distro name?
+ [[ $DIST != "ArchLabs" ]] || sed -i "s/ArchLabs/$DIST/g" "$MNT/etc/"{lsb-release,os-release}
+
+ # vmlinuz, if this isn't copied the standard kernel may fail mkinitcpio
+ cp -vf "$RUN/x86_64/vmlinuz" "$MNT/boot/vmlinuz-linux" 2> "$ERR" 2>&1
+ errshow 1 "cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux"
+
+ # copy network settings
+ [[ -d /etc/netctl ]] && cp -rfv /etc/netctl "$MNT/etc/"
+ [[ -f /etc/resolv.conf ]] && cp -fv /etc/resolv.conf "$MNT/etc/"
+ [[ -e /etc/NetworkManager/system-connections ]] && cp -rvf /etc/NetworkManager/system-connections "$MNT/etc/NetworkManager/"
+
+ echo "LANG=$LOCALE" > "$MNT/etc/locale.conf"
+ cp -fv "$MNT/etc/locale.conf" "$MNT/etc/default/locale"
+ sed -i "s/#en_US.UTF-8/en_US.UTF-8/g; s/#${LOCALE}/${LOCALE}/g" "$MNT/etc/locale.gen"
chrun "locale-gen"
chrun "ln -svf /usr/share/zoneinfo/$ZONE/$SUBZ /etc/localtime"
- cat > $MNT/etc/X11/xorg.conf.d/00-keyboard.conf <<- EOF
+ cat > "$MNT/etc/X11/xorg.conf.d/00-keyboard.conf" <<- EOF
# Use localectl(1) to instruct systemd-localed to update it.
Section "InputClass"
Identifier "system-keyboard"
EndSection
EOF
- cat > $MNT/etc/default/keyboard <<- EOF
+ cat > "$MNT/etc/default/keyboard" <<- EOF
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL=""
XKBOPTIONS=""
BACKSPACE="guess"
EOF
- printf "KEYMAP=%s\nFONT=%s\n" "$CMAP" "$FONT" > $MNT/etc/vconsole.conf
- echo "$MYHOST" > $MNT/etc/hostname
- cat > $MNT/etc/hosts <<- EOF
+ printf "KEYMAP=%s\nFONT=%s\n" "$CMAP" "$FONT" > "$MNT/etc/vconsole.conf"
+
+ echo "$NEWHOST" > "$MNT/etc/hostname"
+ cat > "$MNT/etc/hosts" <<- EOF
127.0.0.1 localhost
- 127.0.1.1 $MYHOST
+ 127.0.1.1 $NEWHOST
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
{
echo "Installing $BOOTLDR"
- if [[ $ROOT_PART == /dev/mapper* ]]; then
- ROOT_PART_ID="$ROOT_PART"
+ if [[ $ROOT == /dev/mapper* ]]; then
+ ROOT_ID="$ROOT"
else
local uuid_type="UUID"
[[ $BOOTLDR =~ (systemd-boot|refind-efi|efistub) ]] && uuid_type="PARTUUID"
- ROOT_PART_ID="$uuid_type=$(blkid -s $uuid_type -o value $ROOT_PART)"
+ ROOT_ID="$uuid_type=$(blkid -s $uuid_type -o value $ROOT)"
fi
if [[ $SYS == 'UEFI' ]]; then
# remove our old install and generic BOOT/ dir
- find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete
- find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname 'BOOT' -type d -delete
+ echo "Removing conflicting boot directories"
+ find "$MNT/boot/EFI/" -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete -printf "remove %p\n"
+ find "$MNT/boot/EFI/" -maxdepth 1 -mindepth 1 -iname 'BOOT' -type d -delete -printf "remove %p\n"
fi
prerun_$BOOTLDR
- chrun "${BCMDS[$BOOTLDR]}" 2>$ERR
+ chrun "${BCMDS[$BOOTLDR]}" 2> "$ERR" 2>&1
errshow 1 "${BCMDS[$BOOTLDR]}"
if [[ -d $MNT/hostrun ]]; then
+ echo "Unmounting chroot directories"
# cleanup the bind mounts we made earlier for the grub-probe module
- umount_dir $MNT/hostrun/{udev,lvm}
- rm -rf $MNT/hostrun >/dev/null 2>&1
+ umount_dir "$MNT/hostrun/"{udev,lvm}
+ rm -rf "$MNT/hostrun" > /dev/null 2>&1
fi
if [[ $SYS == 'UEFI' ]]; then
# some UEFI firmware requires a generic esp/BOOT/BOOTX64.EFI
- mkdir -pv $MNT/$BOOTDIR/EFI/BOOT
+ mkdir -pv "$MNT/boot/EFI/BOOT"
case "$BOOTLDR" in
- grub) cp -fv $MNT/$BOOTDIR/EFI/$DIST/grubx64.efi $MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI ;;
- syslinux) cp -rf "$MNT/$BOOTDIR/EFI/syslinux/"* $MNT/$BOOTDIR/EFI/BOOT/ && cp -f $MNT/$BOOTDIR/EFI/syslinux/syslinux.efi $MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI ;;
- refind-efi) sed -i '/#extra_kernel_version_strings/ c extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux' $MNT/$BOOTDIR/EFI/refind/refind.conf
- cp -fv $MNT/$BOOTDIR/EFI/refind/refind_x64.efi $MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI ;;
+ grub) cp -fv "$MNT/boot/EFI/$DIST/grubx64.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
+ syslinux) cp -rf "$MNT/boot/EFI/syslinux/"* "$MNT/boot/EFI/BOOT/" && cp -f "$MNT/boot/EFI/syslinux/syslinux.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
+ refind-efi)
+ sed -i '/#extra_kernel_version_strings/ c extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux' "$MNT/boot/EFI/refind/refind.conf"
+ cp -fv "$MNT/boot/EFI/refind/refind_x64.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
esac
fi
install_user()
{
- rm -f $MNT/root/.zshrc # remove welcome message from root zshrc
+ local groups='audio,video,floppy,log,network,rfkill,scanner,storage,optical,power,wheel'
+ [[ -e $MNT/etc/X11/xorg.conf.d/20-nvida.conf && -e $MNT/usr/bin/optirun ]] && groups+=',bumblebee'
+
+ rm -f "$MNT/root/.zlogin" # remove welcome message
- chrun "chpasswd <<< 'root:$ROOT_PASS'" 2>$ERR
+ chrun "chpasswd <<< 'root:$ROOT_PASS'" 2> "$ERR" 2>&1
errshow 1 "set root password"
if [[ $MYSHELL != 'zsh' ]]; then # root uses zsh by default
- chrun "usermod -s /bin/$MYSHELL root" 2>$ERR
+ chrun "usermod -s /bin/$MYSHELL root" 2> "$ERR" 2>&1
errshow 1 "usermod -s /bin/$MYSHELL root"
# copy the default mkshrc to /root if it was selected
- [[ $MYSHELL == 'mksh' ]] && cp -fv $MNT/etc/skel/.mkshrc $MNT/root/.mkshrc
+ [[ $MYSHELL == 'mksh' ]] && cp -fv "$MNT/etc/skel/.mkshrc" "$MNT/root/.mkshrc"
fi
echo "Creating new user $NEWUSER and setting password"
- local groups='audio,floppy,log,network,rfkill,scanner,storage,optical,power,wheel'
-
- chrun "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER" 2>$ERR
+ chrun "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER" 2> "$ERR" 2>&1
errshow 1 "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER"
- chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2>$ERR
+ chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2> "$ERR" 2>&1
errshow 1 "set $NEWUSER password"
- if [[ $INSTALL_WMS == *dwm* ]];then
- mkdir -pv "$MNT/home/$NEWUSER/suckless"
- for i in dwm dmenu st; do
- if chrun "git clone https://git.suckless.org/$i /home/$NEWUSER/suckless/$i"; then
- chrun "cd /home/$NEWUSER/suckless/$i; make prefix=/usr install; make clean"
- else
- printf "failed to clone %s repo\n" "$i"
- fi
- done
- fi
-
- [[ $MYSHELL != 'bash' ]] && rm -f "$MNT/home/$NEWUSER/.bash_profile"
- [[ $WM_PKGS == *xfce* ]] && echo 'volumeicon &' >> "$MNT/home/$NEWUSER/.xprofile"
+ [[ $INSTALL_WMS == *dwm* ]] && install_suckless "/home/$NEWUSER" chroot
- # remove some commands from ~/.xprofile when using KDE or Gnome as the login session
- if [[ $LOGIN_WM =~ (startkde|gnome-session) || ($LOGIN_TYPE != 'xinit' && $WM_PKGS =~ (plasma|gnome)) ]]; then
- sed -i '/super/d; /nitrogen/d; /compton/d' "$MNT/home/$NEWUSER/.xprofile" "$MNT/root/.xprofile"
- elif [[ $INSTALL_WMS == 'dwm' ]]; then
- # and dwm
- sed -i '/super/d; /compton/d' "$MNT/home/$NEWUSER/.xprofile" "$MNT/root/.xprofile"
- fi
+ install_cleanup "$NEWUSER"
- # create user home directories (Music, Documents, Downloads, etc..)
- chrun 'xdg-user-dirs-update'
-
return 0
}
install_login()
{
- local serv="$MNT/etc/systemd/system/getty@tty1.service.d"
+ AUTOLOGIN_SERV="$MNT/etc/systemd/system/getty@tty1.service.d"
+
+ if [[ -z $LOGIN_TYPE ]]; then
+ rm -rf "$AUTOLOGIN_SERV"
+ return 0
+ fi
+
echo "Setting up $LOGIN_TYPE"
- case $LOGIN_TYPE in
- ly|sddm|gdm|lightdm)
- rm -rf "$serv" "$MNT/home/$NEWUSER/.xinitrc"
- chrun "systemctl enable $LOGIN_TYPE.service" 2>$ERR
- errshow 1 "systemctl enable $LOGIN_TYPE.service"
- ${LOGIN_TYPE}_config
- ;;
- xinit)
- if [[ $INSTALL_WMS ]]; then
- sed -i "/exec/ c exec ${LOGIN_WM}" "$MNT/home/$NEWUSER/.xinitrc"
- elif [[ -e $MNT/home/$NEWUSER/.xinitrc ]]; then
- sed -i '/exec/d' "$MNT/home/$NEWUSER/.xinitrc"
- return 0
- fi
- if [[ $AUTOLOGIN ]]; then
- sed -i "s/root/${NEWUSER}/g" $serv/autologin.conf
- cat > "$MNT/home/$NEWUSER/$LOGINRC" <<- EOF
- # automatically run startx when logging in on tty1
- [ -z "\$DISPLAY" ] && [ \$XDG_VTNR -eq 1 ] && startx
- EOF
- else
- rm -rf $serv
- fi
- ;;
- esac
+
+ if [[ $LOGIN_TYPE != 'xinit' ]]; then
+ [[ $INSTALL_WMS == *dwm* ]] && dwm_xsession
+ rm -rf "$AUTOLOGIN_SERV" "$MNT/home/$NEWUSER/.xinitrc"
+ chrun "systemctl enable $LOGIN_TYPE.service" 2> "$ERR" 2>&1
+ errshow 1 "systemctl enable $LOGIN_TYPE.service"
+ fi
+
+ ${LOGIN_TYPE}_config
+}
+
+install_cleanup()
+{
+ local user="$1"
+
+ # remove tint2 and jgmenu configs if bspwm and openbox aren't being installed
+ [[ $INSTALL_WMS =~ (bspwm|openbox) ]] || rm -rf "$MNT/home/$user/.config/"{jgmenu,tint2}
+
+ # remove geany configs if it wasn't installed
+ [[ $USER_PKGS != *geany* ]] && rm -rf "$MNT/home/$user/.config/geany"
+
+ # remove shell stuff for unused shells
+ [[ $MYSHELL != 'bash' ]] && rm -rf "$MNT/home/$user/.bash"*
+ [[ $MYSHELL != 'zsh' ]] && rm -rf "$MNT/home/$user/.z"*
+
+ # cleanup default jwmrc
+ if [[ $INSTALL_WMS == *jwm* ]]; then
+ sed '7,14d; s/xlock -mode blank/i3-lock-fancy -p/g; s/root:1/rofi_run/g' "$MNT/etc/system.jwmrc" > "$MNT/home/$user/.jwmrc"
+ fi
+
+ # no picom (compton) or ksuperkey in dwm only installs
+ [[ $LOGIN_WM == 'dwm' ]] && sed -i '/super/d; /picom/d' "$MNT/home/$user/.xprofile" "$MNT/root/.xprofile"
+
+ # remove some commands from ~/.xprofile when using self contained sessions
+ if [[ $LOGIN_WM =~ ($SELF_CONTAINED_SES) || ($LOGIN_TYPE != 'xinit' && $WM_PKGS =~ ($SELF_CONTAINED)) ]]; then
+ sed -i '/super/d; /nitrogen/d; /picom/d' "$MNT/home/$user/.xprofile" "$MNT/root/.xprofile"
+ fi
+
}
install_packages()
{
- local rmpkg="archlabs-installer "
+ local rmpkg=""
local inpkg="$PACKAGES $USER_PKGS $AL_BASE_PKGS "
+ if pacman -Qq archlabs-installer > /dev/null 2>&1; then
+ rmpkg+="archlabs-installer "
+ fi
+
if [[ $MYSHELL == 'zsh' ]]; then
inpkg+="zsh-completions "
else
rmpkg+="zsh "
fi
- [[ $KERNEL != 'linux' ]] && rmpkg+='linux '
-
- if [[ $INSTALL_WMS == 'dwm' ]]; then
- inpkg+="nitrogen polkit-gnome xclip gnome-keyring dunst feh "
- else
- [[ $INSTALL_WMS =~ ^(plasma|gnome|cinnamon)$ ]] || inpkg+="archlabs-ksuperkey "
- [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|fluxbox) ]] && inpkg+="$WM_BASE_PKGS "
+ if [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|fluxbox|jwm|awesome) ]]; then
+ inpkg+="$WM_BASE_PKGS "
+ elif [[ $INSTALL_WMS == 'dwm' ]]; then # dwm only needs a very limited package set
+ inpkg+=" "
fi
# update and install crucial packages first to avoid issues
- chrun "pacman -Syyu $KERNEL $BASE_PKGS ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed" 2>$ERR
- errshow 1 "pacman -Syyu $KERNEL $BASE_PKGS ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed"
+ al_repo "$MNT/etc/pacman.conf"
+ chrun "pacman -Syyu $KERNEL $BASE_PKGS base-devel ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed" 2> "$ERR" 2>&1
+ errshow 1 "pacman -Syyu $KERNEL $BASE_PKGS base-devel ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed"
# remove the packages we don't want on the installed system
- chrun "pacman -Rnsc $rmpkg --noconfirm"
+ [[ $rmpkg ]] && chrun "pacman -Rnsc $rmpkg --noconfirm"
# reinstalling iputils fixes the network issue for non-root users
chrun "pacman -S iputils $UCODE --noconfirm"
# install the packages chosen throughout the install
- chrun "pacman -S $inpkg --needed --noconfirm" 2>$ERR
+ chrun "pacman -S $inpkg --needed --noconfirm" 2> "$ERR" 2>&1
errshow 1 "pacman -S $inpkg --needed --noconfirm"
# bootloader packages
if [[ $BOOTLDR == 'grub' ]]; then
[[ $SYS == 'UEFI' ]] && local efib="efibootmgr"
- chrun "pacman -S os-prober grub $efib --needed --noconfirm" 2>$ERR
+ chrun "pacman -S os-prober grub $efib --needed --noconfirm" 2> "$ERR" 2>&1
errshow 1 "pacman -S os-prober grub $efib --needed --noconfirm"
elif [[ $BOOTLDR == 'refind-efi' ]]; then
- chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" 2>$ERR
+ chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" 2> "$ERR" 2>&1
errshow 1 "pacman -S refind-efi efibootmgr --needed --noconfirm"
elif [[ $SYS == 'UEFI' ]]; then
- chrun "pacman -S efibootmgr --needed --noconfirm" 2>$ERR
+ chrun "pacman -S efibootmgr --needed --noconfirm" 2> "$ERR" 2>&1
errshow 1 "pacman -S efibootmgr --needed --noconfirm"
fi
+ if [[ $VM ]] && dmesg | grep -qi 'vbox'; then
+ case "$KERNEL" in
+ linux) chrun "pacman -S virtualbox-guest-utils virtualbox-guest-modules-arch --needed --noconfirm" ;;
+ *) chrun "pacman -S virtualbox-guest-utils virtualbox-guest-modules-dkms ${KERNEL}-headers --needed --noconfirm" ;;
+ esac
+ fi
+
# allow members of the wheel group to run commands as root
- sed -i "s/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g" $MNT/etc/sudoers
+ sed -i "s/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g" "$MNT/etc/sudoers"
return 0
}
+install_suckless()
+{
+ local dir="$1/suckless"
+ shift
+
+ if [[ $1 == 'chroot' ]]; then
+ chrun "mkdir -pv '$dir'"
+ for i in dwm dmenu st; do
+ if chrun "git clone 'https://git.suckless.org/$i' '$dir/$i'"; then
+ chrun "cd '$dir/$i' && make PREFIX=/usr install"
+ else
+ printf "failed to clone %s repo\n" "$i"
+ fi
+ done
+ else
+ mkdir -pv "$dir"
+ for i in dwm dmenu st; do
+ if git clone "https://git.suckless.org/$i" "$dir/$i"; then
+ cd "$dir/$i" && make PREFIX=/usr install
+ else
+ printf "failed to clone %s repo\n" "$i"
+ fi
+ done
+ fi
+}
+
+install_tearfree()
+{
+ local xpath="$1"
+
+ if [[ $VM ]]; then
+ echo "Virtual machine detected, removing xorg configs"
+ find "$xpath/" -name '*.conf' -delete -printf "remove %p\n"
+ elif [[ $TEARFREE ]]; then
+ if lspci | grep ' VGA ' | grep -q 'Intel'; then
+ echo "Creating Intel Tear Free config /etc/X11/xorg.conf.d/20-intel.conf"
+ cat > "$xpath/20-intel.conf" <<- EOF
+ Section "Device"
+ Identifier "Intel Graphics"
+ Driver "intel"
+ Option "TearFree" "true"
+ EndSection
+ EOF
+ cat "$xpath/20-intel.conf"
+ elif lspci | grep ' VGA ' | grep -q 'AMD/ATI.*RX\|AMD/ATI.*R[579]'; then # newer RX, R5, R7, and R9 cards can use the amdgpu driver
+ echo "Creating AMD Tear Free config /etc/X11/xorg.conf.d/20-amdgpu.conf"
+ cat > "$xpath/20-amdgpu.conf" <<- EOF
+ Section "Device"
+ Identifier "AMD Graphics"
+ Driver "amdgpu"
+ Option "TearFree" "true"
+ EndSection
+ EOF
+ cat "$xpath/20-amdgpu.conf"
+ elif lspci | grep ' VGA ' | grep -q 'AMD/ATI.*HD [2-6][0-9]*'; then # older HD 2xxx-6xxx cards must use the radeon driver
+ echo "Creating Radeon Tear Free config /etc/X11/xorg.conf.d/20-radeon.conf"
+ cat > "$xpath/20-radeon.conf" <<- EOF
+ Section "Device"
+ Identifier "AMD Graphics"
+ Driver "radeon"
+ Option "TearFree" "on"
+ EndSection
+ EOF
+ cat "$xpath/20-radeon.conf"
+ elif lspci | grep ' VGA ' | grep -q 'NVIDIA'; then # nvidia cards require a bit of checking for notebook gpus
+ echo "Trying nvidia driver install"
+ if lspci | grep ' VGA ' | grep -q 'Intel\|AMD' && lspci | grep ' VGA ' | grep -q 'NVIDIA.*[6-9][1-8][05]M[X]\?\|NVIDIA.*Quadro.*[KMP][1-6][0-2][0]*M'; then
+ if [[ $xpath == *"$MNT"* ]]; then
+ chrun "nvidia-installer --bumblebee"
+ else
+ nvidia-installer --bumblebee
+ fi
+ else
+ if [[ $xpath == *"$MNT"* ]]; then
+ chrun "nvidia-installer" # unsure which card so try auto detection
+ else
+ nvidia-installer
+ fi
+ fi
+ if [[ -e $xpath/20-nvidia.conf ]]; then
+ cat "$xpath/20-radeon.conf"
+ echo
+ echo "NVIDIA driver installed"
+ if [[ $xpath == *"$MNT"* ]]; then
+ echo "Trying to load the driver for live session"
+ nvidia-smi -r
+ fi
+ echo "To enable driver vsync:"
+ echo -e "\trun nvidia-settings (as root) on first boot\n\tenable 'ForceFullCompositionPipeline' under the advanced settings"
+ echo -e "\tlastly save the change to your nvida xorg config /etc/X11/xorg.conf.d/20-nvidia.conf"
+ echo -e "\tand remove everything but the Device and Screen sections from the file"
+ else
+ echo "Unable to install nvidia driver"
+ fi
+ return 0
+ fi
+
+ if lspci | grep ' VGA ' | grep -q 'Intel\|AMD/ATI'; then
+ if [[ $xpath == *"$MNT"* ]]; then
+ sed -i 's/xrender/glx/g' "$MNT/etc/skel/.config/picom.conf"
+ else
+ sed -i 's/xrender/glx/g' /etc/skel/.config/picom.conf
+ fi
+ fi
+ fi
+
+ # remove nvidia installer from installed system when not running nvidia gpu
+ [[ $xpath == *"$MNT"* ]] && rm -rf "$MNT/usr/bin/nvidia-installer" "$MNT/var/lib/nvidia-installer"
+}
+
install_mkinitcpio()
{
local add=''
- [[ $LUKS ]] && add="encrypt"
- [[ $LVM ]] && { [[ $add ]] && add+=" lvm2" || add+="lvm2"; }
- sed -i "s/block filesystems/block ${add} filesystems ${HOOKS}/g" $MNT/etc/mkinitcpio.conf
- chrun "mkinitcpio -p $KERNEL" 2>$ERR
+
+ [[ $LUKS ]] && add+=" encrypt"
+ [[ $LVM ]] && add+=" lvm2"
+ sed -i "s/block filesystems/block${add} filesystems ${HOOKS}/g" "$MNT/etc/mkinitcpio.conf"
+ chrun "mkinitcpio -p $KERNEL" 2> "$ERR" 2>&1
errshow 1 "mkinitcpio -p $KERNEL"
}
install_mirrorlist()
{
- if hash reflector >/dev/null 2>&1; then
+ if hash reflector > /dev/null 2>&1; then
reflector --verbose --score 80 -l 40 -f 5 --sort rate --save "$1"
- elif hash rankmirrors >/dev/null 2>&1; then
- echo "Sorting mirrorlist"
+ elif hash rankmirrors > /dev/null 2>&1; then
+ echo "Sorting mirrorlist... This will take a while"
local key="access_key=5f29642060ab983b31fdf4c2935d8c56"
ip_add="$(curl -fsSL "http://api.ipstack.com/check&?$key&fields=ip" | python -c "import sys, json; print(json.load(sys.stdin)['ip'])")"
country="$(curl -fsSL "http://api.ipstack.com/$ip_add?$key&fields=country_code" | python -c "import sys, json; print(json.load(sys.stdin)['country_code'])")"
else # no country code so just grab all mirrors, will be a very slow sort but we don't have other options
mirror="https://www.archlinux.org/mirrorlist/?country=all&use_mirror_status=on"
fi
- curl -fsSL "$mirror" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 6 - >"$1"
+ curl -fsSL "$mirror" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 6 - > "$1"
fi
-
- return 0
}
install_background()
{
- ( rsync -a /run/archiso/sfs/airootfs/ $MNT/ && install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" >/dev/null 2>&1 ) &
+ (
+ rsync -a /run/archiso/sfs/airootfs/ "$MNT/" &&
+ install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" > /tmp/bgout 2>&1 &&
+ al_repo "$MNT/etc/pacman.conf" &&
+ chrun "pacman -Syyu $BASE_PKGS base-devel --noconfirm --needed" > /tmp/bgout 2>&1
+ ) &
BG_PID=$!
- trap "kill $BG_PID 2>/dev/null" EXIT
+ trap "kill $BG_PID 2> /dev/null" EXIT
}
###############################################################################
# display manager config
# these are called based on which DM is chosen after it is installed
-# additional config can be handled here, for now only lightdm has one
-
-lightdm_config()
-{
- cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf <<- EOF
- [greeter]
- default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
- background=/usr/share/backgrounds/archlabs/archlabs.jpg
- theme-name=Adwaita-dark
- icon-theme-name=Adwaita
- font-name=DejaVu Sans Mono 11
- position=30%,end 50%,end
- EOF
-}
+# additional config can be handled here, for now only lightdm and xinit.
ly_config()
{
- :
+ : #TODO
}
gdm_config()
{
- :
+ : #TODO
}
sddm_config()
{
- :
+ : #TODO
+}
+
+xinit_config()
+{
+ if [[ $INSTALL_WMS ]]; then
+ sed -i "/exec/ c exec ${LOGIN_WM}" "$MNT/home/$NEWUSER/.xinitrc"
+ if [[ $LOGIN_WM == 'gnome-session' ]]; then
+ # see https://wiki.archlinux.org/index.php/GNOME#Manually
+ sed -i '/exec/ i export XDG_SESSION_TYPE=x11' "$MNT/home/$NEWUSER/.xinitrc"
+ sed -i '/exec/ i export GDK_BACKEND=x11' "$MNT/home/$NEWUSER/.xinitrc"
+ fi
+ else
+ rm -rf "$MNT/home/$NEWUSER/.xinitrc" "$MNT/root/.xinitrc"
+ return 0
+ fi
+
+ if [[ $AUTOLOGIN ]]; then
+ mkdir -p "$AUTOLOGIN_SERV"
+ cat > "$AUTOLOGIN_SERV/autologin.conf" <<- EOF
+ [Service]
+ ExecStart=
+ ExecStart=-/sbin/agetty --autologin $NEWUSER --noclear %I 38400 linux
+ EOF
+ cat > "$MNT/home/$NEWUSER/$LOGINRC" <<- EOF
+ # automatically run startx when logging in on tty1
+ [ \$XDG_VTNR -eq 1 ] && exec startx
+ EOF
+ else
+ rm -rf "$AUTOLOGIN_SERV"
+ fi
+}
+
+lightdm_config()
+{
+ sed -i "/greeter-session=/ c greeter-session=lightdm-$LIGHTDM_GREETER" "$MNT/etc/lightdm/lightdm.conf"
+
+ if [[ $LIGHTDM_GREETER == 'gtk-greeter' ]]; then
+ cat > "$MNT/etc/lightdm/lightdm-gtk-greeter.conf" <<- EOF
+ [greeter]
+ default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
+ background=/usr/share/backgrounds/archlabs/archlabs.jpg
+ theme-name=Adwaita-dark
+ icon-theme-name=Adwaita
+ font-name=DejaVu Sans Mono 11
+ position=30%,end 50%,end
+ EOF
+ fi
}
###############################################################################
EDIT_FILES[bootloader]="/etc/default/grub"
if [[ $SYS == 'BIOS' ]]; then
- [[ $BOOT_DEV ]] || { part_device 1 || return 1; }
- BCMDS[grub]="grub-install --recheck --force --target=i386-pc $BOOT_DEV"
+ [[ $BOOT_D ]] || { part_device 1 || return 1; }
+ BCMDS[grub]="grub-install --recheck --force --target=i386-pc $BOOT_D"
else
- BCMDS[grub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
- grub-install --recheck --force --target=x86_64-efi --efi-directory=/$BOOTDIR --bootloader-id=$DIST"
- grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
+ BCMDS[grub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
+ grub-install --recheck --force --target=x86_64-efi --efi-directory=/boot --bootloader-id=$DIST"
+ grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
fi
BCMDS[grub]="mkdir -p /run/udev /run/lvm &&
prerun_grub()
{
- sed -i "s/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR=\"${DIST}\"/g; s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" $MNT/etc/default/grub
+ sed -i "s/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR=\"${DIST}\"/g; s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" "$MNT/etc/default/grub"
if [[ $LUKS_DEV ]]; then
- sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" $MNT/etc/default/grub 2>$ERR
+ sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" "$MNT/etc/default/grub" 2> "$ERR" 2>&1
errshow 1 "sed -i 's~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g' $MNT/etc/default/grub"
fi
if [[ $SYS == 'BIOS' && $LVM && -z $SEP_BOOT ]]; then
- sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" $MNT/etc/default/grub 2>$ERR
+ sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" "$MNT/etc/default/grub" 2> "$ERR" 2>&1
errshow 1 "sed -i 's/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g' $MNT/etc/default/grub"
fi
# setup for os-prober module
- mkdir -p /run/{lvm,udev} $MNT/hostrun/{lvm,udev}
- mount --bind /run/lvm $MNT/hostrun/lvm
- mount --bind /run/udev $MNT/hostrun/udev
+ mkdir -p /run/{lvm,udev} "$MNT/hostrun/"{lvm,udev}
+ mount --bind /run/lvm "$MNT/hostrun/lvm"
+ mount --bind /run/udev "$MNT/hostrun/udev"
return 0
}
prerun_efistub()
{
- BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
- efibootmgr -v -d $BOOT_DEV -p $BOOT_PART_NUM -c -L '${DIST} Linux' -l /vmlinuz-${KERNEL} \
- -u 'root=$ROOT_PART_ID rw $([[ $UCODE ]] && printf 'initrd=\%s.img ' "$UCODE")initrd=\initramfs-${KERNEL}.img'"
+ BCMDS[efistub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
+ efibootmgr -v -d $BOOT_D -p $BOOT_NUM -c -L '${DIST} Linux' -l /vmlinuz-${KERNEL} \
+ -u 'root=$ROOT_ID rw $([[ $UCODE ]] && printf 'initrd=\%s.img ' "$UCODE")initrd=\initramfs-${KERNEL}.img'"
}
setup_syslinux()
EDIT_FILES[bootloader]="/boot/syslinux/syslinux.cfg"
else
EDIT_FILES[bootloader]="/boot/EFI/syslinux/syslinux.cfg"
- BCMDS[syslinux]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
- efibootmgr -v -c -d $BOOT_DEV -p $BOOT_PART_NUM -l /EFI/syslinux/syslinux.efi -L $DIST"
+ BCMDS[syslinux]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
+ efibootmgr -v -c -d $BOOT_D -p $BOOT_NUM -l /EFI/syslinux/syslinux.efi -L $DIST"
fi
}
prerun_syslinux()
{
- local c="$MNT/boot/syslinux" s="/usr/lib/syslinux/bios" d=".."
- [[ $SYS == 'UEFI' ]] && { c="$MNT/boot/EFI/syslinux"; s="/usr/lib/syslinux/efi64"; d=''; }
-
- mkdir -pv "$c"
- cp -rfv "$s/"* "$c/"
+ local c="$MNT/boot/syslinux"
+ local s="/usr/lib/syslinux/bios"
+ local d=".."
+ if [[ $SYS == 'UEFI' ]]; then
+ c="$MNT/boot/EFI/syslinux"
+ s="/usr/lib/syslinux/efi64"
+ d='';
+ fi
+ mkdir -pv "$c" 2> "$ERR" 2>&1
+ errshow 1 "mkdir -pv $c"
+ cp -rfv "$s/"* "$c/" 2> "$ERR" 2>&1
+ errshow 1 "cp -rfv $s/* $c/"
+ cp -fv "$RUN/syslinux/splash.png" "$c/" 2> "$ERR" 2>&1
+ errshow 0 "cp -fv $RUN/syslinux/splash.png $c/"
cat > "$c/syslinux.cfg" <<- EOF
- UI menu.c32
- PROMPT 0
+ UI vesamenu.c32
MENU TITLE $DIST Boot Menu
+ MENU BACKGROUND splash.png
TIMEOUT 50
DEFAULT $DIST
+ # see: https://www.syslinux.org/wiki/index.php/Comboot/menu.c32
+ MENU WIDTH 78
+ MENU MARGIN 4
+ MENU ROWS 4
+ MENU VSHIFT 10
+ MENU TIMEOUTROW 13
+ MENU TABMSGROW 14
+ MENU CMDLINEROW 14
+ MENU HELPMSGROW 16
+ MENU HELPMSGENDROW 29
+ MENU COLOR border 30;44 #40ffffff #a0000000 std
+ MENU COLOR title 1;36;44 #9033ccff #a0000000 std
+ MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all
+ MENU COLOR unsel 37;44 #50ffffff #a0000000 std
+ MENU COLOR help 37;40 #c0ffffff #a0000000 std
+ MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std
+ MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std
+ MENU COLOR msg07 37;40 #90ffffff #a0000000 std
+ MENU COLOR tabmsg 31;40 #30ffffff #00000000 std
+
LABEL $DIST
MENU LABEL $DIST Linux
LINUX $d/vmlinuz-$KERNEL
- APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
+ APPEND root=$ROOT_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL.img
LABEL ${DIST}fallback
MENU LABEL $DIST Linux Fallback
LINUX $d/vmlinuz-$KERNEL
- APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
+ APPEND root=$ROOT_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL-fallback.img
EOF
return 0
setup_refind-efi()
{
EDIT_FILES[bootloader]="/boot/refind_linux.conf"
- BCMDS[refind-efi]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1; refind-install"
+ BCMDS[refind-efi]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1; refind-install"
}
prerun_refind-efi()
{
- cat > $MNT/boot/refind_linux.conf <<- EOF
- "$DIST Linux" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
+ cat > "$MNT/boot/refind_linux.conf" <<- EOF
+ "$DIST Linux" "root=$ROOT_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL.img"
- "$DIST Linux Fallback" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
+ "$DIST Linux Fallback" "root=$ROOT_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL-fallback.img"
EOF
- mkdir -p $MNT/etc/pacman.d/hooks
- cat > $MNT/etc/pacman.d/hooks/refind.hook <<- EOF
+ mkdir -p "$MNT/etc/pacman.d/hooks"
+ cat > "$MNT/etc/pacman.d/hooks/refind.hook" <<- EOF
[Trigger]
Operation = Upgrade
Type = Package
setup_systemd-boot()
{
EDIT_FILES[bootloader]="/boot/loader/entries/$DIST.conf"
- BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1; bootctl --path=/boot install"
+ BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1; bootctl --path=/boot install"
}
prerun_systemd-boot()
{
- mkdir -p $MNT/boot/loader/entries
- cat > $MNT/boot/loader/loader.conf <<- EOF
+ mkdir -p "$MNT/boot/loader/entries"
+ cat > "$MNT/boot/loader/loader.conf" <<- EOF
default $DIST
timeout 5
editor no
EOF
- cat > $MNT/boot/loader/entries/$DIST.conf <<- EOF
+ cat > "$MNT/boot/loader/entries/$DIST.conf" <<- EOF
title $DIST Linux
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/$UCODE.img")
initrd /initramfs-$KERNEL.img
- options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
+ options root=$ROOT_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF
- cat > $MNT/boot/loader/entries/$DIST-fallback.conf <<- EOF
+ cat > "$MNT/boot/loader/entries/$DIST-fallback.conf" <<- EOF
title $DIST Linux Fallback
linux /vmlinuz-${KERNEL}$([[ $UCODE ]] && printf "\ninitrd %s" "/$UCODE.img")
initrd /initramfs-$KERNEL-fallback.img
- options root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
+ options root=$ROOT_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
EOF
- mkdir -p $MNT/etc/pacman.d/hooks
- cat > $MNT/etc/pacman.d/hooks/systemd-boot.hook <<- EOF
+ mkdir -p "$MNT/etc/pacman.d/hooks"
+ cat > "$MNT/etc/pacman.d/hooks/systemd-boot.hook" <<- EOF
[Trigger]
Type = Package
Operation = Upgrade
lvm_menu()
{
- msg "Info" "\nGathering device info.\n" 0
- no_bg_install || return 1
+ is_bg_install || return 1
lvm_detect
local choice
while :; do
"Back" "Return to the main menu"
case "$choice" in
"$_lvmnew") lvm_create && break ;;
- "$_lvmdel") lvm_delgroup && yesno "$_lvmdel" "$_lvmdelask" && vgremove -f "$DEL_VG" >/dev/null 2>&1 ;;
+ "$_lvmdel") lvm_delgroup && yesno "$_lvmdel" "$_lvmdelask" && vgremove -f "$DEL_VG" > /dev/null 2>&1 ;;
"$_lvmdelall") lvm_del_all ;;
*) break ;;
esac
lvm_detect()
{
- local v pv
- pv="$(pvs -o pv_name --noheading 2>/dev/null)"
- v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
- VGROUP="$(vgs -o vg_name --noheading 2>/dev/null)"
-
- if [[ $VGROUP && $v && $pv ]]; then
- msg "LVM Setup" "\nActivating existing logical volume management.\n" 0
- modprobe dm-mod >/dev/null 2>$ERR
- errshow 'modprobe dm-mod'
- vgscan >/dev/null 2>&1
- vgchange -ay >/dev/null 2>&1
+ if [[ $(vgs -o vg_name --noheading 2> /dev/null) ]]; then
+ if [[ $(lvs -o vg_name,lv_name --noheading --separator - 2> /dev/null) && $(pvs -o pv_name --noheading 2> /dev/null) ]]; then
+ msg "LVM Setup" "\nActivating existing logical volume management.\n" 0
+ modprobe dm-mod > /dev/null 2> "$ERR"
+ errshow 0 'modprobe dm-mod'
+ vgscan > /dev/null 2>&1
+ vgchange -ay > /dev/null 2>&1
+ fi
fi
}
lvm_create()
{
VGROUP='' LVM_PARTS='' VGROUP_MB=0
- umount_dir $MNT
+ umount_dir "$MNT"
lvm_mkgroup || return 1
local txt="\nThe last (or only) logical volume will automatically use all remaining space in the volume group."
dlg VOL_COUNT menu "$_lvmnew" "\nSelect the number of logical volumes (LVs) to create in: $VGROUP\n$txt" 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -
lvm_extra_lvs || return 1
lvm_volume_name "$_lvmlvname\nNOTE: This LV will use up all remaining space in the volume group (${VGROUP_MB}MB)" || return 1
msg "$_lvmnew (LV:$VOL_COUNT)" "\nCreating volume $VNAME from remaining space in $VGROUP\n" 0
- lvcreate -l +100%FREE "$VGROUP" -n "$VNAME" >/dev/null 2>$ERR
- errshow "lvcreate -l +100%FREE $VGROUP -n $VNAME" || return 1
+ lvcreate -l +100%FREE "$VGROUP" -n "$VNAME" > /dev/null 2> "$ERR"
+ errshow 0 "lvcreate -l +100%FREE $VGROUP -n $VNAME" || return 1
LVM='logical volume'; sleep 0.5
txt="\nDone, volume: $VGROUP-$VNAME (${VOLUME_SIZE:-${VGROUP_MB}MB}) has been created.\n"
msg "$_lvmnew (LV:$VOL_COUNT)" "$txt\n$(lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE $LVM_PARTS)\n"
done
if (( ERR_SIZE != 1 )); then
case ${VOLUME_SIZE:$lv:1} in
- [mMgG]) local s=${VOLUME_SIZE:0:$lv} m=$((s * 1000))
+ [mMgG])
+ local s=${VOLUME_SIZE:0:$lv} m=$((s * 1000))
case ${VOLUME_SIZE:$lv:1} in
- [Gg]) (( m >= VGROUP_MB )) && ERR_SIZE=1 || VGROUP_MB=$((VGROUP_MB - m)) ;;
- [Mm]) (( ${VOLUME_SIZE:0:$lv} >= VGROUP_MB )) && ERR_SIZE=1 || VGROUP_MB=$((VGROUP_MB - s)) ;;
+ [Gg])
+ if (( m >= VGROUP_MB )); then
+ ERR_SIZE=1
+ else
+ VGROUP_MB=$((VGROUP_MB - m))
+ fi
+ ;;
+ [Mm])
+ if (( ${VOLUME_SIZE:0:$lv} >= VGROUP_MB )); then
+ ERR_SIZE=1
+ else
+ VGROUP_MB=$((VGROUP_MB - s))
+ fi
+ ;;
*) ERR_SIZE=1
- esac ;;
+ esac
+ ;;
*) ERR_SIZE=1
esac
fi
done
msg "$_lvmnew" "\nCreating volume group: $VGROUP\n" 0
- vgcreate -f "$VGROUP" $LVM_PARTS >/dev/null 2>$ERR
- errshow "vgcreate -f $VGROUP $LVM_PARTS" || return 1
+ vgcreate -f "$VGROUP" $LVM_PARTS > /dev/null 2> "$ERR"
+ errshow 0 "vgcreate -f $VGROUP $LVM_PARTS" || return 1
SIZE=$(vgdisplay "$VGROUP" | awk '/VG Size/ { gsub(/[^0-9.]/, ""); print int($0) }')
SIZE_UNIT="$(vgdisplay "$VGROUP" | awk '/VG Size/ { print substr($NF, 0, 1) }')"
lvm_del_all()
{
local v pv
- pv="$(pvs -o pv_name --noheading 2>/dev/null)"
- v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)"
- VGROUP="$(vgs -o vg_name --noheading 2>/dev/null)"
+ pv="$(pvs -o pv_name --noheading 2> /dev/null)"
+ v="$(lvs -o vg_name,lv_name --noheading --separator - 2> /dev/null)"
+ VGROUP="$(vgs -o vg_name --noheading 2> /dev/null)"
if [[ $VGROUP || $v || $pv ]]; then
if yesno "$_lvmdelall" "$_lvmdelask"; then
- for i in $v; do lvremove -f "/dev/mapper/$i" >/dev/null 2>&1; done
- for i in $VGROUP; do vgremove -f "$i" >/dev/null 2>&1; done
- for i in $pv; do pvremove -f "$i" >/dev/null 2>&1; done
+ for i in $v; do lvremove -f "/dev/mapper/$i" > /dev/null 2>&1; done
+ for i in $VGROUP; do vgremove -f "$i" > /dev/null 2>&1; done
+ for i in $pv; do pvremove -f "$i" > /dev/null 2>&1; done
LVM=''
fi
else
while (( VOL_COUNT > 1 )); do
lvm_volume_name "$_lvmlvname" && lvm_lv_size || return 1
msg "$_lvmnew (LV:$VOL_COUNT)" "\nCreating a $VOLUME_SIZE volume $VNAME in $VGROUP\n" 0
- lvcreate -L "$VOLUME_SIZE" "$VGROUP" -n "$VNAME" >/dev/null 2>$ERR
- errshow "lvcreate -L $VOLUME_SIZE $VGROUP -n $VNAME" || return 1
+ lvcreate -L "$VOLUME_SIZE" "$VGROUP" -n "$VNAME" > /dev/null 2> "$ERR"
+ errshow 0 "lvcreate -L $VOLUME_SIZE $VGROUP -n $VNAME" || return 1
msg "$_lvmnew (LV:$VOL_COUNT)" "\nDone, logical volume (LV) $VNAME ($VOLUME_SIZE) has been created.\n"
(( VOL_COUNT-- ))
done
luks_menu()
{
local choice
- no_bg_install || return 1
+ is_bg_install || return 1
dlg choice menu "LUKS Encryption" "$_luksmenu" \
"$_luksnew" "cryptsetup -q luksFormat" \
"$_luksopen" "cryptsetup open --type luks" \
luks_open()
{
- modprobe -a dm-mod dm_crypt >/dev/null 2>&1
- umount_dir $MNT
+ modprobe -a dm-mod dm_crypt > /dev/null 2>&1
+ umount_dir "$MNT"
part_find 'part|crypt|lvm' || return 1
if (( COUNT == 1 )); then
luks_pass "$_luksopen" || return 1
msg "$_luksopen" "\nOpening encrypted partition: $LUKS_NAME\n\nUsing device/volume: $LUKS_PART\n" 0
- cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
- errshow "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1
+ cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
+ errshow 0 "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1
LUKS='encrypted'; luks_show
return 0
}
luks_pass()
{
LUKS_PASS=''
- local t="$1" n='' p='' p2=''
+ local t="$1"
+ typeset -a ans=(cryptroot) # default name to start
until [[ $LUKS_PASS ]]; do
- local i=0
tput cnorm
dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $t " --mixedform "$_luksomenu" 0 0 0 \
- "Name:" 1 1 "${LUKS_NAME:-cryptroot}" 1 7 "$COLUMNS" 0 0 \
- "Password:" 2 1 '' 2 11 "$COLUMNS" 0 1 \
- "Password2:" 3 1 '' 3 12 "$COLUMNS" 0 1 2>"$ANS" || return 1
-
- while read -r line; do
- case $i in
- 0) n="$line" ;;
- 1) p="$line" ;;
- 2) p2="$line" ;;
- esac
- (( i++ ))
- done < "$ANS"
+ "Name:" 1 1 "${ans[0]}" 1 7 "$COLUMNS" 0 0 \
+ "Password:" 2 1 '' 2 11 "$COLUMNS" 0 1 \
+ "Password2:" 3 1 '' 3 12 "$COLUMNS" 0 1 2> "$ANS" || return 1
+
+ mapfile -t ans <"$ANS"
- if [[ -z $n ]]; then
+ if [[ -z "${ans[0]}" ]]; then
msg "Name Empty" "\nEncrypted device name cannot be empty.\n\nPlease try again.\n" 2
- elif [[ -z $p || "$p" != "$p2" ]]; then
- LUKS_NAME="$n"
+ elif [[ -z "${ans[1]}" || "${ans[1]}" != "${ans[2]}" ]]; then
+ LUKS_NAME="${ans[0]}"
msg "Password Mismatch" "\nThe passwords entered do not match.\n\nPlease try again.\n" 2
else
- LUKS_NAME="$n" LUKS_PASS="$p"
+ LUKS_NAME="${ans[0]}"
+ LUKS_PASS="${ans[1]}"
fi
done
luks_setup()
{
- modprobe -a dm-mod dm_crypt >/dev/null 2>&1
- umount_dir $MNT
+ modprobe -a dm-mod dm_crypt > /dev/null 2>&1
+ umount_dir "$MNT"
part_find 'part|lvm' || return 1
- if [[ $AUTO_ROOT_PART ]]; then
- LUKS_PART="$AUTO_ROOT_PART"
+ if [[ $AUTO_ROOT ]]; then
+ LUKS_PART="$AUTO_ROOT"
elif (( COUNT == 1 )); then
LUKS_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")"
else
{
luks_setup || return 1
msg "$_luksnew" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
- cryptsetup -q luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2>$ERR
- errshow "cryptsetup -q luksFormat $LUKS_PART" || return 1
- cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
- errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
+ cryptsetup -q luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> "$ERR"
+ errshow 0 "cryptsetup -q luksFormat $LUKS_PART" || return 1
+ cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
+ errshow 0 "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
LUKS='encrypted'; luks_show
return 0
}
dlg cipher input "LUKS Encryption" "$_lukskey" "-s 512 -c aes-xts-plain64"
[[ $cipher ]] || return 1
msg "$_luksadv" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
- cryptsetup -q $cipher luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2>$ERR
- errshow "cryptsetup -q $cipher luksFormat $LUKS_PART" || return 1
- cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR
- errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
+ cryptsetup -q $cipher luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> "$ERR"
+ errshow 0 "cryptsetup -q $cipher luksFormat $LUKS_PART" || return 1
+ cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
+ errshow 0 "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
luks_show
return 0
fi
trap - INT
tput cnorm
if [[ -d $MNT ]]; then
- umount_dir $MNT
- if (( e == 127 )); then
- umount_dir /run/archiso/bootmnt && sleep 0.5 && reboot -f
- fi
+ umount_dir "$MNT"
+ (( e == 127 )) && umount_dir /run/archiso/bootmnt && sleep 0.5 && reboot -f
fi
exit $e
}
# adjust n when passed a large list
local l=$((LINES - 20))
(( ($# / 2) > l )) && n=$l
-
+
tput civis
case "$dlg_t" in
- menu) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --menu "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;;
- check) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --checklist "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;;
+ menu) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --menu "$body" 0 0 $n "$@" 2> "$ANS" || return 1 ;;
+ check) dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --checklist "$body" 0 0 $n "$@" 2> "$ANS" || return 1 ;;
input)
tput cnorm
local def="$1" # assign default value for input
shift
if [[ $1 == 'limit' ]]; then
- dialog --backtitle "$DIST Installer - $SYS - v$VER" --max-input 63 --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1
+ dialog --backtitle "$DIST Installer - $SYS - v$VER" --max-input 63 --title " $title " --inputbox "$body" 0 0 "$def" 2> "$ANS" || return 1
else
- dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1
+ dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --inputbox "$body" 0 0 "$def" 2> "$ANS" || return 1
fi
;;
esac
live()
{
- local e=0
+ local ses="$1"
if ! select_keymap; then
clear
die 0
elif ! net_connect; then
- msg "Not Connected" "\nRunning live requires an active internet connection.\n\nExiting..\n" 2
+ msg "Not Connected" "\nRunning live requires an active internet connection to install packages.\n\nExiting..\n" 2
+ die 1
+ elif (( $(awk '/MemTotal/ {print int($2 / 1024)}' /proc/meminfo) < 2500)); then
+ msg "Not Enough Memory" "\nLive session requires at least 2.5G of system memory for installing packages.\n\nExiting..\n" 2
die 1
- else
- clear
- pacman -Syyu --noconfirm || die 1
- pacman -S $AL_BASE_PKGS $WM_BASE_PKGS xorg-xinit xorg-server --needed --noconfirm || die 1
- for ses; do
- case "$ses" in
- dwm)
- pacman -S git --needed --noconfirm || die 1
- mkdir -pv /root/suckless
- for i in dwm dmenu st; do
- git clone https://git.suckless.org/$i /root/suckless/$i && cd /root/suckless/$i && make PREFIX=/usr install
- done
- ;;
- i3-gaps|oepnbox|fluxbox|bspwm|xfce4|gnome|plasma|cinnamon|awesome)
- pacman -S "$ses" ${WM_EXT[$ses]} xterm --needed --noconfirm || die 1
- ;;
- *) echo "error: invalid session for -l, --live, see -h, --help"; die 1 ;;
- esac
- done
- pacman -Scc --noconfirm
- rm -rf "/var/cache/pacman/pkg/"*
- cp -rfT /etc/skel /root || die 1
- sed -i "/exec/ c exec ${WM_SESSIONS[$ses]}" /root/.xinitrc
- printf "\n%s has been set as the login session in /root/.xinitrc, to start the session simply run\n\n\tstartx\n\n" "${WM_SESSIONS[$ses]}"
- die 0
fi
+
+ clear
+ echo "Sorting mirrorlist"
+ mount /run/archiso/cowspace -o remount,size=2G
+ install_mirrorlist "/etc/pacman.d/mirrorlist"
+ al_repo "/etc/pacman.conf"
+ pacman -Syyu --noconfirm || die 1
+ rm -rf /var/cache/pacman/pkg/*
+ pacman -S $BASE_PKGS $AL_BASE_PKGS xorg-xinit --needed --noconfirm || die 1
+ rm -rf /var/cache/pacman/pkg/*
+ case "$ses" in
+ i3-gaps|openbox|fluxbox|bspwm|awesome|xfce4|jwm) pacman -S "$ses" $WM_BASE_PKGS ${WM_EXT[$ses]} --needed --noconfirm || die 1 ;;
+ $SELF_CONTAINED) pacman -S "$ses" ${WM_EXT[$ses]} --needed --noconfirm || die 1 ;;
+ dwm) { pacman -S git --needed --noconfirm || die 1; }; install_suckless "/root" nochroot ;;
+ esac
+ rm -rf /var/cache/pacman/pkg/*
+ [[ $VM ]] && dmesg | grep -qi 'vbox' && pacman -S virtualbox-guest-utils virtualbox-guest-modules-arch --needed --noconfirm
+ pacman -Scc --noconfirm
+ rm -rf /var/cache/pacman/pkg/*
+ cp -rfT /etc/skel /root
+ install_tearfree "/etc/X11/xorg.conf.d"
+ case "$ses" in
+ $SELF_CONTAINED) sed -i '/super/d; /nitrogen/d; /picom/d' /root/.xprofile ;;
+ dwm) sed -i '/super/d; /picom/d' /root/.xprofile ;;
+ esac
+ rm -f /root/.zlogin
+ echo -e "pulseaudio &\n(sleep 1; pamixer --unmute --set-volume 50) &" >> /root/.xprofile
+ sed -i "/exec/ c exec ${WM_SESSIONS[$ses]}" /root/.xinitrc
+ printf "\n%s has been set as the login session in ~/.xinitrc, to start the session simply run\n\n\tstartx\n\n" "${WM_SESSIONS[$ses]}"
+ die 0
}
usage()
{
- cat <<-EOF
+ cat <<- EOF
usage: $1 [-hdl] [session]
options:
- -h, --help print this message and exit
- -l, --live install and setup a live session
- -d, --debug enable debugging and log output to $DBG
+ -h, --help print this message and exit
+ -l, --live install and setup a live session
+ -d, --debug enable xtrace and log output to $DBG
+ -t, --tearfree install and setup drivers for nvidia or tearfree xorg configs for other vendors
+ if you experience boot issues with this option you can remove
+ /etc/X11/xorg.conf.d/20-*.conf
sessions:
- i3-gaps - A fork of i3wm with more features including gaps
- openbox - A lightweight, powerful, and highly configurable stacking wm
- dwm - A dynamic WM for X that manages windows in tiled, floating, or monocle layouts
- awesome - A customized Awesome WM session created by @elanapan
- bspwm - A tiling wm that represents windows as the leaves of a binary tree
- fluxbox - A lightweight and highly-configurable window manager
- gnome - A desktop environment that aims to be simple and easy to use
- cinnamon - A desktop environment combining traditional desktop with modern effects
- plasma - A kde software project currently comprising a full desktop environment
- xfce4 - A lightweight and modular desktop environment based on gtk+2/3
+ i3-gaps - A fork of i3wm with more features including gaps
+ openbox - A lightweight, powerful, and highly configurable stacking wm
+ dwm - A dynamic WM for X that manages windows in tiled, floating, or monocle layouts
+ awesome - A customized Awesome WM session created by @elanapan
+ bspwm - A tiling wm that represents windows as the leaves of a binary tree
+ fluxbox - A lightweight and highly-configurable window manager
+ gnome - A desktop environment that aims to be simple and easy to use
+ cinnamon - A desktop environment combining traditional desktop with modern effects
+ plasma - A kde software project currently comprising a full desktop environment
+ xfce4 - A lightweight and modular desktop environment based on gtk+2/3
+
+ distro name:
+
+ set the DIST environment variable before launching the installer eg.
+
+ DIST='MyDistro' $1
+
+ root/boot partition:
+
+ set the ROOT and/or BOOT environment variables before launching the installer eg.
+
+ ROOT='/dev/sda2' BOOT='/dev/sda1' $1
+
+ editor used:
+
+ set the EDITOR environment variable before launching the installer eg.
+
+ EDITOR='nano' $1
EOF
exit 0
DEBUG=true
}
+al_repo()
+{
+ local conf="$1"
+
+ if ! grep -q 'archlabs_repo' "$conf"; then
+ cat >> "$conf" <<- EOF
+
+ [archlabs_unstable]
+ Server = https://bitbucket.org/archlabslinux/\$repo/raw/master/\$arch
+
+ [archlabs_repo]
+ Server = https://bitbucket.org/archlabslinux/\$repo/raw/master/\$arch
+ Server = https://sourceforge.net/projects/archlabs-repo/files/\$repo/\$arch
+ Server = https://github.com/ARCHLabs/\$repo/raw/master/\$arch
+
+ EOF
+ fi
+ return 0
+}
+
termcol()
{
local colors=(
{
[ $? -eq 0 ] && return 0
- local fatal=0 err=""
+ local fatal=$1
+ shift # always shift off the fatal level arg
+
+ local err=""
err="$(sed 's/[^[:print:]]//g; s/\[[0-9\;:]*\?m//g; s/==> //g; s/] ERROR:/]\nERROR:/g' "$ERR")"
[[ -z $err ]] && err="no error message was found"
- (( $1 == 1 )) && { fatal=1; shift; }
-
local txt="\nCommand: $1\n\n\n\nError: $err\n\n"
if (( fatal )); then
mount | grep -q 'swap' && swapoff -a
for dir; do
if [[ -d $dir ]] && mount | grep -q "on $dir "; then
- if ! umount "$dir" 2>/dev/null; then
+ if ! umount "$dir" 2> /dev/null; then
sleep 0.5
- umount -f "$dir" 2>/dev/null || umount -l "$dir"
+ umount -f "$dir" 2> /dev/null || umount -l "$dir"
fi
fi
done
{
if chk_connect; then
return 0
- elif hash nmtui >/dev/null 2>&1; then
+ elif hash nmtui > /dev/null 2>&1; then
tput civis
if [[ $TERM == 'linux' ]]; then
printf "%b" "\e]P1191919" "\e]P4191919"
nmtui-connect
fi
chk_connect
- elif hash wifi-menu >dev/null 2>&1; then
+ elif hash wifi-menu > /dev/null 2>&1; then
wifi-menu
chk_connect
else
fi
}
-no_bg_install()
+dwm_xsession()
+{
+ mkdir -p "$MNT/usr/share/xsessions"
+ cat > "$MNT/usr/share/xsessions/dwm.desktop" <<- EOF
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=Dwm
+ Comment=Dynamic Window Manager
+ Exec=dwm
+ Type=XSession
+ EOF
+}
+
+is_bg_install()
{
[[ $BG_PID ]] || return 0
msg "Install Running" "\nA background install process is currently running.\n" 2
UCODE="intel-ucode"
fi
- modprobe -q efivarfs >/dev/null 2>&1
+ modprobe -q efivarfs > /dev/null 2>&1
- _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
- _prep+="\n - An EFI boot partition mounted."
else
export SYS="BIOS"
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\nOnce you're happy with the choices and the required steps are complete, the main install can be started."
}
###############################################################################
# enable some nicer colours in the linux console
termcol
-if (( UID != 0 )); then
+# ensure the required packages are installed and that we're running as root on x86_64 architecture
+if ! hash dialog rsync find parted curl >/dev/null 2>&1; then
+ printf "One or more of the required packages is missing: dialog, curl, rsync, parted, findutils"
+ die 1
+elif (( UID != 0 )); then
msg "Not Root" "\nThis installer must be run as root or using sudo.\n\nExiting..\n" 2
die 1
elif ! grep -qwm 1 'lm' /proc/cpuinfo; then
msg "Not x86_64 Architecture" "\nThis installer only supports x86_64 architectures.\n\nExiting..\n" 2
die 1
-else
- case "$1" in -d|--debug) debug ;; -h|--help) usage "$0" ;; -l|--live) shift; live "$@" ;; esac
fi
# trap ^C to perform cleanup
trap 'printf "\n^C\n" && die 1' INT
+while getopts ":htl:d" OPT; do
+ case "$OPT" in
+ d) debug ;;
+ h) usage "$0" ;;
+ t) TEARFREE=true ;;
+ l)
+ if [[ "${!WM_SESSIONS[@]}" =~ $OPTARG ]]; then
+ live "$OPTARG"
+ else
+ echo "error: invalid session for -l, see -h for help"; die 1
+ fi
+ ;;
+ \?) echo "error: invalid option: -$OPTARG"; die 1 ;;
+ esac
+done
+
system_identify
system_devices
msg "Welcome to the $DIST Installer" "$_welcome"
if ! select_keymap; then
- clear; die 0
+ clear
+ die 0
elif ! net_connect; then
msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2
die 1
fi
-FORMATTED=""
-
while :; do
main
done