diff --git a/README.md b/README.md index 5f4a0ba..0115829 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ #### Requirements -`coreutils`, `parted`, `rsync`, `dialog`, `vim`, `chpasswd`, `curl`, `arch-chroot` +`awk`, `sed`, `curl`, `vim`, `rsync`, `parted`, `dialog`, `coreutils`, `findutils`, `chpasswd`, `util-linux`, `arch-install-scripts` #### Manual Installation @@ -18,7 +18,10 @@ sh -c "$(curl -fsSL https://bitbucket.org/archlabslinux/installer/raw/master/ins ``` --- -A packaged version can also be found in our repos: -[stable](https://bitbucket.org/archlabslinux/archlabs_repo/src/master/x86_64/) -[unstable](https://bitbucket.org/archlabslinux/archlabs_unstable/src/master/x86_64/) + +A packaged version can also be found in our repos: + +- stable: https://bitbucket.org/archlabslinux/archlabs\_repo + +- unstable: https://bitbucket.org/archlabslinux/archlabs\_unstable diff --git a/archlabs-installer b/archlabs-installer index 1d483b9..83276c8 100755 --- a/archlabs-installer +++ b/archlabs-installer @@ -5,7 +5,7 @@ # Some ideas and code reworked from other resources # AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due -VER="2.0.21" # version +VER="2.0.25" # version DIST="ArchLabs" # distributor MNT="/mnt" # mountpoint ANS="/tmp/ans" @@ -112,6 +112,8 @@ RUN="/run/archiso/bootmnt/arch/boot" # path for live /boot VM="$(dmesg | grep -i "hypervisor")" # is the system a vm SYS='Unknown' +export DIALOGOPTS="--cr-wrap" + # } # giant ugly variable container :P { @@ -247,17 +249,10 @@ declare -A PKG_EXT=( # Basics (somewhat in order) _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" -_user="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the [Up] and [Down] arrows to switch between input fields, [Tab] to toggle between input fields and the buttons, and [Enter] to accept." -_hostname="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end." -_locale="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n en_GB is: english Great Britain" -_timez="\nThe time zone is used to set the system clock.\n\nSelect your country or continent from the list below" -_timesubz="\nSelect the nearest city to you or one with the same time zone.\n\nTIP: Pressing the first letter of the city name repeatedly will navigate between entries beggining with that letter." -_sessions="\nUse [Space] to toggle available sessions, use [Enter] to accept the selection and continue.\n\nA basic package set will be installed for compatibility and functionality." -_login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc" -_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." _device="\nSelect a device to use from the list below.\n\nDevices (/dev) are the available drives on the system. /sda, /sdb, /sdc ..." +_resize="\n\nSelect the new filesystem size, a new partition will then be created from the free space.\nThe lowest size is just enough to fit the currently in use space on the partition while the default is set to split the free space evenly.\n\nUse Tab or the arrow keys move the cursor between the buttons and the value, when the cursor is on the value, you can edit it by:\n\n - left/right cursor movement to select a digit to modify\n - +/- characters to increment/decrement the digit by one\n - 0 through 9 to set the digit to the given value\n\nSome keys are also recognized in all cursor positions:\n\n - Home/End set the value to its maximum or minimum\nPageup/Pagedown increment the value so that the slider moves by one column." _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: Please choose carefully during mounting and formatting.\n\nPartitions can be mounted without formatting by selecting skip during mounting, useful for extra or already formatted partitions.\n\nThe exception to this is the root (/) partition, it needs to be formatted before install to ensure system stability.\n" +_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)." _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." @@ -266,6 +261,14 @@ _format="is already formatted correctly.\n\nFor a clean install, previously exis _swapsize="\nEnter the size of the swapfile in megabytes (M) or gigabytes (G).\n\neg. 100M will create a 100 megabyte swapfile, while 10G will create a 10 gigabyte swapfile.\n\nFor ease of use and as an example it is filled in to match the size of your system memory (RAM).\n\nMust be greater than 1, contain only whole numbers, and end with either M or G." _expart="\nYou can now choose any additional partitions you want mounted, you'll be asked for a mountpoint after.\n\nSelect 'done' to finish the mounting step and begin unpacking the base system in the background." _exmnt="\nWhere do you want the partition mounted?\n\nEnsure the name begins with a slash (/).\nExamples include: /usr, /home, /var, etc." +_user="\nEnter a name and password for the new user account.\n\nThe name must not use capital letters, contain any periods (.), end with a hyphen (-), or include any colons (:)\n\nNOTE: Use the [Up] and [Down] arrows to switch between input fields, [Tab] to toggle between input fields and the buttons, and [Enter] to accept." +_hostname="\nEnter a hostname for the new system.\n\nA hostname is used to identify systems on the network.\n\nIt's restricted to alphanumeric characters (a-z, A-Z, 0-9).\nIt can contain hyphens (-) BUT NOT at the beggining or end." +_locale="\nLocale determines the system language and currency formats.\n\nThe format for locale names is languagecode_COUNTRYCODE\n\neg. en_US is: english United States\n en_GB is: english Great Britain" +_timez="\nThe time zone is used to set the system clock.\n\nSelect your country or continent from the list below" +_timesubz="\nSelect the nearest city to you or one with the same time zone.\n\nTIP: Pressing the first letter of the city name repeatedly will navigate between entries beggining with that letter." +_sessions="\nUse [Space] to toggle available sessions, use [Enter] to accept the selection and continue.\n\nA basic package set will be installed for compatibility and functionality." +_login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc" +_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." _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] or Ctrl-z again to resume the installer, if you want to avoid the automatic reboot using Ctrl-c will cleanly exit." # LUKS @@ -306,8 +309,7 @@ select_main() { (( SEL < 12 )) && (( SEL++ )) tput civis - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \ + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \ 1 "Show lsblk output (optional)" \ 2 "Edit partitions (optional)" \ 3 "LUKS encryption (optional)" \ @@ -324,7 +326,7 @@ select_main() read -r SEL < "$ANS" if [[ -z $WARN && $SEL =~ (2|5) ]]; then - msg "Prepare" "$_warn" + msg "Data Warning" "$_warn" WARN=true fi @@ -368,7 +370,11 @@ select_boot() select_show() { local cmd="${BCMDS[$BOOTLDR]}" - [[ $BOOT_PART ]] && local mnt="/$BOOTDIR" || local mnt="none" + if [[ $BOOT_PART ]]; then + local mnt="/$BOOTDIR" + else + local mnt="none" + fi local pkgs="$USER_PKGS $PACKAGES" [[ $INSTALL_WMS == *dwm* ]] && pkgs="dwm st dmenu $pkgs" @@ -503,14 +509,13 @@ select_mkuser() until [[ $NEWUSER ]]; do i=0 tput cnorm - dialog --cr-wrap --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 + 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 @@ -554,7 +559,7 @@ select_keymap() sy Arabic ara Arabic ua Ukrainian cz Czech ru Russian \ sk Slovak nl Dutch it Italian hu Hungarian cn Chinese \ tw Taiwanese vn Vietnamese kr Korean jp Japanese th Thai \ - la Lao pl Polish se Swedish is Icelandic fi Finnish \ + la Lao pl Polish se Swedish is Icelandic 'fi' Finnish \ dk Danish be Belgian in Indian al Albanian am Armenian \ bd Bangla ba Bosnian 'bg' Bulgarian dz Berber mm Burmese \ hr Croatian gr Greek il Hebrew ir Persian iq Iraqi \ @@ -575,9 +580,9 @@ select_keymap() fi if [[ $DISPLAY && $TERM != 'linux' ]]; then - setxkbmap $KEYMAP >/dev/null 2>&1 + setxkbmap "$KEYMAP" >/dev/null 2>&1 else - loadkeys $CMAP >/dev/null 2>&1 + loadkeys "$CMAP" >/dev/null 2>&1 fi return 0 @@ -588,20 +593,20 @@ select_sessions() LOGIN_CHOICES='' dlg INSTALL_WMS check "Sessions" "$_sessions\n" \ - 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[*]}") \ - bspwm "A tiling wm that represents windows as the leaves of a binary tree" $(ofn bspwm "${INSTALL_WMS[*]}") \ - dwm "A fork of dwm, with more layouts and features" $(ofn dwm "${INSTALL_WMS[*]}") \ - fluxbox "A lightweight and highly-configurable window manager" $(ofn fluxbox "${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[*]}") \ - plasma "A kde software project currently comprising a full desktop environment" $(ofn plasma "${INSTALL_WMS[*]}") \ - xfce4 "A lightweight and modular desktop environment based on gtk+2/3" $(ofn xfce4 "${INSTALL_WMS[*]}") + 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[*]}")" \ + bspwm "A tiling wm that represents windows as the leaves of a binary tree" "$(ofn bspwm "${INSTALL_WMS[*]}")" \ + dwm "A fork of dwm, with more layouts and features" "$(ofn dwm "${INSTALL_WMS[*]}")" \ + fluxbox "A lightweight and highly-configurable window manager" "$(ofn fluxbox "${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[*]}")" \ + plasma "A kde software project currently comprising a full desktop environment" "$(ofn plasma "${INSTALL_WMS[*]}")" \ + xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" [[ $INSTALL_WMS ]] || return 1 WM_NUM=0 - while IFS=' ' read -r field; do + while IFS=' ' read -r i; do (( WM_NUM++ )) done <<< "$INSTALL_WMS" @@ -627,88 +632,88 @@ select_sessions() select_packages() { dlg USER_PKGS check " Packages " "$_packages" \ - abiword "A Fully-featured word processor" $(ofn abiword "${USER_PKGS[*]}") \ - alacritty "A cross-platform, GPU-accelerated terminal emulator" $(ofn alacritty "${USER_PKGS[*]}") \ - atom "An open-source text editor developed by GitHub" $(ofn atom "${USER_PKGS[*]}") \ - audacious "A free and advanced audio player based on GTK+" $(ofn audacious "${USER_PKGS[*]}") \ - audacity "A program that lets you manipulate digital audio waveforms" $(ofn audacity "${USER_PKGS[*]}") \ - cairo-dock "Light eye-candy fully themable animated dock" $(ofn cairo-dock "${USER_PKGS[*]}") \ - calligra "A set of applications for productivity" $(ofn calligra "${USER_PKGS[*]}") \ - chromium "An open-source web browser based on the Blink rendering engine" $(ofn chromium "${USER_PKGS[*]}") \ - clementine "A modern music player and library organizer" $(ofn clementine "${USER_PKGS[*]}") \ - cmus "A small, fast and powerful console music player" $(ofn cmus "${USER_PKGS[*]}") \ - deadbeef "A GTK+ audio player for GNU/Linux" $(ofn deadbeef "${USER_PKGS[*]}") \ - deluge "A BitTorrent client written in python" $(ofn deluge "${USER_PKGS[*]}") \ - docky "Full fledged dock for opening applications and managing windows" $(ofn docky "${USER_PKGS[*]}") \ - emacs "An extensible, customizable, self-documenting real-time display editor" $(ofn emacs "${USER_PKGS[*]}") \ - epiphany "A GNOME web browser based on the WebKit rendering engine" $(ofn epiphany "${USER_PKGS[*]}") \ - evince "A document viewer" $(ofn evince "${USER_PKGS[*]}") \ - evolution "Manage your email, contacts and schedule" $(ofn evolution "${USER_PKGS[*]}") \ - file-roller "Create and modify archives" $(ofn file-roller "${USER_PKGS[*]}") \ - firefox "A popular open-source web browser from Mozilla" $(ofn firefox "${USER_PKGS[*]}") \ - gcolor2 "A simple GTK+2 color selector" $(ofn gcolor2 "${USER_PKGS[*]}") \ - geany "A fast and lightweight IDE" $(ofn geany "${USER_PKGS[*]}") \ - geary "A lightweight email client for the GNOME desktop" $(ofn geary "${USER_PKGS[*]}") \ - gimp "GNU Image Manipulation Program" $(ofn gimp "${USER_PKGS[*]}") \ - gnome-disk-utility "Disk Management Utility" $(ofn gnome-disk-utility "${USER_PKGS[*]}") \ - gnome-system-monitor "View current processes and monitor system state" $(ofn gnome-system-monitor "${USER_PKGS[*]}") \ - gparted "A GUI frontend for creating and manipulating partition tables" $(ofn gparted "${USER_PKGS[*]}") \ - gpick "Advanced color picker using GTK+ toolkit" $(ofn gpick "${USER_PKGS[*]}") \ - gpicview "Lightweight image viewer" $(ofn gpicview "${USER_PKGS[*]}") \ - guvcview "Capture video from camera devices" $(ofn guvcview "${USER_PKGS[*]}") \ - hexchat "A popular and easy to use graphical IRC client" $(ofn hexchat "${USER_PKGS[*]}") \ - inkscape "Professional vector graphics editor" $(ofn inkscape "${USER_PKGS[*]}") \ - irssi "Modular text mode IRC client" $(ofn irssi "${USER_PKGS[*]}") \ - kdenlive "A popular non-linear video editor for Linux" $(ofn kdenlive "${USER_PKGS[*]}") \ - krita "Edit and paint images" $(ofn krita "${USER_PKGS[*]}") \ - libreoffice-fresh "Full featured office suite" $(ofn libreoffice-fresh "${USER_PKGS[*]}") \ - lollypop "A new music playing application" $(ofn lollypop "${USER_PKGS[*]}") \ - mousepad "A simple text editor" $(ofn mousepad "${USER_PKGS[*]}") \ - mpd "A flexible, powerful, server-side application for playing music" $(ofn mpd "${USER_PKGS[*]}") \ - mpv "A media player based on mplayer" $(ofn mpv "${USER_PKGS[*]}") \ - mupdf "Lightweight PDF and XPS viewer" $(ofn mupdf "${USER_PKGS[*]}") \ - mutt "Small but very powerful text-based mail client" $(ofn mutt "${USER_PKGS[*]}") \ - nautilus "The default file manager for Gnome" $(ofn nautilus "${USER_PKGS[*]}") \ - ncmpcpp "A mpd client and almost exact clone of ncmpc with some new features" $(ofn ncmpcpp "${USER_PKGS[*]}") \ - neovim "A fork of Vim aiming to improve user experience, plugins, and GUIs." $(ofn neovim "${USER_PKGS[*]}") \ - nicotine+ "A graphical client for Soulseek" $(ofn nicotine+ "${USER_PKGS[*]}") \ - noto-fonts "Google Noto fonts" $(ofn noto-fonts "${USER_PKGS[*]}") \ - noto-fonts-cjk "Google Noto CJK fonts (Chinese, Japanese, Korean)" $(ofn noto-fonts-cjk "${USER_PKGS[*]}") \ - obs-studio "Free opensource streaming/recording software" $(ofn obs-studio "${USER_PKGS[*]}") \ - openshot "An open-source, non-linear video editor for Linux" $(ofn openshot "${USER_PKGS[*]}") \ - opera "A Fast and secure, free of charge web browser from Opera Software" $(ofn opera "${USER_PKGS[*]}") \ - pcmanfm "A fast and lightweight file manager based in Lxde" $(ofn pcmanfm "${USER_PKGS[*]}") \ - pidgin "Multi-protocol instant messaging client" $(ofn pidgin "${USER_PKGS[*]}") \ - plank "An elegant, simple, and clean dock" $(ofn plank "${USER_PKGS[*]}") \ - qbittorrent "An advanced BitTorrent client" $(ofn qbittorrent "${USER_PKGS[*]}") \ - qpdfview "A tabbed PDF viewer" $(ofn qpdfview "${USER_PKGS[*]}") \ - qt5ct "GUI for managing Qt based application themes, icons, and fonts" $(ofn qt5ct "${USER_PKGS[*]}") \ - qutebrowser "A keyboard-focused vim-like web browser based on Python and PyQt5" $(ofn qutebrowser "${USER_PKGS[*]}") \ - rhythmbox "A Music playback and management application" $(ofn rhythmbox "${USER_PKGS[*]}") \ - rxvt-unicode "A unicode enabled rxvt-clone terminal emulator" $(ofn rxvt-unicode "${USER_PKGS[*]}") \ - sakura "A terminal emulator based on GTK and VTE" $(ofn sakura "${USER_PKGS[*]}") \ - simplescreenrecorder "A feature-rich screen recorder" $(ofn simplescreenrecorder "${USER_PKGS[*]}") \ - steam "A popular game distribution platform by Valve" $(ofn steam "${USER_PKGS[*]}") \ - surf "A simple web browser based on WebKit2/GTK+" $(ofn surf "${USER_PKGS[*]}") \ - terminator "Terminal emulator that supports tabs and grids" $(ofn terminator "${USER_PKGS[*]}") \ - termite "A minimal VTE-based terminal emulator" $(ofn termite "${USER_PKGS[*]}") \ - thunar "A modern file manager for the Xfce Desktop Environment" $(ofn thunar "${USER_PKGS[*]}") \ - thunderbird "Standalone mail and news reader from mozilla" $(ofn thunderbird "${USER_PKGS[*]}") \ - tilda "A GTK based drop down terminal for Linux and Unix" $(ofn tilda "${USER_PKGS[*]}") \ - tilix "A tiling terminal emulator for Linux using GTK+ 3" $(ofn tilix "${USER_PKGS[*]}") \ - transmission-cli "Free BitTorrent client CLI" $(ofn transmission-cli "${USER_PKGS[*]}") \ - transmission-gtk "Free BitTorrent client GTK+ GUI" $(ofn transmission-gtk "${USER_PKGS[*]}") \ - transmission-qt "Free BitTorrent client Qt GUI" $(ofn transmission-qt "${USER_PKGS[*]}") \ - ttf-anonymous-pro "A family fixed-width fonts designed with code in mind" $(ofn ttf-anonymous-pro "${USER_PKGS[*]}") \ - ttf-fira-code "Monospaced font with programming ligatures" $(ofn ttf-fira-code "${USER_PKGS[*]}") \ - ttf-font-awesome "Iconic font designed for Bootstrap" $(ofn ttf-font-awesome "${USER_PKGS[*]}") \ - ttf-hack "A hand groomed typeface based on Bitstream Vera Mono" $(ofn ttf-hack "${USER_PKGS[*]}") \ - vlc "A free and open source cross-platform multimedia player" $(ofn vlc "${USER_PKGS[*]}") \ - weechat "Fast, light and extensible IRC client" $(ofn weechat "${USER_PKGS[*]}") \ - xarchiver "A GTK+ frontend to various command line archivers" $(ofn xarchiver "${USER_PKGS[*]}") \ - xfce-terminal "A terminal emulator based in the Xfce Desktop Environment" $(ofn xfce-terminal "${USER_PKGS[*]}") \ - xterm "The standard terminal emulator for the X window system" $(ofn xterm "${USER_PKGS[*]}") \ - zathura "Minimalistic document viewer" $(ofn zathura "${USER_PKGS[*]}") + abiword "A Fully-featured word processor" "$(ofn abiword "${USER_PKGS[*]}")" \ + alacritty "A cross-platform, GPU-accelerated terminal emulator" "$(ofn alacritty "${USER_PKGS[*]}")" \ + atom "An open-source text editor developed by GitHub" "$(ofn atom "${USER_PKGS[*]}")" \ + audacious "A free and advanced audio player based on GTK+" "$(ofn audacious "${USER_PKGS[*]}")" \ + audacity "A program that lets you manipulate digital audio waveforms" "$(ofn audacity "${USER_PKGS[*]}")" \ + cairo-dock "Light eye-candy fully themable animated dock" "$(ofn cairo-dock "${USER_PKGS[*]}")" \ + calligra "A set of applications for productivity" "$(ofn calligra "${USER_PKGS[*]}")" \ + chromium "An open-source web browser based on the Blink rendering engine" "$(ofn chromium "${USER_PKGS[*]}")" \ + clementine "A modern music player and library organizer" "$(ofn clementine "${USER_PKGS[*]}")" \ + cmus "A small, fast and powerful console music player" "$(ofn cmus "${USER_PKGS[*]}")" \ + deadbeef "A GTK+ audio player for GNU/Linux" "$(ofn deadbeef "${USER_PKGS[*]}")" \ + deluge "A BitTorrent client written in python" "$(ofn deluge "${USER_PKGS[*]}")" \ + docky "Full fledged dock for opening applications and managing windows" "$(ofn docky "${USER_PKGS[*]}")" \ + emacs "An extensible, customizable, self-documenting real-time display editor" "$(ofn emacs "${USER_PKGS[*]}")" \ + epiphany "A GNOME web browser based on the WebKit rendering engine" "$(ofn epiphany "${USER_PKGS[*]}")" \ + evince "A document viewer" "$(ofn evince "${USER_PKGS[*]}")" \ + evolution "Manage your email, contacts and schedule" "$(ofn evolution "${USER_PKGS[*]}")" \ + file-roller "Create and modify archives" "$(ofn file-roller "${USER_PKGS[*]}")" \ + firefox "A popular open-source web browser from Mozilla" "$(ofn firefox "${USER_PKGS[*]}")" \ + gcolor2 "A simple GTK+2 color selector" "$(ofn gcolor2 "${USER_PKGS[*]}")" \ + geany "A fast and lightweight IDE" "$(ofn geany "${USER_PKGS[*]}")" \ + geary "A lightweight email client for the GNOME desktop" "$(ofn geary "${USER_PKGS[*]}")" \ + gimp "GNU Image Manipulation Program" "$(ofn gimp "${USER_PKGS[*]}")" \ + gnome-disk-utility "Disk Management Utility" "$(ofn gnome-disk-utility "${USER_PKGS[*]}")" \ + gnome-system-monitor "View current processes and monitor system state" "$(ofn gnome-system-monitor "${USER_PKGS[*]}")" \ + gparted "A GUI frontend for creating and manipulating partition tables" "$(ofn gparted "${USER_PKGS[*]}")" \ + gpick "Advanced color picker using GTK+ toolkit" "$(ofn gpick "${USER_PKGS[*]}")" \ + gpicview "Lightweight image viewer" "$(ofn gpicview "${USER_PKGS[*]}")" \ + guvcview "Capture video from camera devices" "$(ofn guvcview "${USER_PKGS[*]}")" \ + hexchat "A popular and easy to use graphical IRC client" "$(ofn hexchat "${USER_PKGS[*]}")" \ + inkscape "Professional vector graphics editor" "$(ofn inkscape "${USER_PKGS[*]}")" \ + irssi "Modular text mode IRC client" "$(ofn irssi "${USER_PKGS[*]}")" \ + kdenlive "A popular non-linear video editor for Linux" "$(ofn kdenlive "${USER_PKGS[*]}")" \ + krita "Edit and paint images" "$(ofn krita "${USER_PKGS[*]}")" \ + libreoffice-fresh "Full featured office suite" "$(ofn libreoffice-fresh "${USER_PKGS[*]}")" \ + lollypop "A new music playing application" "$(ofn lollypop "${USER_PKGS[*]}")" \ + mousepad "A simple text editor" "$(ofn mousepad "${USER_PKGS[*]}")" \ + mpd "A flexible, powerful, server-side application for playing music" "$(ofn mpd "${USER_PKGS[*]}")" \ + mpv "A media player based on mplayer" "$(ofn mpv "${USER_PKGS[*]}")" \ + mupdf "Lightweight PDF and XPS viewer" "$(ofn mupdf "${USER_PKGS[*]}")" \ + mutt "Small but very powerful text-based mail client" "$(ofn mutt "${USER_PKGS[*]}")" \ + nautilus "The default file manager for Gnome" "$(ofn nautilus "${USER_PKGS[*]}")" \ + ncmpcpp "A mpd client and almost exact clone of ncmpc with some new features" "$(ofn ncmpcpp "${USER_PKGS[*]}")" \ + neovim "A fork of Vim aiming to improve user experience, plugins, and GUIs." "$(ofn neovim "${USER_PKGS[*]}")" \ + nicotine+ "A graphical client for Soulseek" "$(ofn nicotine+ "${USER_PKGS[*]}")" \ + noto-fonts "Google Noto fonts" "$(ofn noto-fonts "${USER_PKGS[*]}")" \ + noto-fonts-cjk "Google Noto CJK fonts (Chinese, Japanese, Korean)" "$(ofn noto-fonts-cjk "${USER_PKGS[*]}")" \ + obs-studio "Free opensource streaming/recording software" "$(ofn obs-studio "${USER_PKGS[*]}")" \ + openshot "An open-source, non-linear video editor for Linux" "$(ofn openshot "${USER_PKGS[*]}")" \ + opera "A Fast and secure, free of charge web browser from Opera Software" "$(ofn opera "${USER_PKGS[*]}")" \ + pcmanfm "A fast and lightweight file manager based in Lxde" "$(ofn pcmanfm "${USER_PKGS[*]}")" \ + pidgin "Multi-protocol instant messaging client" "$(ofn pidgin "${USER_PKGS[*]}")" \ + plank "An elegant, simple, and clean dock" "$(ofn plank "${USER_PKGS[*]}")" \ + qbittorrent "An advanced BitTorrent client" "$(ofn qbittorrent "${USER_PKGS[*]}")" \ + qpdfview "A tabbed PDF viewer" "$(ofn qpdfview "${USER_PKGS[*]}")" \ + qt5ct "GUI for managing Qt based application themes, icons, and fonts" "$(ofn qt5ct "${USER_PKGS[*]}")" \ + qutebrowser "A keyboard-focused vim-like web browser based on Python and PyQt5" "$(ofn qutebrowser "${USER_PKGS[*]}")" \ + rhythmbox "A Music playback and management application" "$(ofn rhythmbox "${USER_PKGS[*]}")" \ + rxvt-unicode "A unicode enabled rxvt-clone terminal emulator" "$(ofn rxvt-unicode "${USER_PKGS[*]}")" \ + sakura "A terminal emulator based on GTK and VTE" "$(ofn sakura "${USER_PKGS[*]}")" \ + simplescreenrecorder "A feature-rich screen recorder" "$(ofn simplescreenrecorder "${USER_PKGS[*]}")" \ + steam "A popular game distribution platform by Valve" "$(ofn steam "${USER_PKGS[*]}")" \ + surf "A simple web browser based on WebKit2/GTK+" "$(ofn surf "${USER_PKGS[*]}")" \ + terminator "Terminal emulator that supports tabs and grids" "$(ofn terminator "${USER_PKGS[*]}")" \ + termite "A minimal VTE-based terminal emulator" "$(ofn termite "${USER_PKGS[*]}")" \ + thunar "A modern file manager for the Xfce Desktop Environment" "$(ofn thunar "${USER_PKGS[*]}")" \ + thunderbird "Standalone mail and news reader from mozilla" "$(ofn thunderbird "${USER_PKGS[*]}")" \ + tilda "A GTK based drop down terminal for Linux and Unix" "$(ofn tilda "${USER_PKGS[*]}")" \ + tilix "A tiling terminal emulator for Linux using GTK+ 3" "$(ofn tilix "${USER_PKGS[*]}")" \ + transmission-cli "Free BitTorrent client CLI" "$(ofn transmission-cli "${USER_PKGS[*]}")" \ + transmission-gtk "Free BitTorrent client GTK+ GUI" "$(ofn transmission-gtk "${USER_PKGS[*]}")" \ + transmission-qt "Free BitTorrent client Qt GUI" "$(ofn transmission-qt "${USER_PKGS[*]}")" \ + ttf-anonymous-pro "A family fixed-width fonts designed with code in mind" "$(ofn ttf-anonymous-pro "${USER_PKGS[*]}")" \ + ttf-fira-code "Monospaced font with programming ligatures" "$(ofn ttf-fira-code "${USER_PKGS[*]}")" \ + ttf-font-awesome "Iconic font designed for Bootstrap" "$(ofn ttf-font-awesome "${USER_PKGS[*]}")" \ + ttf-hack "A hand groomed typeface based on Bitstream Vera Mono" "$(ofn ttf-hack "${USER_PKGS[*]}")" \ + vlc "A free and open source cross-platform multimedia player" "$(ofn vlc "${USER_PKGS[*]}")" \ + weechat "Fast, light and extensible IRC client" "$(ofn weechat "${USER_PKGS[*]}")" \ + xarchiver "A GTK+ frontend to various command line archivers" "$(ofn xarchiver "${USER_PKGS[*]}")" \ + xfce-terminal "A terminal emulator based in the Xfce Desktop Environment" "$(ofn xfce-terminal "${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 for i in $USER_PKGS; do @@ -725,40 +730,41 @@ select_packages() part_menu() { check_background_install || return 0 - - local device choice devhash="$(lsblk -f | base64)" - if [[ $# -eq 1 ]]; then - device="$1" - else - umount_dir $MNT - part_device || return 1 - device="$DEVICE" - fi + local device choice devhash + devhash="$(lsblk -f | base64)" + umount_dir $MNT + part_device || return 1 + device="$DEVICE" while true; do + choice="" if [[ $DISPLAY && $TERM != 'linux' ]] && hash gparted >/dev/null 2>&1; then dlg choice menu "Edit Partitions" "$_part" \ "auto" "Whole device automatic partitioning" \ + "resize" "Resize an existing ext2/3/4 or ntfs partition" \ "gparted" "GUI front end to parted" \ "cfdisk" "Curses based variant of fdisk" \ "parted" "GNU partition editor" \ - "fdisk" "Dialog-driven program for creation and manipulation of partition tables." \ - "done" "Return to the main menu" + "fdisk" "Dialog-driven creation and manipulation of partitions" \ + "done" "Return to the main menu" || return 1 else dlg choice menu "Edit Partitions" "$_part" \ "auto" "Whole device automatic partitioning" \ + "resize" "Resize an existing ext2/3/4 or ntfs partition" \ "cfdisk" "Curses based variant of fdisk" \ "parted" "GNU partition editor" \ - "fdisk" "Dialog-driven program for creation and manipulation of partition tables." \ - "done" "Return to the main menu" + "fdisk" "Dialog-driven creation and manipulation of partitions" \ + "done" "Return to the main menu" || return 1 fi if [[ -z $choice || $choice == 'done' ]]; then return 0 + elif [[ $choice == 'resize' ]]; then + part_resize "$device" elif [[ $choice == 'auto' ]]; then - local root_size txt ret table boot_fs + local root_size txt table boot_fs root_size=$(lsblk -lno SIZE "$device" | awk 'NR == 1 { if ($1 ~ "G") { sub(/G/, "") @@ -783,15 +789,12 @@ part_menu() tput cnorm $choice "$device" fi - - # update the kernel if the partition table changes - [[ $devhash == "$(lsblk -f | base64)" ]] || partprobe >/dev/null 2>&1 + [[ $devhash == "$(lsblk -f | base64)" ]] || { msg "Probing Partitions" "\nInforming the kernel of partition changes using partprobe.\n"; partprobe >/dev/null 2>&1; } done } part_show() { - tput civis local txt if [[ $IGNORE_DEV ]]; then txt="$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINT | awk "!/$IGNORE_DEV/"' && /disk|part|lvm|crypt|NAME/')" @@ -804,75 +807,74 @@ part_show() part_swap() { if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then - fallocate -l $SWAP_SIZE $1 2>$ERR + fallocate -l $SWAP_SIZE "$1" 2>$ERR errshow "fallocate -l $SWAP_SIZE $1" - chmod 600 $1 2>$ERR + chmod 600 "$1" 2>$ERR errshow "chmod 600 $1" fi - mkswap $1 >/dev/null 2>$ERR + mkswap "$1" >/dev/null 2>$ERR errshow "mkswap $1" - swapon $1 >/dev/null 2>$ERR + swapon "$1" >/dev/null 2>$ERR errshow "swapon $1" return 0 } part_auto() { - local device="$1" table="$2" boot_fs="$3" size="$4" - local dev_info="$(parted -s $device print)" + local device="$1" table="$2" boot_fs="$3" size="$4" dev_info="" + dev_info="$(parted -s "$device" print)" msg "Auto Partition" "\nRemoving partitions on $device and setting table to $table\n" 1 swapoff -a while read -r PART; do - parted -s $device rm $PART >/dev/null 2>&1 + parted -s "$device" rm "$PART" >/dev/null 2>&1 done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)" - [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s $device mklabel $table >/dev/null 2>&1 + [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s "$device" mklabel "$table" >/dev/null 2>&1 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 + 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 + parted -s "$device" mkpart ESP "$boot_fs" 1MiB 513MiB >/dev/null 2>&1 fi sleep 0.5 BOOT_DEV="$device" - AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE $device | awk 'NR==2 {print "/dev/" $1}') + AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE "$device" | awk 'NR==2 {print "/dev/" $1}') if [[ $SYS == "BIOS" ]]; then - mkfs.ext4 -q $AUTO_BOOT_PART >/dev/null 2>&1 + mkfs.ext4 -q "$AUTO_BOOT_PART" >/dev/null 2>&1 else - mkfs.vfat -F32 $AUTO_BOOT_PART >/dev/null 2>&1 + mkfs.vfat -F32 "$AUTO_BOOT_PART" >/dev/null 2>&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>&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 - tput civis + AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE "$device" | awk 'NR==3 {print "/dev/" $1}')" + mkfs.ext4 -q "$AUTO_ROOT_PART" >/dev/null 2>&1 sleep 0.5 FORMATTED+="$AUTO_BOOT_PART $AUTO_ROOT_PART " - 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_find() { - local str="$1" err='' + local regexp="$1" err='' # string of partitions as /TYPE/PART SIZE if [[ $IGNORE_DEV ]]; then PARTS="$(lsblk -lno TYPE,NAME,SIZE | - awk "/$str/"' && !'"/$IGNORE_DEV/"' { + awk "/$regexp/"' && !'"/$IGNORE_DEV/"' { sub(/^part/, "/dev/") sub(/^lvm|^crypt/, "/dev/mapper/") print $1$2, $3 }')" else PARTS="$(lsblk -lno TYPE,NAME,SIZE | - awk "/$str/"' { + awk "/$regexp/"' { sub(/^part/, "/dev/") sub(/^lvm|^crypt/, "/dev/mapper/") print $1$2 " " $3 @@ -880,11 +882,10 @@ part_find() fi # number of partitions total - if [[ $PARTS ]]; then - COUNT=$(wc -l <<< "$PARTS") - else - COUNT=0 - fi + COUNT=0 + while read -r line; do + (( COUNT++ )) + done <<< "$PARTS" # ensure we have enough partitions for the system and action type case "$str" in @@ -901,9 +902,8 @@ part_find() part_mount() { - local part="$1" - local mountp="${MNT}$2" - local fs="$(lsblk -lno FSTYPE $part)" + local part="$1" mountp="${MNT}$2" fs="" + fs="$(lsblk -lno FSTYPE "$part")" mkdir -p "$mountp" if [[ $fs && ${FS_OPTS[$fs]} && $part != "$BOOT_PART" ]] && select_mntopts "$fs"; then @@ -912,7 +912,7 @@ part_mount() mount "$part" "$mountp" >/dev/null 2>&1 fi - part_mountconf $part "$mountp" || return 1 + part_mountconf "$part" "$mountp" || return 1 part_cryptlv "$part" return 0 @@ -920,15 +920,76 @@ part_mount() part_format() { - local part="$1" fs="$2" delay="$3" fscmd="${FS_CMDS[$2]}" + local part="$1" fs="$2" delay="$3" msg "Format" "\nFormatting $part as $fs\n" 0 - - $fscmd "$part" >/dev/null 2>$ERR - errshow "$fscmd $part" || return 1 - + ${FS_CMDS[$fs]} "$part" >/dev/null 2>$ERR + errshow "${FS_CMDS[$fs]} $part" || return 1 FORMATTED+="$part " - sleep ${delay:-0} + sleep "${delay:-0}" +} + +part_resize() +{ + part="" + local device="$1" fs="" num=0 + + part_find "${device##*/}[^ ]" || return 1 + (( COUNT == 1 )) && part="$(awk '{print $1}' <<< "${PARTS[@]}" )" + + if (( COUNT == 1 )) || dlg part menu "Resize" "\nWhich partition on $device do you want to resize?" $PARTS && [[ $part ]]; then + num="${part: -1}" + end=$(parted -s "$device" print | awk '/^\s*'"$num"'/ {print $3}') + devsize=$(parted -s "$device" print | awk '/Disk '"$device"':/ {print $3}') + fs=$(lsblk -lno FSTYPE "$part") + case "$fs" in + ext[2-4]|ntfs) + mount "$part" $MNT >/dev/null 2>&1 + sleep 0.5 + min=$(df "$part" | awk '/'"${part//\//\\/}"'/ {print int($3 / 1024)}') # used + max=$(df "$part" | awk '/'"${part//\//\\/}"'/ {print int($4 / 1024)}') # available + def=$((max / 2)) # 1/2 available + umount $MNT >/dev/null 2>&1 + tput cnorm + if dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Resize: $part " --rangebox "$_resize" 17 "$COLUMNS" "$min" "$max" $def 2>$ANS; then + (( (size = $(< "$ANS") * 1024) + 1025 <= max )) || return 1 + size=$(( (size / 4) * 4 )) + else + return 1 + fi + clear + case "$fs" in + ext[2-4]) + e2fsck -f "$part" + sleep 0.5 + resize2fs -f "$part" ${size}K 2>$ERR + errshow "resize2fs -f $part ${size}K" || return 1 + ;; + ntfs) + ntfsresize -f -s ${size}K "$part" 2>$ERR + errshow "ntfsresize -f -s ${size}K $part" || return 1 + ;; + esac + sleep 0.5 + size=$(( size + 1024 )) + parted "$device" resizepart "$num" ${size}Kib || return 1 + sleep 0.5 + if (( (size += 1) < max )); then + if [[ $devsize == "$end" ]]; then + parted -s "$device" mkpart primary ext4 ${size}Kib 100% 2>$ERR + else + parted -s "$device" mkpart primary ext4 ${size}Kib "$end" 2>$ERR + fi + errshow "parted -s $device mkpart primary ext4 ${size}Kib 100%" || return 1 + fi + sleep 0.5 + msg "Resize Finished" "\nThe resize of $part is now complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE,MOUNTPOINT "$device")\n\n" + ;; + *) + msg "Invalid Filesystem: $fs" "\nResizing currently has support for ext2/3/4 and ntfs filesystems.\n" + ;; + esac + fi } part_device() @@ -936,7 +997,6 @@ part_device() if [[ $DEV_COUNT -eq 1 && $SYS_DEVS ]]; then DEVICE="$(awk '{print $1}' <<< "$SYS_DEVS")" elif (( DEV_COUNT > 1 )); then - tput civis if [[ $1 ]]; then dlg DEVICE menu "Boot Device" "\nSelect the device to use for bootloader install." $SYS_DEVS else @@ -944,7 +1004,7 @@ part_device() fi [[ $DEVICE ]] || return 1 elif [[ $DEV_COUNT -lt 1 && ! $1 ]]; then - msg "Installation Error" "\nNo available devices.\n\nExiting..\n" 2; die 1 + msg "Device Error" "\nNo available devices.\n\nExiting..\n" 2; die 1 fi [[ $1 ]] && BOOT_DEV="$DEVICE" @@ -967,8 +1027,8 @@ part_bootdev() part_cryptlv() { - local part="$1" - local devs="$(lsblk -lno NAME,FSTYPE,TYPE)" + local part="$1" devs="" + devs="$(lsblk -lno NAME,FSTYPE,TYPE)" # Identify if $part is LUKS+LVM, LVM+LUKS, LVM alone, or LUKS alone if lsblk -lno TYPE "$part" | grep -q 'crypt'; then @@ -1071,7 +1131,6 @@ select_menu() select_swap() { - tput civis dlg SWAP_PART 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" \ @@ -1081,12 +1140,10 @@ select_swap() SWAP_PART='' return 0 elif [[ $SWAP_PART == "swapfile" ]]; then - tput cnorm 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" - [ $? -eq 0 ] || { SWAP_PART=''; SWAP_SIZE=''; return 1; } + dlg SWAP_SIZE input "Swap Setup" "$_swapsize" "$SYS_MEM" || { SWAP_PART=''; SWAP_SIZE=''; return 1; } (( i++ )) done part_swap "$MNT/$SWAP_PART" @@ -1124,12 +1181,10 @@ select_mntopts() select_mountpoint() { EXMNT='' - tput cnorm until [[ $EXMNT ]]; do - dlg EXMNT input "Extra Mount $part" "$_exmnt" "/" - [ $? -eq 0 ] || return 1 + dlg EXMNT input "Extra Mount $part" "$_exmnt" "/" || return 1 if [[ ${EXMNT:0:1} != "/" || ${#EXMNT} -le 1 || $EXMNT =~ \ |\' || $EXMNTS == *"$EXMNT"* ]]; then - msg "Installation Error" "$_errexpart" + msg "Mountpoint Error" "$_errexpart" EXMNT='' fi done @@ -1138,17 +1193,16 @@ select_mountpoint() select_filesystem() { - local part="$1" fs='' - local cur="$(lsblk -lno FSTYPE "$part" 2>/dev/null)" + local part="$1" fs='' cur='' local txt="\nSelect which filesystem to use for: $part\n\nDefault: ext4" + cur="$(lsblk -lno FSTYPE "$part" 2>/dev/null)" until [[ $fs ]]; do if [[ $cur && ($part != "$ROOT_PART" || $FORMATTED == *"$part"*) ]]; then - dlg fs menu "Filesystem" "$txt\nCurrent: $cur" skip - ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - + 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 - + dlg fs menu "Filesystem" "$txt" ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1 fi - [ $? -eq 0 ] || return 1 [[ $fs == 'skip' ]] && return 0 yesno "Filesystem" "\nFormat $part as $fs?\n" || fs='' done @@ -1157,8 +1211,6 @@ select_filesystem() select_efi_partition() { - tput civis - if (( COUNT == 1 )); then BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$PARTS")" elif [[ $AUTO_BOOT_PART ]]; then @@ -1229,7 +1281,6 @@ select_extra_partitions() while (( COUNT > 0 )); do part='' - tput civis dlg part menu 'Mount Boot' "$_expart" 'done' 'finish mounting step' $PARTS if [[ $part == 'done' || -z $part ]]; then break @@ -1279,7 +1330,7 @@ install_main() pacman "${EDIT_FILES[pacman]}" \ login "${EDIT_FILES[login]}" - if [[ -z $choice || $choice == "finished" ]]; then + if [[ -z $choice || $choice == 'finished' ]]; then [[ $DEBUG == true && -r $DBG ]] && vim $DBG die 127 else @@ -1299,7 +1350,7 @@ install_main() install_base() { if [[ $RSYNC_PID || $MIRROR_PID ]]; then - 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 clear printf "\nBackground install process is currently running...\n" sleep 1 @@ -1310,23 +1361,28 @@ install_base() rsync -ahv /run/archiso/sfs/airootfs/ $MNT/ 2>$ERR errshow 1 "rsync -ahv /run/archiso/sfs/airootfs/ $MNT/" install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" + chrun "pacman -Syyu --noconfirm" + chrun "pacman -S $BASE_PKGS --needed --noconfirm" else mkdir -p /etc/pacman.d/mirrorlist install_mirrorlist "/etc/pacman.d/mirrorlist" - pacstrap $MNT base $UCODE $ISO_BASE 2>$ERR - errshow 1 "pacstrap $MNT base $KERNEL $UCODE $ISO_BASE $BASE_PKGS" + 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" + chrun "pacman -S $BASE_PKGS --needed --noconfirm" fi rm -rf $MNT/etc/mkinitcpio-archiso.conf find $MNT/usr/lib/initcpio -name 'archiso*' -type f -delete sed -i 's/volatile/auto/g' $MNT/etc/systemd/journald.conf + find $MNT/boot -name '*-ucode.img' -delete + if [[ $VM ]]; then - rm -rfv $MNT/etc/X11/xorg.conf.d/*?.conf - sleep 1 - elif [[ "$(lspci | grep ' VGA ' | grep 'Intel')" ]]; then + find $MNT/etc/X11/xorg.conf.d/ -name '*.conf' -delete + elif lspci | grep ' VGA ' | grep -q 'Intel'; then cat > $MNT/etc/X11/xorg.conf.d/20-intel.conf << EOF Section "Device" Identifier "Intel Graphics" @@ -1336,18 +1392,13 @@ EndSection EOF fi - if [[ -e /run/archiso/sfs/airootfs ]]; then - [[ $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux - [[ $UCODE && -e "$RUN/${UCODE/-/_}.img" ]] && cp -vf $RUN/${UCODE/-/_}.img $MNT/boot/$UCODE.img - fi + [[ -e /run/archiso/sfs/airootfs && $KERNEL == 'linux' ]] && cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux cp -fv /etc/resolv.conf $MNT/etc/ - if [[ -e /etc/NetworkManager/system-connections ]]; then - cp -rvf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/ - fi + [[ -e /etc/NetworkManager/system-connections ]] && cp -rvf /etc/NetworkManager/system-connections $MNT/etc/NetworkManager/ echo "LANG=$MYLOCALE" > $MNT/etc/locale.conf - echo "LANG=$MYLOCALE" > $MNT/etc/default/locale + cp -f $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 chrun "locale-gen" chrun "ln -svf /usr/share/zoneinfo/$ZONE/$SUBZ /etc/localtime" @@ -1383,7 +1434,6 @@ EOF ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF - } install_boot() @@ -1397,8 +1447,8 @@ install_boot() fi if [[ $SYS == 'UEFI' ]]; then - find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete >/dev/null 2>&1 - find $MNT/$BOOTDIR/EFI/ -maxdepth 1 -mindepth 1 -iname 'boot' -type d -delete >/dev/null 2>&1 + 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 fi prerun_$BOOTLDR @@ -1478,7 +1528,7 @@ EOF fi [[ $INSTALL_WMS == *dwm* ]] && install_suckless - [[ $LOGIN_WM =~ (startkde|gnome-session) ]] && sed -i '/super/d' $HOME/.xprofile /root/.xprofile + [[ $LOGIN_WM =~ (startkde|gnome-session) ]] && sed -i '/super/d' $MNT/home/$NEWUSER/.xprofile /root/.xprofile return 0 } @@ -1547,7 +1597,7 @@ EOF install_packages() { - local inpkg="$BASE_PKGS $PACKAGES $USER_PKGS" + local inpkg="$PACKAGES $USER_PKGS" local rmpkg="" if pacman -Qsq 'archlabs-installer' >/dev/null 2>&1; then @@ -1556,6 +1606,7 @@ install_packages() rm -f "$MNT/usr/bin/archlabs-installer" fi + [[ $UCODE ]] && inpkg+="$UCODE" [[ $MYSHELL == *mksh ]] && inpkg+=" mksh" [[ $KERNEL == 'linux' ]] || { inpkg+=" $KERNEL"; rmpkg+=" linux"; } @@ -1563,8 +1614,8 @@ install_packages() [[ $inpkg =~ (term|urxvt|tilix|alacritty|sakura|tilda|plasma|cinnamon) || $INSTALL_WMS == *dwm* ]] || inpkg+=" xterm" [[ $MYSHELL == '/usr/bin/zsh' ]] && inpkg+=" zsh-completions" - [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|dwm|fluxbox) ]] && inpkg+=" $WM_BASE_PKGS" [[ $INSTALL_WMS =~ ^(plasma|gnome|cinnamon)$ ]] || inpkg+=" archlabs-ksuperkey" + [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|dwm|fluxbox) ]] && inpkg+=" $WM_BASE_PKGS" chrun "pacman -Syyu --noconfirm" @@ -1575,7 +1626,11 @@ install_packages() chrun "pacman -S $inpkg --needed --noconfirm" if [[ $BOOTLDR == 'grub' ]]; then - chrun "pacman -S grub os-prober efibootmgr --needed --noconfirm" + if [[ $SYS == 'BIOS' ]]; then + chrun "pacman -S grub os-prober --needed --noconfirm" + else + chrun "pacman -S grub os-prober efibootmgr --needed --noconfirm" + fi elif [[ $BOOTLDR == 'refind-efi' ]]; then chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" elif [[ $SYS == 'UEFI' ]]; then @@ -1594,12 +1649,12 @@ install_suckless() if chrun "git clone https://bitbucket.org/natemaia/$i /home/$NEWUSER/suckless/$i"; then chrun "cd /home/$NEWUSER/suckless/$i; rm -f config.h; make clean install; make clean" else - printf "failed to clone $i repo\n" + printf "failed to clone %s repo\n" "$i" fi done if [[ -d $MNT/home/$NEWUSER/suckless/dwm && -x $MNT/usr/bin/dwm ]]; then - printf "To configure dwm edit /home/$NEWUSER/suckless/dwm/config.h\n" + printf "To configure dwm edit %s\n" "/home/$NEWUSER/suckless/dwm/config.h" printf "You can then recompile it with 'sudo make clean install'\n" sleep 2 fi @@ -1620,9 +1675,9 @@ install_mirrorlist() { mfile="$1" - if hash reflector; then + if hash reflector >/dev/null 2>&1; then reflector --score 120 -l 50 -f 5 --sort rate --save "$mfile" - elif hash rankmirrors; then + elif hash rankmirrors >/dev/null 2>&1; then i="$(json 'ip' "check&?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=ip")" c="$(json 'country_code' "${i}?access_key=5f29642060ab983b31fdf4c2935d8c56&fields=country_code")" if [[ $c && $c =~ (CA|US) ]]; then @@ -1643,7 +1698,7 @@ install_background() yesno "Background Install" "\nA portion of the install can be done in the background while you continue.\n\nUtilize background install?\n" || return 0 rsync -a /run/archiso/sfs/airootfs/ $MNT/ & RSYNC_PID=$! - ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" ) >/dev/null 2>&1 & + ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" && chrun "pacman -Syyu --noconfirm" && chrun "pacman -S $BASE_PKGS --needed --noconfirm" ) >/dev/null 2>&1 & MIRROR_PID=$! trap "kill $RSYNC_PID 2>/dev/null; kill $MIRROR_PID 2>/dev/null" EXIT fi @@ -1666,7 +1721,6 @@ setup_grub() fi 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 fi @@ -1880,7 +1934,7 @@ lvm_menu() case "$choice" in "$_lvmnew") lvm_create || return 1 ;; "$_lvmdel") lvm_delgroup && yesno "$_lvmdel" "$_lvmdelask" && vgremove -f "$DEL_VG" >/dev/null 2>&1 ;; - "$_LvMDelAll") lvm_del_all ;; + "$_lvmdelall") lvm_del_all ;; esac return 0 @@ -1888,8 +1942,9 @@ lvm_menu() lvm_detect() { - local pv="$(pvs -o pv_name --noheading 2>/dev/null)" - local v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)" + 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 @@ -1922,6 +1977,7 @@ lvm_create() get_lv_size() { local txt="${VGROUP}: ${SIZE}$SIZE_UNIT (${VGROUP_MB}MB remaining).$_lvmlvsize" + while true; do ERR_SIZE=0 dlg VOLUME_SIZE input "$_lvmnew (LV:$VOL_COUNT)" "$txt" '' @@ -1948,7 +2004,11 @@ get_lv_size() esac fi fi - (( ! ERR_SIZE )) && break || msg "Invalid Logical Volume Size" "$_lvmerrlvsize" + if (( ERR_SIZE )); then + msg "Invalid Logical Volume Size" "$_lvmerrlvsize" + else + break + fi done return $ERR_SIZE @@ -1983,8 +2043,9 @@ lvm_mkgroup() lvm_del_all() { - local pv="$(pvs -o pv_name --noheading 2>/dev/null)" - local v="$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)" + 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 @@ -2008,7 +2069,7 @@ lvm_delgroup() for i in $(lvs --noheadings | awk '{print $2}' | uniq); do VOL_GROUP_LIST+="$i $(vgdisplay "$i" | awk '/VG Size/ {print $3$4}') " done - [[ $VOL_GROUP_LIST ]] || { msg "Installation Error" "\nNo volume groups found."; return 1; } + [[ $VOL_GROUP_LIST ]] || { msg "No Groups" "\nNo volume groups found."; return 1; } dlg DEL_VG menu "Logical Volume Management" "\nSelect volume group to delete.\n\nAll logical volumes within will also be deleted." $VOL_GROUP_LIST [[ $DEL_VG ]] @@ -2037,17 +2098,15 @@ lvm_partitions() lvm_group_name() { VGROUP='' - until [[ $VGROUP ]]; do dlg VGROUP input "$_lvmnew" "$_lvmvgname" "mygroup" if [[ -z $VGROUP ]]; then return 1 - elif [[ ${VGROUP:0:1} == "/" || $VGROUP =~ \ |\' ]] || grep -q "$VGROUP" <<< "$(lsblk)"; then - msg "Installation Error" "$_lvmerrvgname" + elif [[ ${VGROUP:0:1} == "/" || $VGROUP =~ \ |\' ]] || lsblk | grep -q "$VGROUP"; then + msg "LVM Name Error" "$_lvmerrvgname" VGROUP='' fi done - return 0 } @@ -2060,8 +2119,8 @@ lvm_volume_name() dlg VNAME input "$_lvmnew (LV:$VOL_COUNT)" "\n$txt" "$default" if [[ -z $VNAME ]]; then return 1 - elif [[ ${VNAME:0:1} == "/" || $VNAME =~ \ |\' ]] || grep -q "$VNAME" <<< "$(lsblk)"; then - msg "Installation Error" "$_lvmerlvname" + elif [[ ${VNAME:0:1} == "/" || $VNAME =~ \ |\' ]] || lsblk | grep -q "$VNAME"; then + msg "LVM Name Error" "$_lvmerlvname" VNAME='' fi done @@ -2092,7 +2151,7 @@ luks_menu() luks_open() { - modprobe -a dm-mod dm_crypt + modprobe -a dm-mod dm_crypt >/dev/null 2>&1 umount_dir $MNT part_find 'part|crypt|lvm' || return 1 @@ -2106,7 +2165,7 @@ luks_open() luks_pass "$_luksopen" || return 1 msg "$_luksopen" "\nOpening encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0 - cryptsetup open --type luks $LUKS_PART "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR + cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR errshow "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1 LUKS='encrypted'; luks_show return 0 @@ -2121,17 +2180,16 @@ luks_pass() i=0 tput cnorm if [[ $op ]]; then - dialog --cr-wrap --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $title " \ + dialog --insecure --backtitle "$DIST Installer - $SYS - v$VER" --separator $'\n' --title " $t " \ --mixedform "\nEnter the password to decrypt $ROOT_PART\n\nThis is needed to create a keyfile." 0 0 0 \ - "Password:" 1 1 '' 1 11 $COLUMNS 0 1 \ - "Password2:" 2 1 '' 2 12 $COLUMNS 0 1 2>"$ANS" || return 1 + "Password:" 1 1 '' 1 11 "$COLUMNS" 0 1 \ + "Password2:" 2 1 '' 2 12 "$COLUMNS" 0 1 2>"$ANS" || return 1 else - dialog --cr-wrap --insecure --backtitle "$DIST Installer - $SYS - v$VER" \ - --separator $'\n' --title " $title " --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 + 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 fi @@ -2168,12 +2226,12 @@ luks_pass() luks_show() { sleep 0.5 - msg "$_luksnew" "\nEncrypted partition opened and ready for mounting.\n\n$(lsblk $LUKS_PART -o NAME,MODEL,SIZE,TYPE,FSTYPE)\n\n" + msg "$_luksnew" "\nEncrypted partition opened and ready for mounting.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$LUKS_PART")\n\n" } luks_setup() { - modprobe -a dm-mod dm_crypt + modprobe -a dm-mod dm_crypt >/dev/null 2>&1 umount_dir $MNT part_find 'part|lvm' || return 1 @@ -2193,9 +2251,9 @@ luks_basic() { 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 + 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 + cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1 LUKS='encrypted'; luks_show return 0 @@ -2224,9 +2282,9 @@ luks_advanced() 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 + 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 + cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2>$ERR errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1 luks_show return 0 @@ -2245,7 +2303,6 @@ ofn() die() { local exitcode="$1" - trap - INT tput cnorm if [[ -d $MNT ]] && command cd /; then @@ -2265,51 +2322,45 @@ die() printf "%b" "${colors[@]}" && clear && unset col fi - exit $exitcode + exit "$exitcode" } dlg() { - local var="$1" btype="$2" title="$3" body="$4" n=0 + local var="$1" dialog_type="$2" title="$3" body="$4" n=0 shift 4 (( ($# / 2) > SHL )) && n=$SHL - case "$btype" in + tput civis + case "$dialog_type" in menu) - tput civis - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --title " $title " --menu "$body" 0 0 $n "$@" 2>"$ANS" + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --menu "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;; check) - tput civis - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --title " $title " --checklist "$body" 0 0 $n "$@" 2>"$ANS" + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --checklist "$body" 0 0 $n "$@" 2>"$ANS" || return 1 ;; input) tput cnorm - local default="$1" + local def="$1" shift if [[ $1 == 'limit' ]]; then - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --max-input 63 --title " $title " --inputbox "$body" 0 0 "$default" 2>"$ANS" + dialog --backtitle "$DIST Installer - $SYS - v$VER" --max-input 63 --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1 else - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --title " $title " --inputbox "$body" 0 0 "$default" 2>"$ANS" + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --inputbox "$body" 0 0 "$def" 2>"$ANS" || return 1 fi ;; esac - [ $? -eq 0 ] && [ -s "$ANS" ] && printf -v $var "%s" "$(< "$ANS")" + [[ -s "$ANS" ]] && printf -v "$var" "%s" "$(< "$ANS")" } msg() { local title="$1" body="$2" - tput civis if (( $# == 3 )); then - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --sleep $3 --title " $title " --infobox "$body\n" 0 0 + dialog --backtitle "$DIST Installer - $SYS - v$VER" --sleep "$3" --title " $title " --infobox "$body\n" 0 0 else - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --msgbox "$body\n" 0 0 + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --msgbox "$body\n" 0 0 fi } @@ -2321,17 +2372,13 @@ json() yesno() { local title="$1" body="$2" yes='Yes' no='No' - (( $# >= 3 )) && local yes="$3" (( $# >= 4 )) && local no="$4" - tput civis if (( $# == 5 )); then - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" --defaultno \ - --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0 + dialog --backtitle "$DIST Installer - $SYS - v$VER" --defaultno --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0 else - dialog --cr-wrap --backtitle "$DIST Installer - $SYS - v$VER" \ - --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0 + dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " $title " --yes-label "$yes" --no-label "$no" --yesno "$body\n" 0 0 fi } @@ -2375,13 +2422,12 @@ print4() errshow() { - [ $? -eq 0 ] && return 0 - - local fatal=0 - local err="$(sed 's/[^[:print:]]//g; s/\[[0-9\;:]*\?m//g; s/==> //g; s/] ERROR:/]\nERROR:/g' "$ERR")" + exit_code="$?" + (( exit_code == 0 )) && return 0 + local fatal=0 err="" + err="$(sed 's/[^[:print:]]//g; s/\[[0-9\;:]*\?m//g; s/==> //g; s/] ERROR:/]\nERROR:/g' "$ERR")" (( $1 == 1 )) && { fatal=1; shift; } - local txt="\nThe command exited abnormally:\n\n$1\n\n" if [[ $err ]]; then @@ -2438,7 +2484,7 @@ prechecks() umount_dir() { swapoff -a - [[ -d $1 ]] && umount -R $1 >/dev/null 2>&1 + [[ -d $1 ]] && umount -R "$1" >/dev/null 2>&1 return 0 } @@ -2476,7 +2522,7 @@ system_devices() fi if [[ -z $SYS_DEVS ]]; then - msg "Installation Error" "\nNo available devices...\n\nExiting..\n" 2 + msg "Device Error" "\nNo available devices...\n\nExiting..\n" 2 die 1 fi @@ -2496,13 +2542,9 @@ system_identify() UCODE="intel-ucode" fi - if grep -qi 'apple' /sys/class/dmi/id/sys_vendor; then - modprobe -r -q efivars - else - modprobe -q efivarfs - fi + modprobe -q efivarfs >/dev/null 2>&1 - _prep="\nTo begin the install you must first have:\n\n - A root (/) partition mounted." + _prep="\nWelcome to the installer primary menu.\nOnce a step is finished a step you will be returned here, if the step was successful (ie. no errors were encountered) the cursor will be advanced to the next step.\nIf a step is unsuccessful the cursor will be placed on the step required to advance (when possible).\nTo begin the install you should have:\n\n - A root (/) partition mounted." 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 @@ -2510,8 +2552,9 @@ system_identify() else export SYS="BIOS" fi - _prep+="\n - The system bootloader selected.\n - A new user created and passwords set." - _prep+="\n - The system configuration finished.\n\nOnce the above are met the install can be started." + _prep+="\n\nOnce finished mounting, a portion of the install can be done in the background while you continue configuring the system:\n" + _prep+="\n - Choose the system bootloader.\n - Create a user and password." + _prep+="\n - Basic system configuration, kernel, shell, login, packages, etc..\n\nLastly once you're happy with your choices and the required steps are complete, the main install can be started." } check_background_install() @@ -2539,7 +2582,7 @@ trap sigint INT system_identify system_devices -msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST setup on your system.\nHaving GNU/Linux experience is an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n" +msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST setup on your system.\nHaving previous GNU/Linux and shell experience will be an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will usually be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n" select_keymap || { clear; die 0; } diff --git a/install.sh b/install.sh index ec4774b..ceee5d4 100755 --- a/install.sh +++ b/install.sh @@ -1,17 +1,12 @@ #!/bin/bash - if (( UID != 0 )); then printf "privilege escalation required\n" su -c 'hash git >/dev/null 2>&1 || pacman -Syy git - git clone --depth=1 https://bitbucket.org/archlabslinux/installer && - cp -fv installer/archlabs-installer /usr/bin/ && rm -rf installer' - + git clone --depth=1 https://bitbucket.org/archlabslinux/installer && cp -fv installer/archlabs-installer /usr/bin/ && rm -rf installer' else hash git >/dev/null 2>&1 || pacman -Syy git - git clone --depth=1 https://bitbucket.org/archlabslinux/installer && - cp -fv installer/archlabs-installer /usr/bin/ && rm -rf installer - + git clone --depth=1 https://bitbucket.org/archlabslinux/installer && cp -fv installer/archlabs-installer /usr/bin/ && rm -rf installer fi [ $? -eq 0 ] && printf "\nInstall complete\n"