Large cleanup in prep for minor version increase

- Add block comments describing each segment
- Use <<- EOF for consistent indentation
- Rename/rearrange some functions to make more sense
- Remove redundant checks for background install
- Improve background process output handling and speed
- Cleanup some script and comment sections
This commit is contained in:
natemaia 2019-08-20 15:52:25 -07:00
parent aab6018e41
commit cbb298fbaf

View File

@ -120,16 +120,16 @@ export DIALOGOPTS="--cr-wrap"
# giant ugly variable container :P { # giant ugly variable container :P {
# RAM in the system in MB # system RAM in MB
SYS_MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)" SYS_MEM="$(awk '/MemTotal/ {print int($2 / 1024) "M"}' /proc/meminfo)"
# locales from /etc/locale.gen # locales from /etc/locale.gen
LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if ($1) {print $1 " - "}}' /etc/locale.gen)" LOCALES="$(awk '/\.UTF-8/ {gsub(/# .*|#/, ""); if ($1) {print $1 " - "}}' /etc/locale.gen)"
# linux console keyboard mappings # console keyboard mappings
CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " - "}' | sort)" CMAPS="$(find /usr/share/kbd/keymaps -name '*.map.gz' | awk '{gsub(/\.map\.gz|.*\//, ""); print $1 " - "}' | sort)"
# terminal size definitions # terminal size
[[ $LINES ]] || LINES=$(tput lines) [[ $LINES ]] || LINES=$(tput lines)
[[ $COLUMNS ]] || COLUMNS=$(tput cols) [[ $COLUMNS ]] || COLUMNS=$(tput cols)
SHL=$((LINES - 20)) SHL=$((LINES - 20))
@ -137,7 +137,7 @@ SHL=$((LINES - 20))
# associative arrays # associative arrays
# { # {
# commands used to install each bootloader (most get modified during runtime) { # commands used to install each bootloader, however most get modified during runtime {
declare -A BCMDS=( declare -A BCMDS=(
[refind-efi]='refind-install' # minor modification [refind-efi]='refind-install' # minor modification
[grub]='grub-install --recheck --force' # heavily modified [grub]='grub-install --recheck --force' # heavily modified
@ -146,7 +146,7 @@ declare -A BCMDS=(
[systemd-boot]='bootctl --path=/boot install' # not modified [systemd-boot]='bootctl --path=/boot install' # not modified
) # } ) # }
# executable name for each wm/de { # executable name for each wm/de used in ~/.xinitrc {
declare -A WM_SESSIONS=( declare -A WM_SESSIONS=(
[dwm]='dwm' [dwm]='dwm'
[i3-gaps]='i3' [i3-gaps]='i3'
@ -173,7 +173,7 @@ declare -A WM_EXT=(
[xfce4]='archlabs-skel-xfce4 xfce4-goodies' # see deps of archlabs-skel-xfce4 [xfce4]='archlabs-skel-xfce4 xfce4-goodies' # see deps of archlabs-skel-xfce4
) # } ) # }
# files that can be edited after install is complete { # files offered for editing after install is complete {
declare -A EDIT_FILES=( declare -A EDIT_FILES=(
[login]='' # login is populated once we know the username and shell [login]='' # login is populated once we know the username and shell
[fstab]='/etc/fstab' [fstab]='/etc/fstab'
@ -188,7 +188,7 @@ declare -A EDIT_FILES=(
[keyboard]='/etc/X11/xorg.conf.d/00-keyboard.conf /etc/default/keyboard' [keyboard]='/etc/X11/xorg.conf.d/00-keyboard.conf /etc/default/keyboard'
) # } ) # }
# mkfs command for filesystem formatting { # mkfs command and flags for filesystem formatting {
declare -A FS_CMDS=( declare -A FS_CMDS=(
[f2fs]='mkfs.f2fs' [f2fs]='mkfs.f2fs'
[jfs]='mkfs.jfs -q' [jfs]='mkfs.jfs -q'
@ -202,7 +202,7 @@ declare -A FS_CMDS=(
[reiserfs]='mkfs.reiserfs -q' [reiserfs]='mkfs.reiserfs -q'
) # } ) # }
# mount options for each filesystem (if any) { # mount options for each filesystem {
declare -A FS_OPTS=( declare -A FS_OPTS=(
[vfat]='' # NA [vfat]='' # NA
[ntfs]='' # NA [ntfs]='' # NA
@ -222,10 +222,9 @@ declare -A LOGIN_PKGS=(
[lightdm]='lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice' [lightdm]='lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice'
) # } ) # }
# PKG_EXT: if you add a package to $PACKAGES in any dialog { # extras installed for user selected packages {
# and it uses/requires some additional packages, # if a package requires additional packages that aren't already dependencies
# you can add them here to keep it simple: [package]="extra" # they can be added here eg. [package]="extra"
# duplicates are not added
declare -A PKG_EXT=( declare -A PKG_EXT=(
[vlc]='qt4' [vlc]='qt4'
[mpd]='mpc' [mpd]='mpc'
@ -243,7 +242,7 @@ declare -A PKG_EXT=(
# } # }
# text variables # dialog text variables
# { # {
# Basics (somewhat in order) # Basics (somewhat in order)
@ -304,8 +303,11 @@ _lvmerrlvsize="\nInvalid value Entered.\n\nMust be a numeric value with 'M' (meg
############################################################################### ###############################################################################
# selection menus # selection menus
# main is the entry point which calls functions including outside of its block
# once those functions finished they always are returned here with the
# exception of install_main(), it exits upon completion
select_main() main()
{ {
(( SEL < 12 )) && (( SEL++ )) (( SEL < 12 )) && (( SEL++ ))
tput civis tput civis
@ -330,7 +332,7 @@ select_main()
2) part_menu || (( SEL-- )) ;; 2) part_menu || (( SEL-- )) ;;
3) luks_menu || (( SEL-- )) ;; 3) luks_menu || (( SEL-- )) ;;
4) lvm_menu || (( SEL-- )) ;; 4) lvm_menu || (( SEL-- )) ;;
5) select_menu || (( SEL-- )) ;; 5) mount_menu || (( SEL-- )) ;;
6) prechecks 0 && { select_boot || (( SEL-- )); } ;; 6) prechecks 0 && { select_boot || (( SEL-- )); } ;;
7) prechecks 1 && { select_mkuser || (( SEL-- )); } ;; 7) prechecks 1 && { select_mkuser || (( SEL-- )); } ;;
8) prechecks 2 && { select_config || (( SEL-- )); } ;; 8) prechecks 2 && { select_config || (( SEL-- )); } ;;
@ -713,7 +715,9 @@ select_packages()
} }
############################################################################### ###############################################################################
# partition menus # partitioning menus
# non-essential partitioning helpers called by the user when using the optional
# partition menu and selecting a device to edit
part_menu() part_menu()
{ {
@ -849,6 +853,74 @@ part_auto()
msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$device")\n" msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$device")\n"
} }
part_shrink()
{
part=""
typeset -i size num
local device="$1" fs=""
part_find "${device##*/}[^ ]" || return 1
(( COUNT == 1 )) && part="$(awk '{print $1}' <<< "${PARTS[@]}" )"
if (( COUNT == 1 )) || dlg part menu "Resize" "\nWhich partition on $device do you want to resize?" $PARTS; then
fs=$(lsblk -lno FSTYPE "$part")
case "$fs" in
ext*|ntfs)
msg "Resize" "\nGathering device size info.\n" 0
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
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
tput cnorm
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
return 1
fi
clear
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
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
fi
;;
*)
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
;;
esac
sleep 0.5
parted "$device" resizepart "$num" ${size}KiB || return 1
(( 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
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
fi
msg "Resize Complete" "\n$part has been successfully resized to $((size / 1024))M.\n" 1
;;
"") msg "No Filesystem" "\nFor unformatted partitions, cfdisk can be used in the partition menu.\n" ;;
*) msg "Invalid Filesystem: $fs" "\nResizing only supports ext and ntfs.\n" ;;
esac
fi
}
###############################################################################
# partition management functions
# these are helpers for use by other functions to do essential setup/teardown
part_find() part_find()
{ {
local regexp="$1" err='' local regexp="$1" err=''
@ -918,70 +990,6 @@ part_format()
sleep "${delay:-0}" sleep "${delay:-0}"
} }
part_shrink()
{
part=""
typeset -i size num
local device="$1" fs=""
part_find "${device##*/}[^ ]" || return 1
(( COUNT == 1 )) && part="$(awk '{print $1}' <<< "${PARTS[@]}" )"
if (( COUNT == 1 )) || dlg part menu "Resize" "\nWhich partition on $device do you want to resize?" $PARTS; then
fs=$(lsblk -lno FSTYPE "$part")
case "$fs" in
ext*|ntfs)
msg "Resize" "\nGathering device size info.\n" 0
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
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
tput cnorm
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
return 1
fi
clear
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
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
fi
;;
*)
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
;;
esac
sleep 0.5
parted "$device" resizepart "$num" ${size}KiB || return 1
(( 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
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
fi
msg "Resize Complete" "\n$part has been successfully resized to $((size / 1024))M.\n" 1
;;
"") msg "No Filesystem" "\nFor unformatted partitions, cfdisk can be used in the partition menu.\n" ;;
*) msg "Invalid Filesystem: $fs" "\nResizing only supports ext and ntfs.\n" ;;
esac
fi
}
part_device() part_device()
{ {
if [[ $DEV_COUNT -eq 1 && $SYS_DEVS ]]; then if [[ $DEV_COUNT -eq 1 && $SYS_DEVS ]]; then
@ -1087,8 +1095,10 @@ part_mountconf()
############################################################################### ###############################################################################
# mounting menus # mounting menus
# mount_menu is the entry point which calls all other functions
# once finished it returns to the main menu: main()
select_menu() mount_menu()
{ {
msg "Info" "\nGathering device info.\n" 0 msg "Info" "\nGathering device info.\n" 0
is_bg_install || return 0 is_bg_install || return 0
@ -1114,7 +1124,7 @@ select_menu()
select_swap || return 1 select_swap || return 1
select_extra_partitions || return 1 select_extra_partitions || return 1
install_background || return 1 install_background
return 0 return 0
} }
@ -1332,6 +1342,8 @@ select_extra_partitions()
############################################################################### ###############################################################################
# installation # installation
# main is the entry point which calls all other install functions, once
# complete it shows a dialog to edit files on the new system before reboot
install_main() install_main()
{ {
@ -1385,28 +1397,24 @@ install_main()
install_base() install_base()
{ {
if [[ $RSYNC_PID || $MIRROR_PID ]]; then if [[ $RSYNC_PID || $MIRROR_PID ]]; then
clear local oldmsg="" msg=""
printf "\nOne or more background install processes are still running, grabbing their output...\n" printf "\nOne or more background install processes are still running, grabbing their output...\n"
sleep 2
while kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; do while kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; do
tail -n 1 /tmp/bg_out msg="$(tail -n 1 /tmp/bg_out)"
sleep 0.5 if [[ "$msg" != "$oldmsg" ]]; then
printf "\n%s" "$msg"
oldmsg="$msg"
else
printf "."
fi
done done
trap - EXIT trap - EXIT
unset RSYNC_PID MIRROR_PID unset RSYNC_PID MIRROR_PID
elif hash rsync >/dev/null 2>&1 && [[ -d /run/archiso/sfs/airootfs/etc/skel ]]; then else
rsync -ahv /run/archiso/sfs/airootfs/ $MNT/ 2>$ERR rsync -ahv /run/archiso/sfs/airootfs/ $MNT/ 2>$ERR
errshow 1 "rsync -ahv /run/archiso/sfs/airootfs/ $MNT/" errshow 1 "rsync -ahv /run/archiso/sfs/airootfs/ $MNT/"
install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" install_mirrorlist "$MNT/etc/pacman.d/mirrorlist"
chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm" chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm"
else
mkdir -p /etc/pacman.d/mirrorlist
install_mirrorlist "/etc/pacman.d/mirrorlist"
pacstrap "$MNT" base $ISO_BASE 2>$ERR
errshow 1 "pacstrap $MNT base $KERNEL $ISO_BASE"
mkdir -p "$MNT/etc/pacman.d/mirrorlist"
cp -f /etc/pacman.d/mirrorlist "$MNT/etc/pacman.d/mirrorlist"
chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm"
fi fi
rm -rf $MNT/etc/mkinitcpio-archiso.conf rm -rf $MNT/etc/mkinitcpio-archiso.conf
@ -1417,13 +1425,13 @@ install_base()
if [[ $VM ]]; then if [[ $VM ]]; then
find $MNT/etc/X11/xorg.conf.d/ -name '*.conf' -delete find $MNT/etc/X11/xorg.conf.d/ -name '*.conf' -delete
elif lspci | grep ' VGA ' | grep -q 'Intel'; then elif lspci | grep ' VGA ' | grep -q 'Intel'; then
cat > $MNT/etc/X11/xorg.conf.d/20-intel.conf << EOF cat > $MNT/etc/X11/xorg.conf.d/20-intel.conf <<- EOF
Section "Device" Section "Device"
Identifier "Intel Graphics" Identifier "Intel Graphics"
Driver "intel" Driver "intel"
Option "TearFree" "true" Option "TearFree" "true"
EndSection EndSection
EOF EOF
fi fi
[[ -e /run/archiso/sfs/airootfs && $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux [[ -e /run/archiso/sfs/airootfs && $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux
@ -1442,32 +1450,33 @@ EOF
rm -f $MNT/etc/modprobe/ rm -f $MNT/etc/modprobe/
fi fi
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. # Use localectl(1) to instruct systemd-localed to update it.
Section "InputClass" Section "InputClass"
Identifier "system-keyboard" Identifier "system-keyboard"
MatchIsKeyboard "on" MatchIsKeyboard "on"
Option "XkbLayout" "$KEYMAP" Option "XkbLayout" "$KEYMAP"
EndSection EndSection
EOF EOF
cat > $MNT/etc/default/keyboard << EOF
# KEYBOARD CONFIGURATION FILE cat > $MNT/etc/default/keyboard <<- EOF
# Consult the keyboard(5) manual page. # KEYBOARD CONFIGURATION FILE
XKBMODEL="" # Consult the keyboard(5) manual page.
XKBLAYOUT="$KEYMAP" XKBMODEL=""
XKBVARIANT="" XKBLAYOUT="$KEYMAP"
XKBOPTIONS="" XKBVARIANT=""
BACKSPACE="guess" XKBOPTIONS=""
EOF BACKSPACE="guess"
EOF
printf "KEYMAP=%s\nFONT=%s\n" "$CMAP" "$FONT" > $MNT/etc/vconsole.conf printf "KEYMAP=%s\nFONT=%s\n" "$CMAP" "$FONT" > $MNT/etc/vconsole.conf
echo "$MYHOST" > $MNT/etc/hostname echo "$MYHOST" > $MNT/etc/hostname
cat > $MNT/etc/hosts << EOF cat > $MNT/etc/hosts <<- EOF
127.0.0.1 localhost 127.0.0.1 localhost
127.0.1.1 $MYHOST 127.0.1.1 $MYHOST
::1 localhost ip6-localhost ip6-loopback ::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes ff02::1 ip6-allnodes
ff02::2 ip6-allrouters ff02::2 ip6-allrouters
EOF EOF
} }
install_boot() install_boot()
@ -1516,12 +1525,13 @@ install_boot()
install_user() install_user()
{ {
rm -f $MNT/root/.zshrc # remove welcome message from root zshrc
chrun "chpasswd <<< 'root:$ROOT_PASS'" 2>$ERR chrun "chpasswd <<< 'root:$ROOT_PASS'" 2>$ERR
errshow 1 "set root password" errshow 1 "set root password"
if [[ $MYSHELL != "/usr/bin/zsh" ]]; then if [[ $MYSHELL != "/usr/bin/zsh" ]]; then # root uses zsh by default, change it if something else was chosen
# root uses zsh by default, change it if something else was chosen
chrun "usermod -s $MYSHELL root" 2>$ERR chrun "usermod -s $MYSHELL root" 2>$ERR
errshow 1 "usermod -s $MYSHELL root" errshow 1 "usermod -s $MYSHELL root"
# copy the default mkshrc to /root if mksh was picked
[[ $MYSHELL == '/usr/bin/mksh' ]] && cp -fv $MNT/etc/skel/.mkshrc $MNT/root/.mkshrc [[ $MYSHELL == '/usr/bin/mksh' ]] && cp -fv $MNT/etc/skel/.mkshrc $MNT/root/.mkshrc
fi fi
@ -1534,14 +1544,15 @@ install_user()
chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2>$ERR chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2>$ERR
errshow 1 "set $NEWUSER password" errshow 1 "set $NEWUSER password"
if [[ $USER_PKGS == *neovim* && -d $MNT/home/$NEWUSER/.vim ]]; then # if neovim was picked copy vim configs to ~/.config/nvim
if [[ $USER_PKGS == *neovim* ]]; then
mkdir -p $MNT/home/$NEWUSER/.config/nvim mkdir -p $MNT/home/$NEWUSER/.config/nvim
cp -fv $MNT/home/$NEWUSER/.vimrc $MNT/home/$NEWUSER/.config/nvim/init.vim cp -fv $MNT/home/$NEWUSER/.vimrc $MNT/home/$NEWUSER/.config/nvim/init.vim
cp -rfv $MNT/home/$NEWUSER/.vim/colors $MNT/home/$NEWUSER/.config/nvim/colors cp -rfv $MNT/home/$NEWUSER/.vim/colors $MNT/home/$NEWUSER/.config/nvim/colors
fi fi
[[ $INSTALL_WMS == *dwm* ]] && install_suckless case $INSTALL_WMS in *awesome*) install_awesome ;; *dwm*) install_suckless ;; esac
[[ $INSTALL_WMS == *awesome* ]] && install_awesome
[[ $WM_PKGS == *xfce* ]] && echo 'volumeicon &' >> $MNT/home/$NEWUSER/.xprofile [[ $WM_PKGS == *xfce* ]] && echo 'volumeicon &' >> $MNT/home/$NEWUSER/.xprofile
# remove some commands from ~/.xprofile when using KDE or Gnome as the login session # remove some commands from ~/.xprofile when using KDE or Gnome as the login session
@ -1567,15 +1578,13 @@ install_xinit()
if [[ $AUTOLOGIN ]]; then if [[ $AUTOLOGIN ]]; then
sed -i "s/root/${NEWUSER}/g" $SERVICE/autologin.conf sed -i "s/root/${NEWUSER}/g" $SERVICE/autologin.conf
cat > "$MNT/home/$NEWUSER/$LOGINRC" <<EOF cat > "$MNT/home/$NEWUSER/$LOGINRC" <<- EOF
# ~/$LOGINRC # ~/$LOGINRC
# sourced by ${MYSHELL##*/} when used as a login shell # sourced by ${MYSHELL##*/} when used as a login shell
# automatically run startx when logging in on tty1 # automatically run startx when logging in on tty1
if [ -z \$DISPLAY ] && [ \$XDG_VTNR -eq 1 ]; then [ -z \$DISPLAY ] && [ \$XDG_VTNR -eq 1 ] && exec startx
exec startx EOF
fi
EOF
else else
rm -rf $SERVICE rm -rf $SERVICE
fi fi
@ -1584,7 +1593,6 @@ EOF
install_login() install_login()
{ {
SERVICE="$MNT/etc/systemd/system/getty@tty1.service.d" SERVICE="$MNT/etc/systemd/system/getty@tty1.service.d"
sed -i '/printf/d' $MNT/root/.zshrc
install_${LOGIN_TYPE:-xinit} install_${LOGIN_TYPE:-xinit}
} }
@ -1593,28 +1601,27 @@ install_lightdm()
rm -rf "$SERVICE" "$MNT/home/$NEWUSER"/.{xinitrc,profile,zprofile,bash_profile} rm -rf "$SERVICE" "$MNT/home/$NEWUSER"/.{xinitrc,profile,zprofile,bash_profile}
chrun 'systemctl set-default graphical.target && systemctl enable lightdm.service' 2>$ERR chrun 'systemctl set-default graphical.target && systemctl enable lightdm.service' 2>$ERR
errshow 1 "systemctl set-default graphical.target && systemctl enable lightdm.service" errshow 1 "systemctl set-default graphical.target && systemctl enable lightdm.service"
cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf << EOF cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf <<- EOF
# LightDM GTK+ Configuration # LightDM GTK+ Configuration
[greeter] [greeter]
default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
background=/usr/share/backgrounds/archlabs/archlabs.jpg background=/usr/share/backgrounds/archlabs/archlabs.jpg
theme-name=Adwaita-dark theme-name=Adwaita-dark
icon-theme-name=Adwaita icon-theme-name=Adwaita
font-name=DejaVu Sans Mono 11 font-name=DejaVu Sans Mono 11
position=30%,end 50%,end position=30%,end 50%,end
EOF EOF
} }
install_awesome() install_awesome()
{ {
# downloads and sets up @elenapan's awesome WM config hosted on github # downloads and sets up @elenapan's awesome WM config hosted on github
if chrun "git clone https://github.com/elenapan/archlabs-awesome /home/$NEWUSER/archlabs-awesome"; then if chrun "git clone https://github.com/elenapan/archlabs-awesome /home/$NEWUSER/archlabs-awesome"; then
cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" "/mnt/home/$NEWUSER" cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" "/mnt/home/$NEWUSER"
cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" /mnt/etc/skel cp -rT "/mnt/home/$NEWUSER/archlabs-awesome" /mnt/etc/skel
rm -rf "/home/$NEWUSER/"{.git,archlabs-awesome,screenshots} rm -rf "/home/$NEWUSER/"{.git,archlabs-awesome,screenshots}
printf "You will need to instal pamac seperately if needed using: 'baph -i pamac-aur'\n" printf "You will need to install pamac separately using: 'baph -i pamac-aur'\n"
sleep 3 sleep 3
else else
printf "failed to clone awesome config repo\n" printf "failed to clone awesome config repo\n"
@ -1726,22 +1733,22 @@ install_mirrorlist()
if hash reflector >/dev/null 2>&1; then if hash reflector >/dev/null 2>&1; then
reflector --score 80 -l 40 -f 5 --sort rate --save "$mfile" reflector --score 80 -l 40 -f 5 --sort rate --save "$mfile"
elif hash rankmirrors >/dev/null 2>&1; then elif hash rankmirrors >/dev/null 2>&1; then
ip_add="$(curl -fsSL "http://api.ipstack.com/check&?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=ip" | local key="access_key=5f29642060ab983b31fdf4c2935d8c56"
python -c "import sys, json; print(json.load(sys.stdin)['ip'])")" 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}?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=country_code" | 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'])")"
python -c "import sys, json; print(json.load(sys.stdin)['country_code'])")"
if [[ "$country" ]]; then if [[ "$country" ]]; then
if [[ $country =~ (CA|US) ]]; then if [[ $country =~ (CA|US) ]]; then
# use both CA and US mirrors for CA or US countries
mirror="https://www.archlinux.org/mirrorlist/?country=US&country=CA&use_mirror_status=on" mirror="https://www.archlinux.org/mirrorlist/?country=US&country=CA&use_mirror_status=on"
elif [[ $country =~ (AU|NZ) ]]; then elif [[ $country =~ (AU|NZ) ]]; then
# use both AU and NZ mirrors for AU or NZ countries
mirror="https://www.archlinux.org/mirrorlist/?country=AU&country=NZ&use_mirror_status=on" mirror="https://www.archlinux.org/mirrorlist/?country=AU&country=NZ&use_mirror_status=on"
else else
mirror="https://www.archlinux.org/mirrorlist/?country=${country}&use_mirror_status=on" mirror="https://www.archlinux.org/mirrorlist/?country=${country}&use_mirror_status=on"
fi fi
else 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" mirror="https://www.archlinux.org/mirrorlist/?country=all&use_mirror_status=on"
fi fi
curl -fsSL "$mirror" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 6 - >"$mfile" curl -fsSL "$mirror" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 6 - >"$mfile"
fi fi
@ -1750,20 +1757,24 @@ install_mirrorlist()
install_background() install_background()
{ {
if [[ -d /run/archiso/sfs/airootfs/etc/skel ]] && grep -qw "$MNT" /proc/mounts && (grep -qw "$MNT/$BOOTDIR" /proc/mounts || [[ $SYS == 'BIOS' && -z $LUKS ]]); then yesno "Background Install" "\nBegin install in the background?\n" || return 0
yesno "Background Install" "\nBegin install in the background?\n" || return 0
rsync -a /run/archiso/sfs/airootfs/ $MNT/ & rsync -a /run/archiso/sfs/airootfs/ $MNT/ &
RSYNC_PID=$! RSYNC_PID=$!
( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && sleep 1 && mkdir -p $MNT/var/lib/pacman && chrun "pacman -Syyu $BASE_PKGS --needed --noconfirm" >> /tmp/bg_out 2>&1 ) &
MIRROR_PID=$! mkdir -p $MNT/var/lib/pacman # can help with pacman errors
# end the background processes before exiting ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && sleep 1 && chrun "pacman -Syyu $BASE_PKGS --needed --noconfirm" >> /tmp/bg_out 2>&1 ) &
trap "kill $RSYNC_PID $MIRROR_PID 2>/dev/null" EXIT MIRROR_PID=$!
fi
return 0 # end the background processes before exiting
trap "kill $RSYNC_PID $MIRROR_PID 2>/dev/null" EXIT
} }
############################################################################### ###############################################################################
# bootloader setup # bootloader setup
# prerun_* set up the configs needed before actually running the commands
# setup_* are run after selecting a bootloader and build the command used later
# they can also be used for further user input as these run before control is taken away
setup_grub() setup_grub()
{ {
@ -1846,56 +1857,45 @@ prerun_syslinux()
[[ $SYS == 'UEFI' ]] && { c="$MNT/boot/EFI/syslinux"; s="/usr/lib/syslinux/efi64/"; d=''; } [[ $SYS == 'UEFI' ]] && { c="$MNT/boot/EFI/syslinux"; s="/usr/lib/syslinux/efi64/"; d=''; }
mkdir -pv "$c" && cp -rfv $s/* "$c/" && cp -f "$RUN/syslinux/splash.png" "$c/" mkdir -pv "$c" && cp -rfv $s/* "$c/" && cp -f "$RUN/syslinux/splash.png" "$c/"
cat > "$c/syslinux.cfg" << EOF cat > "$c/syslinux.cfg" <<- EOF
UI vesamenu.c32 UI vesamenu.c32
MENU TITLE $DIST Boot Menu MENU TITLE $DIST Boot Menu
MENU BACKGROUND splash.png MENU BACKGROUND splash.png
TIMEOUT 50 TIMEOUT 50
DEFAULT $DIST DEFAULT $DIST
# see: https://www.syslinux.org/wiki/index.php/Comboot/menu.c32 # see: https://www.syslinux.org/wiki/index.php/Comboot/menu.c32
MENU WIDTH 78 MENU WIDTH 78
MENU MARGIN 4 MENU MARGIN 4
MENU ROWS 4 MENU ROWS 4
MENU VSHIFT 10 MENU VSHIFT 10
MENU TIMEOUTROW 13 MENU TIMEOUTROW 13
MENU TABMSGROW 14 MENU TABMSGROW 14
MENU CMDLINEROW 14 MENU CMDLINEROW 14
MENU HELPMSGROW 16 MENU HELPMSGROW 16
MENU HELPMSGENDROW 29 MENU HELPMSGENDROW 29
MENU COLOR border 30;44 #40ffffff #a0000000 std MENU COLOR border 30;44 #40ffffff #a0000000 std
MENU COLOR title 1;36;44 #9033ccff #a0000000 std MENU COLOR title 1;36;44 #9033ccff #a0000000 std
MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel 37;44 #50ffffff #a0000000 std MENU COLOR unsel 37;44 #50ffffff #a0000000 std
MENU COLOR help 37;40 #c0ffffff #a0000000 std MENU COLOR help 37;40 #c0ffffff #a0000000 std
MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std
MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07 37;40 #90ffffff #a0000000 std MENU COLOR msg07 37;40 #90ffffff #a0000000 std
MENU COLOR tabmsg 31;40 #30ffffff #00000000 std MENU COLOR tabmsg 31;40 #30ffffff #00000000 std
LABEL $DIST LABEL $DIST
MENU LABEL $DIST Linux MENU LABEL $DIST Linux
LINUX $d/vmlinuz-$KERNEL LINUX $d/vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL.img INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL.img
LABEL ${DIST}fallback LABEL ${DIST}fallback
MENU LABEL $DIST Linux Fallback MENU LABEL $DIST Linux Fallback
LINUX $d/vmlinuz-$KERNEL LINUX $d/vmlinuz-$KERNEL
APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw APPEND root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && printf "%s " "$LUKS_DEV")rw
INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL-fallback.img INITRD $([[ $UCODE ]] && printf "%s" "$d/$UCODE.img,")$d/initramfs-$KERNEL-fallback.img
$([[ $SYS == 'BIOS' ]] && printf "\n%s" "# examples of chainloading other bootloaders EOF
#LABEL grub2
#MENU LABEL Grub2
#COM32 chain.c32
#APPEND file=$d/grub/boot.img
#LABEL windows
#MENU LABEL Windows
#COM32 chain.c32
#APPEND hd0 3")
EOF
return 0 return 0
} }
@ -1908,26 +1908,26 @@ setup_refind-efi()
prerun_refind-efi() prerun_refind-efi()
{ {
cat > $MNT/boot/refind_linux.conf << EOF cat > $MNT/boot/refind_linux.conf <<- EOF
"$DIST Linux" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && "$DIST Linux" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] && printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL.img" printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL.img"
"$DIST Linux Fallback" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] && "$DIST Linux Fallback" "root=$ROOT_PART_ID $([[ $LUKS_DEV ]] &&
printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] && printf "%s " "$LUKS_DEV")rw add_efi_memmap $([[ $UCODE ]] &&
printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL-fallback.img" printf "initrd=%s " "/$UCODE.img")initrd=/initramfs-$KERNEL-fallback.img"
EOF EOF
mkdir -p $MNT/etc/pacman.d/hooks mkdir -p $MNT/etc/pacman.d/hooks
cat > $MNT/etc/pacman.d/hooks/refind.hook << EOF cat > $MNT/etc/pacman.d/hooks/refind.hook <<- EOF
[Trigger] [Trigger]
Operation = Upgrade Operation = Upgrade
Type = Package Type = Package
Target = refind-efi Target = refind-efi
[Action] [Action]
Description = Updating rEFInd on ESP Description = Updating rEFInd on ESP
When = PostTransaction When = PostTransaction
Exec = /usr/bin/refind-install Exec = /usr/bin/refind-install
EOF EOF
} }
setup_systemd-boot() setup_systemd-boot()
@ -1940,35 +1940,40 @@ setup_systemd-boot()
prerun_systemd-boot() prerun_systemd-boot()
{ {
mkdir -p $MNT/boot/loader/entries 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
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
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
EOF
mkdir -p $MNT/etc/pacman.d/hooks
cat > $MNT/etc/pacman.d/hooks/systemd-boot.hook << EOF
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd
[Action] cat > $MNT/boot/loader/loader.conf <<- EOF
Description = Updating systemd-boot default $DIST
When = PostTransaction timeout 5
Exec = /usr/bin/bootctl update editor no
EOF 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
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
EOF
mkdir -p $MNT/etc/pacman.d/hooks
cat > $MNT/etc/pacman.d/hooks/systemd-boot.hook <<- EOF
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd
[Action]
Description = Updating systemd-boot
When = PostTransaction
Exec = /usr/bin/bootctl update
EOF
systemd-machine-id-setup --root="$MNT" systemd-machine-id-setup --root="$MNT"
return 0 return 0
} }
@ -2349,7 +2354,9 @@ luks_advanced()
} }
############################################################################### ###############################################################################
# helper functions # simple functions
# some help avoid repetition and improve usability of some commands
# others are initial setup functions used before reaching the main loop
ofn() ofn()
{ {
@ -2646,7 +2653,7 @@ lspci -vnn -d 14e4: | grep -q 'BCM4352' && load_bcm
net_connect || { msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2; die 1; } net_connect || { msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2; die 1; }
while :; do while :; do
select_main main
done done
# vim:fdm=marker:fmr={,} # vim:fdm=marker:fmr={,}