diff --git a/PKGBUILD b/PKGBUILD index 16a4b97..df6bbd6 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: Chrysostomus @forum.manjaro.org pkgname=manjaro-architect -pkgver=0.1 +pkgver=0.2 pkgrel=1 pkgdesc="A clone of architect installer modified to install manjaro instead of arch linux" arch=(any) @@ -20,6 +20,7 @@ md5sums=('SKIP') package () { cd "$srcdir/aif-dev" install -Dm755 "$srcdir/aif-dev/aif" "$pkgdir/usr/bin/aif" + install -Dm755 "$srcdir/aif-dev/manjaro-architect" "$pkgdir/usr/bin/manjaro-architect" install -dm655 $pkgdir/usr/share/aif/package-lists install -dm655 $pkgdir/usr/share/aif/translations cp -r $srcdir/aif-dev/package-lists/ "$pkgdir/usr/share/aif/" diff --git a/aif b/aif index 294e943..4502786 100755 --- a/aif +++ b/aif @@ -4,157 +4,155 @@ # # Written by Carl Duff for Architect Linux # -# Modified by Chrysostomus to install manjaro instead -# # This program is free software, provided under the GNU General Public License # as published by the Free Software Foundation. So feel free to copy, distribute, # or modify it as you wish. # -# + ###################################################################### -## ## -## Installer Variables ## -## ## +## ## +## Installer Variables ## +## ## ###################################################################### # Temporary files to store menu selections -ANSWER="/tmp/.aif" # Basic menu selections -PACKAGES="/tmp/.pkgs" # Packages to install -MOUNT_OPTS="/tmp/.mnt_opts" # Filesystem Mount options -INIT="/tmp/.init" +ANSWER="/tmp/.aif" # Basic menu selections +PACKAGES="/tmp/.pkgs" # Packages to install +MOUNT_OPTS="/tmp/.mnt_opts" # Filesystem Mount options + # Save retyping VERSION="Architect Installation Framework 2.3.1" # Installation -DM_INST="" # Which DMs have been installed? -DM_ENABLED=0 # Has a display manager been enabled? -NM_INST="" # Which NMs have been installed? -NM_ENABLED=0 # Has a network connection manager been enabled? -KERNEL="n" # Kernel(s) installed (base install); kernels for mkinitcpio -GRAPHIC_CARD="" # graphics card -INTEGRATED_GC="" # Integrated graphics card for NVIDIA -NVIDIA_INST=0 # Indicates if NVIDIA proprietary driver has been installed -NVIDIA="" # NVIDIA driver(s) to install depending on kernel(s) -VB_MOD="" # headers packages to install depending on kernel(s) -SHOW_ONCE=0 # Show de_wm information only once -COPY_PACCONF=0 # Copy over installer /etc/pacman.conf to installed system? +DM_INST="" # Which DMs have been installed? +DM_ENABLED=0 # Has a display manager been enabled? +NM_INST="" # Which NMs have been installed? +NM_ENABLED=0 # Has a network connection manager been enabled? +KERNEL="n" # Kernel(s) installed (base install); kernels for mkinitcpio +GRAPHIC_CARD="" # graphics card +INTEGRATED_GC="" # Integrated graphics card for NVIDIA +NVIDIA_INST=0 # Indicates if NVIDIA proprietary driver has been installed +NVIDIA="" # NVIDIA driver(s) to install depending on kernel(s) +VB_MOD="" # headers packages to install depending on kernel(s) +SHOW_ONCE=0 # Show de_wm information only once +COPY_PACCONF=0 # Copy over installer /etc/pacman.conf to installed system? # Mounting -MOUNTPOINT="/mnt" # Installation: Root mount -MOUNT="" # Installation: All other mounts branching from Root -FS_OPTS="" # File system special mount options available -CHK_NUM=16 # Used for FS mount options checklist length -INCLUDE_PART='part\|lvm\|crypt' # Partition types to include for display and selection. -ROOT_PART="" # ROOT partition -UEFI_PART="" # UEFI partition -UEFI_MOUNT="" # UEFI mountpoint (/boot or /boot/efi) +MOUNTPOINT="/mnt" # Installation: Root mount +MOUNT="" # Installation: All other mounts branching from Root +FS_OPTS="" # File system special mount options available +CHK_NUM=16 # Used for FS mount options checklist length +INCLUDE_PART='part\|lvm\|crypt' # Partition types to include for display and selection. +ROOT_PART="" # ROOT partition +UEFI_PART="" # UEFI partition +UEFI_MOUNT="" # UEFI mountpoint (/boot or /boot/efi) # Architecture -ARCHI=$(uname -m) # Display whether 32 or 64 bit system -SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown" +ARCHI=$(uname -m) # Display whether 32 or 64 bit system +SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown" # Menu highlighting (automated step progression) -HIGHLIGHT=0 # Highlight items for Main Menu -HIGHLIGHT_SUB=0 # Highlight items for submenus -SUB_MENU="" # Submenu to be highlighted +HIGHLIGHT=0 # Highlight items for Main Menu +HIGHLIGHT_SUB=0 # Highlight items for submenus +SUB_MENU="" # Submenu to be highlighted # Logical Volume Management -LVM=0 # Logical Volume Management Detected? -LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM -LVM_VG="" # Name of volume group to create or use -LVM_VG_MB=0 # MB remaining of VG -LVM_LV_NAME="" # Name of LV to create or use -LV_SIZE_INVALID=0 # Is LVM LV size entered valid? -VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes? +LVM=0 # Logical Volume Management Detected? +LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM +LVM_VG="" # Name of volume group to create or use +LVM_VG_MB=0 # MB remaining of VG +LVM_LV_NAME="" # Name of LV to create or use +LV_SIZE_INVALID=0 # Is LVM LV size entered valid? +VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes? # LUKS -LUKS=0 # Luks Used? -LUKS_DEV="" # If encrypted, partition -LUKS_NAME="" # Name given to encrypted partition -LUKS_UUID="" # UUID used for comparison purposes -LUKS_OPT="" # Default or user-defined? +LUKS=0 # Luks Used? +LUKS_DEV="" # If encrypted, partition +LUKS_NAME="" # Name given to encrypted partition +LUKS_UUID="" # UUID used for comparison purposes +LUKS_OPT="" # Default or user-defined? # Locale and Language -CURR_LOCALE="en_US.UTF-8" # Default Locale -FONT="" # Set new font if necessary -KEYMAP="us" # Virtual console keymap. Default is "us" -XKBMAP="us" # X11 keyboard layout. Default is "us" -ZONE="" # For time -SUBZONE="" # For time -LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8" +CURR_LOCALE="en_US.UTF-8" # Default Locale +FONT="" # Set new font if necessary +KEYMAP="us" # Virtual console keymap. Default is "us" +XKBMAP="us" # X11 keyboard layout. Default is "us" +ZONE="" # For time +SUBZONE="" # For time +LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8" # Edit Files -FILE="" # File(s) to be reviewed +FILE="" # File(s) to be reviewed ###################################################################### -## ## -## Core Functions ## -## ## +## ## +## Core Functions ## +## ## ###################################################################### # Add locale on-the-fly and sets source translation file for installer select_language() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Select Language " --menu "\nLanguage / sprache / taal / språk / lingua / idioma / nyelv / língua" 0 0 9 \ + "1" $"English (en_**)" \ + "2" $"Español (es_ES)" \ + "3" $"Português [Brasil] (pt_BR)" \ + "4" $"Português (pt_PT)" \ + "5" $"Français (fr_FR)" \ + "6" $"Russkiy (ru_RU)" \ + "7" $"Italiano (it_IT)" \ + "8" $"Nederlands (nl_NL)" \ + "9" $"Magyar (hu_HU)" 2>${ANSWER} - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Select Language " --menu "\nLanguage" 0 0 9 \ - "1" $"English (en_**)" \ - "2" $"Español (es_ES)" \ - "3" $"Português [Brasil] (pt_BR)" \ - "4" $"Português (pt_PT)" \ - "5" $"Français (fr_FR)" \ - "6" $"Russkiy (ru_RU)" \ - "7" $"Italiano (it_IT)" \ - "8" $"Nederlands (nl_NL)" \ - "9" $"Magyar (hu_HU)" 2>${ANSWER} - - case $(cat ${ANSWER}) in - "1") source /usr/share/aif/translations/english.trans + case $(cat ${ANSWER}) in + "1") source /aif-dev-master/english.trans CURR_LOCALE="en_US.UTF-8" ;; - "2") source /usr/share/aif/translations/spanish.trans + "2") source /aif-dev-master/spanish.trans CURR_LOCALE="es_ES.UTF-8" - ;; - "3") source /usr/share/aif/translations/portuguese_brasil.trans - CURR_LOCALE="pt_BR.UTF-8" - ;; - "4") source /usr/share/aif/translations/portuguese.trans - CURR_LOCALE="pt_PT.UTF-8" - ;; - "5") source /usr/share/aif/translations/french.trans + ;; + "3") source /aif-dev-master/portuguese_brasil.trans + CURR_LOCALE="pt_BR.UTF-8" + ;; + "4") source /aif-dev-master/portuguese.trans + CURR_LOCALE="pt_PT.UTF-8" + ;; + "5") source /aif-dev-master/french.trans CURR_LOCALE="fr_FR.UTF-8" - ;; - "6") source /usr/share/aif/translations/russian.trans + ;; + "6") source /aif-dev-master/russian.trans CURR_LOCALE="ru_RU.UTF-8" FONT="LatKaCyrHeb-14.psfu" ;; - "7") source /usr/share/aif/translations/italian.trans + "7") source /aif-dev-master/italian.trans CURR_LOCALE="it_IT.UTF-8" ;; - "8") source /usr/share/aif/translations/dutch.trans + "8") source /aif-dev-master/dutch.trans CURR_LOCALE="nl_NL.UTF-8" ;; - "9") source /usr/share/aif/translations/hungarian.trans + "9") source /aif-dev-master/hungarian.trans CURR_LOCALE="hu_HU.UTF-8" FONT="lat2-16.psfu" ;; -# "4") source /usr/share/aif/translations/turkish.trans +# "4") source /aif-dev-master/turkish.trans # CURR_LOCALE="tr_TR.UTF-8" # FONT="LatKaCyrHeb-14.psfu" -# ;; -# "6") source /usr/share/aif/translations/greek.trans +# ;; +# "6") source /aif-dev-master/greek.trans # CURR_LOCALE="el_GR.UTF-8" -# FONT="iso07u-16.psfu" +# FONT="iso07u-16.psfu" # ;; -# "12") source /usr/share/aif/translations/polish.trans +# "12") source /aif-dev-master/polish.trans # CURR_LOCALE="pl_PL.UTF-8" # FONT="latarcyrheb-sun16" # ;; *) exit 0 ;; esac - + # Generate the chosen locale and set the language sed -i "s/#${CURR_LOCALE}/${CURR_LOCALE}/" /etc/locale.gen locale-gen >/dev/null 2>&1 @@ -162,43 +160,31 @@ select_language() { [[ $FONT != "" ]] && setfont $FONT } -set_lightdm_greeter(){ - local greeters=$(ls /mnt/usr/share/xgreeters/*greeter.desktop) name - for g in ${greeters[@]};do - name=${g##*/} - name=${name%%.*} - case ${name} in - lightdm-gtk-greeter) break ;; - lightdm-*-greeter) - sed -i -e "s/^.*greeter-session=.*/greeter-session=${name}/" /mnt/etc/lightdm/lightdm.conf - ;; - esac - done -} + # Check user is root, and that there is an active internet connection # Seperated the checks into seperate "if" statements for readability. check_requirements() { - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ChkTitle " --infobox "$_ChkBody" 0 0 sleep 2 - + if [[ `whoami` != "root" ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_Erritle " --infobox "$_RtFailBody" 0 0 sleep 2 exit 1 fi - + if [[ ! $(ping -c 1 google.com) ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --infobox "$_ConFailBody" 0 0 sleep 2 exit 1 fi - + # This will only be executed where neither of the above checks are true. # The error log is also cleared, just in case something is there from a previous use of the installer. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ReqMetTitle " --infobox "$_ReqMetBody" 0 0 - sleep 2 + sleep 2 clear echo "" > /tmp/.errlog pacman -Syy @@ -207,14 +193,14 @@ check_requirements() { # Adapted from AIS. Checks if system is made by Apple, whether the system is BIOS or UEFI, # and for LVM and/or LUKS. id_system() { - + # Apple System Detection if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then modprobe -r -q efivars || true # if MAC else modprobe -q efivarfs # all others fi - + # BIOS or UEFI Detection if [[ -d "/sys/firmware/efi/" ]]; then # Mount efivarfs if it is not already mounted @@ -225,15 +211,15 @@ id_system() { else SYSTEM="BIOS" fi + - -} - +} + # Adapted from AIS. An excellent bit of code! arch_chroot() { arch-chroot $MOUNTPOINT /bin/bash -c "${1}" -} +} # If there is an error, display it, clear the log and then go back to the main menu (no point in continuing). check_for_error() { @@ -243,7 +229,7 @@ check_for_error() { echo "" > /tmp/.errlog main_menu_online fi - + } # Ensure that a partition is mounted @@ -263,7 +249,7 @@ check_base() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoBase" 0 0 main_menu_online fi - + } # Simple code to show devices / partitions. @@ -273,20 +259,20 @@ show_devices() { } ###################################################################### -## ## -## Configuration Functions ## -## ## +## ## +## Configuration Functions ## +## ## ###################################################################### # Originally adapted from AIS. Added option to allow users to edit the mirrorlist. configure_mirrorlist() { -# Generate a mirrorlist based on the country chosen. +# Generate a mirrorlist based on the country chosen. mirror_by_country() { - BRANCH="/tmp/.branch" + COUNTRY_LIST="" - countries_list="Africa AF Australia AU Austria AT Belarus BY Belgium BE Brasil BR Bulgaria BG Canada CA Chile CL China CN Colombia CO Costa_Rica CR Czech CZ Denmark DK Ecuador EQ France FR Germany DE Greece GR Indonesia ID Ireland IE Italy IT Japan JP Netherlands NL Philippines PH Poland PL Portugal PT Romania RO Russia RU Singapore SG Sweden SE Taiwan TW Turkey TR United_Kingdom GB United_States US Vietnam VN" + countries_list="AU Australia AT Austria BA Bosnia_Herzegovina BY Belarus BE Belgium BR Brazil BG Bulgaria CA Canada CL Chile CN China CO Colombia CZ Czech_Republic DK Denmark EE Estonia FI Finland FR France DE Germany GB United_Kingdom GR Greece HU Hungary IN India IE Ireland IL Israel IT Italy JP Japan KZ Kazakhstan KR Korea LT Lithuania LV Latvia LU Luxembourg MK Macedonia NL Netherlands NC New_Caledonia NZ New_Zealand NO Norway PL Poland PT Portugal RO Romania RU Russia RS Serbia SG Singapore SK Slovakia ZA South_Africa ES Spain LK Sri_Lanka SE Sweden CH Switzerland TW Taiwan TR Turkey UA Ukraine US United_States UZ Uzbekistan VN Vietnam" for i in ${countries_list}; do COUNTRY_LIST="${COUNTRY_LIST} ${i}" @@ -294,18 +280,13 @@ mirror_by_country() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --menu "$_MirrorCntryBody" 0 0 0 $COUNTRY_LIST 2>${ANSWER} || install_base_menu - #URL="https://www.archlinux.org/mirrorlist/?country=$(cat ${ANSWER})&use_mirror_status=on" - #Choose the branch for mirrorlist + URL="https://www.archlinux.org/mirrorlist/?country=$(cat ${ANSWER})&use_mirror_status=on" MIRROR_TEMP=$(mktemp --suffix=-mirrorlist) - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Choose manjaro branch to use " --radiolist " $_UseSpaceBar" 0 0 12 \ - "stable" "-" on \ - "testing" "-" off \ - "unstable" "-" off 2>${BRANCH} # Get latest mirror list and save to tmpfile dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "$_PlsWaitBody" 0 0 - pacman-mirrors -g -b $(cat ${BRANCH}) -c $(cat ${ANSWER}) -o ${MIRROR_TEMP} 2>/tmp/.errlog -# curl -so ${MIRROR_TEMP} ${URL} 2>/tmp/.errlog + + curl -so ${MIRROR_TEMP} ${URL} 2>/tmp/.errlog check_for_error sed -i 's/^#Server/Server/g' ${MIRROR_TEMP} nano ${MIRROR_TEMP} @@ -317,7 +298,7 @@ mirror_by_country() { mv -f ${MIRROR_TEMP} /etc/pacman.d/mirrorlist chmod +r /etc/pacman.d/mirrorlist dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 + sleep 2 else configure_mirrorlist fi @@ -326,49 +307,56 @@ mirror_by_country() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " \ --menu "$_MirrorlistBody" 0 0 6 \ - "1" "$_MirrorbyCountry" \ - "2" "$_MirrorEdit" \ - "3" "$_MirrorRestTitle" \ - "4" "$_MirrorPacman" \ - "5" "$_Back" 2>${ANSWER} + "1" "$_MirrorbyCountry" \ + "2" "$_MirrorRankTitle" \ + "3" "$_MirrorEdit" \ + "4" "$_MirrorRestTitle" \ + "5" "$_MirrorPacman" \ + "6" "$_Back" 2>${ANSWER} case $(cat ${ANSWER}) in "1") mirror_by_country ;; - "2") nano /etc/pacman.d/mirrorlist + "2") dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "$_MirrorRankBody $_PlsWaitBody" 0 0 + cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup + rankmirrors -n 10 /etc/pacman.d/mirrorlist.backup > /etc/pacman.d/mirrorlist 2>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 ;; - "3") if [[ -e /etc/pacman.d/mirrorlist.orig ]]; then - mv -f /etc/pacman.d/mirrorlist.orig /etc/pacman.d/mirrorlist - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --msgbox "\n$_Done!\n\n" 0 0 - else - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_MirrorNoneBody" 0 0 - fi + "3") nano /etc/pacman.d/mirrorlist ;; - "4") nano /etc/pacman.conf - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorPacman " --yesno "$_MIrrorPacQ" 0 0 && COPY_PACCONF=1 || COPY_PACCONF=0 - pacman -Syy - ;; - *) install_base_menu + "4") if [[ -e /etc/pacman.d/mirrorlist.orig ]]; then + mv -f /etc/pacman.d/mirrorlist.orig /etc/pacman.d/mirrorlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --msgbox "\n$_Done!\n\n" 0 0 + else + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_MirrorNoneBody" 0 0 + fi ;; - esac + "5") nano /etc/pacman.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorPacman " --yesno "$_MIrrorPacQ" 0 0 && COPY_PACCONF=1 || COPY_PACCONF=0 + pacman -Syy + ;; + *) install_base_menu + ;; + esac configure_mirrorlist } - # virtual console keymap -set_keymap() { - - KEYMAPS="" +set_keymap() { + + KEYMAPS="" for i in $(ls -R /usr/share/kbd/keymaps | grep "map.gz" | sed 's/\.map\.gz//g' | sort); do KEYMAPS="${KEYMAPS} ${i} -" done - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_VCKeymapTitle " \ - --menu "$_VCKeymapBody" 20 40 16 ${KEYMAPS} 2>${ANSWER} || prep_menu + --menu "$_VCKeymapBody" 20 40 16 ${KEYMAPS} 2>${ANSWER} || prep_menu KEYMAP=$(cat ${ANSWER}) - - loadkeys $KEYMAP 2>/tmp/.errlog + + loadkeys $KEYMAP 2>/tmp/.errlog check_for_error echo -e "KEYMAP=${KEYMAP}\nFONT=${FONT}" > /tmp/vconsole.conf @@ -376,30 +364,30 @@ set_keymap() { # Set keymap for X11 set_xkbmap() { - - XKBMAP_LIST="" - keymaps_xkb=("af al am at az ba bd be bg br bt bw by ca cd ch cm cn cz de dk ee es et eu fi fo fr gb ge gh gn gr hr hu ie il in iq ir is it jp ke kg kh kr kz la lk lt lv ma md me mk ml mm mn mt mv ng nl no np pc ph pk pl pt ro rs ru se si sk sn sy tg th tj tm tr tw tz ua us uz vn za") - - for i in ${keymaps_xkb}; do + + XKBMAP_LIST="" + keymaps_xkb=("af al am at az ba bd be bg br bt bw by ca cd ch cm cn cz de dk ee es et eu fi fo fr gb ge gh gn gr hr hu ie il in iq ir is it jp ke kg kh kr kz la lk lt lv ma md me mk ml mm mn mt mv ng nl no np pc ph pk pl pt ro rs ru se si sk sn sy tg th tj tm tr tw tz ua us uz vn za") + + for i in ${keymaps_xkb}; do XKBMAP_LIST="${XKBMAP_LIST} ${i} -" done - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepKBLayout " --menu "$_XkbmapBody" 0 0 16 ${XKBMAP_LIST} 2>${ANSWER} || install_graphics_menu XKBMAP=$(cat ${ANSWER} |sed 's/_.*//') echo -e "Section "\"InputClass"\"\nIdentifier "\"system-keyboard"\"\nMatchIsKeyboard "\"on"\"\nOption "\"XkbLayout"\" "\"${XKBMAP}"\"\nEndSection" > ${MOUNTPOINT}/etc/X11/xorg.conf.d/00-keyboard.conf - + } # locale array generation code adapted from the Manjaro 0.8 installer set_locale() { - LOCALES="" + LOCALES="" for i in $(cat /etc/locale.gen | grep -v "# " | sed 's/#//g' | sed 's/ UTF-8//g' | grep .UTF-8); do LOCALES="${LOCALES} ${i} -" done - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseSysLoc " --menu "$_localeBody" 0 0 12 ${LOCALES} 2>${ANSWER} || config_base_menu - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseSysLoc " --menu "$_localeBody" 0 0 12 ${LOCALES} 2>${ANSWER} || config_base_menu + LOCALE=$(cat ${ANSWER}) echo "LANG=\"${LOCALE}\"" > ${MOUNTPOINT}/etc/locale.conf @@ -415,20 +403,20 @@ set_timezone() { for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "/" | sed "s/\/.*//g" | sort -ud); do ZONE="$ZONE ${i} -" done - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_TimeZBody" 0 0 10 ${ZONE} 2>${ANSWER} || config_base_menu - ZONE=$(cat ${ANSWER}) - + ZONE=$(cat ${ANSWER}) + SUBZONE="" for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "${ZONE}/" | sed "s/${ZONE}\///g" | sort -ud); do SUBZONE="$SUBZONE ${i} -" done - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_TimeSubZBody" 0 0 11 ${SUBZONE} 2>${ANSWER} || config_base_menu - SUBZONE=$(cat ${ANSWER}) - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --yesno "$_TimeZQ ${ZONE}/${SUBZONE}?" 0 0 - + SUBZONE=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --yesno "$_TimeZQ ${ZONE}/${SUBZONE}?" 0 0 + if [[ $? -eq 0 ]]; then arch_chroot "ln -s /usr/share/zoneinfo/${ZONE}/${SUBZONE} /etc/localtime" 2>/tmp/.errlog check_for_error @@ -438,9 +426,9 @@ set_timezone() { } set_hw_clock() { - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_HwCBody" 0 0 2 \ - "utc" "-" "localtime" "-" 2>${ANSWER} + "utc" "-" "localtime" "-" 2>${ANSWER} [[ $(cat ${ANSWER}) != "" ]] && arch_chroot "hwclock --systohc --$(cat ${ANSWER})" 2>/tmp/.errlog && check_for_error } @@ -449,30 +437,30 @@ set_hw_clock() { generate_fstab() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseFstab " --menu "$_FstabBody" 0 0 4 \ - "fstabgen -p" "$_FstabDevName" \ - "fstabgen -L -p" "$_FstabDevLabel" \ - "fstabgen -U -p" "$_FstabDevUUID" \ - "fstabgen -t PARTUUID -p" "$_FstabDevPtUUID" 2>${ANSWER} - - if [[ $(cat ${ANSWER}) != "" ]]; then - if [[ $SYSTEM == "BIOS" ]] && [[ $(cat ${ANSWER}) == "fstabgen -t PARTUUID -p" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_FstabErr" 0 0 - generate_fstab - else - $(cat ${ANSWER}) ${MOUNTPOINT} > ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog - check_for_error - [[ -f ${MOUNTPOINT}/swapfile ]] && sed -i "s/\\${MOUNTPOINT}//" ${MOUNTPOINT}/etc/fstab - fi - fi - - config_base_menu + "genfstab -p" "$_FstabDevName" \ + "genfstab -L -p" "$_FstabDevLabel" \ + "genfstab -U -p" "$_FstabDevUUID" \ + "genfstab -t PARTUUID -p" "$_FstabDevPtUUID" 2>${ANSWER} + + if [[ $(cat ${ANSWER}) != "" ]]; then + if [[ $SYSTEM == "BIOS" ]] && [[ $(cat ${ANSWER}) == "genfstab -t PARTUUID -p" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_FstabErr" 0 0 + generate_fstab + else + $(cat ${ANSWER}) ${MOUNTPOINT} > ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog + check_for_error + [[ -f ${MOUNTPOINT}/swapfile ]] && sed -i "s/\\${MOUNTPOINT}//" ${MOUNTPOINT}/etc/fstab + fi + fi + + config_base_menu } set_hostname() { - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseHost " --inputbox "$_HostNameBody" 0 0 "manjaro" 2>${ANSWER} || config_base_menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseHost " --inputbox "$_HostNameBody" 0 0 "arch" 2>${ANSWER} || config_base_menu echo "$(cat ${ANSWER})" > ${MOUNTPOINT}/etc/hostname 2>/tmp/.errlog echo -e "#\t\t\n127.0.0.1\tlocalhost.localdomain\tlocalhost\t$(cat ${ANSWER})\n::1\tlocalhost.localdomain\tlocalhost\t$(cat ${ANSWER})" > ${MOUNTPOINT}/etc/hosts 2>>/tmp/.errlog @@ -484,11 +472,11 @@ set_root_password() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrRoot " --clear --insecure --passwordbox "$_PassRtBody" 0 0 2> ${ANSWER} || config_base_menu PASSWD=$(cat ${ANSWER}) - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrRoot " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu PASSWD2=$(cat ${ANSWER}) - - if [[ $PASSWD == $PASSWD2 ]]; then + + if [[ $PASSWD == $PASSWD2 ]]; then echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd arch_chroot "passwd root" < /tmp/.passwd >/dev/null 2>/tmp/.errlog rm /tmp/.passwd @@ -505,101 +493,95 @@ create_new_user() { dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NUsrTitle " --inputbox "$_NUsrBody" 0 0 "" 2>${ANSWER} || config_base_menu USER=$(cat ${ANSWER}) - + # Loop while user name is blank, has spaces, or has capital letters in it. while [[ ${#USER} -eq 0 ]] || [[ $USER =~ \ |\' ]] || [[ $USER =~ [^a-z0-9\ ] ]]; do dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NUsrTitle " --inputbox "$_NUsrErrBody" 0 0 "" 2>${ANSWER} || config_base_menu USER=$(cat ${ANSWER}) done - - # If zsh is installed, use that for users shell - if [[ -e /mnt/usr/bin/zsh ]]; then - shell="zsh" - else - shell="bash" - fi + # Enter password. This step will only be reached where the loop has been skipped or broken. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu - PASSWD=$(cat ${ANSWER}) - + PASSWD=$(cat ${ANSWER}) + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu - PASSWD2=$(cat ${ANSWER}) - + PASSWD2=$(cat ${ANSWER}) + # loop while passwords entered do not match. while [[ $PASSWD != $PASSWD2 ]]; do dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PassErrBody" 0 0 - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu - PASSWD=$(cat ${ANSWER}) - + PASSWD=$(cat ${ANSWER}) + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu - PASSWD2=$(cat ${ANSWER}) - done - - # create new user. This step will only be reached where the password loop has been skipped or broken. + PASSWD2=$(cat ${ANSWER}) + done + + # create new user. This step will only be reached where the password loop has been skipped or broken. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --infobox "$_NUsrSetBody" 0 0 sleep 2 # Create the user, set password, then remove temporary password file - arch_chroot "useradd ${USER} -m -g users -G wheel,storage,power,network,video,audio,lp -s /bin/$shell" 2>/tmp/.errlog + arch_chroot "useradd ${USER} -m -g users -G wheel,storage,power,network,video,audio,lp -s /bin/bash" 2>/tmp/.errlog check_for_error echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd arch_chroot "passwd ${USER}" < /tmp/.passwd >/dev/null 2>/tmp/.errlog rm /tmp/.passwd check_for_error # Set up basic configuration files and permissions for user - #arch_chroot "cp /etc/skel/.bashrc /home/${USER}" + arch_chroot "cp /etc/skel/.bashrc /home/${USER}" arch_chroot "chown -R ${USER}:users /home/${USER}" [[ -e ${MOUNTPOINT}/etc/sudoers ]] && sed -i '/%wheel ALL=(ALL) ALL/s/^#//' ${MOUNTPOINT}/etc/sudoers - + } run_mkinitcpio() { + + clear - clear + KERNEL="" - KERNEL="" - - # If LVM and/or LUKS used, add the relevant hook(s) - ([[ $LVM -eq 1 ]] && [[ $LUKS -eq 0 ]]) && sed -i 's/block filesystems/block lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog + # If LVM and/or LUKS used, add the relevant hook(s) + ([[ $LVM -eq 1 ]] && [[ $LUKS -eq 0 ]]) && sed -i 's/block filesystems/block lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog ([[ $LVM -eq 1 ]] && [[ $LUKS -eq 1 ]]) && sed -i 's/block filesystems/block encrypt lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog ([[ $LVM -eq 0 ]] && [[ $LUKS -eq 1 ]]) && sed -i 's/block filesystems/block encrypt filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog check_for_error - - # Run Mkinitcpio command depending on kernel(s) installed - KERNEL=$(ls ${MOUNTPOINT}/boot/*.img | grep -v "fallback" | sed "s~${MOUNTPOINT}/boot/initramfs-~~g" | sed s/\.img//g | uniq) - for i in ${KERNEL}; do - arch_chroot "mkinitcpio -P" 2>>/tmp/.errlog - done - check_for_error - + + # Run Mkinitcpio command depending on kernel(s) installed + KERNEL=$(ls ${MOUNTPOINT}/boot/*.img | grep -v "fallback" | sed "s~${MOUNTPOINT}/boot/initramfs-~~g" | sed s/\.img//g | uniq) + for i in ${KERNEL}; do + arch_chroot "mkinitcpio -p ${i}" 2>>/tmp/.errlog + done + check_for_error + } ###################################################################### -## ## -## System and Partitioning Functions ## -## ## +## ## +## System and Partitioning Functions ## +## ## ###################################################################### # Unmount partitions. umount_partitions(){ - + MOUNTED="" MOUNTED=$(mount | grep "${MOUNTPOINT}" | awk '{print $3}' | sort -r) swapoff -a - + for i in ${MOUNTED[@]}; do umount $i >/dev/null 2>>/tmp/.errlog done - + check_for_error } # Revised to deal with partion sizes now being displayed to the user confirm_mount() { - if [[ $(mount | grep $1) ]]; then + if [[ $(mount | grep $1) ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --infobox "$_MntStatusSucc" 0 0 sleep 2 PARTITIONS=$(echo $PARTITIONS | sed "s~${PARTITION} [0-9]*[G-M]~~" | sed "s~${PARTITION} [0-9]*\.[0-9]*[G-M]~~" | sed s~${PARTITION}$' -'~~) @@ -611,124 +593,124 @@ confirm_mount() { fi } -# This function does not assume that the formatted device is the Root installation device as +# This function does not assume that the formatted device is the Root installation device as # more than one device may be formatted. Root is set in the mount_partitions function. select_device() { - + DEVICE="" devices_list=$(lsblk -lno NAME,SIZE,TYPE | grep 'disk' | awk '{print "/dev/" $1 " " $2}' | sort -u); - + for i in ${devices_list[@]}; do DEVICE="${DEVICE} ${i}" done - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DevSelTitle " --menu "$_DevSelBody" 0 0 4 ${DEVICE} 2>${ANSWER} || prep_menu DEVICE=$(cat ${ANSWER}) - + } -# Finds all available partitions according to type(s) specified and generates a list +# Finds all available partitions according to type(s) specified and generates a list # of them. This also includes partitions on different devices. find_partitions() { - PARTITIONS="" - NUMBER_PARTITIONS=0 - partition_list=$(lsblk -lno NAME,SIZE,TYPE | grep $INCLUDE_PART | sed 's/part$/\/dev\//g' | sed 's/lvm$\|crypt$/\/dev\/mapper\//g' | awk '{print $3$1 " " $2}' | sort -u) + PARTITIONS="" + NUMBER_PARTITIONS=0 + partition_list=$(lsblk -lno NAME,SIZE,TYPE | grep $INCLUDE_PART | sed 's/part$/\/dev\//g' | sed 's/lvm$\|crypt$/\/dev\/mapper\//g' | awk '{print $3$1 " " $2}' | sort -u) for i in ${partition_list}; do PARTITIONS="${PARTITIONS} ${i}" NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS + 1 )) done - - # Double-partitions will be counted due to counting sizes, so fix + + # Double-partitions will be counted due to counting sizes, so fix NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS / 2 )) - # Deal with partitioning schemes appropriate to mounting, lvm, and/or luks. - case $INCLUDE_PART in - 'part\|lvm\|crypt') # Deal with incorrect partitioning for main mounting function - - if ([[ $SYSTEM == "UEFI" ]] && [[ $NUMBER_PARTITIONS -lt 2 ]]) || ([[ $SYSTEM == "BIOS" ]] && [[ $NUMBER_PARTITIONS -eq 0 ]]); then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PartErrBody" 0 0 - create_partitions - fi - ;; - 'part\|crypt') # Ensure there is at least one partition for LVM - if [[ $NUMBER_PARTITIONS -eq 0 ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmPartErrBody" 0 0 - create_partitions - fi - ;; - 'part\|lvm') # Ensure there are at least two partitions for LUKS - if [[ $NUMBER_PARTITIONS -lt 2 ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LuksPartErrBody" 0 0 - create_partitions - fi - ;; - esac + # Deal with partitioning schemes appropriate to mounting, lvm, and/or luks. + case $INCLUDE_PART in + 'part\|lvm\|crypt') # Deal with incorrect partitioning for main mounting function + if ([[ $SYSTEM == "UEFI" ]] && [[ $NUMBER_PARTITIONS -lt 2 ]]) || ([[ $SYSTEM == "BIOS" ]] && [[ $NUMBER_PARTITIONS -eq 0 ]]); then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PartErrBody" 0 0 + create_partitions + fi + ;; + 'part\|crypt') # Ensure there is at least one partition for LVM + if [[ $NUMBER_PARTITIONS -eq 0 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmPartErrBody" 0 0 + create_partitions + fi + ;; + 'part\|lvm') # Ensure there are at least two partitions for LUKS + if [[ $NUMBER_PARTITIONS -lt 2 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LuksPartErrBody" 0 0 + create_partitions + fi + ;; + esac + } create_partitions(){ # Securely destroy all data on a given device. secure_wipe(){ - - # Warn the user. If they proceed, wipe the selected device. - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PartOptWipe " --yesno "$_AutoPartWipeBody1 ${DEVICE} $_AutoPartWipeBody2" 0 0 - if [[ $? -eq 0 ]]; then - clear - - # Install wipe where not already installed. Much faster than dd - if [[ ! -e /usr/bin/wipe ]]; then - pacman -Sy --noconfirm wipe 2>/tmp/.errlog - check_for_error - fi - - clear - wipe -Ifre ${DEVICE} - - # Alternate dd command - requires pv to be installed - #dd if=/dev/zero | pv | dd of=${DEVICE} iflag=nocache oflag=direct bs=4096 2>/tmp/.errlog - check_for_error + + # Warn the user. If they proceed, wipe the selected device. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PartOptWipe " --yesno "$_AutoPartWipeBody1 ${DEVICE} $_AutoPartWipeBody2" 0 0 + if [[ $? -eq 0 ]]; then + clear + + # Install wipe where not already installed. Much faster than dd + if [[ ! -e /usr/bin/wipe ]]; then + pacman -Sy --noconfirm wipe 2>/tmp/.errlog + check_for_error + fi + + clear + wipe -Ifre ${DEVICE} + + # Alternate dd command - requires pv to be installed + #dd if=/dev/zero | pv | dd of=${DEVICE} iflag=nocache oflag=direct bs=4096 2>/tmp/.errlog + check_for_error else - create_partitions + create_partitions fi } # BIOS and UEFI auto_partition(){ - - # Provide warning to user - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepPartDisk " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartBody2 $_AutoPartBody3" 0 0 - - if [[ $? -eq 0 ]]; then - - # Find existing partitions (if any) to remove - parted -s ${DEVICE} print | awk '/^ / {print $1}' > /tmp/.del_parts - - for del_part in $(tac /tmp/.del_parts); do - parted -s ${DEVICE} rm ${del_part} 2>/tmp/.errlog - check_for_error - done - - # Identify the partition table - part_table=$(parted -s ${DEVICE} print | grep -i 'partition table' | awk '{print $3}' >/dev/null 2>&1) - - # Create partition table if one does not already exist - ([[ $SYSTEM == "BIOS" ]] && [[ $part_table != "msdos" ]]) && parted -s ${DEVICE} mklabel msdos 2>/tmp/.errlog - ([[ $SYSTEM == "UEFI" ]] && [[ $part_table != "gpt" ]]) && parted -s ${DEVICE} mklabel gpt 2>/tmp/.errlog - check_for_error - - # Create paritions (same basic partitioning scheme for BIOS and UEFI) - if [[ $SYSTEM == "BIOS" ]]; then - parted -s ${DEVICE} mkpart primary ext3 1MiB 513MiB 2>/tmp/.errlog - else - parted -s ${DEVICE} mkpart ESP fat32 1MiB 513MiB 2>/tmp/.errlog - fi - - parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog - parted -s ${DEVICE} mkpart primary ext3 513MiB 100% 2>>/tmp/.errlog - check_for_error + + # Provide warning to user + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepPartDisk " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartBody2 $_AutoPartBody3" 0 0 + + if [[ $? -eq 0 ]]; then + + # Find existing partitions (if any) to remove + parted -s ${DEVICE} print | awk '/^ / {print $1}' > /tmp/.del_parts + + for del_part in $(tac /tmp/.del_parts); do + parted -s ${DEVICE} rm ${del_part} 2>/tmp/.errlog + check_for_error + done + + # Identify the partition table + part_table=$(parted -s ${DEVICE} print | grep -i 'partition table' | awk '{print $3}' >/dev/null 2>&1) + + # Create partition table if one does not already exist + ([[ $SYSTEM == "BIOS" ]] && [[ $part_table != "msdos" ]]) && parted -s ${DEVICE} mklabel msdos 2>/tmp/.errlog + ([[ $SYSTEM == "UEFI" ]] && [[ $part_table != "gpt" ]]) && parted -s ${DEVICE} mklabel gpt 2>/tmp/.errlog + check_for_error + + # Create paritions (same basic partitioning scheme for BIOS and UEFI) + if [[ $SYSTEM == "BIOS" ]]; then + parted -s ${DEVICE} mkpart primary ext3 1MiB 513MiB 2>/tmp/.errlog + else + parted -s ${DEVICE} mkpart ESP fat32 1MiB 513MiB 2>/tmp/.errlog + fi + + parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog + parted -s ${DEVICE} mkpart primary ext3 513MiB 100% 2>>/tmp/.errlog + check_for_error # Show created partitions lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE > /tmp/.devlist @@ -739,364 +721,364 @@ auto_partition(){ } - # Partitioning Menu + # Partitioning Menu dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepPartDisk " --menu "$_PartToolBody" 0 0 7 \ "$_PartOptWipe" "BIOS & UEFI" \ "$_PartOptAuto" "BIOS & UEFI" \ - "cfdisk" "BIOS" \ - "cgdisk" "UEFI" \ - "fdisk" "BIOS & UEFI" \ - "gdisk" "UEFI" \ - "parted" "BIOS & UEFI" 2>${ANSWER} + "cfdisk" "BIOS" \ + "cgdisk" "UEFI" \ + "fdisk" "BIOS & UEFI" \ + "gdisk" "UEFI" \ + "parted" "BIOS & UEFI" 2>${ANSWER} - clear - # If something selected - if [[ $(cat ${ANSWER}) != "" ]]; then - if ([[ $(cat ${ANSWER}) != "$_PartOptWipe" ]] && [[ $(cat ${ANSWER}) != "$_PartOptAuto" ]]); then - $(cat ${ANSWER}) ${DEVICE} - else - [[ $(cat ${ANSWER}) == "$_PartOptWipe" ]] && secure_wipe && create_partitions - [[ $(cat ${ANSWER}) == "$_PartOptAuto" ]] && auto_partition - fi - fi + clear + # If something selected + if [[ $(cat ${ANSWER}) != "" ]]; then + if ([[ $(cat ${ANSWER}) != "$_PartOptWipe" ]] && [[ $(cat ${ANSWER}) != "$_PartOptAuto" ]]); then + $(cat ${ANSWER}) ${DEVICE} + else + [[ $(cat ${ANSWER}) == "$_PartOptWipe" ]] && secure_wipe && create_partitions + [[ $(cat ${ANSWER}) == "$_PartOptAuto" ]] && auto_partition + fi + fi + + prep_menu +} - prep_menu -} - -# Set static list of filesystems rather than on-the-fly. Partially as most require additional flags, and +# Set static list of filesystems rather than on-the-fly. Partially as most require additional flags, and # partially because some don't seem to be viable. # Set static list of filesystems rather than on-the-fly. select_filesystem(){ - # prep variables - fs_opts="" - CHK_NUM=0 + # prep variables + fs_opts="" + CHK_NUM=0 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --menu "$_FSBody" 0 0 12 \ - "$_FSSkip" "-" \ - "btrfs" "mkfs.btrfs -f" \ - "ext2" "mkfs.ext2 -q" \ - "ext3" "mkfs.ext3 -q" \ - "ext4" "mkfs.ext4 -q" \ - "f2fs" "mkfs.f2fs" \ - "jfs" "mkfs.jfs -q" \ - "nilfs2" "mkfs.nilfs2 -fq" \ - "ntfs" "mkfs.ntfs -q" \ - "reiserfs" "mkfs.reiserfs -q" \ - "vfat" "mkfs.vfat -F32" \ - "xfs" "mkfs.xfs -f" 2>${ANSWER} - - case $(cat ${ANSWER}) in - "$_FSSkip") FILESYSTEM="$_FSSkip" ;; - "btrfs") FILESYSTEM="mkfs.btrfs -f" - CHK_NUM=16 - fs_opts="autodefrag compress=zlib compress=lzo compress=no compress-force=zlib compress-force=lzo discard noacl noatime nodatasum nospace_cache recovery skip_balance space_cache ssd ssd_spread" - modprobe btrfs - ;; - "ext2") FILESYSTEM="mkfs.ext2 -q" ;; - "ext3") FILESYSTEM="mkfs.ext3 -q" ;; - "ext4") FILESYSTEM="mkfs.ext4 -q" - CHK_NUM=8 - fs_opts="data=journal data=writeback dealloc discard noacl noatime nobarrier nodelalloc" - ;; - "f2fs") FILESYSTEM="mkfs.f2fs" - fs_opts="data_flush disable_roll_forward disable_ext_identify discard fastboot flush_merge inline_xattr inline_data inline_dentry no_heap noacl nobarrier noextent_cache noinline_data norecovery" - CHK_NUM=16 - modprobe f2fs - ;; - "jfs") FILESYSTEM="mkfs.jfs -q" - CHK_NUM=4 - fs_opts="discard errors=continue errors=panic nointegrity" - ;; - "nilfs2") FILESYSTEM="mkfs.nilfs2 -fq" - CHK_NUM=7 - fs_opts="discard nobarrier errors=continue errors=panic order=relaxed order=strict norecovery" - ;; - "ntfs") FILESYSTEM="mkfs.ntfs -q" ;; - "reiserfs") FILESYSTEM="mkfs.reiserfs -q" - CHK_NUM=5 - fs_opts="acl nolog notail replayonly user_xattr" - ;; - "vfat") FILESYSTEM="mkfs.vfat -F32" ;; - "xfs") FILESYSTEM="mkfs.xfs -f" - CHK_NUM=9 - fs_opts="discard filestreams ikeep largeio noalign nobarrier norecovery noquota wsync" - ;; - *) prep_menu ;; - esac - - # Warn about formatting! - if [[ $FILESYSTEM != $_FSSkip ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --yesno "\n$FILESYSTEM $PARTITION\n\n" 0 0 - if [[ $? -eq 0 ]]; then - ${FILESYSTEM} ${PARTITION} >/dev/null 2>/tmp/.errlog - check_for_error - else - select_filesystem - fi - fi + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --menu "$_FSBody" 0 0 12 \ + "$_FSSkip" "-" \ + "btrfs" "mkfs.btrfs -f" \ + "ext2" "mkfs.ext2 -q" \ + "ext3" "mkfs.ext3 -q" \ + "ext4" "mkfs.ext4 -q" \ + "f2fs" "mkfs.f2fs" \ + "jfs" "mkfs.jfs -q" \ + "nilfs2" "mkfs.nilfs2 -fq" \ + "ntfs" "mkfs.ntfs -q" \ + "reiserfs" "mkfs.reiserfs -q" \ + "vfat" "mkfs.vfat -F32" \ + "xfs" "mkfs.xfs -f" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_FSSkip") FILESYSTEM="$_FSSkip" ;; + "btrfs") FILESYSTEM="mkfs.btrfs -f" + CHK_NUM=16 + fs_opts="autodefrag compress=zlib compress=lzo compress=no compress-force=zlib compress-force=lzo discard noacl noatime nodatasum nospace_cache recovery skip_balance space_cache ssd ssd_spread" + modprobe btrfs + ;; + "ext2") FILESYSTEM="mkfs.ext2 -q" ;; + "ext3") FILESYSTEM="mkfs.ext3 -q" ;; + "ext4") FILESYSTEM="mkfs.ext4 -q" + CHK_NUM=8 + fs_opts="data=journal data=writeback dealloc discard noacl noatime nobarrier nodelalloc" + ;; + "f2fs") FILESYSTEM="mkfs.f2fs" + fs_opts="data_flush disable_roll_forward disable_ext_identify discard fastboot flush_merge inline_xattr inline_data inline_dentry no_heap noacl nobarrier noextent_cache noinline_data norecovery" + CHK_NUM=16 + modprobe f2fs + ;; + "jfs") FILESYSTEM="mkfs.jfs -q" + CHK_NUM=4 + fs_opts="discard errors=continue errors=panic nointegrity" + ;; + "nilfs2") FILESYSTEM="mkfs.nilfs2 -fq" + CHK_NUM=7 + fs_opts="discard nobarrier errors=continue errors=panic order=relaxed order=strict norecovery" + ;; + "ntfs") FILESYSTEM="mkfs.ntfs -q" ;; + "reiserfs") FILESYSTEM="mkfs.reiserfs -q" + CHK_NUM=5 + fs_opts="acl nolog notail replayonly user_xattr" + ;; + "vfat") FILESYSTEM="mkfs.vfat -F32" ;; + "xfs") FILESYSTEM="mkfs.xfs -f" + CHK_NUM=9 + fs_opts="discard filestreams ikeep largeio noalign nobarrier norecovery noquota wsync" + ;; + *) prep_menu ;; + esac + + # Warn about formatting! + if [[ $FILESYSTEM != $_FSSkip ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --yesno "\n$FILESYSTEM $PARTITION\n\n" 0 0 + if [[ $? -eq 0 ]]; then + ${FILESYSTEM} ${PARTITION} >/dev/null 2>/tmp/.errlog + check_for_error + else + select_filesystem + fi + fi } - + mount_partitions() { # This subfunction allows for special mounting options to be applied for relevant fs's. # Seperate subfunction for neatness. mount_opts() { - FS_OPTS="" - echo "" > ${MOUNT_OPTS} + FS_OPTS="" + echo "" > ${MOUNT_OPTS} + + for i in ${fs_opts}; do + FS_OPTS="${FS_OPTS} ${i} - off" + done - for i in ${fs_opts}; do - FS_OPTS="${FS_OPTS} ${i} - off" - done - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $(echo $FILESYSTEM | sed "s/.*\.//g" | sed "s/-.*//g") " --checklist "$_btrfsMntBody" 0 0 $CHK_NUM \ - $FS_OPTS 2>${MOUNT_OPTS} - - # Now clean up the file - sed -i 's/ /,/g' ${MOUNT_OPTS} - sed -i '$s/,$//' ${MOUNT_OPTS} - - # If mount options selected, confirm choice - if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --yesno "\n${_btrfsMntConfBody}$(cat ${MOUNT_OPTS})\n" 10 75 - [[ $? -eq 1 ]] && mount_opts - fi + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $(echo $FILESYSTEM | sed "s/.*\.//g" | sed "s/-.*//g") " --checklist "$_btrfsMntBody" 0 0 $CHK_NUM \ + $FS_OPTS 2>${MOUNT_OPTS} + + # Now clean up the file + sed -i 's/ /,/g' ${MOUNT_OPTS} + sed -i '$s/,$//' ${MOUNT_OPTS} + # If mount options selected, confirm choice + if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --yesno "\n${_btrfsMntConfBody}$(cat ${MOUNT_OPTS})\n" 10 75 + [[ $? -eq 1 ]] && mount_opts + fi + } # Subfunction to save repetition of code mount_current_partition(){ - - # Make the mount directory - mkdir -p ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog - - # Get mounting options for appropriate filesystems + + # Make the mount directory + mkdir -p ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog + + # Get mounting options for appropriate filesystems [[ $fs_opts != "" ]] && mount_opts + + # Use special mounting options if selected, else standard mount + if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then + mount -o $(cat ${MOUNT_OPTS}) ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog + else + mount ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog + fi + + check_for_error + confirm_mount ${MOUNTPOINT}${MOUNT} - # Use special mounting options if selected, else standard mount - if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then - mount -o $(cat ${MOUNT_OPTS}) ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog - else - mount ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog - fi - - check_for_error - confirm_mount ${MOUNTPOINT}${MOUNT} - - # Identify if mounted partition is type "crypt" (LUKS on LVM, or LUKS alone) - if [[ $(lsblk -lno TYPE ${PARTITION} | grep "crypt") != "" ]]; then + # Identify if mounted partition is type "crypt" (LUKS on LVM, or LUKS alone) + if [[ $(lsblk -lno TYPE ${PARTITION} | grep "crypt") != "" ]]; then # cryptname for bootloader configuration either way - LUKS=1 - LUKS_NAME=$(echo ${PARTITION} | sed "s~^/dev/mapper/~~g") - - # Check if LUKS on LVM (parent = lvm /dev/mapper/...) - cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "lvm" | grep -i "crypto_luks" | uniq | awk '{print "/dev/mapper/"$1}') - for i in ${cryptparts}; do - if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then - LUKS_DEV="$LUKS_DEV cryptdevice=${i}:$LUKS_NAME" - LVM=1 - break; - fi - done - - # Check if LUKS alone (parent = part /dev/...) - cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') - for i in ${cryptparts}; do - if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then - LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') - LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" - break; - fi - done - - # If LVM logical volume.... - elif [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]]; then - LVM=1 - - # First get crypt name (code above would get lv name) - cryptparts=$(lsblk -lno NAME,TYPE,FSTYPE | grep "crypt" | grep -i "lvm2_member" | uniq | awk '{print "/dev/mapper/"$1}') - for i in ${cryptparts}; do - if [[ $(lsblk -lno NAME ${i} | grep $(echo $PARTITION | sed "s~^/dev/mapper/~~g")) != "" ]]; then - LUKS_NAME=$(echo ${i} | sed s~/dev/mapper/~~g) - break; - fi - done - - # Now get the device (/dev/...) for the crypt name - cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') - for i in ${cryptparts}; do - if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then - # Create UUID for comparison - LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') - - # Check if not already added as a LUKS DEVICE (i.e. multiple LVs on one crypt). If not, add. - if [[ $(echo $LUKS_DEV | grep $LUKS_UUID) == "" ]]; then - LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" - LUKS=1 - fi - - break; - fi - done - fi + LUKS=1 + LUKS_NAME=$(echo ${PARTITION} | sed "s~^/dev/mapper/~~g") + # Check if LUKS on LVM (parent = lvm /dev/mapper/...) + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "lvm" | grep -i "crypto_luks" | uniq | awk '{print "/dev/mapper/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + LUKS_DEV="$LUKS_DEV cryptdevice=${i}:$LUKS_NAME" + LVM=1 + break; + fi + done + + # Check if LUKS alone (parent = part /dev/...) + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') + LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" + break; + fi + done + + # If LVM logical volume.... + elif [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]]; then + LVM=1 + + # First get crypt name (code above would get lv name) + cryptparts=$(lsblk -lno NAME,TYPE,FSTYPE | grep "crypt" | grep -i "lvm2_member" | uniq | awk '{print "/dev/mapper/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $(echo $PARTITION | sed "s~^/dev/mapper/~~g")) != "" ]]; then + LUKS_NAME=$(echo ${i} | sed s~/dev/mapper/~~g) + break; + fi + done + + # Now get the device (/dev/...) for the crypt name + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + # Create UUID for comparison + LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') + + # Check if not already added as a LUKS DEVICE (i.e. multiple LVs on one crypt). If not, add. + if [[ $(echo $LUKS_DEV | grep $LUKS_UUID) == "" ]]; then + LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" + LUKS=1 + fi + + break; + fi + done + fi + } # Seperate function due to ability to cancel make_swap(){ - # Ask user to select partition or create swapfile - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelSwpBody" 0 0 7 "$_SelSwpNone" $"-" "$_SelSwpFile" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu - - if [[ $(cat ${ANSWER}) != "$_SelSwpNone" ]]; then + # Ask user to select partition or create swapfile + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelSwpBody" 0 0 7 "$_SelSwpNone" $"-" "$_SelSwpFile" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu + + if [[ $(cat ${ANSWER}) != "$_SelSwpNone" ]]; then PARTITION=$(cat ${ANSWER}) + + if [[ $PARTITION == "$_SelSwpFile" ]]; then + total_memory=$(grep MemTotal /proc/meminfo | awk '{print $2/1024}' | sed 's/\..*//') + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap + m_or_g=$(cat ${ANSWER}) + + while [[ $(echo ${m_or_g: -1} | grep "M\|G") == "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --msgbox "\n$_SelSwpFile $_ErrTitle: M = MB, G = GB\n\n" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap + m_or_g=$(cat ${ANSWER}) + done - if [[ $PARTITION == "$_SelSwpFile" ]]; then - total_memory=$(grep MemTotal /proc/meminfo | awk '{print $2/1024}' | sed 's/\..*//') - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap - m_or_g=$(cat ${ANSWER}) - - while [[ $(echo ${m_or_g: -1} | grep "M\|G") == "" ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --msgbox "\n$_SelSwpFile $_ErrTitle: M = MB, G = GB\n\n" 0 0 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap - m_or_g=$(cat ${ANSWER}) - done - - fallocate -l ${m_or_g} ${MOUNTPOINT}/swapfile 2>/tmp/.errlog - chmod 600 ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog - mkswap ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog - swapon ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog - check_for_error - - else # Swap Partition - # Warn user if creating a new swap - if [[ $(lsblk -o FSTYPE ${PARTITION} | grep -i "swap") != "swap" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --yesno "\nmkswap ${PARTITION}\n\n" 0 0 - [[ $? -eq 0 ]] && mkswap ${PARTITION} >/dev/null 2>/tmp/.errlog || mount_partitions - fi - # Whether existing to newly created, activate swap - swapon ${PARTITION} >/dev/null 2>>/tmp/.errlog - check_for_error - # Since a partition was used, remove that partition from the list - PARTITIONS=$(echo $PARTITIONS | sed "s~${PARTITION} [0-9]*[G-M]~~" | sed "s~${PARTITION} [0-9]*\.[0-9]*[G-M]~~" | sed s~${PARTITION}$' -'~~) - NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 )) - fi - fi + fallocate -l ${m_or_g} ${MOUNTPOINT}/swapfile 2>/tmp/.errlog + chmod 600 ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + mkswap ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + swapon ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + check_for_error + + else # Swap Partition + # Warn user if creating a new swap + if [[ $(lsblk -o FSTYPE ${PARTITION} | grep -i "swap") != "swap" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --yesno "\nmkswap ${PARTITION}\n\n" 0 0 + [[ $? -eq 0 ]] && mkswap ${PARTITION} >/dev/null 2>/tmp/.errlog || mount_partitions + fi + # Whether existing to newly created, activate swap + swapon ${PARTITION} >/dev/null 2>>/tmp/.errlog + check_for_error + # Since a partition was used, remove that partition from the list + PARTITIONS=$(echo $PARTITIONS | sed "s~${PARTITION} [0-9]*[G-M]~~" | sed "s~${PARTITION} [0-9]*\.[0-9]*[G-M]~~" | sed s~${PARTITION}$' -'~~) + NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 )) + fi + fi } - #### #### - #### MOUNTING FUNCTION BEGINS HERE #### - #### #### + #### #### + #### MOUNTING FUNCTION BEGINS HERE #### + #### #### - # prep variables - MOUNT="" - LUKS_NAME="" - LUKS_DEV="" - LUKS_UUID="" - LUKS=0 - LVM=0 - BTRFS=0 - - # Warn users that they CAN mount partitions without formatting them! - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --msgbox "$_WarnMount1 '$_FSSkip' $_WarnMount2" 0 0 + # prep variables + MOUNT="" + LUKS_NAME="" + LUKS_DEV="" + LUKS_UUID="" + LUKS=0 + LVM=0 + BTRFS=0 + + # Warn users that they CAN mount partitions without formatting them! + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --msgbox "$_WarnMount1 '$_FSSkip' $_WarnMount2" 0 0 # LVM Detection. If detected, activate. lvm_detect - # Ensure partitions are unmounted (i.e. where mounted previously), and then list available partitions - INCLUDE_PART='part\|lvm\|crypt' + # Ensure partitions are unmounted (i.e. where mounted previously), and then list available partitions + INCLUDE_PART='part\|lvm\|crypt' umount_partitions - find_partitions - - # Identify and mount root - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelRootBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu - PARTITION=$(cat ${ANSWER}) + find_partitions + + # Identify and mount root + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelRootBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + PARTITION=$(cat ${ANSWER}) ROOT_PART=${PARTITION} + + # Format with FS (or skip) + select_filesystem + + # Make the directory and mount. Also identify LUKS and/or LVM + mount_current_partition - # Format with FS (or skip) - select_filesystem - - # Make the directory and mount. Also identify LUKS and/or LVM - mount_current_partition - - # Identify and create swap, if applicable - make_swap - + # Identify and create swap, if applicable + make_swap + # Extra Step for VFAT UEFI Partition. This cannot be in an LVM container. if [[ $SYSTEM == "UEFI" ]]; then - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelUefiBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelUefiBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu PARTITION=$(cat ${ANSWER}) UEFI_PART=${PARTITION} - + # If it is already a fat/vfat partition... if [[ $(fsck -N $PARTITION | grep fat) ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --yesno "$_FormUefiBody $PARTITION $_FormUefiBody2" 0 0 && mkfs.vfat -F32 ${PARTITION} >/dev/null 2>/tmp/.errlog - else + else mkfs.vfat -F32 ${PARTITION} >/dev/null 2>/tmp/.errlog fi check_for_error - - # Inform users of the mountpoint options and consequences + + # Inform users of the mountpoint options and consequences dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_MntUefiBody" 0 0 2 \ - "/boot" "systemd-boot"\ - "/boot/efi" "-" 2>${ANSWER} - - [[ $(cat ${ANSWER}) != "" ]] && UEFI_MOUNT=$(cat ${ANSWER}) || prep_menu - + "/boot" "systemd-boot"\ + "/boot/efi" "-" 2>${ANSWER} + + [[ $(cat ${ANSWER}) != "" ]] && UEFI_MOUNT=$(cat ${ANSWER}) || prep_menu + mkdir -p ${MOUNTPOINT}${UEFI_MOUNT} 2>/tmp/.errlog mount ${PARTITION} ${MOUNTPOINT}${UEFI_MOUNT} 2>>/tmp/.errlog check_for_error - confirm_mount ${MOUNTPOINT}${UEFI_MOUNT} + confirm_mount ${MOUNTPOINT}${UEFI_MOUNT} fi - + # All other partitions - while [[ $NUMBER_PARTITIONS > 0 ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_ExtPartBody" 0 0 7 "$_Done" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu - PARTITION=$(cat ${ANSWER}) + while [[ $NUMBER_PARTITIONS > 0 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_ExtPartBody" 0 0 7 "$_Done" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu + PARTITION=$(cat ${ANSWER}) + + if [[ $PARTITION == $_Done ]]; then + break; + else + MOUNT="" + select_filesystem + + # Ask user for mountpoint. Don't give /boot as an example for UEFI systems! + [[ $SYSTEM == "UEFI" ]] && MNT_EXAMPLES="/home\n/var" || MNT_EXAMPLES="/boot\n/home\n/var" + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu + MOUNT=$(cat ${ANSWER}) + + # loop while the mountpoint specified is incorrect (is only '/', is blank, or has spaces). + while [[ ${MOUNT:0:1} != "/" ]] || [[ ${#MOUNT} -le 1 ]] || [[ $MOUNT =~ \ |\' ]]; do + # Warn user about naming convention + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ExtErrBody" 0 0 + # Ask user for mountpoint again + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu + MOUNT=$(cat ${ANSWER}) + done - if [[ $PARTITION == $_Done ]]; then - break; - else - MOUNT="" - select_filesystem - - # Ask user for mountpoint. Don't give /boot as an example for UEFI systems! - [[ $SYSTEM == "UEFI" ]] && MNT_EXAMPLES="/home\n/var" || MNT_EXAMPLES="/boot\n/home\n/var" - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu - MOUNT=$(cat ${ANSWER}) - - # loop while the mountpoint specified is incorrect (is only '/', is blank, or has spaces). - while [[ ${MOUNT:0:1} != "/" ]] || [[ ${#MOUNT} -le 1 ]] || [[ $MOUNT =~ \ |\' ]]; do - # Warn user about naming convention - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ExtErrBody" 0 0 - # Ask user for mountpoint again - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu - MOUNT=$(cat ${ANSWER}) - done - - # Create directory and mount. - mount_current_partition - - # Determine if a seperate /boot is used. 0 = no seperate boot, 1 = seperate non-lvm boot, - # 2 = seperate lvm boot. For Grub configuration - if [[ $MOUNT == "/boot" ]]; then - [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]] && LVM_SEP_BOOT=2 || LVM_SEP_BOOT=1 - fi - - fi - done -} + # Create directory and mount. + mount_current_partition + + # Determine if a seperate /boot is used. 0 = no seperate boot, 1 = seperate non-lvm boot, + # 2 = seperate lvm boot. For Grub configuration + if [[ $MOUNT == "/boot" ]]; then + [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]] && LVM_SEP_BOOT=2 || LVM_SEP_BOOT=1 + fi + + fi + done +} ###################################################################### -## ## -## Encryption (dm_crypt) Functions ## -## ## +## ## +## Encryption (dm_crypt) Functions ## +## ## ###################################################################### # Had to write it in this way due to (bash?) bug(?), as if/then statements in a single @@ -1108,11 +1090,11 @@ luks_password(){ dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --clear --insecure --passwordbox "$_LuksPassBody" 0 0 2> ${ANSWER} || prep_menu PASSWD=$(cat ${ANSWER}) - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || prep_menu PASSWD2=$(cat ${ANSWER}) - - if [[ $PASSWD != $PASSWD2 ]]; then + + if [[ $PASSWD != $PASSWD2 ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PassErrBody" 0 0 luks_password fi @@ -1121,154 +1103,154 @@ luks_password(){ luks_open(){ - LUKS_ROOT_NAME="" - INCLUDE_PART='part\|crypt\|lvm' + LUKS_ROOT_NAME="" + INCLUDE_PART='part\|crypt\|lvm' umount_partitions find_partitions - - # Select encrypted partition to open - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --menu "$_LuksMenuBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu - PARTITION=$(cat ${ANSWER}) - - # Enter name of the Luks partition and get password to open it - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu + + # Select encrypted partition to open + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --menu "$_LuksMenuBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu + PARTITION=$(cat ${ANSWER}) + + # Enter name of the Luks partition and get password to open it + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu LUKS_ROOT_NAME=$(cat ${ANSWER}) - luks_password + luks_password + + # Try to open the luks partition with the credentials given. If successful show this, otherwise + # show the error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --infobox "$_PlsWaitBody" 0 0 + echo $PASSWD | cryptsetup open --type luks ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error - # Try to open the luks partition with the credentials given. If successful show this, otherwise - # show the error - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --infobox "$_PlsWaitBody" 0 0 - echo $PASSWD | cryptsetup open --type luks ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog - check_for_error - - lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINT ${PARTITION} | grep "crypt\|NAME\|MODEL\|TYPE\|FSTYPE\|SIZE" > /tmp/.devlist + lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINT ${PARTITION} | grep "crypt\|NAME\|MODEL\|TYPE\|FSTYPE\|SIZE" > /tmp/.devlist dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DevShowOpt " --textbox /tmp/.devlist 0 0 - - luks_menu + + luks_menu } luks_setup(){ - modprobe -a dm-mod dm_crypt - INCLUDE_PART='part\|lvm' + modprobe -a dm-mod dm_crypt + INCLUDE_PART='part\|lvm' umount_partitions - find_partitions + find_partitions + + # Select partition to encrypt + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --menu "$_LuksCreateBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu + PARTITION=$(cat ${ANSWER}) - # Select partition to encrypt - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --menu "$_LuksCreateBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu - PARTITION=$(cat ${ANSWER}) - - # Enter name of the Luks partition and get password to create it - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu + # Enter name of the Luks partition and get password to create it + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu LUKS_ROOT_NAME=$(cat ${ANSWER}) luks_password } luks_default() { - + # Encrypt selected partition or LV with credentials given - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --infobox "$_PlsWaitBody" 0 0 - sleep 2 - echo $PASSWD | cryptsetup -q luksFormat ${PARTITION} 2>/tmp/.errlog - - # Now open the encrypted partition or LV - echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog - check_for_error - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --infobox "$_PlsWaitBody" 0 0 + sleep 2 + echo $PASSWD | cryptsetup -q luksFormat ${PARTITION} 2>/tmp/.errlog + + # Now open the encrypted partition or LV + echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error + } luks_key_define() { - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --inputbox "$_LuksCipherKey" 0 0 "-s 512 -c aes-xts-plain64" 2>${ANSWER} || luks_menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --inputbox "$_LuksCipherKey" 0 0 "-s 512 -c aes-xts-plain64" 2>${ANSWER} || luks_menu - # Encrypt selected partition or LV with credentials given - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncryptAdv " --infobox "$_PlsWaitBody" 0 0 - sleep 2 + # Encrypt selected partition or LV with credentials given + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncryptAdv " --infobox "$_PlsWaitBody" 0 0 + sleep 2 - echo $PASSWD | cryptsetup -q $(cat ${ANSWER}) luksFormat ${PARTITION} 2>/tmp/.errlog - check_for_error + echo $PASSWD | cryptsetup -q $(cat ${ANSWER}) luksFormat ${PARTITION} 2>/tmp/.errlog + check_for_error - # Now open the encrypted partition or LV - echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog - check_for_error + # Now open the encrypted partition or LV + echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error } luks_show(){ - - echo -e ${_LuksEncruptSucc} > /tmp/.devlist - lsblk -o NAME,TYPE,FSTYPE,SIZE ${PARTITION} | grep "part\|crypt\|NAME\|TYPE\|FSTYPE\|SIZE" >> /tmp/.devlist + + echo -e ${_LuksEncruptSucc} > /tmp/.devlist + lsblk -o NAME,TYPE,FSTYPE,SIZE ${PARTITION} | grep "part\|crypt\|NAME\|TYPE\|FSTYPE\|SIZE" >> /tmp/.devlist dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --textbox /tmp/.devlist 0 0 - luks_menu + luks_menu } luks_menu() { - LUKS_OPT="" + LUKS_OPT="" - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --menu "$_LuksMenuBody$_LuksMenuBody2$_LuksMenuBody3" 0 0 4 \ - "$_LuksOpen" "cryptsetup open --type luks" \ - "$_LuksEncrypt" "cryptsetup -q luksFormat" \ - "$_LuksEncryptAdv" "cryptsetup -q -s -c luksFormat" \ - "$_Back" "-" 2>${ANSWER} + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --menu "$_LuksMenuBody$_LuksMenuBody2$_LuksMenuBody3" 0 0 4 \ + "$_LuksOpen" "cryptsetup open --type luks" \ + "$_LuksEncrypt" "cryptsetup -q luksFormat" \ + "$_LuksEncryptAdv" "cryptsetup -q -s -c luksFormat" \ + "$_Back" "-" 2>${ANSWER} - case $(cat ${ANSWER}) in - "$_LuksOpen") luks_open ;; - "$_LuksEncrypt") luks_setup - luks_default - luks_show ;; - "$_LuksEncryptAdv") luks_setup - luks_key_define - luks_show ;; - *) prep_menu ;; - esac + case $(cat ${ANSWER}) in + "$_LuksOpen") luks_open ;; + "$_LuksEncrypt") luks_setup + luks_default + luks_show ;; + "$_LuksEncryptAdv") luks_setup + luks_key_define + luks_show ;; + *) prep_menu ;; + esac - luks_menu + luks_menu } ###################################################################### -## ## -## Logical Volume Management Functions ## -## ## +## ## +## Logical Volume Management Functions ## +## ## ###################################################################### # LVM Detection. lvm_detect() { - + LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null) LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null) LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null) - - if [[ $LVM_LV != "" ]] && [[ $LVM_VG != "" ]] && [[ $LVM_PV != "" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --infobox "$_LvmDetBody" 0 0 - modprobe dm-mod 2>/tmp/.errlog - check_for_error - vgscan >/dev/null 2>&1 - vgchange -ay >/dev/null 2>&1 - fi + + if [[ $LVM_LV != "" ]] && [[ $LVM_VG != "" ]] && [[ $LVM_PV != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --infobox "$_LvmDetBody" 0 0 + modprobe dm-mod 2>/tmp/.errlog + check_for_error + vgscan >/dev/null 2>&1 + vgchange -ay >/dev/null 2>&1 + fi } lvm_show_vg(){ - VG_LIST="" - vg_list=$(lvs --noheadings | awk '{print $2}' | uniq) + VG_LIST="" + vg_list=$(lvs --noheadings | awk '{print $2}' | uniq) - for i in ${vg_list}; do - VG_LIST="${VG_LIST} ${i} $(vgdisplay ${i} | grep -i "vg size" | awk '{print $3$4}')" - done + for i in ${vg_list}; do + VG_LIST="${VG_LIST} ${i} $(vgdisplay ${i} | grep -i "vg size" | awk '{print $3$4}')" + done - # If no VGs, no point in continuing - if [[ $VG_LIST == "" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmVGErr" 0 0 - lvm_menu - fi + # If no VGs, no point in continuing + if [[ $VG_LIST == "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmVGErr" 0 0 + lvm_menu + fi - # Select VG - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --menu "$_LvmSelVGBody" 0 0 5 \ - ${VG_LIST} 2>${ANSWER} || lvm_menu + # Select VG + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --menu "$_LvmSelVGBody" 0 0 5 \ + ${VG_LIST} 2>${ANSWER} || lvm_menu } # Create Volume Group and Logical Volumes @@ -1277,72 +1259,72 @@ lvm_create() { # subroutine to save a lot of repetition. check_lv_size() { - LV_SIZE_INVALID=0 - chars=0 + LV_SIZE_INVALID=0 + chars=0 - # Check to see if anything was actually entered and if first character is '0' - ([[ ${#LVM_LV_SIZE} -eq 0 ]] || [[ ${LVM_LV_SIZE:0:1} -eq "0" ]]) && LV_SIZE_INVALID=1 + # Check to see if anything was actually entered and if first character is '0' + ([[ ${#LVM_LV_SIZE} -eq 0 ]] || [[ ${LVM_LV_SIZE:0:1} -eq "0" ]]) && LV_SIZE_INVALID=1 - # If not invalid so far, check for non numberic characters other than the last character - if [[ $LV_SIZE_INVALID -eq 0 ]]; then - while [[ $chars -lt $(( ${#LVM_LV_SIZE} - 1 )) ]]; do - [[ ${LVM_LV_SIZE:chars:1} != [0-9] ]] && LV_SIZE_INVALID=1 && break; - chars=$(( chars + 1 )) - done - fi + # If not invalid so far, check for non numberic characters other than the last character + if [[ $LV_SIZE_INVALID -eq 0 ]]; then + while [[ $chars -lt $(( ${#LVM_LV_SIZE} - 1 )) ]]; do + [[ ${LVM_LV_SIZE:chars:1} != [0-9] ]] && LV_SIZE_INVALID=1 && break; + chars=$(( chars + 1 )) + done + fi + + # If not invalid so far, check that last character is a M/m or G/g + if [[ $LV_SIZE_INVALID -eq 0 ]]; then + LV_SIZE_TYPE=$(echo ${LVM_LV_SIZE:$(( ${#LVM_LV_SIZE} - 1 )):1}) + + case $LV_SIZE_TYPE in + "m"|"M"|"g"|"G") LV_SIZE_INVALID=0 ;; + *) LV_SIZE_INVALID=1 ;; + esac + + fi - # If not invalid so far, check that last character is a M/m or G/g - if [[ $LV_SIZE_INVALID -eq 0 ]]; then - LV_SIZE_TYPE=$(echo ${LVM_LV_SIZE:$(( ${#LVM_LV_SIZE} - 1 )):1}) + # If not invalid so far, check whether the value is greater than or equal to the LV remaining Size. + # If not, convert into MB for VG space remaining. + if [[ ${LV_SIZE_INVALID} -eq 0 ]]; then + + case ${LV_SIZE_TYPE} in + "G"|"g") if [[ $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) -ge ${LVM_VG_MB} ]]; then + LV_SIZE_INVALID=1 + else + LVM_VG_MB=$(( LVM_VG_MB - $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) )) + fi + ;; + "M"|"m") if [[ $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) -ge ${LVM_VG_MB} ]]; then + LV_SIZE_INVALID=1 + else + LVM_VG_MB=$(( LVM_VG_MB - $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) )) + fi + ;; + *) LV_SIZE_INVALID=1 + ;; + esac - case $LV_SIZE_TYPE in - "m"|"M"|"g"|"G") LV_SIZE_INVALID=0 ;; - *) LV_SIZE_INVALID=1 ;; - esac - - fi - - # If not invalid so far, check whether the value is greater than or equal to the LV remaining Size. - # If not, convert into MB for VG space remaining. - if [[ ${LV_SIZE_INVALID} -eq 0 ]]; then - - case ${LV_SIZE_TYPE} in - "G"|"g") if [[ $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) -ge ${LVM_VG_MB} ]]; then - LV_SIZE_INVALID=1 - else - LVM_VG_MB=$(( LVM_VG_MB - $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) )) - fi - ;; - "M"|"m") if [[ $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) -ge ${LVM_VG_MB} ]]; then - LV_SIZE_INVALID=1 - else - LVM_VG_MB=$(( LVM_VG_MB - $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) )) - fi - ;; - *) LV_SIZE_INVALID=1 - ;; - esac - - fi + fi } - # # - # LVM Create Starts Here # - # # + # # + # LVM Create Starts Here # + # # - # Prep Variables - LVM_VG="" - VG_PARTS="" - LVM_VG_MB=0 + # Prep Variables + LVM_VG="" + VG_PARTS="" + LVM_VG_MB=0 - # Find LVM appropriate partitions. - INCLUDE_PART='part\|crypt' - umount_partitions - find_partitions + # Find LVM appropriate partitions. + INCLUDE_PART='part\|crypt' + umount_partitions + find_partitions # Amend partition(s) found for use in check list PARTITIONS=$(echo $PARTITIONS | sed 's/M\|G\|T/& off/g') - + # Name the Volume Group dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu LVM_VG=$(cat ${ANSWER}) @@ -1350,434 +1332,408 @@ check_lv_size() { # Loop while the Volume Group name starts with a "/", is blank, has spaces, or is already being used while [[ ${LVM_VG:0:1} == "/" ]] || [[ ${#LVM_VG} -eq 0 ]] || [[ $LVM_VG =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_VG}) != "" ]]; do dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_LvmNameVgErr" 0 0 - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu LVM_VG=$(cat ${ANSWER}) done - + # Select the partition(s) for the Volume Group - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --checklist "$_LvmPvSelBody $_UseSpaceBar" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --checklist "$_LvmPvSelBody $_UseSpaceBar" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu [[ $(cat ${ANSWER}) != "" ]] && VG_PARTS=$(cat ${ANSWER}) || prep_menu - + # Once all the partitions have been selected, show user. On confirmation, use it/them in 'vgcreate' command. # Also determine the size of the VG, to use for creating LVs for it. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --yesno "$_LvmPvConfBody1${LVM_VG} $_LvmPvConfBody2${VG_PARTS}" 0 0 - + if [[ $? -eq 0 ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --infobox "$_LvmPvActBody1${LVM_VG}.$_PlsWaitBody" 0 0 sleep 1 vgcreate -f ${LVM_VG} ${VG_PARTS} >/dev/null 2>/tmp/.errlog check_for_error + + # Once created, get size and size type for display and later number-crunching for lv creation + VG_SIZE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $3}' | sed 's/\..*//') + VG_SIZE_TYPE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $4}') - # Once created, get size and size type for display and later number-crunching for lv creation - VG_SIZE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $3}' | sed 's/\..*//') - VG_SIZE_TYPE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $4}') - - # Convert the VG size into GB and MB. These variables are used to keep tabs on space available and remaining - [[ ${VG_SIZE_TYPE:0:1} == "G" ]] && LVM_VG_MB=$(( VG_SIZE * 1000 )) || LVM_VG_MB=$VG_SIZE - + # Convert the VG size into GB and MB. These variables are used to keep tabs on space available and remaining + [[ ${VG_SIZE_TYPE:0:1} == "G" ]] && LVM_VG_MB=$(( VG_SIZE * 1000 )) || LVM_VG_MB=$VG_SIZE + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --msgbox "$_LvmPvDoneBody1 '${LVM_VG}' $_LvmPvDoneBody2 (${VG_SIZE} ${VG_SIZE_TYPE}).\n\n" 0 0 else lvm_menu fi - # - # Once VG created, create Logical Volumes - # + # + # Once VG created, create Logical Volumes + # + + # Specify number of Logical volumes to create. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --radiolist "$_LvmLvNumBody1 ${LVM_VG}. $_LvmLvNumBody2" 0 0 9 \ + "1" "-" off "2" "-" off "3" "-" off "4" "-" off "5" "-" off "6" "-" off "7" "-" off "8" "-" off "9 " "-" off 2>${ANSWER} + + [[ $(cat ${ANSWER}) == "" ]] && lvm_menu || NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER}) - # Specify number of Logical volumes to create. - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --radiolist "$_LvmLvNumBody1 ${LVM_VG}. $_LvmLvNumBody2" 0 0 9 \ - "1" "-" off "2" "-" off "3" "-" off "4" "-" off "5" "-" off "6" "-" off "7" "-" off "8" "-" off "9 " "-" off 2>${ANSWER} + # Loop while the number of LVs is greater than 1. This is because the size of the last LV is automatic. + while [[ $NUMBER_LOGICAL_VOLUMES -gt 1 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) - [[ $(cat ${ANSWER}) == "" ]] && lvm_menu || NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER}) + # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. + while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + done - # Loop while the number of LVs is greater than 1. This is because the size of the last LV is automatic. - while [[ $NUMBER_LOGICAL_VOLUMES -gt 1 ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu - LVM_LV_NAME=$(cat ${ANSWER}) + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu + LVM_LV_SIZE=$(cat ${ANSWER}) + check_lv_size + + # Loop while an invalid value is entered. + while [[ $LV_SIZE_INVALID -eq 1 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvSizeErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu + LVM_LV_SIZE=$(cat ${ANSWER}) + check_lv_size + done + + # Create the LV + lvcreate -L ${LVM_LV_SIZE} ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --msgbox "\n$_Done\n\nLV ${LVM_LV_NAME} (${LVM_LV_SIZE}) $_LvmPvDoneBody2.\n\n" 0 0 + NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) + done + + # Now the final LV. Size is automatic. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) - # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. - while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu - LVM_LV_NAME=$(cat ${ANSWER}) - done + # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. + while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + done - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu - LVM_LV_SIZE=$(cat ${ANSWER}) - check_lv_size - - # Loop while an invalid value is entered. - while [[ $LV_SIZE_INVALID -eq 1 ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvSizeErrBody" 0 0 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu - LVM_LV_SIZE=$(cat ${ANSWER}) - check_lv_size - done - - # Create the LV - lvcreate -L ${LVM_LV_SIZE} ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog - check_for_error - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --msgbox "\n$_Done\n\nLV ${LVM_LV_NAME} (${LVM_LV_SIZE}) $_LvmPvDoneBody2.\n\n" 0 0 - NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) - done - - # Now the final LV. Size is automatic. - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu - LVM_LV_NAME=$(cat ${ANSWER}) - - # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. - while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu - LVM_LV_NAME=$(cat ${ANSWER}) - done - - # Create the final LV - lvcreate -l +100%FREE ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog - check_for_error - NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) - LVM=1 - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --yesno "$_LvmCompBody" 0 0 \ - && show_devices || lvm_menu + # Create the final LV + lvcreate -l +100%FREE ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog + check_for_error + NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) + LVM=1 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --yesno "$_LvmCompBody" 0 0 \ + && show_devices || lvm_menu } lvm_del_vg(){ - # Generate list of VGs for selection - lvm_show_vg - - # Ask for confirmation - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelVG " --yesno "$_LvmDelQ" 0 0 - - # if confirmation given, delete - if [[ $? -eq 0 ]]; then - vgremove -f $(cat ${ANSWER}) >/dev/null 2>&1 - fi - - lvm_menu + # Generate list of VGs for selection + lvm_show_vg + + # Ask for confirmation + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelVG " --yesno "$_LvmDelQ" 0 0 + + # if confirmation given, delete + if [[ $? -eq 0 ]]; then + vgremove -f $(cat ${ANSWER}) >/dev/null 2>&1 + fi + + lvm_menu } lvm_del_all(){ - LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null) - LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null) - LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null) + LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null) + LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null) + LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null) + + # Ask for confirmation + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelLV " --yesno "$_LvmDelQ" 0 0 + + # if confirmation given, delete + if [[ $? -eq 0 ]]; then + + for i in ${LVM_LV}; do + lvremove -f /dev/mapper/${i} >/dev/null 2>&1 + done - # Ask for confirmation - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelLV " --yesno "$_LvmDelQ" 0 0 + for i in ${LVM_VG}; do + vgremove -f ${i} >/dev/null 2>&1 + done - # if confirmation given, delete - if [[ $? -eq 0 ]]; then + for i in ${LV_PV}; do + pvremove -f ${i} >/dev/null 2>&1 + done - for i in ${LVM_LV}; do - lvremove -f /dev/mapper/${i} >/dev/null 2>&1 - done - - for i in ${LVM_VG}; do - vgremove -f ${i} >/dev/null 2>&1 - done - - for i in ${LV_PV}; do - pvremove -f ${i} >/dev/null 2>&1 - done - - fi - - lvm_menu + fi + + lvm_menu } lvm_menu(){ - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --infobox "$_PlsWaitBody" 0 0 - sleep 1 - lvm_detect + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --infobox "$_PlsWaitBody" 0 0 + sleep 1 + lvm_detect - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --menu "$_LvmMenu" 0 0 4 \ - "$_LvmCreateVG" "vgcreate -f, lvcreate -L -n" \ - "$_LvmDelVG" "vgremove -f" \ - "$_LvMDelAll" "lvrmeove, vgremove, pvremove -f" \ - "$_Back" "-" 2>${ANSWER} - - case $(cat ${ANSWER}) in - "$_LvmCreateVG") lvm_create ;; - "$_LvmDelVG") lvm_del_vg ;; - "$_LvMDelAll") lvm_del_all ;; - *) prep_menu ;; - esac + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --menu "$_LvmMenu" 0 0 4 \ + "$_LvmCreateVG" "vgcreate -f, lvcreate -L -n" \ + "$_LvmDelVG" "vgremove -f" \ + "$_LvMDelAll" "lvrmeove, vgremove, pvremove -f" \ + "$_Back" "-" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_LvmCreateVG") lvm_create ;; + "$_LvmDelVG") lvm_del_vg ;; + "$_LvMDelAll") lvm_del_all ;; + *) prep_menu ;; + esac } ###################################################################### -## ## -## Installation Functions ## -## ## -###################################################################### +## ## +## Installation Functions ## +## ## +###################################################################### # The linux kernel package will be removed from the base group as it and/or the lts version will be # selected by the user. Two installation methods are available: Standard (group package based) and # Advanced (individual package based). Neither will allow progress without selecting a kernel. install_base() { - # Prep variables - echo "" > ${PACKAGES} - echo "" > ${ANSWER} - BTRF_CHECK=$(echo "btrfs-progs" "-" off) - F2FS_CHECK=$(echo "f2fs-tools" "-" off) - KERNEL="n" - kernels="linux-rt-lts-manjaro linux410 linux-rt-manjaro linux-linux49" + # Prep variables + echo "" > ${PACKAGES} + echo "" > ${ANSWER} + BTRF_CHECK=$(echo "btrfs-progs" "-" off) + F2FS_CHECK=$(echo "f2fs-tools" "-" off) + KERNEL="n" + kernels="linux-lts linux-grsec linux-zen" - # User to select "standard" or "advanced" installation Method - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Choose your initsystem " --menu "Some manjaro editions like gnome are incompatible with openrc" 0 0 2 \ - "1" "systemd" \ - "2" "openrc" 2>${INIT} + # User to select "standard" or "advanced" installation Method + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --menu "$_InstBseBody" 0 0 2 \ + "1" "$_InstStandBase" \ + "2" "$_InstAdvBase" 2>${ANSWER} + # "Standard" installation method + if [[ $(cat ${ANSWER}) -eq 1 ]]; then + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstStandBseBody$_UseSpaceBar" 0 0 3 \ + "linux" "-" on \ + "linux-lts" "-" off \ + "base-devel" "-" on 2>${PACKAGES} + + # "Advanced" installation method + elif [[ $(cat ${ANSWER}) -eq 2 ]]; then - if [[ $(cat ${INIT}) -eq 2 ]]; then - touch /tmp/.openrc - cat /usr/share/aif/package-lists/base-openrc-manjaro > /tmp/.base - else - cat /usr/share/aif/package-lists/base-systemd-manjaro > /tmp/.base + # Ask user to wait while package descriptions are gathered (because it takes ages) + #dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAdvBase " --infobox "$_InstAdvWait $_PlsWaitBody" 0 0 + # Generate a package list with descriptions. + PKG_LIST="" + pkg_list=$(pacman -Sqg base base-devel | sed s/linux// | sed s/util-/util-linux/ | uniq | sort -u) + + # Check btrfs and f2fs packages in list if used + [[ $(lsblk -lno FSTYPE | grep btrfs) != "" ]] && BTRF_CHECK=$(echo $BTRFS_CHECK | sed "s/ off/ on/g") + [[ $(lsblk -lno FSTYPE | grep f2fs) != "" ]] && F2FS_CHECK=$(echo $F2FS_CHECK | sed "s/ off/ on/g") + + # Gather package descriptions for base group + for i in ${pkg_list}; do + PKG_LIST="${PKG_LIST} ${i} - on" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstAdvBseBody $_UseSpaceBar" 0 0 20 \ + "linux" "-" on \ + "linux-lts" "-" off \ + "linux-grsec" "-" off \ + "linux-zen" "-" off \ + $PKG_LIST $BTRF_CHECK $F2FS_CHECK 2>${PACKAGES} fi - - # User to select "standard" or "advanced" installation Method - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --menu "$_InstBseBody" 0 0 2 \ - "1" "$_InstStandBase" \ - "2" "$_InstAdvBase" 2>${ANSWER} - - # "Standard" installation method - if [[ $(cat ${ANSWER}) -eq 1 ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstStandBseBody$_UseSpaceBar" 0 0 3 \ - "linux49" "-" on \ - "linux-rt-lts-manjaro" "-" off \ - "base-devel" "-" on 2>${PACKAGES} - cat ${PACKAGES} >> /tmp/.base - - # "Advanced" installation method - elif [[ $(cat ${ANSWER}) -eq 2 ]]; then - - # Ask user to wait while package descriptions are gathered (because it takes ages) - #dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAdvBase " --infobox "$_InstAdvWait $_PlsWaitBody" 0 0 - - # Generate a package list with descriptions. - PKG_LIST="" - if [[ -e /tmp/.openrc ]]; then - pkg_list=$(echo $(cat /usr/share/aif/package-lists/base-openrc-manjaro) $(pacman -Sqg base-devel) | uniq | sort -u) - else - pkg_list=$(echo $(cat /usr/share/aif/package-lists/base-systemd-manjaro) $(pacman -Sqg base-devel) | uniq | sort -u) - fi - # Check btrfs and f2fs packages in list if used - [[ $(lsblk -lno FSTYPE | grep btrfs) != "" ]] && BTRF_CHECK=$(echo $BTRFS_CHECK | sed "s/ off/ on/g") - [[ $(lsblk -lno FSTYPE | grep f2fs) != "" ]] && F2FS_CHECK=$(echo $F2FS_CHECK | sed "s/ off/ on/g") - - # Gather package descriptions for base group - for i in ${pkg_list}; do - PKG_LIST="${PKG_LIST} ${i} - on" - done - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstAdvBseBody $_UseSpaceBar" 0 0 20 \ - "linux49" "-" on \ - "linux-rt-lts-manjaro" "-" off \ - "linux-rt-manjaro" "-" off \ - "linux-linux410" "-" off \ - $PKG_LIST $BTRF_CHECK $F2FS_CHECK 2>${PACKAGES} - fi - + # If a selection made, act if [[ $(cat ${PACKAGES}) != "" ]]; then - - # Check to see if a kernel is already installed - ls ${MOUNTPOINT}/boot/*.img >/dev/null 2>&1 - if [[ $? == 0 ]]; then - KERNEL="y" - # If not, check to see if the linux kernel has been selected - elif [[ $(cat ${PACKAGES} | awk '{print $1}') == "linux49" ]]; then - KERNEL="y" - # If no linux kernel, check to see if any of the others have been selected - else - for i in ${kernels}; do - [[ $(cat ${PACKAGES} | grep ${i}) != "" ]] && KERNEL="y" && break; - done - fi - - # If no kernel selected, warn and restart - if [[ $KERNEL == "n" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoKernel" 0 0 - install_base - - # If at least one kernel selected, proceed with installation. - elif [[ $KERNEL == "y" ]]; then - clear - [[ $(cat ${ANSWER}) -eq 1 ]] && basestrap ${MOUNTPOINT} $(cat /tmp/.base) 2>/tmp/.errlog - [[ $(cat ${ANSWER}) -eq 2 ]] && basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - # Use mhwd to install selected kernels with right kernel modules - # This is as of yet untested - arch_chroot "mhwd-kernel -i $(cat ${PACKAGES} | xargs -n1 | grep "^linux" | xargs)" 2>/tmp/.errlog - check_for_error - # If the virtual console has been set, then copy config file to installation - [[ -e /tmp/vconsole.conf ]] && cp -f /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>/tmp/.errlog - # If specified, copy over the pacman.conf file to the installation - [[ $COPY_PACCONF -eq 1 ]] && cp -f /etc/pacman.conf ${MOUNTPOINT}/etc/pacman.conf 2>>/tmp/.errlog - check_for_error - # if branch was chosen, use that also in installed system. If not, use the system setting - if [[ -e ${BRANCH} ]]; then - sed -i "/Branch =/c\Branch = $(cat ${BRANCH})/" ${MOUNTPOINT}/etc/pacman-mirrors.conf - else - sed -i "/Branch =/c$(grep "Branch =" /etc/pacman-mirrors.conf)" ${MOUNTPOINT}/etc/pacman-mirrors.conf - fi - fi - fi + + # Check to see if a kernel is already installed + ls ${MOUNTPOINT}/boot/*.img >/dev/null 2>&1 + if [[ $? == 0 ]]; then + KERNEL="y" + # If not, check to see if the linux kernel has been selected + elif [[ $(cat ${PACKAGES} | awk '{print $1}') == "linux" ]]; then + KERNEL="y" + # If no linux kernel, check to see if any of the others have been selected + else + for i in ${kernels}; do + [[ $(cat ${PACKAGES} | grep ${i}) != "" ]] && KERNEL="y" && break; + done + fi + + # If no kernel selected, warn and restart + if [[ $KERNEL == "n" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoKernel" 0 0 + install_base + + # If at least one kernel selected, proceed with installation. + elif [[ $KERNEL == "y" ]]; then + clear + [[ $(cat ${ANSWER}) -eq 1 ]] && pacstrap ${MOUNTPOINT} $(pacman -Sqg base | sed 's/linux//' | sed 's/util-/util-linux/') $(cat ${PACKAGES}) btrfs-progs f2fs-tools sudo 2>/tmp/.errlog + [[ $(cat ${ANSWER}) -eq 2 ]] && pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + # If the virtual console has been set, then copy config file to installation + [[ -e /tmp/vconsole.conf ]] && cp -f /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>/tmp/.errlog + # If specified, copy over the pacman.conf file to the installation + [[ $COPY_PACCONF -eq 1 ]] && cp -f /etc/pacman.conf ${MOUNTPOINT}/etc/pacman.conf 2>>/tmp/.errlog + check_for_error + fi + fi } install_bootloader() { # Grub auto-detects installed kernels, etc. Syslinux does not, hence the extra code for it. -bios_bootloader() { +bios_bootloader() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBiosBtTitle " --menu "$_InstBiosBtBody" 0 0 3 \ + "grub" "-" "grub + os-prober" "-" "syslinux" "-" 2>${PACKAGES} + clear + + # If something has been selected, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + sed -i 's/+\|\"//g' ${PACKAGES} + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + # If Grub, select device + if [[ $(cat ${PACKAGES} | grep "grub") != "" ]]; then + select_device + + # If a device has been selected, configure + if [[ $DEVICE != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 + arch_chroot "grub-install --target=i386-pc --recheck $DEVICE" 2>/tmp/.errlog + + # if /boot is LVM (whether using a seperate /boot mount or not), amend grub + if ( [[ $LVM -eq 1 ]] && [[ $LVM_SEP_BOOT -eq 0 ]] ) || [[ $LVM_SEP_BOOT -eq 2 ]]; then + sed -i "s/GRUB_PRELOAD_MODULES=\"\"/GRUB_PRELOAD_MODULES=\"lvm\"/g" ${MOUNTPOINT}/etc/default/grub + fi + + # If encryption used amend grub + [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub + + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + check_for_error + fi + else + # Syslinux + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstSysTitle " --menu "$_InstSysBody" 0 0 2 \ + "syslinux-install_update -iam" "[MBR]" "syslinux-install_update -i" "[/]" 2>${PACKAGES} + + # If an installation method has been chosen, run it + if [[ $(cat ${PACKAGES}) != "" ]]; then + arch_chroot "$(cat ${PACKAGES})" 2>/tmp/.errlog + check_for_error - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBiosBtTitle " --menu "$_InstBiosBtBody" 0 0 3 \ - "grub" "-" "grub + os-prober" "-" 2>${PACKAGES} - clear - - # If something has been selected, act - if [[ $(cat ${PACKAGES}) != "" ]]; then - sed -i 's/+\|\"//g' ${PACKAGES} - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - - # If Grub, select device - if [[ $(cat ${PACKAGES} | grep "grub") != "" ]]; then - select_device - - # If a device has been selected, configure - if [[ $DEVICE != "" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 - arch_chroot "grub-install --target=i386-pc --recheck $DEVICE" 2>/tmp/.errlog - - # if /boot is LVM (whether using a seperate /boot mount or not), amend grub - if ( [[ $LVM -eq 1 ]] && [[ $LVM_SEP_BOOT -eq 0 ]] ) || [[ $LVM_SEP_BOOT -eq 2 ]]; then - sed -i "s/GRUB_PRELOAD_MODULES=\"\"/GRUB_PRELOAD_MODULES=\"lvm\"/g" ${MOUNTPOINT}/etc/default/grub - fi - - # If encryption used amend grub - [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub - - arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog - check_for_error - fi - else - # Syslinux - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstSysTitle " --menu "$_InstSysBody" 0 0 2 \ - "syslinux-install_update -iam" "[MBR]" "syslinux-install_update -i" "[/]" 2>${PACKAGES} - - # If an installation method has been chosen, run it - if [[ $(cat ${PACKAGES}) != "" ]]; then - arch_chroot "$(cat ${PACKAGES})" 2>/tmp/.errlog - check_for_error - - # Amend configuration file. First remove all existing entries, then input new ones. - sed -i '/^LABEL.*$/,$d' ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - #echo -e "\n" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - # First the "main" entries - [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux realtime LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux realtime\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux release candidate\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - # Second the "fallback" entries - [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback realtime LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback realtime\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallbacl Zen\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - # Third, amend for LUKS - [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - # Finally, re-add the "default" entries - echo -e "\n\nLABEL hdt\n\tMENU LABEL HDT (Hardware Detection Tool)\n\tCOM32 hdt.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - echo -e "\n\nLABEL reboot\n\tMENU LABEL Reboot\n\tCOM32 reboot.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - echo -e "\n\n#LABEL windows\n\t#MENU LABEL Windows\n\t#COM32 chain.c32\n\t#APPEND root=/dev/sda2 rw" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - echo -e "\n\nLABEL poweroff\n\tMENU LABEL Poweroff\n\tCOM32 poweroff.c32" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - fi - fi - fi + # Amend configuration file. First remove all existing entries, then input new ones. + sed -i '/^LABEL.*$/,$d' ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + #echo -e "\n" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # First the "main" entries + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Grsec\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Zen\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Second the "fallback" entries + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Fallback\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Fallback LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Fallback Grsec\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Arch Linux Fallbacl Zen\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Third, amend for LUKS + [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Finally, re-add the "default" entries + echo -e "\n\nLABEL hdt\n\tMENU LABEL HDT (Hardware Detection Tool)\n\tCOM32 hdt.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\nLABEL reboot\n\tMENU LABEL Reboot\n\tCOM32 reboot.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\n#LABEL windows\n\t#MENU LABEL Windows\n\t#COM32 chain.c32\n\t#APPEND root=/dev/sda2 rw" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\nLABEL poweroff\n\tMENU LABEL Poweroff\n\tCOM32 poweroff.c32" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + fi + fi + fi } uefi_bootloader() { #Ensure again that efivarfs is mounted - [[ -z $(mount | grep /sys/firmware/efi/efivars) ]] && mount -t efivarfs efivarfs /sys/firmware/efi/efivars + [[ -z $(mount | grep /sys/firmware/efi/efivars) ]] && mount -t efivarfs efivarfs /sys/firmware/efi/efivars dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --menu "$_InstUefiBtBody" 0 0 2 \ - "grub" "-" 2>${PACKAGES} + "grub" "-" "systemd-boot" "/boot" 2>${PACKAGES} - if [[ $(cat ${PACKAGES}) != "" ]]; then + if [[ $(cat ${PACKAGES}) != "" ]]; then + + clear + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES} | grep -v "systemd-boot") efibootmgr dosfstools 2>/tmp/.errlog + check_for_error - clear - basestrap ${MOUNTPOINT} $(cat ${PACKAGES} | grep -v "systemd-boot") efibootmgr dosfstools 2>/tmp/.errlog - check_for_error + case $(cat ${PACKAGES}) in + "grub") + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 + arch_chroot "grub-install --target=x86_64-efi --efi-directory=${UEFI_MOUNT} --bootloader-id=arch_grub --recheck" 2>/tmp/.errlog + + # If encryption used amend grub + [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub + + # Generate config file + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + check_for_error - case $(cat ${PACKAGES}) in - "grub") - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 - arch_chroot "grub-install --target=x86_64-efi --efi-directory=${UEFI_MOUNT} --bootloader-id=arch_grub --recheck" 2>/tmp/.errlog + # Ask if user wishes to set Grub as the default bootloader and act accordingly + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --yesno "$_SetBootDefBody ${UEFI_MOUNT}/EFI/boot $_SetBootDefBody2" 0 0 + + if [[ $? -eq 0 ]]; then + arch_chroot "mkdir ${UEFI_MOUNT}/EFI/boot" 2>/tmp/.errlog + arch_chroot "cp -r ${UEFI_MOUNT}/EFI/arch_grub/grubx64.efi ${UEFI_MOUNT}/EFI/boot/bootx64.efi" 2>>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --infobox "\nGrub $_SetDefDoneBody" 0 0 + sleep 2 + fi + ;; + "systemd-boot") + arch_chroot "bootctl --path=${UEFI_MOUNT} install" 2>/tmp/.errlog + check_for_error + + # Deal with LVM Root + [[ $(echo $ROOT_PART | grep "/dev/mapper/") != "" ]] && bl_root=$ROOT_PART \ + || bl_root=$"PARTUUID="$(blkid -s PARTUUID ${ROOT_PART} | sed 's/.*=//g' | sed 's/"//g') + + # Create default config files. First the loader + echo -e "default arch\ntimeout 10" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf 2>/tmp/.errlog + + # Second, the kernel conf files + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "title\tArch Linux\nlinux\t/vmlinuz-linux\ninitrd\t/initramfs-linux.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "title\tArch Linux LTS\nlinux\t/vmlinuz-linux-lts\ninitrd\t/initramfs-linux-lts.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-lts.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "title\tArch Linux Grsec\nlinux\t/vmlinuz-linux-grsec\ninitrd\t/initramfs-linux-grsec.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-grsec.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "title\tArch Linux Zen\nlinux\t/vmlinuz-linux-zen\ninitrd\t/initramfs-linux-zen.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-zen.conf - # If encryption used amend grub - [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub - - # Generate config file - arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog - check_for_error - - # Ask if user wishes to set Grub as the default bootloader and act accordingly - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --yesno "$_SetBootDefBody ${UEFI_MOUNT}/EFI/boot $_SetBootDefBody2" 0 0 - - if [[ $? -eq 0 ]]; then - arch_chroot "mkdir ${UEFI_MOUNT}/EFI/boot" 2>/tmp/.errlog - arch_chroot "cp -r ${UEFI_MOUNT}/EFI/arch_grub/grubx64.efi ${UEFI_MOUNT}/EFI/boot/bootx64.efi" 2>>/tmp/.errlog - check_for_error - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --infobox "\nGrub $_SetDefDoneBody" 0 0 - sleep 2 - fi - ;; - "systemd-boot") - arch_chroot "bootctl --path=${UEFI_MOUNT} install" 2>/tmp/.errlog - check_for_error - - # Deal with LVM Root - [[ $(echo $ROOT_PART | grep "/dev/mapper/") != "" ]] && bl_root=$ROOT_PART \ - || bl_root=$"PARTUUID="$(blkid -s PARTUUID ${ROOT_PART} | sed 's/.*=//g' | sed 's/"//g') - - # Create default config files. First the loader - echo -e "default arch\ntimeout 10" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf 2>/tmp/.errlog - - # Second, the kernel conf files - [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "title\tManjaro Linux\nlinux\t/vmlinuz-linux\ninitrd\t/initramfs-linux.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch.conf - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "title\tManjaro Linux LTS\nlinux\t/vmlinuz-linux-lts\ninitrd\t/initramfs-linux-lts.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-lts.conf - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "title\tManjaro Linux Grsec\nlinux\t/vmlinuz-linux-grsec\ninitrd\t/initramfs-linux-grsec.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-grsec.conf - [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "title\tManjaro Linux Zen\nlinux\t/vmlinuz-linux-zen\ninitrd\t/initramfs-linux-zen.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-zen.conf - - # Finally, amend kernel conf files for LUKS and BTRFS - sysdconf=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch*.conf) - for i in ${sysdconf}; do - [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${i} - done - ;; - *) install_base_menu - ;; - esac - fi + # Finally, amend kernel conf files for LUKS and BTRFS + sysdconf=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch*.conf) + for i in ${sysdconf}; do + [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${i} + done + ;; + *) install_base_menu + ;; + esac + fi } - # # - # Bootloader function begins here # - # # + # # + # Bootloader function begins here # + # # check_mount # Set the default PATH variable arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog @@ -1790,92 +1746,86 @@ uefi_bootloader() { fi } -# +# install_network_menu() { # ntp not exactly wireless, but this menu is the best fit. install_wireless_packages(){ - WIRELESS_PACKAGES="" - wireless_pkgs="dialog iw rp-pppoe wireless_tools wpa_actiond" - - for i in ${wireless_pkgs}; do - WIRELESS_PACKAGES="${WIRELESS_PACKAGES} ${i} - on" - done - - # If no wireless, uncheck wireless pkgs - [[ $(lspci | grep -i "Network Controller") == "" ]] && WIRELESS_PACKAGES=$(echo $WIRELESS_PACKAGES | sed "s/ on/ off/g") - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuPkg " --checklist "$_InstNMMenuPkgBody\n\n$_UseSpaceBar" 0 0 13 \ - $WIRELESS_PACKAGES \ - "ufw" "-" off \ - "gufw" "-" off \ - "ntp" "-" off \ - "b43-fwcutter" "Broadcom 802.11b/g/n" off \ - "bluez-firmware" "Broadcom BCM203x / STLC2300 Bluetooth" off \ - "ipw2100-fw" "Intel PRO/Wireless 2100" off \ - "ipw2200-fw" "Intel PRO/Wireless 2200" off \ - "zd1211-firmware" "ZyDAS ZD1211(b) 802.11a/b/g USB WLAN" off 2>${PACKAGES} - - if [[ $(cat ${PACKAGES}) != "" ]]; then - clear - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi + WIRELESS_PACKAGES="" + wireless_pkgs="dialog iw rp-pppoe wireless_tools wpa_actiond" + + for i in ${wireless_pkgs}; do + WIRELESS_PACKAGES="${WIRELESS_PACKAGES} ${i} - on" + done + + # If no wireless, uncheck wireless pkgs + [[ $(lspci | grep -i "Network Controller") == "" ]] && WIRELESS_PACKAGES=$(echo $WIRELESS_PACKAGES | sed "s/ on/ off/g") + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuPkg " --checklist "$_InstNMMenuPkgBody\n\n$_UseSpaceBar" 0 0 13 \ + $WIRELESS_PACKAGES \ + "ufw" "-" off \ + "gufw" "-" off \ + "ntp" "-" off \ + "b43-fwcutter" "Broadcom 802.11b/g/n" off \ + "bluez-firmware" "Broadcom BCM203x / STLC2300 Bluetooth" off \ + "ipw2100-fw" "Intel PRO/Wireless 2100" off \ + "ipw2200-fw" "Intel PRO/Wireless 2200" off \ + "zd1211-firmware" "ZyDAS ZD1211(b) 802.11a/b/g USB WLAN" off 2>${PACKAGES} + + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi } install_cups(){ - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --checklist "$_InstCupsBody\n\n$_UseSpaceBar" 0 0 11 \ - "cups" "-" on \ - "cups-pdf" "-" off \ - "ghostscript" "-" on \ - "gsfonts" "-" on \ - "samba" "-" off 2>${PACKAGES} - - if [[ $(cat ${PACKAGES}) != "" ]]; then - clear - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - - if [[ $(cat ${PACKAGES} | grep "cups") != "" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --yesno "$_InstCupsQ" 0 0 - if [[ $? -eq 0 ]]; then - # Add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. - if [[ -e /tmp/.openrc ]]; then - #statements - arch_chroot "rc-update add cupsd" 2>/tmp/.errlog - else - arch_chroot "systemctl enable org.cups.cupsd.service" 2>/tmp/.errlog - fi - check_for_error - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 - fi - fi - fi - + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --checklist "$_InstCupsBody\n\n$_UseSpaceBar" 0 0 11 \ + "cups" "-" on \ + "cups-pdf" "-" off \ + "ghostscript" "-" on \ + "gsfonts" "-" on \ + "samba" "-" off 2>${PACKAGES} + + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + if [[ $(cat ${PACKAGES} | grep "cups") != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --yesno "$_InstCupsQ" 0 0 + if [[ $? -eq 0 ]]; then + arch_chroot "systemctl enable org.cups.cupsd.service" 2>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + fi + fi + fi + } - if [[ $SUB_MENU != "install_network_packages" ]]; then - SUB_MENU="install_network_packages" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 5 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + if [[ $SUB_MENU != "install_network_packages" ]]; then + SUB_MENU="install_network_packages" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuTitle " --menu "$_InstNMMenuBody" 0 0 5 \ - "1" "$_SeeWirelessDev" \ - "2" "$_InstNMMenuPkg" \ - "3" "$_InstNMMenuNM" \ - "4" "$_InstNMMenuCups" \ - "5" "$_Back" 2>${ANSWER} + "1" "$_SeeWirelessDev" \ + "2" "$_InstNMMenuPkg" \ + "3" "$_InstNMMenuNM" \ + "4" "$_InstNMMenuCups" \ + "5" "$_Back" 2>${ANSWER} case $(cat ${ANSWER}) in - "1") # Identify the Wireless Device + "1") # Identify the Wireless Device lspci -k | grep -i -A 2 "network controller" > /tmp/.wireless if [[ $(cat /tmp/.wireless) != "" ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WirelessShowTitle " --textbox /tmp/.wireless 0 0 @@ -1885,51 +1835,52 @@ install_cups(){ ;; "2") install_wireless_packages ;; - "3") install_nm - ;; - "4") install_cups - ;; - *) main_menu_online + "3") install_nm + ;; + "4") install_cups + ;; + *) main_menu_online ;; esac - + install_network_menu - + } # Install xorg and input drivers. Also copy the xkbmap configuration file created earlier to the installed system install_xorg_input() { - echo "" > ${PACKAGES} + echo "" > ${PACKAGES} - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstGrMenuDS " --checklist "$_InstGrMenuDSBody\n\n$_UseSpaceBar" 0 0 12 \ - "wayland" "-" off \ - "xorg-server" "-" on \ - "xorg-server-common" "-" off \ - "xorg-server-utils" "-" on \ - "xorg-xinit" "-" on \ - "xorg-server-xwayland" "-" off \ - "xf86-input-evdev" "-" off \ - "xf86-input-keyboard" "-" on \ - "xf86-input-libinput" "-" on \ - "xf86-input-mouse" "-" on \ - "xf86-input-synaptics" "-" off 2>${PACKAGES} + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstGrMenuDS " --checklist "$_InstGrMenuDSBody\n\n$_UseSpaceBar" 0 0 12 \ + "wayland" "-" off \ + "xorg-server" "-" on \ + "xorg-server-common" "-" off \ + "xorg-server-utils" "-" on \ + "xorg-xinit" "-" on \ + "xorg-server-xwayland" "-" off \ + "xf86-input-evdev" "-" off \ + "xf86-input-joystick" "-" off \ + "xf86-input-keyboard" "-" on \ + "xf86-input-libinput" "-" off \ + "xf86-input-mouse" "-" on \ + "xf86-input-synaptics" "-" on 2>${PACKAGES} - clear - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + + # now copy across .xinitrc for all user accounts + user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") + for i in ${user_list}; do + cp -f ${MOUNTPOINT}/etc/X11/xinit/xinitrc ${MOUNTPOINT}/home/$i/.xinitrc + arch_chroot "chown -R ${i}:users /home/${i}" + done - # now copy across .xinitrc for all user accounts - user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") - for i in ${user_list}; do - [[ -e ${MOUNTPOINT}/home/$i/.xinitrc ]] || cp -f ${MOUNTPOINT}/etc/X11/xinit/xinitrc ${MOUNTPOINT}/home/$i/.xinitrc - arch_chroot "chown -R ${i}:users /home/${i}" - done - - install_graphics_menu + install_graphics_menu } setup_graphics_card() { @@ -1937,134 +1888,153 @@ setup_graphics_card() { # Save repetition install_intel(){ - #basestrap ${MOUNTPOINT} xf86-video-intel libva-intel-driver intel-ucode 2>/tmp/.errlog - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog - check_for_error + pacstrap ${MOUNTPOINT} xf86-video-intel libva-intel-driver intel-ucode 2>/tmp/.errlog sed -i 's/MODULES=""/MODULES="i915"/' ${MOUNTPOINT}/etc/mkinitcpio.conf - + # Intel microcode (Grub, Syslinux and systemd-boot). # Done as seperate if statements in case of multiple bootloaders. if [[ -e ${MOUNTPOINT}/boot/grub/grub.cfg ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " grub-mkconfig " --infobox "$_PlsWaitBody" 0 0 - sleep 1 - arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog - fi - # Syslinux - [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && sed -i "s/INITRD /&..\/intel-ucode.img,/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg - - # Systemd-boot - if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then - update=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) - for i in ${upgate}; do - sed -i '/linux \//a initrd \/intel-ucode.img' ${i} - done - fi + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " grub-mkconfig " --infobox "$_PlsWaitBody" 0 0 + sleep 1 + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + fi + # Syslinux + [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && sed -i "s/INITRD /&..\/intel-ucode.img,/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Systemd-boot + if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then + update=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) + for i in ${upgate}; do + sed -i '/linux \//a initrd \/intel-ucode.img' ${i} + done + fi + } # Save repetition install_ati(){ - # basestrap ${MOUNTPOINT} xf86-video-ati 2>/tmp/.errlog - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog - check_for_error - sed -i 's/MODULES=""/MODULES="radeon"/' ${MOUNTPOINT}/etc/mkinitcpio.conf + pacstrap ${MOUNTPOINT} xf86-video-ati 2>/tmp/.errlog + sed -i 's/MODULES=""/MODULES="radeon"/' ${MOUNTPOINT}/etc/mkinitcpio.conf } # Main menu. Correct option for graphics card should be automatically highlighted. - NVIDIA="" - VB_MOD="" - GRAPHIC_CARD="" - INTEGRATED_GC="N/A" - GRAPHIC_CARD=$(lspci | grep -i "vga" | sed 's/.*://' | sed 's/(.*//' | sed 's/^[ \t]*//') - - # Highlight menu entry depending on GC detected. Extra work is needed for NVIDIA - if [[ $(echo $GRAPHIC_CARD | grep -i "nvidia") != "" ]]; then - # If NVIDIA, first need to know the integrated GC - [[ $(lscpu | grep -i "intel\|lenovo") != "" ]] && INTEGRATED_GC="Intel" || INTEGRATED_GC="ATI" - - # Second, identity the NVIDIA card and driver / menu entry - if [[ $(dmesg | grep -i 'chipset' | grep -i 'nvc\|nvd\|nve') != "" ]]; then HIGHLIGHT_SUB_GC=4 - elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nva\|nv5\|nv8\|nv9') != "" ]]; then HIGHLIGHT_SUB_GC=5 - elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nv4\|nv6') != "" ]]; then HIGHLIGHT_SUB_GC=6 - else HIGHLIGHT_SUB_GC=3 - fi - - # All non-NVIDIA cards / virtualisation - elif [[ $(echo $GRAPHIC_CARD | grep -i 'intel\|lenovo') != "" ]]; then HIGHLIGHT_SUB_GC=2 - elif [[ $(echo $GRAPHIC_CARD | grep -i 'ati') != "" ]]; then HIGHLIGHT_SUB_GC=1 - elif [[ $(echo $GRAPHIC_CARD | grep -i 'via') != "" ]]; then HIGHLIGHT_SUB_GC=7 - elif [[ $(echo $GRAPHIC_CARD | grep -i 'virtualbox') != "" ]]; then HIGHLIGHT_SUB_GC=9 - elif [[ $(echo $GRAPHIC_CARD | grep -i 'vmware') != "" ]]; then HIGHLIGHT_SUB_GC=8 - else HIGHLIGHT_SUB_GC=9 - fi - + NVIDIA="" + VB_MOD="" + GRAPHIC_CARD="" + INTEGRATED_GC="N/A" + GRAPHIC_CARD=$(lspci | grep -i "vga" | sed 's/.*://' | sed 's/(.*//' | sed 's/^[ \t]*//') + + # Highlight menu entry depending on GC detected. Extra work is needed for NVIDIA + if [[ $(echo $GRAPHIC_CARD | grep -i "nvidia") != "" ]]; then + # If NVIDIA, first need to know the integrated GC + [[ $(lscpu | grep -i "intel\|lenovo") != "" ]] && INTEGRATED_GC="Intel" || INTEGRATED_GC="ATI" + + # Second, identity the NVIDIA card and driver / menu entry + if [[ $(dmesg | grep -i 'chipset' | grep -i 'nvc\|nvd\|nve') != "" ]]; then HIGHLIGHT_SUB_GC=4 + elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nva\|nv5\|nv8\|nv9') != "" ]]; then HIGHLIGHT_SUB_GC=5 + elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nv4\|nv6') != "" ]]; then HIGHLIGHT_SUB_GC=6 + else HIGHLIGHT_SUB_GC=3 + fi + + # All non-NVIDIA cards / virtualisation + elif [[ $(echo $GRAPHIC_CARD | grep -i 'intel\|lenovo') != "" ]]; then HIGHLIGHT_SUB_GC=2 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'ati') != "" ]]; then HIGHLIGHT_SUB_GC=1 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'via') != "" ]]; then HIGHLIGHT_SUB_GC=7 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'virtualbox') != "" ]]; then HIGHLIGHT_SUB_GC=8 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'vmware') != "" ]]; then HIGHLIGHT_SUB_GC=9 + else HIGHLIGHT_SUB_GC=10 + fi + dialog --default-item ${HIGHLIGHT_SUB_GC} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_GCtitle " \ --menu "$GRAPHIC_CARD\n" 0 0 10 \ - "1" $"xf86-video-ati" \ - "2" $"xf86-video-intel" \ - "3" $"xf86-video-nouveau (+ $INTEGRATED_GC)" \ - "4" $"Nvidia (+ $INTEGRATED_GC)" \ - "5" $"Nvidia-340xx (+ $INTEGRATED_GC)" \ - "6" $"Nvidia-304xx (+ $INTEGRATED_GC)" \ - "7" $"xf86-video-openchrome" \ - "8" $"xf86-video-vmware" \ - "9" "$_GCUnknOpt / xf86-video-fbdev" 2>${ANSWER} + "1" $"xf86-video-ati" \ + "2" $"xf86-video-intel" \ + "3" $"xf86-video-nouveau (+ $INTEGRATED_GC)" \ + "4" $"Nvidia (+ $INTEGRATED_GC)" \ + "5" $"Nvidia-340xx (+ $INTEGRATED_GC)" \ + "6" $"Nvidia-304xx (+ $INTEGRATED_GC)" \ + "7" $"xf86-video-openchrome" \ + "8" $"virtualbox-guest-dkms" \ + "9" $"xf86-video-vmware" \ + "10" "$_GCUnknOpt / xf86-video-fbdev" 2>${ANSWER} case $(cat ${ANSWER}) in "1") # ATI/AMD - install_ati + install_ati ;; "2") # Intel - install_intel + install_intel ;; "3") # Nouveau / NVIDIA - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog - sed -i 's/MODULES=""/MODULES="nouveau"/' ${MOUNTPOINT}/etc/mkinitcpio.conf + [[ $INTEGRATED_GC == "ATI" ]] && install_ati || install_intel + pacstrap ${MOUNTPOINT} xf86-video-nouveau 2>/tmp/.errlog + sed -i 's/MODULES=""/MODULES="nouveau"/' ${MOUNTPOINT}/etc/mkinitcpio.conf ;; "4") # NVIDIA-GF - arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + [[ $INTEGRATED_GC == "ATI" ]] && install_ati || install_intel + arch_chroot "pacman -Rdds --noconfirm mesa-libgl mesa" + + # Set NVIDIA driver(s) to install depending on installed kernel(s) + ([[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]]) && NVIDIA="nvidia" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && NVIDIA="$NVIDIA nvidia-lts" + + clear + pacstrap ${MOUNTPOINT} ${NVIDIA} nvidia-libgl nvidia-utils pangox-compat nvidia-settings 2>/tmp/.errlog NVIDIA_INST=1 ;; "5") # NVIDIA-340 - arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + [[ $INTEGRATED_GC == "ATI" ]] && install_ati || install_intel + arch_chroot "pacman -Rdds --noconfirm mesa-libgl mesa" + + # Set NVIDIA driver(s) to install depending on installed kernel(s) + ([[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]]) && NVIDIA="nvidia-340xx" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && NVIDIA="$NVIDIA nvidia-340xx-lts" + + clear + pacstrap ${MOUNTPOINT} ${NVIDIA} nvidia-340xx-libgl nvidia-340xx-utils nvidia-settings 2>/tmp/.errlog NVIDIA_INST=1 ;; "6") # NVIDIA-304 - arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + [[ $INTEGRATED_GC == "ATI" ]] && install_ati || install_intel + arch_chroot "pacman -Rdds --noconfirm mesa-libgl mesa" + + # Set NVIDIA driver(s) to install depending on installed kernel(s) + ([[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] || [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]]) && NVIDIA="nvidia-304xx" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && NVIDIA="$NVIDIA nvidia-304xx-lts" + + clear + pacstrap ${MOUNTPOINT} ${NVIDIA} nvidia-304xx-libgl nvidia-304xx-utils nvidia-settings 2>/tmp/.errlog NVIDIA_INST=1 - ;; + ;; "7") # Via - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog - #basestrap ${MOUNTPOINT} xf86-video-openchrome 2>/tmp/.errlog + pacstrap ${MOUNTPOINT} xf86-video-openchrome 2>/tmp/.errlog + ;; + "8") # VirtualBox + + # Set VB headers to install depending on installed kernel(s) + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && VB_MOD="linux-headers" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && VB_MOD="$VB_MOD linux-grsec-headers" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && VB_MOD="$VB_MOD linux-zen-headers" + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && VB_MOD="$VB_MOD linux-lts-headers" + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_VBoxInstTitle" --msgbox "$_VBoxInstBody" 0 0 + clear + + pacstrap ${MOUNTPOINT} virtualbox-guest-utils virtualbox-guest-dkms $VB_MOD 2>/tmp/.errlog + umount -l /mnt/dev + + # Load modules and enable vboxservice. + arch_chroot "modprobe -a vboxguest vboxsf vboxvideo" + arch_chroot "systemctl enable vboxservice" + echo -e "vboxguest\nvboxsf\nvboxvideo" > ${MOUNTPOINT}/etc/modules-load.d/virtualbox.conf ;; - # "8") # VirtualBox - - # # Set VB headers to install depending on installed kernel(s) - # [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && VB_MOD="linux-headers" - # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && VB_MOD="$VB_MOD linux-grsec-headers" - # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && VB_MOD="$VB_MOD linux-zen-headers" - # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && VB_MOD="$VB_MOD linux-lts-headers" - - # dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_VBoxInstTitle" --msgbox "$_VBoxInstBody" 0 0 - # clear - - # basestrap ${MOUNTPOINT} virtualbox-guest-utils virtualbox-guest-dkms $VB_MOD 2>/tmp/.errlog - # umount -l /mnt/dev - - # # Load modules and enable vboxservice. - # arch_chroot "modprobe -a vboxguest vboxsf vboxvideo" - # # add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. - # arch_chroot "systemctl enable vboxservice" - # echo -e "vboxguest\nvboxsf\nvboxvideo" > ${MOUNTPOINT}/etc/modules-load.d/virtualbox.conf - # ;; - "8") # VMWare - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog - #basestrap ${MOUNTPOINT} xf86-video-vmware xf86-input-vmmouse 2>/tmp/.errlog + "9") # VMWare + pacstrap ${MOUNTPOINT} xf86-video-vmware xf86-input-vmmouse 2>/tmp/.errlog ;; - "9") # Generic / Unknown - #basestrap ${MOUNTPOINT} xf86-video-fbdev 2>/tmp/.errlog - arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + "10") # Generic / Unknown + pacstrap ${MOUNTPOINT} xf86-video-fbdev 2>/tmp/.errlog ;; *) install_graphics_menu ;; @@ -2084,16 +2054,18 @@ install_ati(){ echo " # ..." >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf echo "EndSection" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf fi - + # Where NVIDIA has been installed allow user to check and amend the file if [[ $NVIDIA_INST == 1 ]]; then dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NvidiaConfTitle " --msgbox "$_NvidiaConfBody" 0 0 nano ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf fi - + install_graphics_menu } + + install_de_wm() { # Only show this information box once @@ -2102,300 +2074,73 @@ install_de_wm() { SHOW_ONCE=1 fi - # DE/WM Menu - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --checklist "$_InstDEBody $_UseSpaceBar" 0 0 12 \ - "budgie-desktop" "-" off \ - "cinnamon" "-" off \ - "deepin" "-" off \ - "deepin-extra" "-" off \ - "enlightenment + terminology" "-" off \ - "gnome-shell" "-" off \ - "gnome" "-" off \ - "gnome-extra" "-" off \ - "plasma-desktop" "-" off \ - "plasma" "-" off \ - "kde-applications" "-" off \ - "lxde" "-" off \ - "lxqt + oxygen-icons" "-" off \ - "mate" "-" off \ - "mate-extra" "-" off \ - "mate-gtk3" "-" off \ - "mate-extra-gtk3" "-" off \ - "xfce4" "-" off \ - "xfce4-goodies" "-" off \ - "awesome + vicious" "-" off \ - "fluxbox + fbnews" "-" off \ - "i3-wm + i3lock + i3status" "-" off \ - "icewm + icewm-themes" "-" off \ - "openbox + openbox-themes" "-" off \ - "pekwm + pekwm-themes" "-" off \ - "windowmaker" "-" off 2>${PACKAGES} + # DE/WM Menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --checklist "$_InstDEBody $_UseSpaceBar" 0 0 12 \ + "budgie-desktop" "-" off \ + "cinnamon" "-" off \ + "deepin" "-" off \ + "deepin-extra" "-" off \ + "enlightenment + terminology" "-" off \ + "gnome-shell" "-" off \ + "gnome" "-" off \ + "gnome-extra" "-" off \ + "plasma-desktop" "-" off \ + "plasma" "-" off \ + "kde-applications" "-" off \ + "lxde" "-" off \ + "lxqt + oxygen-icons" "-" off \ + "mate" "-" off \ + "mate-extra" "-" off \ + "mate-gtk3" "-" off \ + "mate-extra-gtk3" "-" off \ + "xfce4" "-" off \ + "xfce4-goodies" "-" off \ + "awesome + vicious" "-" off \ + "fluxbox + fbnews" "-" off \ + "i3-wm + i3lock + i3status" "-" off \ + "icewm + icewm-themes" "-" off \ + "openbox + openbox-themes" "-" off \ + "pekwm + pekwm-themes" "-" off \ + "windowmaker" "-" off 2>${PACKAGES} - # If something has been selected, install - if [[ $(cat ${PACKAGES}) != "" ]]; then - clear - sed -i 's/+\|\"//g' ${PACKAGES} - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error + # If something has been selected, install + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + sed -i 's/+\|\"//g' ${PACKAGES} + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + # Clear the packages file for installation of "common" packages + echo "" > ${PACKAGES} - # Clear the packages file for installation of "common" packages - echo "" > ${PACKAGES} + # Offer to install various "common" packages. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstComTitle " --checklist "$_InstComBody $_UseSpaceBar" 0 50 14 \ + "bash-completion" "-" on \ + "gamin" "-" on \ + "gksu" "-" on \ + "gnome-icon-theme" "-" on \ + "gnome-keyring" "-" on \ + "gvfs" "-" on \ + "gvfs-afc" "-" on \ + "gvfs-smb" "-" on \ + "polkit" "-" on \ + "poppler" "-" on \ + "python2-xdg" "-" on \ + "ntfs-3g" "-" on \ + "ttf-dejavu" "-" on \ + "xdg-user-dirs" "-" on \ + "xdg-utils" "-" on \ + "xterm" "-" on 2>${PACKAGES} - # Offer to install various "common" packages. - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstComTitle " --checklist "$_InstComBody $_UseSpaceBar" 0 50 14 \ - "bash-completion" "-" on \ - "gamin" "-" on \ - "gksu" "-" on \ - "gnome-icon-theme" "-" on \ - "gnome-keyring" "-" on \ - "gvfs" "-" on \ - "gvfs-afc" "-" on \ - "gvfs-smb" "-" on \ - "polkit" "-" on \ - "poppler" "-" on \ - "python2-xdg" "-" on \ - "ntfs-3g" "-" on \ - "ttf-dejavu" "-" on \ - "xdg-user-dirs" "-" on \ - "xdg-utils" "-" on \ - "xterm" "-" on 2>${PACKAGES} + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - clear - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi - - fi - -} - -install_manjaro_de_wm() { - - # Only show this information box once - if [[ $SHOW_ONCE -eq 0 ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --msgbox "This installs a package list and a desktop-settings package that correspond to manjaro editions of the same name." 0 0 - SHOW_ONCE=1 - fi - - # download manjaro-tools.-isoprofiles git repo - if [[ -d /tmp/profiles ]]; then - git -C /tmp/profiles pull - else - git clone --depth 1 https://github.com/manjaro/iso-profiles.git /tmp/profiles - fi - - # Clear packages after installing base - echo "" > /tmp/.desktop - # DE/WM Menu - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --radiolist "$_InstDEBody $_UseSpaceBar" 0 0 12 \ - "xfce" "-" off \ - "kde" "-" off \ - "budgie" "-" off \ - "cinnamon" "-" off \ - "deepin" "-" off \ - "gnome" "-" off \ - "mate" "-" off \ - "lxqt" "-" off \ - "i3" "-" off \ - "bspwm" "-" off 2> /tmp/.desktop - - # If something has been selected, install - if [[ $(cat /tmp/.desktop) != "" ]]; then - # Get packages to install from manjaro isoprofiles files, - # remove openrc and kernel specific stuff and unnecesary characters - case $(cat /tmp/.desktop) in - xfce) - target_desktop="/tmp/profiles/manjaro/xfce/Packages-Desktop" - overlay="/tmp/profiles/manjaro/xfce/desktop-overlay/" - profile="/tmp/profiles/manjaro/xfce/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - kde) - target_desktop="/tmp/profiles/manjaro/kde/Packages-Desktop" - overlay="/tmp/profiles/manjaro/kde/desktop-overlay/" - profile="/tmp/profiles/manjaro/kde/profile.conf" - echo "sddm" > /tmp/.display-manager - ;; - deepin) - target_desktop="/tmp/profiles/community/deepin/Packages-Desktop" - overlay="/tmp/profiles/community/deepin/desktop-overlay/" - profile="/tmp/profiles/community/deepin/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - gnome) - target_desktop="/tmp/profiles/manjaro/gnome/Packages-Desktop" - overlay="/tmp/profiles/manjaro/gnome/desktop-overlay/" - profile="/tmp/profiles/manjaro/gnome/profile.conf" - echo "gdm" > /tmp/.display-manager - ;; - lxqt) - target_desktop="/tmp/profiles/manjaro/lxqt/Packages-Desktop" - overlay="/tmp/profiles/manjaro/lxqt/desktop-overlay/" - profile="/tmp/profiles/manjaro/lxqt/profile.conf" - echo "sddm" > /tmp/.display-manager - ;; - i3) - target_desktop="/tmp/profiles/community/i3/Packages-Desktop" - overlay="/tmp/profiles/community/i3/desktop-overlay/" - profile="/tmp/profiles/community/i3/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - bspwm) - target_desktop="/tmp/profiles/community/bspwm/Packages-Desktop" - overlay="/tmp/profiles/community/bspwm/desktop-overlay/" - profile="/tmp/profiles/community/bspwm/profile.conf" - echo "" > /tmp/.display-manager - ;; - budgie) - target_desktop="/tmp/profiles/community/budgie/Packages-Desktop" - overlay="/tmp/profiles/community/budgie/desktop-overlay/" - profile="/tmp/profiles/community/budgie/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - cinnamon) - target_desktop="/tmp/profiles/community/cinnamon/Packages-Desktop" - overlay="/tmp/profiles/community/cinnamon/desktop-overlay/" - profile="/tmp/profiles/community/cinnamon/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - mate) - target_desktop="/tmp/profiles/community/mate/Packages-Desktop" - overlay="/tmp/profiles/community/mate/desktop-overlay/" - profile="/tmp/profiles/community/mate/profile.conf" - echo "lightdm" > /tmp/.display-manager - ;; - esac - - # Parse package list based on user input and remove parts that don't belong to pacman - cat /tmp/profiles/shared/Packages-Root "$target_desktop" > /tmp/.edition - if [[ -e /tmp/.openrc ]]; then - # Remove any packages tagged with >systemd and remove >openrc tags - sed -i '/>systemd/d' /tmp/.edition - sed -i 's/>openrc //g' /tmp/.edition - else - # Remove any packages tagged with >openrc and remove >systemd tags - sed -i '/>openrc/d' /tmp/.edition - sed -i 's/>systemd //g' /tmp/.edition - fi - - if [[ "$(uname -m)" == "x86_64" ]]; then - # Remove any packages tagged with >i686 and remove >x86_64 tags - sed -i '/>i686/d' /tmp/.edition - sed -i 's/>x86_64 //g' /tmp/.edition - else - # Remove any packages tagged with >x86_64 and remove >i686 tags - sed -i '/>x86_64/d' /tmp/.edition - sed -i 's/>i686 //g' /tmp/.edition - fi - # If multilib repo is enabled, install multilib packages - if grep -q "^[multilib]" ${MOUNTPOINT}/etc/pacman.conf ; then - # Remove >multilib tags - sed -i 's/>multilib //g' /tmp/.edition - else - # Remove lines with >multilib tag - sed -i '/>multilib/d' /tmp/.edition - fi - # Remove commented lines - # remove everything except the first word of every lines - sed -i 's/\s.*$//' /tmp/.edition - # Remove lines with # - sed -i '/#/d' /tmp/.edition - # remove KERNEL variable - sed -i '/KERNEL/d' /tmp/.edition - # Remove empty lines - sed -i '/^\s*$/d' /tmp/.edition - # Remove base-devel and base packages. Base is already installed and base-devel should be decided by the user - pacman -Qgq base-devel base > /tmp/.notincluded - pacman -Sgq openrc-base >> /tmp/.notincluded - grep -v -f /tmp/.notincluded /tmp/.edition | grep -v "base-devel" > /tmp/.tmp - mv /tmp/.tmp /tmp/.edition - # basestrap the parsed package list to the new root - basestrap ${MOUNTPOINT} $(cat /tmp/.edition /usr/share/aif/package-lists/input-drivers | sort | uniq) 2>/tmp/.errlog - check_for_error - - # copy the profile overlay to the new root - echo "Copying overlay files to the new root" - cp -r "$overlay"* ${MOUNTPOINT} 2>/tmp/.errlog - check_for_error - # Enable services in the chosen profile - echo "Enabling services" - if [[ -e /tmp/.openrc ]]; then - eval $(grep -e "enable_openrc=" $profile | sed 's/# //g') - echo "${enable_openrc[@]}" > /tmp/.services - for service in "${enable_openrc[@]}" ; do - arch_chroot "rc-update add $service" 2>/tmp/.errlog - check_for_error - done - # enable display manager for openrc - if [[ "$(cat /tmp/.display-manager)" == sddm ]]; then - sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"sddm\"/g" /mnt/etc/conf.d/xdm - arch_chroot "rc-update add xdm default" 2>/tmp/.errlog - check_for_error - elif [[ "$(cat /tmp/.display-manager)" == lightdm ]]; then - set_lightdm_greeter - sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"lightdm\"/g" /mnt/etc/conf.d/xdm - arch_chroot "rc-update add xdm default" 2>/tmp/.errlog - check_for_error - else - echo "no display manager was installed" - sleep 2 - fi - else - eval $(grep -e "enable_systemd=" $profile | sed 's/# //g') - echo "${enable_systemd[@]}" > /tmp/.services - for service in "${enable_systemd[@]}" ; do - arch_chroot "systemctl enable $service && echo "enabled $service" || echo "failed to enable $service"" 2>/tmp/.errlog - check_for_error - done - arch_chroot "systemctl disable pacman-init" 2>/tmp/.errlog - check_for_error - # enable display manager for systemd - if [[ "$(cat /tmp/.display-manager)" == lightdm ]]; then - set_lightdm_greeter - arch_chroot "systemctl enable lightdm" 2>/tmp/.errlog - check_for_error - elif [[ "$(cat /tmp/.display-manager)" == sddm ]]; then - arch_chroot "systemctl enable sdddm" 2>/tmp/.errlog - check_for_error - elif [[ "$(cat /tmp/.display-manager)" == gdm ]]; then - arch_chroot "systemctl enable gdm" 2>/tmp/.errlog - check_for_error - else - echo "no display manager was installed" - sleep 2 - fi - fi - # Clear the packages file for installation of "common" packages - echo "" > ${PACKAGES} - - # Offer to install various "common" packages. - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstComTitle " --checklist "$_InstComBody $_UseSpaceBar" 0 50 13 \ - "manjaro-settings-manager" "-" off \ - "pamac" "-" off \ - "octopi" "-" off \ - "pacli" "-" off \ - "fish" "-" off \ - "fisherman" "-" off \ - "zsh-completions" "-" on \ - "mhwd-chroot" "-" off \ - "bmenu" "-" on \ - "clonezilla" "-" off \ - "manjaro-tools-iso" "-" off \ - "manjaro-tools-base" "-" off \ - "manjaro-tools-pkg" "-" off 2>${PACKAGES} - - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - clear - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi - - fi + fi } @@ -2404,65 +2149,56 @@ install_dm() { # Save repetition of code enable_dm() { - if [[ -e /tmp/.openrc ]]; then - sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"$(cat ${PACKAGES})\"/g" /mnt/etc/conf.d/xdm - arch_chroot "rc-update add xdm default" 2>/tmp/.errlog - check_for_error - DM=$(cat ${PACKAGES}) - DM_ENABLED=1 - else - # enable display manager for systemd - arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog - check_for_error - DM=$(cat ${PACKAGES}) - DM_ENABLED=1 - fi + arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog + check_for_error + DM=$(cat ${PACKAGES}) + DM_ENABLED=1 } - if [[ $DM_ENABLED -eq 0 ]]; then - # Prep variables - echo "" > ${PACKAGES} - dm_list="gdm lxdm lightdm sddm" - DM_LIST="" - DM_INST="" + if [[ $DM_ENABLED -eq 0 ]]; then + # Prep variables + echo "" > ${PACKAGES} + dm_list="gdm lxdm lightdm sddm" + DM_LIST="" + DM_INST="" - # Generate list of DMs installed with DEs, and a list for selection menu - for i in ${dm_list}; do - [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && DM_INST="${DM_INST} ${i}" - DM_LIST="${DM_LIST} ${i} -" - done + # Generate list of DMs installed with DEs, and a list for selection menu + for i in ${dm_list}; do + [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && DM_INST="${DM_INST} ${i}" + DM_LIST="${DM_LIST} ${i} -" + done - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --menu "$_AlreadyInst$DM_INST\n\n$_DmChBody" 0 0 4 \ - ${DM_LIST} 2>${PACKAGES} - clear + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --menu "$_AlreadyInst$DM_INST\n\n$_DmChBody" 0 0 4 \ + ${DM_LIST} 2>${PACKAGES} + clear + + # If a selection has been made, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + + # check if selected dm already installed. If so, enable and break loop. + for i in ${DM_INST}; do + if [[ $(cat ${PACKAGES}) == ${i} ]]; then + enable_dm + break; + fi + done + + # If no match found, install and enable DM + if [[ $DM_ENABLED -eq 0 ]]; then + + # Where lightdm selected, add gtk greeter package + sed -i 's/lightdm/lightdm lightdm-gtk-greeter/' ${PACKAGES} + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + + # Where lightdm selected, now remove the greeter package + sed -i 's/lightdm-gtk-greeter//' ${PACKAGES} + enable_dm + fi + fi + fi - # If a selection has been made, act - if [[ $(cat ${PACKAGES}) != "" ]]; then - - # check if selected dm already installed. If so, enable and break loop. - for i in ${DM_INST}; do - if [[ $(cat ${PACKAGES}) == ${i} ]]; then - enable_dm - break; - fi - done - - # If no match found, install and enable DM - if [[ $DM_ENABLED -eq 0 ]]; then - - # Where lightdm selected, add gtk greeter package - sed -i 's/lightdm/lightdm lightdm-gtk-greeter/' ${PACKAGES} - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - - # Where lightdm selected, now remove the greeter package - sed -i 's/lightdm-gtk-greeter//' ${PACKAGES} - enable_dm - fi - fi - fi - - # Show after successfully installing or where attempting to repeat when already completed. - [[ $DM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --msgbox "$_DmDoneBody" 0 0 + # Show after successfully installing or where attempting to repeat when already completed. + [[ $DM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --msgbox "$_DmDoneBody" 0 0 } @@ -2471,61 +2207,60 @@ install_nm() { # Save repetition of code enable_nm() { - # Add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. - if [[ $(cat ${PACKAGES}) == "NetworkManager" ]]; then - arch_chroot "systemctl enable NetworkManager.service && systemctl enable NetworkManager-dispatcher.service" >/tmp/.symlink 2>/tmp/.errlog - else - arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog - fi - - check_for_error - NM_ENABLED=1 + if [[ $(cat ${PACKAGES}) == "NetworkManager" ]]; then + arch_chroot "systemctl enable NetworkManager.service && systemctl enable NetworkManager-dispatcher.service" >/tmp/.symlink 2>/tmp/.errlog + else + arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog + fi + + check_for_error + NM_ENABLED=1 } - if [[ $NM_ENABLED -eq 0 ]]; then - # Prep variables - echo "" > ${PACKAGES} - nm_list="connman CLI dhcpcd CLI netctl CLI NetworkManager GUI wicd GUI" - NM_LIST="" - NM_INST="" + if [[ $NM_ENABLED -eq 0 ]]; then + # Prep variables + echo "" > ${PACKAGES} + nm_list="connman CLI dhcpcd CLI netctl CLI NetworkManager GUI wicd GUI" + NM_LIST="" + NM_INST="" - # Generate list of DMs installed with DEs, and a list for selection menu - for i in ${nm_list}; do - [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && NM_INST="${NM_INST} ${i}" - NM_LIST="${NM_LIST} ${i}" - done + # Generate list of DMs installed with DEs, and a list for selection menu + for i in ${nm_list}; do + [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && NM_INST="${NM_INST} ${i}" + NM_LIST="${NM_LIST} ${i}" + done - # Remove netctl from selectable list as it is a PITA to configure via arch_chroot - NM_LIST=$(echo $NM_LIST | sed "s/netctl CLI//") + # Remove netctl from selectable list as it is a PITA to configure via arch_chroot + NM_LIST=$(echo $NM_LIST | sed "s/netctl CLI//") - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --menu "$_AlreadyInst $NM_INST\n$_InstNMBody" 0 0 4 \ - ${NM_LIST} 2> ${PACKAGES} - clear + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --menu "$_AlreadyInst $NM_INST\n$_InstNMBody" 0 0 4 \ + ${NM_LIST} 2> ${PACKAGES} + clear - # If a selection has been made, act - if [[ $(cat ${PACKAGES}) != "" ]]; then - - # check if selected nm already installed. If so, enable and break loop. - for i in ${NM_INST}; do - [[ $(cat ${PACKAGES}) == ${i} ]] && enable_nm && break - done - - # If no match found, install and enable NM - if [[ $NM_ENABLED -eq 0 ]]; then - - # Where networkmanager selected, add network-manager-applet - sed -i 's/NetworkManager/networkmanager network-manager-applet/g' ${PACKAGES} - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - - # Where networkmanager selected, now remove network-manager-applet - sed -i 's/networkmanager network-manager-applet/NetworkManager/g' ${PACKAGES} - enable_nm - fi - fi - fi - - # Show after successfully installing or where attempting to repeat when already completed. - [[ $NM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --msgbox "$_InstNMErrBody" 0 0 + # If a selection has been made, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + + # check if selected nm already installed. If so, enable and break loop. + for i in ${NM_INST}; do + [[ $(cat ${PACKAGES}) == ${i} ]] && enable_nm && break + done + + # If no match found, install and enable NM + if [[ $NM_ENABLED -eq 0 ]]; then + + # Where networkmanager selected, add network-manager-applet + sed -i 's/NetworkManager/networkmanager network-manager-applet/g' ${PACKAGES} + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + + # Where networkmanager selected, now remove network-manager-applet + sed -i 's/networkmanager network-manager-applet/NetworkManager/g' ${PACKAGES} + enable_nm + fi + fi + fi + + # Show after successfully installing or where attempting to repeat when already completed. + [[ $NM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --msgbox "$_InstNMErrBody" 0 0 } @@ -2533,97 +2268,97 @@ enable_nm() { install_multimedia_menu(){ install_alsa_pulse(){ - # Prep Variables - echo "" > ${PACKAGES} - ALSA="" - PULSE_EXTRA="" - alsa=$(pacman -Ss alsa | awk '{print $1}' | grep "/alsa-" | sed "s/extra\///g" | sort -u) - pulse_extra=$(pacman -Ss pulseaudio- | awk '{print $1}' | sed "s/extra\///g" | grep "pulseaudio-" | sort -u) + # Prep Variables + echo "" > ${PACKAGES} + ALSA="" + PULSE_EXTRA="" + alsa=$(pacman -Ss alsa | awk '{print $1}' | grep "/alsa-" | sed "s/extra\///g" | sort -u) + pulse_extra=$(pacman -Ss pulseaudio- | awk '{print $1}' | sed "s/extra\///g" | grep "pulseaudio-" | sort -u) + + for i in ${alsa}; do + ALSA="${ALSA} ${i} - off" + done + + ALSA=$(echo $ALSA | sed "s/alsa-utils - off/alsa-utils - on/g" | sed "s/alsa-plugins - off/alsa-plugins - on/g") - for i in ${alsa}; do - ALSA="${ALSA} ${i} - off" - done + for i in ${pulse_extra}; do + PULSE_EXTRA="${PULSE_EXTRA} ${i} - off" + done - ALSA=$(echo $ALSA | sed "s/alsa-utils - off/alsa-utils - on/g" | sed "s/alsa-plugins - off/alsa-plugins - on/g") + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulSnd " --checklist "$_InstMulSndBody\n\n$_UseSpaceBar" 0 0 14 \ + $ALSA "pulseaudio" "-" off $PULSE_EXTRA \ + "paprefs" "pulseaudio GUI" off \ + "pavucontrol" "pulseaudio GUI" off \ + "ponymix" "pulseaudio CLI" off \ + "volumeicon" "ALSA GUI" off \ + "volwheel" "ASLA GUI" off 2>${PACKAGES} - for i in ${pulse_extra}; do - PULSE_EXTRA="${PULSE_EXTRA} ${i} - off" - done - - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulSnd " --checklist "$_InstMulSndBody\n\n$_UseSpaceBar" 0 0 14 \ - $ALSA "pulseaudio" "-" off $PULSE_EXTRA \ - "paprefs" "pulseaudio GUI" off \ - "pavucontrol" "pulseaudio GUI" off \ - "ponymix" "pulseaudio CLI" off \ - "volumeicon" "ALSA GUI" off \ - "volwheel" "ASLA GUI" off 2>${PACKAGES} - - clear - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi } install_codecs(){ - # Prep Variables - echo "" > ${PACKAGES} - GSTREAMER="" - gstreamer=$(pacman -Ss gstreamer | awk '{print $1}' | grep "/gstreamer" | sed "s/extra\///g" | sed "s/community\///g" | sort -u) - echo $gstreamer - for i in ${gstreamer}; do - GSTREAMER="${GSTREAMER} ${i} - off" - done + # Prep Variables + echo "" > ${PACKAGES} + GSTREAMER="" + gstreamer=$(pacman -Ss gstreamer | awk '{print $1}' | grep "/gstreamer" | sed "s/extra\///g" | sed "s/community\///g" | sort -u) + echo $gstreamer + for i in ${gstreamer}; do + GSTREAMER="${GSTREAMER} ${i} - off" + done - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCodec " --checklist "$_InstMulCodBody$_UseSpaceBar" 0 0 14 \ - $GSTREAMER "xine-lib" "-" off 2>${PACKAGES} - - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCodec " --checklist "$_InstMulCodBody$_UseSpaceBar" 0 0 14 \ + $GSTREAMER "xine-lib" "-" off 2>${PACKAGES} + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + } - + install_cust_pkgs(){ - echo "" > ${PACKAGES} - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCust " --inputbox "$_InstMulCustBody" 0 0 "" 2>${PACKAGES} || install_multimedia_menu - - clear - # If at least one package, install. - if [[ $(cat ${PACKAGES}) != "" ]]; then - if [[ $(cat ${PACKAGES}) == "hen poem" ]]; then - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " \"My Sweet Buckies\" by Atiya & Carl " --msgbox "\nMy Sweet Buckies,\nYou are the sweetest Buckies that ever did \"buck\",\nLily, Rosie, Trumpet, and Flute,\nMy love for you all is absolute!\n\nThey buck: \"We love our treats, we are the Booyakka sisters,\"\n\"Sometimes we squabble and give each other comb-twisters,\"\n\"And in our garden we love to sunbathe, forage, hop and jump,\"\n\"We love our freedom far, far away from that factory farm dump,\"\n\n\"For so long we were trapped in cramped prisons full of disease,\"\n\"No sunlight, no fresh air, no one who cared for even our basic needs,\"\n\"We suffered in fear, pain, and misery for such a long time,\"\n\"But now we are so happy, we wanted to tell you in this rhyme!\"\n\n" 0 0 - else - basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog - check_for_error - fi - fi + echo "" > ${PACKAGES} + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCust " --inputbox "$_InstMulCustBody" 0 0 "" 2>${PACKAGES} || install_multimedia_menu + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + if [[ $(cat ${PACKAGES}) == "hen poem" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " \"My Sweet Buckies\" by Atiya & Carl " --msgbox "\nMy Sweet Buckies,\nYou are the sweetest Buckies that ever did \"buck\",\nLily, Rosie, Trumpet, and Flute,\nMy love for you all is absolute!\n\nThey buck: \"We love our treats, we are the Booyakka sisters,\"\n\"Sometimes we squabble and give each other comb-twisters,\"\n\"And in our garden we love to sunbathe, forage, hop and jump,\"\n\"We love our freedom far, far away from that factory farm dump,\"\n\n\"For so long we were trapped in cramped prisons full of disease,\"\n\"No sunlight, no fresh air, no one who cared for even our basic needs,\"\n\"We suffered in fear, pain, and misery for such a long time,\"\n\"But now we are so happy, we wanted to tell you in this rhyme!\"\n\n" 0 0 + else + pacstrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + fi + } - if [[ $SUB_MENU != "install_multimedia_menu" ]]; then - SUB_MENU="install_multimedia_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 5 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + if [[ $SUB_MENU != "install_multimedia_menu" ]]; then + SUB_MENU="install_multimedia_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMultMenuTitle " --menu "$_InstMultMenuBody" 0 0 5 \ - "1" "$_InstMulSnd" \ - "2" "$_InstMulCodec" \ - "3" "$_InstMulAcc" \ - "4" "$_InstMulCust" \ - "5" "$_Back" 2>${ANSWER} - - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in + "1" "$_InstMulSnd" \ + "2" "$_InstMulCodec" \ + "3" "$_InstMulAcc" \ + "4" "$_InstMulCust" \ + "5" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in "1") install_alsa_pulse ;; "2") install_codecs @@ -2632,126 +2367,126 @@ install_cust_pkgs(){ ;; "4") install_cust_pkgs ;; - *) main_menu_online + *) main_menu_online ;; - esac - - install_multimedia_menu + esac + + install_multimedia_menu } security_menu(){ - if [[ $SUB_MENU != "security_menu" ]]; then - SUB_MENU="security_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 4 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + if [[ $SUB_MENU != "security_menu" ]]; then + SUB_MENU="security_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 4 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecMenuTitle " --menu "$_SecMenuBody" 0 0 4 \ - "1" "$_SecJournTitle" \ - "2" "$_SecCoreTitle" \ - "3" "$_SecKernTitle" \ - "4" "$_Back" 2>${ANSWER} + "1" "$_SecJournTitle" \ + "2" "$_SecCoreTitle" \ + "3" "$_SecKernTitle" \ + "4" "$_Back" 2>${ANSWER} - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in "1") # systemd-journald - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --menu "$_SecJournBody" 0 0 7 \ - "$_Edit" "/etc/systemd/journald.conf" \ - "10M" "SystemMaxUse=10M" \ - "20M" "SystemMaxUse=20M" \ - "50M" "SystemMaxUse=50M" \ - "100M" "SystemMaxUse=100M" \ - "200M" "SystemMaxUse=200M" \ - "$_Disable" "Storage=none" 2>${ANSWER} + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --menu "$_SecJournBody" 0 0 7 \ + "$_Edit" "/etc/systemd/journald.conf" \ + "10M" "SystemMaxUse=10M" \ + "20M" "SystemMaxUse=20M" \ + "50M" "SystemMaxUse=50M" \ + "100M" "SystemMaxUse=100M" \ + "200M" "SystemMaxUse=200M" \ + "$_Disable" "Storage=none" 2>${ANSWER} - if [[ $(cat ${ANSWER}) != "" ]]; then - if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then - sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/journald.conf - sed -i "s/SystemMaxUse.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 - elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then - nano ${MOUNTPOINT}/etc/systemd/journald.conf - else - sed -i "s/#SystemMaxUse.*\|SystemMaxUse.*/SystemMaxUse=$(cat ${ANSWER})/g" ${MOUNTPOINT}/etc/systemd/journald.conf - sed -i "s/Storage.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 - fi - fi - ;; - "2") # core dump - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --menu "$_SecCoreBody" 0 0 2 \ - "$_Disable" "Storage=none" "$_Edit" "/etc/systemd/coredump.conf" 2>${ANSWER} - - if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then - sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/coredump.conf - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 - elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then - nano ${MOUNTPOINT}/etc/systemd/coredump.conf - fi + if [[ $(cat ${ANSWER}) != "" ]]; then + if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then + sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/journald.conf + sed -i "s/SystemMaxUse.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then + nano ${MOUNTPOINT}/etc/systemd/journald.conf + else + sed -i "s/#SystemMaxUse.*\|SystemMaxUse.*/SystemMaxUse=$(cat ${ANSWER})/g" ${MOUNTPOINT}/etc/systemd/journald.conf + sed -i "s/Storage.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + fi + fi + ;; + "2") # core dump + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --menu "$_SecCoreBody" 0 0 2 \ + "$_Disable" "Storage=none" "$_Edit" "/etc/systemd/coredump.conf" 2>${ANSWER} + + if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then + sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/coredump.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then + nano ${MOUNTPOINT}/etc/systemd/coredump.conf + fi ;; - "3") # Kernel log access - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --menu "\nKernel logs may contain information an attacker can use to identify and exploit kernel vulnerabilities, including sensitive memory addresses.\n\nIf systemd-journald logging has not been disabled, it is possible to create a rule in /etc/sysctl.d/ to disable access to these logs unless using root privilages (e.g. via sudo).\n" 0 0 2 \ - "$_Disable" "kernel.dmesg_restrict = 1" "$_Edit" "/etc/systemd/coredump.conf.d/custom.conf" 2>${ANSWER} - - case $(cat ${ANSWER}) in - "$_Disable") echo "kernel.dmesg_restrict = 1" > ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --infobox "\n$_Done!\n\n" 0 0 - sleep 2 ;; - "$_Edit") [[ -e ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf ]] && nano ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf \ - || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SeeConfErrTitle " --msgbox "$_SeeConfErrBody1" 0 0 ;; - esac + "3") # Kernel log access + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --menu "\nKernel logs may contain information an attacker can use to identify and exploit kernel vulnerabilities, including sensitive memory addresses.\n\nIf systemd-journald logging has not been disabled, it is possible to create a rule in /etc/sysctl.d/ to disable access to these logs unless using root privilages (e.g. via sudo).\n" 0 0 2 \ + "$_Disable" "kernel.dmesg_restrict = 1" "$_Edit" "/etc/systemd/coredump.conf.d/custom.conf" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_Disable") echo "kernel.dmesg_restrict = 1" > ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 ;; + "$_Edit") [[ -e ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf ]] && nano ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf \ + || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SeeConfErrTitle " --msgbox "$_SeeConfErrBody1" 0 0 ;; + esac ;; *) main_menu_online - ;; + ;; esac - + security_menu } ###################################################################### -## ## -## Main Interfaces ## -## ## +## ## +## Main Interfaces ## +## ## ###################################################################### # Greet the user when first starting the installer greeting() { -dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WelTitle $VERSION " --msgbox "$_WelBody" 0 0 +dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WelTitle $VERSION " --msgbox "$_WelBody" 0 0 } # Preparation prep_menu() { - - if [[ $SUB_MENU != "prep_menu" ]]; then - SUB_MENU="prep_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 7 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi - - dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMenuTitle " --menu "$_PrepMenuBody" 0 0 7 \ - "1" "$_VCKeymapTitle" \ - "2" "$_DevShowOpt" \ - "3" "$_PrepPartDisk" \ - "4" "$_PrepLUKS" \ - "5" "$_PrepLVM $_PrepLVM2" \ - "6" "$_PrepMntPart" \ - "7" "$_Back" 2>${ANSWER} + + if [[ $SUB_MENU != "prep_menu" ]]; then + SUB_MENU="prep_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 7 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMenuTitle " --menu "$_PrepMenuBody" 0 0 7 \ + "1" "$_VCKeymapTitle" \ + "2" "$_DevShowOpt" \ + "3" "$_PrepPartDisk" \ + "4" "$_PrepLUKS" \ + "5" "$_PrepLVM $_PrepLVM2" \ + "6" "$_PrepMntPart" \ + "7" "$_Back" 2>${ANSWER} HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in - "1") set_keymap + case $(cat ${ANSWER}) in + "1") set_keymap ;; "2") show_devices ;; @@ -2760,199 +2495,196 @@ prep_menu() { create_partitions ;; "4") luks_menu - ;; + ;; "5") lvm_menu ;; "6") mount_partitions - ;; + ;; *) main_menu_online ;; esac - - prep_menu - + + prep_menu + } # Base Installation install_base_menu() { - if [[ $SUB_MENU != "install_base_menu" ]]; then - SUB_MENU="install_base_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 5 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + if [[ $SUB_MENU != "install_base_menu" ]]; then + SUB_MENU="install_base_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi - dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBsMenuTitle " --menu "$_InstBseMenuBody" 0 0 6 \ - "1" "$_PrepMirror" \ - "2" "$_PrepPacKey" \ - "3" "$_InstBse" \ - "4" "$_InstBootldr" \ - "5" "Install a manjaro desktop" \ - "6" "$_Back" 2>${ANSWER} - - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in - "1") configure_mirrorlist - ;; - "2") clear - pacman-key --init - pacman-key --populate archlinux manjaro - pacman-key --refresh-keys - ;; - "3") install_base - ;; - "4") install_bootloader - ;; - "5") install_manjaro_de_wm - ;; - *) main_menu_online - ;; - esac - - install_base_menu + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBsMenuTitle " --menu "$_InstBseMenuBody" 0 0 5 \ + "1" "$_PrepMirror" \ + "2" "$_PrepPacKey" \ + "3" "$_InstBse" \ + "4" "$_InstBootldr" \ + "5" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") configure_mirrorlist + ;; + "2") clear + pacman-key --init + pacman-key --populate archlinux + pacman-key --refresh-keys + ;; + "3") install_base + ;; + "4") install_bootloader + ;; + *) main_menu_online + ;; + esac + + install_base_menu } # Base Configuration config_base_menu() { - - # Set the default PATH variable + + # Set the default PATH variable arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog - check_for_error - - if [[ $SUB_MENU != "config_base_menu" ]]; then - SUB_MENU="config_base_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 8 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + check_for_error + + if [[ $SUB_MENU != "config_base_menu" ]]; then + SUB_MENU="config_base_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 8 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseMenuTitle " --menu "$_ConfBseBody" 0 0 8 \ - "1" "$_ConfBseFstab" \ - "2" "$_ConfBseHost" \ - "3" "$_ConfBseSysLoc" \ - "4" "$_ConfBseTimeHC" \ - "5" "$_ConfUsrRoot" \ - "6" "$_ConfUsrNew" \ - "7" "$_MMRunMkinit" \ - "8" "$_Back" 2>${ANSWER} - - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in - "1") generate_fstab + "1" "$_ConfBseFstab" \ + "2" "$_ConfBseHost" \ + "3" "$_ConfBseSysLoc" \ + "4" "$_ConfBseTimeHC" \ + "5" "$_ConfUsrRoot" \ + "6" "$_ConfUsrNew" \ + "7" "$_MMRunMkinit" \ + "8" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") generate_fstab ;; "2") set_hostname ;; "3") set_locale - ;; + ;; "4") set_timezone - set_hw_clock + set_hw_clock ;; - "5") set_root_password - ;; - "6") create_new_user - ;; - "7") run_mkinitcpio - ;; + "5") set_root_password + ;; + "6") create_new_user + ;; + "7") run_mkinitcpio + ;; *) main_menu_online - ;; + ;; esac - + config_base_menu } install_graphics_menu() { - if [[ $SUB_MENU != "install_graphics_menu" ]]; then - SUB_MENU="install_graphics_menu" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 6 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + if [[ $SUB_MENU != "install_graphics_menu" ]]; then + SUB_MENU="install_graphics_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 6 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstGrMenuTitle " --menu "$_InstGrMenuBody" 0 0 6 \ - "1" "$_InstGrMenuDS" \ - "2" "$_InstGrMenuDD" \ - "3" "$_InstGrMenuGE" \ - "4" "$_InstGrMenuDM" \ - "5" "$_PrepKBLayout" \ - "6" "$_Back" 2>${ANSWER} + "1" "$_InstGrMenuDS" \ + "2" "$_InstGrMenuDD" \ + "3" "$_InstGrMenuGE" \ + "4" "$_InstGrMenuDM" \ + "5" "$_PrepKBLayout" \ + "6" "$_Back" 2>${ANSWER} - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in "1") install_xorg_input - ;; - "2") setup_graphics_card + ;; + "2") setup_graphics_card ;; "3") install_de_wm ;; "4") install_dm ;; - "5") set_xkbmap - ;; + "5") set_xkbmap + ;; *) main_menu_online - ;; + ;; esac - + install_graphics_menu - + } # Install Accessibility Applications install_acc_menu() { - echo "" > ${PACKAGES} + echo "" > ${PACKAGES} - dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAccTitle " --checklist "$_InstAccBody" 0 0 15 \ - "accerciser" "-" off \ - "at-spi2-atk" "-" off \ - "at-spi2-core" "-" off \ - "brltty" "-" off \ - "caribou" "-" off \ - "dasher" "-" off \ - "espeak" "-" off \ - "espeakup" "-" off \ - "festival" "-" off \ - "java-access-bridge" "-" off \ - "java-atk-wrapper" "-" off \ - "julius" "-" off \ - "orca" "-" off \ - "qt-at-spi" "-" off \ - "speech-dispatcher" "-" off 2>${PACKAGES} - - clear - # If something has been selected, install - if [[ $(cat ${PACKAGES}) != "" ]]; then - basestrap ${MOUNTPOINT} ${PACKAGES} 2>/tmp/.errlog - check_for_error - fi - - install_multimedia_menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAccTitle " --checklist "$_InstAccBody" 0 0 15 \ + "accerciser" "-" off \ + "at-spi2-atk" "-" off \ + "at-spi2-core" "-" off \ + "brltty" "-" off \ + "caribou" "-" off \ + "dasher" "-" off \ + "espeak" "-" off \ + "espeakup" "-" off \ + "festival" "-" off \ + "java-access-bridge" "-" off \ + "java-atk-wrapper" "-" off \ + "julius" "-" off \ + "orca" "-" off \ + "qt-at-spi" "-" off \ + "speech-dispatcher" "-" off 2>${PACKAGES} + + clear + # If something has been selected, install + if [[ $(cat ${PACKAGES}) != "" ]]; then + pacstrap ${MOUNTPOINT} ${PACKAGES} 2>/tmp/.errlog + check_for_error + fi + + install_multimedia_menu } edit_configs() { - - # Clear the file variables - FILE="" - user_list="" - - if [[ $SUB_MENU != "edit configs" ]]; then - SUB_MENU="edit configs" - HIGHLIGHT_SUB=1 - else - if [[ $HIGHLIGHT_SUB != 12 ]]; then - HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) - fi - fi + + # Clear the file variables + FILE="" + user_list="" + + if [[ $SUB_MENU != "edit configs" ]]; then + SUB_MENU="edit configs" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 12 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SeeConfOptTitle " --menu "$_SeeConfOptBody" 0 0 13 \ "1" "/etc/vconsole.conf" \ @@ -2968,12 +2700,12 @@ edit_configs() { "11" "/etc/pacman.conf" \ "12" "~/.xinitrc" \ "13" "$_Back" 2>${ANSWER} - - HIGHLIGHT_SUB=$(cat ${ANSWER}) - case $(cat ${ANSWER}) in - "1") [[ -e ${MOUNTPOINT}/etc/vconsole.conf ]] && FILE="${MOUNTPOINT}/etc/vconsole.conf" + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") [[ -e ${MOUNTPOINT}/etc/vconsole.conf ]] && FILE="${MOUNTPOINT}/etc/vconsole.conf" ;; - "2") [[ -e ${MOUNTPOINT}/etc/locale.conf ]] && FILE="${MOUNTPOINT}/etc/locale.conf" + "2") [[ -e ${MOUNTPOINT}/etc/locale.conf ]] && FILE="${MOUNTPOINT}/etc/locale.conf" ;; "3") [[ -e ${MOUNTPOINT}/etc/hostname ]] && FILE="${MOUNTPOINT}/etc/hostname" ;; @@ -2986,57 +2718,57 @@ edit_configs() { "7") [[ -e ${MOUNTPOINT}/etc/fstab ]] && FILE="${MOUNTPOINT}/etc/fstab" ;; "8") [[ -e ${MOUNTPOINT}/etc/crypttab ]] && FILE="${MOUNTPOINT}/etc/crypttab" - ;; + ;; "9") [[ -e ${MOUNTPOINT}/etc/default/grub ]] && FILE="${MOUNTPOINT}/etc/default/grub" - [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && FILE="$FILE ${MOUNTPOINT}/boot/syslinux/syslinux.cfg" - if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then - files=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) - for i in ${files}; do - FILE="$FILE ${i}" - done - fi + [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && FILE="$FILE ${MOUNTPOINT}/boot/syslinux/syslinux.cfg" + if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then + files=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) + for i in ${files}; do + FILE="$FILE ${i}" + done + fi ;; - "10") [[ -e ${MOUNTPOINT}/etc/lxdm/lxdm.conf ]] && FILE="${MOUNTPOINT}/etc/lxdm/lxdm.conf" - [[ -e ${MOUNTPOINT}/etc/lightdm/lightdm.conf ]] && FILE="${MOUNTPOINT}/etc/lightdm/lightdm.conf" + "10") [[ -e ${MOUNTPOINT}/etc/lxdm/lxdm.conf ]] && FILE="${MOUNTPOINT}/etc/lxdm/lxdm.conf" + [[ -e ${MOUNTPOINT}/etc/lightdm/lightdm.conf ]] && FILE="${MOUNTPOINT}/etc/lightdm/lightdm.conf" [[ -e ${MOUNTPOINT}/etc/sddm.conf ]] && FILE="${MOUNTPOINT}/etc/sddm.conf" ;; "11") [[ -e ${MOUNTPOINT}/etc/pacman.conf ]] && FILE="${MOUNTPOINT}/etc/pacman.conf" - ;; - "12") user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") - for i in ${user_list}; do - [[ -e ${MOUNTPOINT}/home/$i/.xinitrc ]] && FILE="$FILE ${MOUNTPOINT}/home/$i/.xinitrc" - done - ;; + ;; + "12") user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") + for i in ${user_list}; do + [[ -e ${MOUNTPOINT}/home/$i/.xinitrc ]] && FILE="$FILE ${MOUNTPOINT}/home/$i/.xinitrc" + done + ;; *) main_menu_online ;; esac - - [[ $FILE != "" ]] && nano $FILE \ - || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_SeeConfErrBody" 0 0 - - edit_configs + + [[ $FILE != "" ]] && nano $FILE \ + || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_SeeConfErrBody" 0 0 + + edit_configs } main_menu_online() { - - if [[ $HIGHLIGHT != 9 ]]; then - HIGHLIGHT=$(( HIGHLIGHT + 1 )) - fi - + + if [[ $HIGHLIGHT != 9 ]]; then + HIGHLIGHT=$(( HIGHLIGHT + 1 )) + fi + dialog --default-item ${HIGHLIGHT} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MMTitle " \ --menu "$_MMBody" 0 0 9 \ - "1" "$_PrepMenuTitle" \ - "2" "$_InstBsMenuTitle" \ - "3" "$_ConfBseMenuTitle" \ - "4" "$_InstGrMenuTitle" \ - "5" "$_InstNMMenuTitle" \ + "1" "$_PrepMenuTitle" \ + "2" "$_InstBsMenuTitle" \ + "3" "$_ConfBseMenuTitle" \ + "4" "$_InstGrMenuTitle" \ + "5" "$_InstNMMenuTitle" \ "6" "$_InstMultMenuTitle" \ "7" "$_SecMenuTitle" \ "8" "$_SeeConfOptTitle" \ - "9" "$_Done" 2>${ANSWER} + "9" "$_Done" 2>${ANSWER} HIGHLIGHT=$(cat ${ANSWER}) - + # Depending on the answer, first check whether partition(s) are mounted and whether base has been installed if [[ $(cat ${ANSWER}) -eq 2 ]]; then check_mount @@ -3046,52 +2778,51 @@ main_menu_online() { check_mount check_base fi - + case $(cat ${ANSWER}) in - "1") prep_menu + "1") prep_menu ;; "2") install_base_menu ;; "3") config_base_menu - ;; + ;; "4") install_graphics_menu ;; "5") install_network_menu - ;; + ;; "6") install_multimedia_menu - ;; + ;; "7") security_menu - ;; + ;; "8") edit_configs - ;; + ;; *) dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_CloseInstBody" 0 0 - + if [[ $? -eq 0 ]]; then umount_partitions - [[ -e /tmp/.openrc ]] && rm /tmp/.openrc clear exit 0 else main_menu_online fi - + ;; esac - - main_menu_online - + + main_menu_online + } ###################################################################### -## ## -## Execution ## -## ## +## ## +## Execution ## +## ## ###################################################################### id_system select_language check_requirements greeting - while true; do - main_menu_online + while true; do + main_menu_online done diff --git a/manjaro-architect b/manjaro-architect new file mode 100755 index 0000000..71d5ff0 --- /dev/null +++ b/manjaro-architect @@ -0,0 +1,3097 @@ +# !/bin/bash +# +# Architect Installation Framework (version 2.3.1 - 26-Mar-2016) +# +# Written by Carl Duff for Architect Linux +# +# Modified by Chrysostomus to install manjaro instead +# +# This program is free software, provided under the GNU General Public License +# as published by the Free Software Foundation. So feel free to copy, distribute, +# or modify it as you wish. +# +# + + +###################################################################### +## ## +## Installer Variables ## +## ## +###################################################################### + +# Temporary files to store menu selections +ANSWER="/tmp/.aif" # Basic menu selections +PACKAGES="/tmp/.pkgs" # Packages to install +MOUNT_OPTS="/tmp/.mnt_opts" # Filesystem Mount options +INIT="/tmp/.init" +# Save retyping +VERSION="Manjaro Installation Framework 0.2" + +# Installation +DM_INST="" # Which DMs have been installed? +DM_ENABLED=0 # Has a display manager been enabled? +NM_INST="" # Which NMs have been installed? +NM_ENABLED=0 # Has a network connection manager been enabled? +KERNEL="n" # Kernel(s) installed (base install); kernels for mkinitcpio +GRAPHIC_CARD="" # graphics card +INTEGRATED_GC="" # Integrated graphics card for NVIDIA +NVIDIA_INST=0 # Indicates if NVIDIA proprietary driver has been installed +NVIDIA="" # NVIDIA driver(s) to install depending on kernel(s) +VB_MOD="" # headers packages to install depending on kernel(s) +SHOW_ONCE=0 # Show de_wm information only once +COPY_PACCONF=0 # Copy over installer /etc/pacman.conf to installed system? + +# Mounting +MOUNTPOINT="/mnt" # Installation: Root mount +MOUNT="" # Installation: All other mounts branching from Root +FS_OPTS="" # File system special mount options available +CHK_NUM=16 # Used for FS mount options checklist length +INCLUDE_PART='part\|lvm\|crypt' # Partition types to include for display and selection. +ROOT_PART="" # ROOT partition +UEFI_PART="" # UEFI partition +UEFI_MOUNT="" # UEFI mountpoint (/boot or /boot/efi) + +# Architecture +ARCHI=$(uname -m) # Display whether 32 or 64 bit system +SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown" + +# Menu highlighting (automated step progression) +HIGHLIGHT=0 # Highlight items for Main Menu +HIGHLIGHT_SUB=0 # Highlight items for submenus +SUB_MENU="" # Submenu to be highlighted + +# Logical Volume Management +LVM=0 # Logical Volume Management Detected? +LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM +LVM_VG="" # Name of volume group to create or use +LVM_VG_MB=0 # MB remaining of VG +LVM_LV_NAME="" # Name of LV to create or use +LV_SIZE_INVALID=0 # Is LVM LV size entered valid? +VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes? + +# LUKS +LUKS=0 # Luks Used? +LUKS_DEV="" # If encrypted, partition +LUKS_NAME="" # Name given to encrypted partition +LUKS_UUID="" # UUID used for comparison purposes +LUKS_OPT="" # Default or user-defined? + +# Locale and Language +CURR_LOCALE="en_US.UTF-8" # Default Locale +FONT="" # Set new font if necessary +KEYMAP="us" # Virtual console keymap. Default is "us" +XKBMAP="us" # X11 keyboard layout. Default is "us" +ZONE="" # For time +SUBZONE="" # For time +LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8" + + +# Edit Files +FILE="" # File(s) to be reviewed + +###################################################################### +## ## +## Core Functions ## +## ## +###################################################################### + +# Add locale on-the-fly and sets source translation file for installer +select_language() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Select Language " --menu "\nLanguage" 0 0 9 \ + "1" $"English (en_**)" \ + "2" $"Español (es_ES)" \ + "3" $"Português [Brasil] (pt_BR)" \ + "4" $"Português (pt_PT)" \ + "5" $"Français (fr_FR)" \ + "6" $"Russkiy (ru_RU)" \ + "7" $"Italiano (it_IT)" \ + "8" $"Nederlands (nl_NL)" \ + "9" $"Magyar (hu_HU)" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "1") source /usr/share/aif/translations/english.trans + CURR_LOCALE="en_US.UTF-8" + ;; + "2") source /usr/share/aif/translations/spanish.trans + CURR_LOCALE="es_ES.UTF-8" + ;; + "3") source /usr/share/aif/translations/portuguese_brasil.trans + CURR_LOCALE="pt_BR.UTF-8" + ;; + "4") source /usr/share/aif/translations/portuguese.trans + CURR_LOCALE="pt_PT.UTF-8" + ;; + "5") source /usr/share/aif/translations/french.trans + CURR_LOCALE="fr_FR.UTF-8" + ;; + "6") source /usr/share/aif/translations/russian.trans + CURR_LOCALE="ru_RU.UTF-8" + FONT="LatKaCyrHeb-14.psfu" + ;; + "7") source /usr/share/aif/translations/italian.trans + CURR_LOCALE="it_IT.UTF-8" + ;; + "8") source /usr/share/aif/translations/dutch.trans + CURR_LOCALE="nl_NL.UTF-8" + ;; + "9") source /usr/share/aif/translations/hungarian.trans + CURR_LOCALE="hu_HU.UTF-8" + FONT="lat2-16.psfu" + ;; +# "4") source /usr/share/aif/translations/turkish.trans +# CURR_LOCALE="tr_TR.UTF-8" +# FONT="LatKaCyrHeb-14.psfu" +# ;; +# "6") source /usr/share/aif/translations/greek.trans +# CURR_LOCALE="el_GR.UTF-8" +# FONT="iso07u-16.psfu" +# ;; +# "12") source /usr/share/aif/translations/polish.trans +# CURR_LOCALE="pl_PL.UTF-8" +# FONT="latarcyrheb-sun16" +# ;; + *) exit 0 + ;; + esac + + # Generate the chosen locale and set the language + sed -i "s/#${CURR_LOCALE}/${CURR_LOCALE}/" /etc/locale.gen + locale-gen >/dev/null 2>&1 + export LANG=${CURR_LOCALE} + [[ $FONT != "" ]] && setfont $FONT +} + +set_lightdm_greeter(){ + local greeters=$(ls /mnt/usr/share/xgreeters/*greeter.desktop) name + for g in ${greeters[@]};do + name=${g##*/} + name=${name%%.*} + case ${name} in + lightdm-gtk-greeter) break ;; + lightdm-*-greeter) + sed -i -e "s/^.*greeter-session=.*/greeter-session=${name}/" /mnt/etc/lightdm/lightdm.conf + ;; + esac + done +} + +# Check user is root, and that there is an active internet connection +# Seperated the checks into seperate "if" statements for readability. +check_requirements() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ChkTitle " --infobox "$_ChkBody" 0 0 + sleep 2 + + if [[ `whoami` != "root" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_Erritle " --infobox "$_RtFailBody" 0 0 + sleep 2 + exit 1 + fi + + if [[ ! $(ping -c 1 google.com) ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --infobox "$_ConFailBody" 0 0 + sleep 2 + exit 1 + fi + + # This will only be executed where neither of the above checks are true. + # The error log is also cleared, just in case something is there from a previous use of the installer. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ReqMetTitle " --infobox "$_ReqMetBody" 0 0 + sleep 2 + clear + echo "" > /tmp/.errlog + pacman -Syy +} + +# Adapted from AIS. Checks if system is made by Apple, whether the system is BIOS or UEFI, +# and for LVM and/or LUKS. +id_system() { + + # Apple System Detection + if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then + modprobe -r -q efivars || true # if MAC + else + modprobe -q efivarfs # all others + fi + + # BIOS or UEFI Detection + if [[ -d "/sys/firmware/efi/" ]]; then + # Mount efivarfs if it is not already mounted + if [[ -z $(mount | grep /sys/firmware/efi/efivars) ]]; then + mount -t efivarfs efivarfs /sys/firmware/efi/efivars + fi + SYSTEM="UEFI" + else + SYSTEM="BIOS" + fi + + +} + + +# Adapted from AIS. An excellent bit of code! +arch_chroot() { + arch-chroot $MOUNTPOINT /bin/bash -c "${1}" +} + +# If there is an error, display it, clear the log and then go back to the main menu (no point in continuing). +check_for_error() { + + if [[ $? -eq 1 ]] && [[ $(cat /tmp/.errlog | grep -i "error") != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$(cat /tmp/.errlog)" 0 0 + echo "" > /tmp/.errlog + main_menu_online + fi + +} + +# Ensure that a partition is mounted +check_mount() { + + if [[ $(lsblk -o MOUNTPOINT | grep ${MOUNTPOINT}) == "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoMount" 0 0 + main_menu_online + fi + +} + +# Ensure that Arch has been installed +check_base() { + + if [[ ! -e ${MOUNTPOINT}/etc ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoBase" 0 0 + main_menu_online + fi + +} + +# Simple code to show devices / partitions. +show_devices() { + lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT | grep "disk\|part\|lvm\|crypt\|NAME\|MODEL\|TYPE\|FSTYPE\|SIZE\|MOUNTPOINT" > /tmp/.devlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DevShowOpt " --textbox /tmp/.devlist 0 0 +} + +###################################################################### +## ## +## Configuration Functions ## +## ## +###################################################################### + + +# Originally adapted from AIS. Added option to allow users to edit the mirrorlist. +configure_mirrorlist() { + +# Generate a mirrorlist based on the country chosen. +mirror_by_country() { + BRANCH="/tmp/.branch" + COUNTRY_LIST="" + countries_list="Africa AF Australia AU Austria AT Belarus BY Belgium BE Brasil BR Bulgaria BG Canada CA Chile CL China CN Colombia CO Costa_Rica CR Czech CZ Denmark DK Ecuador EQ France FR Germany DE Greece GR Indonesia ID Ireland IE Italy IT Japan JP Netherlands NL Philippines PH Poland PL Portugal PT Romania RO Russia RU Singapore SG Sweden SE Taiwan TW Turkey TR United_Kingdom GB United_States US Vietnam VN" + + for i in ${countries_list}; do + COUNTRY_LIST="${COUNTRY_LIST} ${i}" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --menu "$_MirrorCntryBody" 0 0 0 $COUNTRY_LIST 2>${ANSWER} || install_base_menu + + #URL="https://www.archlinux.org/mirrorlist/?country=$(cat ${ANSWER})&use_mirror_status=on" + #Choose the branch for mirrorlist + MIRROR_TEMP=$(mktemp --suffix=-mirrorlist) + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Choose manjaro branch to use " --radiolist " $_UseSpaceBar" 0 0 12 \ + "stable" "-" on \ + "testing" "-" off \ + "unstable" "-" off 2>${BRANCH} + + # Get latest mirror list and save to tmpfile + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "$_PlsWaitBody" 0 0 + pacman-mirrors -g -b $(cat ${BRANCH}) -c $(cat ${ANSWER}) -o ${MIRROR_TEMP} 2>/tmp/.errlog +# curl -so ${MIRROR_TEMP} ${URL} 2>/tmp/.errlog + check_for_error + sed -i 's/^#Server/Server/g' ${MIRROR_TEMP} + nano ${MIRROR_TEMP} + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --yesno "$_MirrorGenQ" 0 0 + + if [[ $? -eq 0 ]];then + mv -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig + mv -f ${MIRROR_TEMP} /etc/pacman.d/mirrorlist + chmod +r /etc/pacman.d/mirrorlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + else + configure_mirrorlist + fi +} + + +dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " \ + --menu "$_MirrorlistBody" 0 0 6 \ + "1" "$_MirrorbyCountry" \ + "2" "$_MirrorEdit" \ + "3" "$_MirrorRestTitle" \ + "4" "$_MirrorPacman" \ + "5" "$_Back" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "1") mirror_by_country + ;; + "2") nano /etc/pacman.d/mirrorlist + ;; + "3") if [[ -e /etc/pacman.d/mirrorlist.orig ]]; then + mv -f /etc/pacman.d/mirrorlist.orig /etc/pacman.d/mirrorlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorlistTitle " --msgbox "\n$_Done!\n\n" 0 0 + else + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_MirrorNoneBody" 0 0 + fi + ;; + "4") nano /etc/pacman.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MirrorPacman " --yesno "$_MIrrorPacQ" 0 0 && COPY_PACCONF=1 || COPY_PACCONF=0 + pacman -Syy + ;; + *) install_base_menu + ;; + esac + + configure_mirrorlist +} + + +# virtual console keymap +set_keymap() { + + KEYMAPS="" + for i in $(ls -R /usr/share/kbd/keymaps | grep "map.gz" | sed 's/\.map\.gz//g' | sort); do + KEYMAPS="${KEYMAPS} ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_VCKeymapTitle " \ + --menu "$_VCKeymapBody" 20 40 16 ${KEYMAPS} 2>${ANSWER} || prep_menu + KEYMAP=$(cat ${ANSWER}) + + loadkeys $KEYMAP 2>/tmp/.errlog + check_for_error + + echo -e "KEYMAP=${KEYMAP}\nFONT=${FONT}" > /tmp/vconsole.conf + } + +# Set keymap for X11 + set_xkbmap() { + + XKBMAP_LIST="" + keymaps_xkb=("af al am at az ba bd be bg br bt bw by ca cd ch cm cn cz de dk ee es et eu fi fo fr gb ge gh gn gr hr hu ie il in iq ir is it jp ke kg kh kr kz la lk lt lv ma md me mk ml mm mn mt mv ng nl no np pc ph pk pl pt ro rs ru se si sk sn sy tg th tj tm tr tw tz ua us uz vn za") + + for i in ${keymaps_xkb}; do + XKBMAP_LIST="${XKBMAP_LIST} ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepKBLayout " --menu "$_XkbmapBody" 0 0 16 ${XKBMAP_LIST} 2>${ANSWER} || install_graphics_menu + XKBMAP=$(cat ${ANSWER} |sed 's/_.*//') + echo -e "Section "\"InputClass"\"\nIdentifier "\"system-keyboard"\"\nMatchIsKeyboard "\"on"\"\nOption "\"XkbLayout"\" "\"${XKBMAP}"\"\nEndSection" > ${MOUNTPOINT}/etc/X11/xorg.conf.d/00-keyboard.conf + +} + +# locale array generation code adapted from the Manjaro 0.8 installer +set_locale() { + + LOCALES="" + for i in $(cat /etc/locale.gen | grep -v "# " | sed 's/#//g' | sed 's/ UTF-8//g' | grep .UTF-8); do + LOCALES="${LOCALES} ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseSysLoc " --menu "$_localeBody" 0 0 12 ${LOCALES} 2>${ANSWER} || config_base_menu + + LOCALE=$(cat ${ANSWER}) + + echo "LANG=\"${LOCALE}\"" > ${MOUNTPOINT}/etc/locale.conf + sed -i "s/#${LOCALE}/${LOCALE}/" ${MOUNTPOINT}/etc/locale.gen 2>/tmp/.errlog + arch_chroot "locale-gen" >/dev/null 2>>/tmp/.errlog + check_for_error +} + +# Set Zone and Sub-Zone +set_timezone() { + + ZONE="" + for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "/" | sed "s/\/.*//g" | sort -ud); do + ZONE="$ZONE ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_TimeZBody" 0 0 10 ${ZONE} 2>${ANSWER} || config_base_menu + ZONE=$(cat ${ANSWER}) + + SUBZONE="" + for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "${ZONE}/" | sed "s/${ZONE}\///g" | sort -ud); do + SUBZONE="$SUBZONE ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_TimeSubZBody" 0 0 11 ${SUBZONE} 2>${ANSWER} || config_base_menu + SUBZONE=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --yesno "$_TimeZQ ${ZONE}/${SUBZONE}?" 0 0 + + if [[ $? -eq 0 ]]; then + arch_chroot "ln -s /usr/share/zoneinfo/${ZONE}/${SUBZONE} /etc/localtime" 2>/tmp/.errlog + check_for_error + else + config_base_menu + fi +} + +set_hw_clock() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseTimeHC " --menu "$_HwCBody" 0 0 2 \ + "utc" "-" "localtime" "-" 2>${ANSWER} + + [[ $(cat ${ANSWER}) != "" ]] && arch_chroot "hwclock --systohc --$(cat ${ANSWER})" 2>/tmp/.errlog && check_for_error +} + +# Function will not allow incorrect UUID type for installed system. +generate_fstab() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseFstab " --menu "$_FstabBody" 0 0 4 \ + "fstabgen -p" "$_FstabDevName" \ + "fstabgen -L -p" "$_FstabDevLabel" \ + "fstabgen -U -p" "$_FstabDevUUID" \ + "fstabgen -t PARTUUID -p" "$_FstabDevPtUUID" 2>${ANSWER} + + if [[ $(cat ${ANSWER}) != "" ]]; then + if [[ $SYSTEM == "BIOS" ]] && [[ $(cat ${ANSWER}) == "fstabgen -t PARTUUID -p" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_FstabErr" 0 0 + generate_fstab + else + $(cat ${ANSWER}) ${MOUNTPOINT} > ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog + check_for_error + [[ -f ${MOUNTPOINT}/swapfile ]] && sed -i "s/\\${MOUNTPOINT}//" ${MOUNTPOINT}/etc/fstab + fi + fi + + config_base_menu + +} + + +set_hostname() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseHost " --inputbox "$_HostNameBody" 0 0 "manjaro" 2>${ANSWER} || config_base_menu + + echo "$(cat ${ANSWER})" > ${MOUNTPOINT}/etc/hostname 2>/tmp/.errlog + echo -e "#\t\t\n127.0.0.1\tlocalhost.localdomain\tlocalhost\t$(cat ${ANSWER})\n::1\tlocalhost.localdomain\tlocalhost\t$(cat ${ANSWER})" > ${MOUNTPOINT}/etc/hosts 2>>/tmp/.errlog + check_for_error +} + +# Adapted and simplified from the Manjaro 0.8 and Antergos 2.0 installers +set_root_password() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrRoot " --clear --insecure --passwordbox "$_PassRtBody" 0 0 2> ${ANSWER} || config_base_menu + PASSWD=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrRoot " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu + PASSWD2=$(cat ${ANSWER}) + + if [[ $PASSWD == $PASSWD2 ]]; then + echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd + arch_chroot "passwd root" < /tmp/.passwd >/dev/null 2>/tmp/.errlog + rm /tmp/.passwd + check_for_error + else + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PassErrBody" 0 0 + set_root_password + fi + +} + +# Originally adapted from the Antergos 2.0 installer +create_new_user() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NUsrTitle " --inputbox "$_NUsrBody" 0 0 "" 2>${ANSWER} || config_base_menu + USER=$(cat ${ANSWER}) + + # Loop while user name is blank, has spaces, or has capital letters in it. + while [[ ${#USER} -eq 0 ]] || [[ $USER =~ \ |\' ]] || [[ $USER =~ [^a-z0-9\ ] ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NUsrTitle " --inputbox "$_NUsrErrBody" 0 0 "" 2>${ANSWER} || config_base_menu + USER=$(cat ${ANSWER}) + done + + # If zsh is installed, use that for users shell + if [[ -e /mnt/usr/bin/zsh ]]; then + shell="zsh" + else + shell="bash" + fi + # Enter password. This step will only be reached where the loop has been skipped or broken. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu + PASSWD=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu + PASSWD2=$(cat ${ANSWER}) + + # loop while passwords entered do not match. + while [[ $PASSWD != $PASSWD2 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PassErrBody" 0 0 + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu + PASSWD=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || config_base_menu + PASSWD2=$(cat ${ANSWER}) + done + + # create new user. This step will only be reached where the password loop has been skipped or broken. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfUsrNew " --infobox "$_NUsrSetBody" 0 0 + sleep 2 + # Create the user, set password, then remove temporary password file + arch_chroot "useradd ${USER} -m -g users -G wheel,storage,power,network,video,audio,lp -s /bin/$shell" 2>/tmp/.errlog + check_for_error + echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd + arch_chroot "passwd ${USER}" < /tmp/.passwd >/dev/null 2>/tmp/.errlog + rm /tmp/.passwd + check_for_error + # Set up basic configuration files and permissions for user + #arch_chroot "cp /etc/skel/.bashrc /home/${USER}" + arch_chroot "chown -R ${USER}:users /home/${USER}" + [[ -e ${MOUNTPOINT}/etc/sudoers ]] && sed -i '/%wheel ALL=(ALL) ALL/s/^#//' ${MOUNTPOINT}/etc/sudoers + +} + +run_mkinitcpio() { + + clear + + KERNEL="" + + # If LVM and/or LUKS used, add the relevant hook(s) + ([[ $LVM -eq 1 ]] && [[ $LUKS -eq 0 ]]) && sed -i 's/block filesystems/block lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog + ([[ $LVM -eq 1 ]] && [[ $LUKS -eq 1 ]]) && sed -i 's/block filesystems/block encrypt lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog + ([[ $LVM -eq 0 ]] && [[ $LUKS -eq 1 ]]) && sed -i 's/block filesystems/block encrypt filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf 2>/tmp/.errlog + check_for_error + + # Run Mkinitcpio command depending on kernel(s) installed + KERNEL=$(ls ${MOUNTPOINT}/boot/*.img | grep -v "fallback" | sed "s~${MOUNTPOINT}/boot/initramfs-~~g" | sed s/\.img//g | uniq) + for i in ${KERNEL}; do + arch_chroot "mkinitcpio -P" 2>>/tmp/.errlog + done + check_for_error + +} + +###################################################################### +## ## +## System and Partitioning Functions ## +## ## +###################################################################### + + + +# Unmount partitions. +umount_partitions(){ + + MOUNTED="" + MOUNTED=$(mount | grep "${MOUNTPOINT}" | awk '{print $3}' | sort -r) + swapoff -a + + for i in ${MOUNTED[@]}; do + umount $i >/dev/null 2>>/tmp/.errlog + done + + check_for_error + +} + +# Revised to deal with partion sizes now being displayed to the user +confirm_mount() { + if [[ $(mount | grep $1) ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --infobox "$_MntStatusSucc" 0 0 + sleep 2 + PARTITIONS=$(echo $PARTITIONS | sed "s~${PARTITION} [0-9]*[G-M]~~" | sed "s~${PARTITION} [0-9]*\.[0-9]*[G-M]~~" | sed s~${PARTITION}$' -'~~) + NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 )) + else + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --infobox "$_MntStatusFail" 0 0 + sleep 2 + prep_menu + fi +} + +# This function does not assume that the formatted device is the Root installation device as +# more than one device may be formatted. Root is set in the mount_partitions function. +select_device() { + + DEVICE="" + devices_list=$(lsblk -lno NAME,SIZE,TYPE | grep 'disk' | awk '{print "/dev/" $1 " " $2}' | sort -u); + + for i in ${devices_list[@]}; do + DEVICE="${DEVICE} ${i}" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DevSelTitle " --menu "$_DevSelBody" 0 0 4 ${DEVICE} 2>${ANSWER} || prep_menu + DEVICE=$(cat ${ANSWER}) + + } + +# Finds all available partitions according to type(s) specified and generates a list +# of them. This also includes partitions on different devices. +find_partitions() { + + PARTITIONS="" + NUMBER_PARTITIONS=0 + partition_list=$(lsblk -lno NAME,SIZE,TYPE | grep $INCLUDE_PART | sed 's/part$/\/dev\//g' | sed 's/lvm$\|crypt$/\/dev\/mapper\//g' | awk '{print $3$1 " " $2}' | sort -u) + + for i in ${partition_list}; do + PARTITIONS="${PARTITIONS} ${i}" + NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS + 1 )) + done + + # Double-partitions will be counted due to counting sizes, so fix + NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS / 2 )) + + # Deal with partitioning schemes appropriate to mounting, lvm, and/or luks. + case $INCLUDE_PART in + 'part\|lvm\|crypt') # Deal with incorrect partitioning for main mounting function + + if ([[ $SYSTEM == "UEFI" ]] && [[ $NUMBER_PARTITIONS -lt 2 ]]) || ([[ $SYSTEM == "BIOS" ]] && [[ $NUMBER_PARTITIONS -eq 0 ]]); then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PartErrBody" 0 0 + create_partitions + fi + ;; + 'part\|crypt') # Ensure there is at least one partition for LVM + if [[ $NUMBER_PARTITIONS -eq 0 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmPartErrBody" 0 0 + create_partitions + fi + ;; + 'part\|lvm') # Ensure there are at least two partitions for LUKS + if [[ $NUMBER_PARTITIONS -lt 2 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LuksPartErrBody" 0 0 + create_partitions + fi + ;; + esac + +} + +create_partitions(){ + +# Securely destroy all data on a given device. +secure_wipe(){ + + # Warn the user. If they proceed, wipe the selected device. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PartOptWipe " --yesno "$_AutoPartWipeBody1 ${DEVICE} $_AutoPartWipeBody2" 0 0 + if [[ $? -eq 0 ]]; then + clear + + # Install wipe where not already installed. Much faster than dd + if [[ ! -e /usr/bin/wipe ]]; then + pacman -Sy --noconfirm wipe 2>/tmp/.errlog + check_for_error + fi + + clear + wipe -Ifre ${DEVICE} + + # Alternate dd command - requires pv to be installed + #dd if=/dev/zero | pv | dd of=${DEVICE} iflag=nocache oflag=direct bs=4096 2>/tmp/.errlog + check_for_error + else + create_partitions + fi +} + +# BIOS and UEFI +auto_partition(){ + + # Provide warning to user + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepPartDisk " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartBody2 $_AutoPartBody3" 0 0 + + if [[ $? -eq 0 ]]; then + + # Find existing partitions (if any) to remove + parted -s ${DEVICE} print | awk '/^ / {print $1}' > /tmp/.del_parts + + for del_part in $(tac /tmp/.del_parts); do + parted -s ${DEVICE} rm ${del_part} 2>/tmp/.errlog + check_for_error + done + + # Identify the partition table + part_table=$(parted -s ${DEVICE} print | grep -i 'partition table' | awk '{print $3}' >/dev/null 2>&1) + + # Create partition table if one does not already exist + ([[ $SYSTEM == "BIOS" ]] && [[ $part_table != "msdos" ]]) && parted -s ${DEVICE} mklabel msdos 2>/tmp/.errlog + ([[ $SYSTEM == "UEFI" ]] && [[ $part_table != "gpt" ]]) && parted -s ${DEVICE} mklabel gpt 2>/tmp/.errlog + check_for_error + + # Create paritions (same basic partitioning scheme for BIOS and UEFI) + if [[ $SYSTEM == "BIOS" ]]; then + parted -s ${DEVICE} mkpart primary ext3 1MiB 513MiB 2>/tmp/.errlog + else + parted -s ${DEVICE} mkpart ESP fat32 1MiB 513MiB 2>/tmp/.errlog + fi + + parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog + parted -s ${DEVICE} mkpart primary ext3 513MiB 100% 2>>/tmp/.errlog + check_for_error + + # Show created partitions + lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE > /tmp/.devlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "" --textbox /tmp/.devlist 0 0 + else + create_partitions + fi + +} + + # Partitioning Menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepPartDisk " --menu "$_PartToolBody" 0 0 7 \ + "$_PartOptWipe" "BIOS & UEFI" \ + "$_PartOptAuto" "BIOS & UEFI" \ + "cfdisk" "BIOS" \ + "cgdisk" "UEFI" \ + "fdisk" "BIOS & UEFI" \ + "gdisk" "UEFI" \ + "parted" "BIOS & UEFI" 2>${ANSWER} + + clear + # If something selected + if [[ $(cat ${ANSWER}) != "" ]]; then + if ([[ $(cat ${ANSWER}) != "$_PartOptWipe" ]] && [[ $(cat ${ANSWER}) != "$_PartOptAuto" ]]); then + $(cat ${ANSWER}) ${DEVICE} + else + [[ $(cat ${ANSWER}) == "$_PartOptWipe" ]] && secure_wipe && create_partitions + [[ $(cat ${ANSWER}) == "$_PartOptAuto" ]] && auto_partition + fi + fi + + prep_menu +} + +# Set static list of filesystems rather than on-the-fly. Partially as most require additional flags, and +# partially because some don't seem to be viable. +# Set static list of filesystems rather than on-the-fly. +select_filesystem(){ + + # prep variables + fs_opts="" + CHK_NUM=0 + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --menu "$_FSBody" 0 0 12 \ + "$_FSSkip" "-" \ + "btrfs" "mkfs.btrfs -f" \ + "ext2" "mkfs.ext2 -q" \ + "ext3" "mkfs.ext3 -q" \ + "ext4" "mkfs.ext4 -q" \ + "f2fs" "mkfs.f2fs" \ + "jfs" "mkfs.jfs -q" \ + "nilfs2" "mkfs.nilfs2 -fq" \ + "ntfs" "mkfs.ntfs -q" \ + "reiserfs" "mkfs.reiserfs -q" \ + "vfat" "mkfs.vfat -F32" \ + "xfs" "mkfs.xfs -f" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_FSSkip") FILESYSTEM="$_FSSkip" ;; + "btrfs") FILESYSTEM="mkfs.btrfs -f" + CHK_NUM=16 + fs_opts="autodefrag compress=zlib compress=lzo compress=no compress-force=zlib compress-force=lzo discard noacl noatime nodatasum nospace_cache recovery skip_balance space_cache ssd ssd_spread" + modprobe btrfs + ;; + "ext2") FILESYSTEM="mkfs.ext2 -q" ;; + "ext3") FILESYSTEM="mkfs.ext3 -q" ;; + "ext4") FILESYSTEM="mkfs.ext4 -q" + CHK_NUM=8 + fs_opts="data=journal data=writeback dealloc discard noacl noatime nobarrier nodelalloc" + ;; + "f2fs") FILESYSTEM="mkfs.f2fs" + fs_opts="data_flush disable_roll_forward disable_ext_identify discard fastboot flush_merge inline_xattr inline_data inline_dentry no_heap noacl nobarrier noextent_cache noinline_data norecovery" + CHK_NUM=16 + modprobe f2fs + ;; + "jfs") FILESYSTEM="mkfs.jfs -q" + CHK_NUM=4 + fs_opts="discard errors=continue errors=panic nointegrity" + ;; + "nilfs2") FILESYSTEM="mkfs.nilfs2 -fq" + CHK_NUM=7 + fs_opts="discard nobarrier errors=continue errors=panic order=relaxed order=strict norecovery" + ;; + "ntfs") FILESYSTEM="mkfs.ntfs -q" ;; + "reiserfs") FILESYSTEM="mkfs.reiserfs -q" + CHK_NUM=5 + fs_opts="acl nolog notail replayonly user_xattr" + ;; + "vfat") FILESYSTEM="mkfs.vfat -F32" ;; + "xfs") FILESYSTEM="mkfs.xfs -f" + CHK_NUM=9 + fs_opts="discard filestreams ikeep largeio noalign nobarrier norecovery noquota wsync" + ;; + *) prep_menu ;; + esac + + # Warn about formatting! + if [[ $FILESYSTEM != $_FSSkip ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_FSTitle " --yesno "\n$FILESYSTEM $PARTITION\n\n" 0 0 + if [[ $? -eq 0 ]]; then + ${FILESYSTEM} ${PARTITION} >/dev/null 2>/tmp/.errlog + check_for_error + else + select_filesystem + fi + fi + + + } + +mount_partitions() { + +# This subfunction allows for special mounting options to be applied for relevant fs's. +# Seperate subfunction for neatness. +mount_opts() { + + FS_OPTS="" + echo "" > ${MOUNT_OPTS} + + for i in ${fs_opts}; do + FS_OPTS="${FS_OPTS} ${i} - off" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $(echo $FILESYSTEM | sed "s/.*\.//g" | sed "s/-.*//g") " --checklist "$_btrfsMntBody" 0 0 $CHK_NUM \ + $FS_OPTS 2>${MOUNT_OPTS} + + # Now clean up the file + sed -i 's/ /,/g' ${MOUNT_OPTS} + sed -i '$s/,$//' ${MOUNT_OPTS} + + # If mount options selected, confirm choice + if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MntStatusTitle " --yesno "\n${_btrfsMntConfBody}$(cat ${MOUNT_OPTS})\n" 10 75 + [[ $? -eq 1 ]] && mount_opts + fi + +} + +# Subfunction to save repetition of code +mount_current_partition(){ + + # Make the mount directory + mkdir -p ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog + + # Get mounting options for appropriate filesystems + [[ $fs_opts != "" ]] && mount_opts + + # Use special mounting options if selected, else standard mount + if [[ $(cat ${MOUNT_OPTS}) != "" ]]; then + mount -o $(cat ${MOUNT_OPTS}) ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog + else + mount ${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog + fi + + check_for_error + confirm_mount ${MOUNTPOINT}${MOUNT} + + # Identify if mounted partition is type "crypt" (LUKS on LVM, or LUKS alone) + if [[ $(lsblk -lno TYPE ${PARTITION} | grep "crypt") != "" ]]; then + + # cryptname for bootloader configuration either way + LUKS=1 + LUKS_NAME=$(echo ${PARTITION} | sed "s~^/dev/mapper/~~g") + + # Check if LUKS on LVM (parent = lvm /dev/mapper/...) + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "lvm" | grep -i "crypto_luks" | uniq | awk '{print "/dev/mapper/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + LUKS_DEV="$LUKS_DEV cryptdevice=${i}:$LUKS_NAME" + LVM=1 + break; + fi + done + + # Check if LUKS alone (parent = part /dev/...) + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') + LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" + break; + fi + done + + # If LVM logical volume.... + elif [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]]; then + LVM=1 + + # First get crypt name (code above would get lv name) + cryptparts=$(lsblk -lno NAME,TYPE,FSTYPE | grep "crypt" | grep -i "lvm2_member" | uniq | awk '{print "/dev/mapper/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $(echo $PARTITION | sed "s~^/dev/mapper/~~g")) != "" ]]; then + LUKS_NAME=$(echo ${i} | sed s~/dev/mapper/~~g) + break; + fi + done + + # Now get the device (/dev/...) for the crypt name + cryptparts=$(lsblk -lno NAME,FSTYPE,TYPE | grep "part" | grep -i "crypto_luks" | uniq | awk '{print "/dev/"$1}') + for i in ${cryptparts}; do + if [[ $(lsblk -lno NAME ${i} | grep $LUKS_NAME) != "" ]]; then + # Create UUID for comparison + LUKS_UUID=$(lsblk -lno UUID,TYPE,FSTYPE ${i} | grep "part" | grep -i "crypto_luks" | awk '{print $1}') + + # Check if not already added as a LUKS DEVICE (i.e. multiple LVs on one crypt). If not, add. + if [[ $(echo $LUKS_DEV | grep $LUKS_UUID) == "" ]]; then + LUKS_DEV="$LUKS_DEV cryptdevice=UUID=$LUKS_UUID:$LUKS_NAME" + LUKS=1 + fi + + break; + fi + done + fi + + +} + +# Seperate function due to ability to cancel +make_swap(){ + + # Ask user to select partition or create swapfile + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelSwpBody" 0 0 7 "$_SelSwpNone" $"-" "$_SelSwpFile" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu + + if [[ $(cat ${ANSWER}) != "$_SelSwpNone" ]]; then + PARTITION=$(cat ${ANSWER}) + + if [[ $PARTITION == "$_SelSwpFile" ]]; then + total_memory=$(grep MemTotal /proc/meminfo | awk '{print $2/1024}' | sed 's/\..*//') + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap + m_or_g=$(cat ${ANSWER}) + + while [[ $(echo ${m_or_g: -1} | grep "M\|G") == "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --msgbox "\n$_SelSwpFile $_ErrTitle: M = MB, G = GB\n\n" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SelSwpFile " --inputbox "\nM = MB, G = GB\n" 9 30 "${total_memory}M" 2>${ANSWER} || make_swap + m_or_g=$(cat ${ANSWER}) + done + + fallocate -l ${m_or_g} ${MOUNTPOINT}/swapfile 2>/tmp/.errlog + chmod 600 ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + mkswap ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + swapon ${MOUNTPOINT}/swapfile 2>>/tmp/.errlog + check_for_error + + else # Swap Partition + # Warn user if creating a new swap + if [[ $(lsblk -o FSTYPE ${PARTITION} | grep -i "swap") != "swap" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --yesno "\nmkswap ${PARTITION}\n\n" 0 0 + [[ $? -eq 0 ]] && mkswap ${PARTITION} >/dev/null 2>/tmp/.errlog || mount_partitions + fi + # Whether existing to newly created, activate swap + swapon ${PARTITION} >/dev/null 2>>/tmp/.errlog + check_for_error + # Since a partition was used, remove that partition from the list + PARTITIONS=$(echo $PARTITIONS | sed "s~${PARTITION} [0-9]*[G-M]~~" | sed "s~${PARTITION} [0-9]*\.[0-9]*[G-M]~~" | sed s~${PARTITION}$' -'~~) + NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 )) + fi + fi + +} + #### #### + #### MOUNTING FUNCTION BEGINS HERE #### + #### #### + + # prep variables + MOUNT="" + LUKS_NAME="" + LUKS_DEV="" + LUKS_UUID="" + LUKS=0 + LVM=0 + BTRFS=0 + + # Warn users that they CAN mount partitions without formatting them! + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --msgbox "$_WarnMount1 '$_FSSkip' $_WarnMount2" 0 0 + + # LVM Detection. If detected, activate. + lvm_detect + + # Ensure partitions are unmounted (i.e. where mounted previously), and then list available partitions + INCLUDE_PART='part\|lvm\|crypt' + umount_partitions + find_partitions + + # Identify and mount root + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelRootBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + PARTITION=$(cat ${ANSWER}) + ROOT_PART=${PARTITION} + + # Format with FS (or skip) + select_filesystem + + # Make the directory and mount. Also identify LUKS and/or LVM + mount_current_partition + + # Identify and create swap, if applicable + make_swap + + # Extra Step for VFAT UEFI Partition. This cannot be in an LVM container. + if [[ $SYSTEM == "UEFI" ]]; then + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_SelUefiBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + PARTITION=$(cat ${ANSWER}) + UEFI_PART=${PARTITION} + + # If it is already a fat/vfat partition... + if [[ $(fsck -N $PARTITION | grep fat) ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --yesno "$_FormUefiBody $PARTITION $_FormUefiBody2" 0 0 && mkfs.vfat -F32 ${PARTITION} >/dev/null 2>/tmp/.errlog + else + mkfs.vfat -F32 ${PARTITION} >/dev/null 2>/tmp/.errlog + fi + check_for_error + + # Inform users of the mountpoint options and consequences + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_MntUefiBody" 0 0 2 \ + "/boot" "systemd-boot"\ + "/boot/efi" "-" 2>${ANSWER} + + [[ $(cat ${ANSWER}) != "" ]] && UEFI_MOUNT=$(cat ${ANSWER}) || prep_menu + + mkdir -p ${MOUNTPOINT}${UEFI_MOUNT} 2>/tmp/.errlog + mount ${PARTITION} ${MOUNTPOINT}${UEFI_MOUNT} 2>>/tmp/.errlog + check_for_error + confirm_mount ${MOUNTPOINT}${UEFI_MOUNT} + fi + + # All other partitions + while [[ $NUMBER_PARTITIONS > 0 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart " --menu "$_ExtPartBody" 0 0 7 "$_Done" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu + PARTITION=$(cat ${ANSWER}) + + if [[ $PARTITION == $_Done ]]; then + break; + else + MOUNT="" + select_filesystem + + # Ask user for mountpoint. Don't give /boot as an example for UEFI systems! + [[ $SYSTEM == "UEFI" ]] && MNT_EXAMPLES="/home\n/var" || MNT_EXAMPLES="/boot\n/home\n/var" + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu + MOUNT=$(cat ${ANSWER}) + + # loop while the mountpoint specified is incorrect (is only '/', is blank, or has spaces). + while [[ ${MOUNT:0:1} != "/" ]] || [[ ${#MOUNT} -le 1 ]] || [[ $MOUNT =~ \ |\' ]]; do + # Warn user about naming convention + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ExtErrBody" 0 0 + # Ask user for mountpoint again + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMntPart $PARTITON " --inputbox "$_ExtPartBody1$MNT_EXAMPLES\n" 0 0 "/" 2>${ANSWER} || prep_menu + MOUNT=$(cat ${ANSWER}) + done + + # Create directory and mount. + mount_current_partition + + # Determine if a seperate /boot is used. 0 = no seperate boot, 1 = seperate non-lvm boot, + # 2 = seperate lvm boot. For Grub configuration + if [[ $MOUNT == "/boot" ]]; then + [[ $(lsblk -lno TYPE ${PARTITION} | grep "lvm") != "" ]] && LVM_SEP_BOOT=2 || LVM_SEP_BOOT=1 + fi + + fi + done +} + +###################################################################### +## ## +## Encryption (dm_crypt) Functions ## +## ## +###################################################################### + +# Had to write it in this way due to (bash?) bug(?), as if/then statements in a single +# "create LUKS" function for default and "advanced" modes were interpreted as commands, +# not mere string statements. Not happy with it, but it works... + +# Save repetition of code. +luks_password(){ + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --clear --insecure --passwordbox "$_LuksPassBody" 0 0 2> ${ANSWER} || prep_menu + PASSWD=$(cat ${ANSWER}) + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --clear --insecure --passwordbox "$_PassReEntBody" 0 0 2> ${ANSWER} || prep_menu + PASSWD2=$(cat ${ANSWER}) + + if [[ $PASSWD != $PASSWD2 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_PassErrBody" 0 0 + luks_password + fi + +} + +luks_open(){ + + LUKS_ROOT_NAME="" + INCLUDE_PART='part\|crypt\|lvm' + umount_partitions + find_partitions + + # Select encrypted partition to open + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --menu "$_LuksMenuBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu + PARTITION=$(cat ${ANSWER}) + + # Enter name of the Luks partition and get password to open it + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu + LUKS_ROOT_NAME=$(cat ${ANSWER}) + luks_password + + # Try to open the luks partition with the credentials given. If successful show this, otherwise + # show the error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksOpen " --infobox "$_PlsWaitBody" 0 0 + echo $PASSWD | cryptsetup open --type luks ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error + + lsblk -o NAME,TYPE,FSTYPE,SIZE,MOUNTPOINT ${PARTITION} | grep "crypt\|NAME\|MODEL\|TYPE\|FSTYPE\|SIZE" > /tmp/.devlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DevShowOpt " --textbox /tmp/.devlist 0 0 + + luks_menu +} + +luks_setup(){ + + modprobe -a dm-mod dm_crypt + INCLUDE_PART='part\|lvm' + umount_partitions + find_partitions + + # Select partition to encrypt + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --menu "$_LuksCreateBody" 0 0 7 ${PARTITIONS} 2>${ANSWER} || luks_menu + PARTITION=$(cat ${ANSWER}) + + # Enter name of the Luks partition and get password to create it + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --inputbox "$_LuksOpenBody" 10 50 "cryptroot" 2>${ANSWER} || luks_menu + LUKS_ROOT_NAME=$(cat ${ANSWER}) + luks_password +} + +luks_default() { + + # Encrypt selected partition or LV with credentials given + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --infobox "$_PlsWaitBody" 0 0 + sleep 2 + echo $PASSWD | cryptsetup -q luksFormat ${PARTITION} 2>/tmp/.errlog + + # Now open the encrypted partition or LV + echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error + +} + +luks_key_define() { + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --inputbox "$_LuksCipherKey" 0 0 "-s 512 -c aes-xts-plain64" 2>${ANSWER} || luks_menu + + # Encrypt selected partition or LV with credentials given + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncryptAdv " --infobox "$_PlsWaitBody" 0 0 + sleep 2 + + echo $PASSWD | cryptsetup -q $(cat ${ANSWER}) luksFormat ${PARTITION} 2>/tmp/.errlog + check_for_error + + # Now open the encrypted partition or LV + echo $PASSWD | cryptsetup open ${PARTITION} ${LUKS_ROOT_NAME} 2>/tmp/.errlog + check_for_error + +} + +luks_show(){ + + echo -e ${_LuksEncruptSucc} > /tmp/.devlist + lsblk -o NAME,TYPE,FSTYPE,SIZE ${PARTITION} | grep "part\|crypt\|NAME\|TYPE\|FSTYPE\|SIZE" >> /tmp/.devlist + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LuksEncrypt " --textbox /tmp/.devlist 0 0 + + luks_menu +} + +luks_menu() { + + LUKS_OPT="" + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLUKS " --menu "$_LuksMenuBody$_LuksMenuBody2$_LuksMenuBody3" 0 0 4 \ + "$_LuksOpen" "cryptsetup open --type luks" \ + "$_LuksEncrypt" "cryptsetup -q luksFormat" \ + "$_LuksEncryptAdv" "cryptsetup -q -s -c luksFormat" \ + "$_Back" "-" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_LuksOpen") luks_open ;; + "$_LuksEncrypt") luks_setup + luks_default + luks_show ;; + "$_LuksEncryptAdv") luks_setup + luks_key_define + luks_show ;; + *) prep_menu ;; + esac + + luks_menu + +} + + + +###################################################################### +## ## +## Logical Volume Management Functions ## +## ## +###################################################################### + +# LVM Detection. +lvm_detect() { + + LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null) + LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null) + LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null) + + if [[ $LVM_LV != "" ]] && [[ $LVM_VG != "" ]] && [[ $LVM_PV != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --infobox "$_LvmDetBody" 0 0 + modprobe dm-mod 2>/tmp/.errlog + check_for_error + vgscan >/dev/null 2>&1 + vgchange -ay >/dev/null 2>&1 + fi +} + +lvm_show_vg(){ + + VG_LIST="" + vg_list=$(lvs --noheadings | awk '{print $2}' | uniq) + + for i in ${vg_list}; do + VG_LIST="${VG_LIST} ${i} $(vgdisplay ${i} | grep -i "vg size" | awk '{print $3$4}')" + done + + # If no VGs, no point in continuing + if [[ $VG_LIST == "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmVGErr" 0 0 + lvm_menu + fi + + # Select VG + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM " --menu "$_LvmSelVGBody" 0 0 5 \ + ${VG_LIST} 2>${ANSWER} || lvm_menu +} + +# Create Volume Group and Logical Volumes +lvm_create() { + +# subroutine to save a lot of repetition. +check_lv_size() { + + LV_SIZE_INVALID=0 + chars=0 + + # Check to see if anything was actually entered and if first character is '0' + ([[ ${#LVM_LV_SIZE} -eq 0 ]] || [[ ${LVM_LV_SIZE:0:1} -eq "0" ]]) && LV_SIZE_INVALID=1 + + # If not invalid so far, check for non numberic characters other than the last character + if [[ $LV_SIZE_INVALID -eq 0 ]]; then + while [[ $chars -lt $(( ${#LVM_LV_SIZE} - 1 )) ]]; do + [[ ${LVM_LV_SIZE:chars:1} != [0-9] ]] && LV_SIZE_INVALID=1 && break; + chars=$(( chars + 1 )) + done + fi + + # If not invalid so far, check that last character is a M/m or G/g + if [[ $LV_SIZE_INVALID -eq 0 ]]; then + LV_SIZE_TYPE=$(echo ${LVM_LV_SIZE:$(( ${#LVM_LV_SIZE} - 1 )):1}) + + case $LV_SIZE_TYPE in + "m"|"M"|"g"|"G") LV_SIZE_INVALID=0 ;; + *) LV_SIZE_INVALID=1 ;; + esac + + fi + + # If not invalid so far, check whether the value is greater than or equal to the LV remaining Size. + # If not, convert into MB for VG space remaining. + if [[ ${LV_SIZE_INVALID} -eq 0 ]]; then + + case ${LV_SIZE_TYPE} in + "G"|"g") if [[ $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) -ge ${LVM_VG_MB} ]]; then + LV_SIZE_INVALID=1 + else + LVM_VG_MB=$(( LVM_VG_MB - $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) )) + fi + ;; + "M"|"m") if [[ $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) -ge ${LVM_VG_MB} ]]; then + LV_SIZE_INVALID=1 + else + LVM_VG_MB=$(( LVM_VG_MB - $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) )) + fi + ;; + *) LV_SIZE_INVALID=1 + ;; + esac + + fi + +} + + # # + # LVM Create Starts Here # + # # + + # Prep Variables + LVM_VG="" + VG_PARTS="" + LVM_VG_MB=0 + + # Find LVM appropriate partitions. + INCLUDE_PART='part\|crypt' + umount_partitions + find_partitions + # Amend partition(s) found for use in check list + PARTITIONS=$(echo $PARTITIONS | sed 's/M\|G\|T/& off/g') + + # Name the Volume Group + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu + LVM_VG=$(cat ${ANSWER}) + + # Loop while the Volume Group name starts with a "/", is blank, has spaces, or is already being used + while [[ ${LVM_VG:0:1} == "/" ]] || [[ ${#LVM_VG} -eq 0 ]] || [[ $LVM_VG =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_VG}) != "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_LvmNameVgErr" 0 0 + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu + LVM_VG=$(cat ${ANSWER}) + done + + # Select the partition(s) for the Volume Group + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --checklist "$_LvmPvSelBody $_UseSpaceBar" 0 0 7 ${PARTITIONS} 2>${ANSWER} || prep_menu + [[ $(cat ${ANSWER}) != "" ]] && VG_PARTS=$(cat ${ANSWER}) || prep_menu + + # Once all the partitions have been selected, show user. On confirmation, use it/them in 'vgcreate' command. + # Also determine the size of the VG, to use for creating LVs for it. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --yesno "$_LvmPvConfBody1${LVM_VG} $_LvmPvConfBody2${VG_PARTS}" 0 0 + + if [[ $? -eq 0 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --infobox "$_LvmPvActBody1${LVM_VG}.$_PlsWaitBody" 0 0 + sleep 1 + vgcreate -f ${LVM_VG} ${VG_PARTS} >/dev/null 2>/tmp/.errlog + check_for_error + + # Once created, get size and size type for display and later number-crunching for lv creation + VG_SIZE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $3}' | sed 's/\..*//') + VG_SIZE_TYPE=$(vgdisplay $LVM_VG | grep 'VG Size' | awk '{print $4}') + + # Convert the VG size into GB and MB. These variables are used to keep tabs on space available and remaining + [[ ${VG_SIZE_TYPE:0:1} == "G" ]] && LVM_VG_MB=$(( VG_SIZE * 1000 )) || LVM_VG_MB=$VG_SIZE + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --msgbox "$_LvmPvDoneBody1 '${LVM_VG}' $_LvmPvDoneBody2 (${VG_SIZE} ${VG_SIZE_TYPE}).\n\n" 0 0 + else + lvm_menu + fi + + # + # Once VG created, create Logical Volumes + # + + # Specify number of Logical volumes to create. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --radiolist "$_LvmLvNumBody1 ${LVM_VG}. $_LvmLvNumBody2" 0 0 9 \ + "1" "-" off "2" "-" off "3" "-" off "4" "-" off "5" "-" off "6" "-" off "7" "-" off "8" "-" off "9 " "-" off 2>${ANSWER} + + [[ $(cat ${ANSWER}) == "" ]] && lvm_menu || NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER}) + + # Loop while the number of LVs is greater than 1. This is because the size of the last LV is automatic. + while [[ $NUMBER_LOGICAL_VOLUMES -gt 1 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + + # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. + while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu + LVM_LV_SIZE=$(cat ${ANSWER}) + check_lv_size + + # Loop while an invalid value is entered. + while [[ $LV_SIZE_INVALID -eq 1 ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvSizeErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu + LVM_LV_SIZE=$(cat ${ANSWER}) + check_lv_size + done + + # Create the LV + lvcreate -L ${LVM_LV_SIZE} ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --msgbox "\n$_Done\n\nLV ${LVM_LV_NAME} (${LVM_LV_SIZE}) $_LvmPvDoneBody2.\n\n" 0 0 + NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) + done + + # Now the final LV. Size is automatic. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + + # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists. + while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_LvmLvNameErrBody" 0 0 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG (LV:$NUMBER_LOGICAL_VOLUMES) " --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu + LVM_LV_NAME=$(cat ${ANSWER}) + done + + # Create the final LV + lvcreate -l +100%FREE ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog + check_for_error + NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 )) + LVM=1 + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmCreateVG " --yesno "$_LvmCompBody" 0 0 \ + && show_devices || lvm_menu + +} + +lvm_del_vg(){ + + # Generate list of VGs for selection + lvm_show_vg + + # Ask for confirmation + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelVG " --yesno "$_LvmDelQ" 0 0 + + # if confirmation given, delete + if [[ $? -eq 0 ]]; then + vgremove -f $(cat ${ANSWER}) >/dev/null 2>&1 + fi + + lvm_menu +} + +lvm_del_all(){ + + LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null) + LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null) + LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null) + + # Ask for confirmation + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_LvmDelLV " --yesno "$_LvmDelQ" 0 0 + + # if confirmation given, delete + if [[ $? -eq 0 ]]; then + + for i in ${LVM_LV}; do + lvremove -f /dev/mapper/${i} >/dev/null 2>&1 + done + + for i in ${LVM_VG}; do + vgremove -f ${i} >/dev/null 2>&1 + done + + for i in ${LV_PV}; do + pvremove -f ${i} >/dev/null 2>&1 + done + + fi + + lvm_menu +} + +lvm_menu(){ + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --infobox "$_PlsWaitBody" 0 0 + sleep 1 + lvm_detect + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepLVM $_PrepLVM2 " --menu "$_LvmMenu" 0 0 4 \ + "$_LvmCreateVG" "vgcreate -f, lvcreate -L -n" \ + "$_LvmDelVG" "vgremove -f" \ + "$_LvMDelAll" "lvrmeove, vgremove, pvremove -f" \ + "$_Back" "-" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_LvmCreateVG") lvm_create ;; + "$_LvmDelVG") lvm_del_vg ;; + "$_LvMDelAll") lvm_del_all ;; + *) prep_menu ;; + esac + + +} + +###################################################################### +## ## +## Installation Functions ## +## ## +###################################################################### + +# The linux kernel package will be removed from the base group as it and/or the lts version will be +# selected by the user. Two installation methods are available: Standard (group package based) and +# Advanced (individual package based). Neither will allow progress without selecting a kernel. +install_base() { + + # Prep variables + echo "" > ${PACKAGES} + echo "" > ${ANSWER} + BTRF_CHECK=$(echo "btrfs-progs" "-" off) + F2FS_CHECK=$(echo "f2fs-tools" "-" off) + KERNEL="n" + kernels="linux-rt-lts-manjaro linux410 linux-rt-manjaro linux-linux49" + + # User to select "standard" or "advanced" installation Method + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Choose your initsystem " --menu "Some manjaro editions like gnome are incompatible with openrc" 0 0 2 \ + "1" "systemd" \ + "2" "openrc" 2>${INIT} + + + if [[ $(cat ${INIT}) -eq 2 ]]; then + touch /tmp/.openrc + cat /usr/share/aif/package-lists/base-openrc-manjaro > /tmp/.base + else + cat /usr/share/aif/package-lists/base-systemd-manjaro > /tmp/.base + + fi + + # User to select "standard" or "advanced" installation Method + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --menu "$_InstBseBody" 0 0 2 \ + "1" "$_InstStandBase" \ + "2" "$_InstAdvBase" 2>${ANSWER} + + # "Standard" installation method + if [[ $(cat ${ANSWER}) -eq 1 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstStandBseBody$_UseSpaceBar" 0 0 3 \ + "linux49" "-" on \ + "linux-rt-lts-manjaro" "-" off \ + "base-devel" "-" on 2>${PACKAGES} + cat ${PACKAGES} >> /tmp/.base + + # "Advanced" installation method + elif [[ $(cat ${ANSWER}) -eq 2 ]]; then + + # Ask user to wait while package descriptions are gathered (because it takes ages) + #dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAdvBase " --infobox "$_InstAdvWait $_PlsWaitBody" 0 0 + + # Generate a package list with descriptions. + PKG_LIST="" + if [[ -e /tmp/.openrc ]]; then + pkg_list=$(echo $(cat /usr/share/aif/package-lists/base-openrc-manjaro) $(pacman -Sqg base-devel) | uniq | sort -u) + else + pkg_list=$(echo $(cat /usr/share/aif/package-lists/base-systemd-manjaro) $(pacman -Sqg base-devel) | uniq | sort -u) + fi + # Check btrfs and f2fs packages in list if used + [[ $(lsblk -lno FSTYPE | grep btrfs) != "" ]] && BTRF_CHECK=$(echo $BTRFS_CHECK | sed "s/ off/ on/g") + [[ $(lsblk -lno FSTYPE | grep f2fs) != "" ]] && F2FS_CHECK=$(echo $F2FS_CHECK | sed "s/ off/ on/g") + + # Gather package descriptions for base group + for i in ${pkg_list}; do + PKG_LIST="${PKG_LIST} ${i} - on" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBseTitle " --checklist "$_InstAdvBseBody $_UseSpaceBar" 0 0 20 \ + "linux49" "-" on \ + "linux-rt-lts-manjaro" "-" off \ + "linux-rt-manjaro" "-" off \ + "linux-linux410" "-" off \ + $PKG_LIST $BTRF_CHECK $F2FS_CHECK 2>${PACKAGES} + fi + + # If a selection made, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + + # Check to see if a kernel is already installed + ls ${MOUNTPOINT}/boot/*.img >/dev/null 2>&1 + if [[ $? == 0 ]]; then + KERNEL="y" + # If not, check to see if the linux kernel has been selected + elif [[ $(cat ${PACKAGES} | awk '{print $1}') == "linux49" ]]; then + KERNEL="y" + # If no linux kernel, check to see if any of the others have been selected + else + for i in ${kernels}; do + [[ $(cat ${PACKAGES} | grep ${i}) != "" ]] && KERNEL="y" && break; + done + fi + + # If no kernel selected, warn and restart + if [[ $KERNEL == "n" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_ErrNoKernel" 0 0 + install_base + + # If at least one kernel selected, proceed with installation. + elif [[ $KERNEL == "y" ]]; then + clear + [[ $(cat ${ANSWER}) -eq 1 ]] && basestrap ${MOUNTPOINT} $(cat /tmp/.base) 2>/tmp/.errlog + [[ $(cat ${ANSWER}) -eq 2 ]] && basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + # Use mhwd to install selected kernels with right kernel modules + # This is as of yet untested + arch_chroot "mhwd-kernel -i $(cat ${PACKAGES} | xargs -n1 | grep "^linux" | xargs)" 2>/tmp/.errlog + check_for_error + # If the virtual console has been set, then copy config file to installation + [[ -e /tmp/vconsole.conf ]] && cp -f /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>/tmp/.errlog + # If specified, copy over the pacman.conf file to the installation + [[ $COPY_PACCONF -eq 1 ]] && cp -f /etc/pacman.conf ${MOUNTPOINT}/etc/pacman.conf 2>>/tmp/.errlog + check_for_error + # if branch was chosen, use that also in installed system. If not, use the system setting + if [[ -e ${BRANCH} ]]; then + sed -i "/Branch =/c\Branch = $(cat ${BRANCH})/" ${MOUNTPOINT}/etc/pacman-mirrors.conf + else + sed -i "/Branch =/c$(grep "Branch =" /etc/pacman-mirrors.conf)" ${MOUNTPOINT}/etc/pacman-mirrors.conf + fi + fi + fi + +} + +install_bootloader() { + +# Grub auto-detects installed kernels, etc. Syslinux does not, hence the extra code for it. +bios_bootloader() { + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBiosBtTitle " --menu "$_InstBiosBtBody" 0 0 3 \ + "grub" "-" "grub + os-prober" "-" 2>${PACKAGES} + clear + + # If something has been selected, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + sed -i 's/+\|\"//g' ${PACKAGES} + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + # If Grub, select device + if [[ $(cat ${PACKAGES} | grep "grub") != "" ]]; then + select_device + + # If a device has been selected, configure + if [[ $DEVICE != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 + arch_chroot "grub-install --target=i386-pc --recheck $DEVICE" 2>/tmp/.errlog + + # if /boot is LVM (whether using a seperate /boot mount or not), amend grub + if ( [[ $LVM -eq 1 ]] && [[ $LVM_SEP_BOOT -eq 0 ]] ) || [[ $LVM_SEP_BOOT -eq 2 ]]; then + sed -i "s/GRUB_PRELOAD_MODULES=\"\"/GRUB_PRELOAD_MODULES=\"lvm\"/g" ${MOUNTPOINT}/etc/default/grub + fi + + # If encryption used amend grub + [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub + + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + check_for_error + fi + else + # Syslinux + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstSysTitle " --menu "$_InstSysBody" 0 0 2 \ + "syslinux-install_update -iam" "[MBR]" "syslinux-install_update -i" "[/]" 2>${PACKAGES} + + # If an installation method has been chosen, run it + if [[ $(cat ${PACKAGES}) != "" ]]; then + arch_chroot "$(cat ${PACKAGES})" 2>/tmp/.errlog + check_for_error + + # Amend configuration file. First remove all existing entries, then input new ones. + sed -i '/^LABEL.*$/,$d' ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + #echo -e "\n" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # First the "main" entries + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux realtime LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux realtime\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux release candidate\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Second the "fallback" entries + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback\n\tLINUX ../vmlinuz-linux\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback realtime LTS\n\tLINUX ../vmlinuz-linux-lts\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-lts-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallback realtime\n\tLINUX ../vmlinuz-linux-grsec\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-grsec-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "\n\nLABEL arch\n\tMENU LABEL Manjaro Linux Fallbacl Zen\n\tLINUX ../vmlinuz-linux-zen\n\tAPPEND root=${ROOT_PART} rw\n\tINITRD ../initramfs-linux-zen-fallback.img" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Third, amend for LUKS + [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Finally, re-add the "default" entries + echo -e "\n\nLABEL hdt\n\tMENU LABEL HDT (Hardware Detection Tool)\n\tCOM32 hdt.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\nLABEL reboot\n\tMENU LABEL Reboot\n\tCOM32 reboot.c32" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\n#LABEL windows\n\t#MENU LABEL Windows\n\t#COM32 chain.c32\n\t#APPEND root=/dev/sda2 rw" >> ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + echo -e "\n\nLABEL poweroff\n\tMENU LABEL Poweroff\n\tCOM32 poweroff.c32" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + fi + fi + fi +} + +uefi_bootloader() { + + #Ensure again that efivarfs is mounted + [[ -z $(mount | grep /sys/firmware/efi/efivars) ]] && mount -t efivarfs efivarfs /sys/firmware/efi/efivars + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --menu "$_InstUefiBtBody" 0 0 2 \ + "grub" "-" 2>${PACKAGES} + + if [[ $(cat ${PACKAGES}) != "" ]]; then + + clear + basestrap ${MOUNTPOINT} $(cat ${PACKAGES} | grep -v "systemd-boot") efibootmgr dosfstools 2>/tmp/.errlog + check_for_error + + case $(cat ${PACKAGES}) in + "grub") + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0 + arch_chroot "grub-install --target=x86_64-efi --efi-directory=${UEFI_MOUNT} --bootloader-id=arch_grub --recheck" 2>/tmp/.errlog + + # If encryption used amend grub + [[ $LUKS_DEV != "" ]] && sed -i "s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"$LUKS_DEV\"~g" ${MOUNTPOINT}/etc/default/grub + + # Generate config file + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + check_for_error + + # Ask if user wishes to set Grub as the default bootloader and act accordingly + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --yesno "$_SetBootDefBody ${UEFI_MOUNT}/EFI/boot $_SetBootDefBody2" 0 0 + + if [[ $? -eq 0 ]]; then + arch_chroot "mkdir ${UEFI_MOUNT}/EFI/boot" 2>/tmp/.errlog + arch_chroot "cp -r ${UEFI_MOUNT}/EFI/arch_grub/grubx64.efi ${UEFI_MOUNT}/EFI/boot/bootx64.efi" 2>>/tmp/.errlog + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstUefiBtTitle " --infobox "\nGrub $_SetDefDoneBody" 0 0 + sleep 2 + fi + ;; + "systemd-boot") + arch_chroot "bootctl --path=${UEFI_MOUNT} install" 2>/tmp/.errlog + check_for_error + + # Deal with LVM Root + [[ $(echo $ROOT_PART | grep "/dev/mapper/") != "" ]] && bl_root=$ROOT_PART \ + || bl_root=$"PARTUUID="$(blkid -s PARTUUID ${ROOT_PART} | sed 's/.*=//g' | sed 's/"//g') + + # Create default config files. First the loader + echo -e "default arch\ntimeout 10" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf 2>/tmp/.errlog + + # Second, the kernel conf files + [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && echo -e "title\tManjaro Linux\nlinux\t/vmlinuz-linux\ninitrd\t/initramfs-linux.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && echo -e "title\tManjaro Linux LTS\nlinux\t/vmlinuz-linux-lts\ninitrd\t/initramfs-linux-lts.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-lts.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && echo -e "title\tManjaro Linux Grsec\nlinux\t/vmlinuz-linux-grsec\ninitrd\t/initramfs-linux-grsec.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-grsec.conf + [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && echo -e "title\tManjaro Linux Zen\nlinux\t/vmlinuz-linux-zen\ninitrd\t/initramfs-linux-zen.img\noptions\troot=${bl_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch-zen.conf + + # Finally, amend kernel conf files for LUKS and BTRFS + sysdconf=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/arch*.conf) + for i in ${sysdconf}; do + [[ $LUKS_DEV != "" ]] && sed -i "s~rw~$LUKS_DEV rw~g" ${i} + done + ;; + *) install_base_menu + ;; + esac + fi + +} + # # + # Bootloader function begins here # + # # + check_mount + # Set the default PATH variable + arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog + check_for_error + + if [[ $SYSTEM == "BIOS" ]]; then + bios_bootloader + else + uefi_bootloader + fi +} + +# +install_network_menu() { + +# ntp not exactly wireless, but this menu is the best fit. +install_wireless_packages(){ + + WIRELESS_PACKAGES="" + wireless_pkgs="dialog iw rp-pppoe wireless_tools wpa_actiond" + + for i in ${wireless_pkgs}; do + WIRELESS_PACKAGES="${WIRELESS_PACKAGES} ${i} - on" + done + + # If no wireless, uncheck wireless pkgs + [[ $(lspci | grep -i "Network Controller") == "" ]] && WIRELESS_PACKAGES=$(echo $WIRELESS_PACKAGES | sed "s/ on/ off/g") + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuPkg " --checklist "$_InstNMMenuPkgBody\n\n$_UseSpaceBar" 0 0 13 \ + $WIRELESS_PACKAGES \ + "ufw" "-" off \ + "gufw" "-" off \ + "ntp" "-" off \ + "b43-fwcutter" "Broadcom 802.11b/g/n" off \ + "bluez-firmware" "Broadcom BCM203x / STLC2300 Bluetooth" off \ + "ipw2100-fw" "Intel PRO/Wireless 2100" off \ + "ipw2200-fw" "Intel PRO/Wireless 2200" off \ + "zd1211-firmware" "ZyDAS ZD1211(b) 802.11a/b/g USB WLAN" off 2>${PACKAGES} + + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + +} + +install_cups(){ + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --checklist "$_InstCupsBody\n\n$_UseSpaceBar" 0 0 11 \ + "cups" "-" on \ + "cups-pdf" "-" off \ + "ghostscript" "-" on \ + "gsfonts" "-" on \ + "samba" "-" off 2>${PACKAGES} + + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + if [[ $(cat ${PACKAGES} | grep "cups") != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --yesno "$_InstCupsQ" 0 0 + if [[ $? -eq 0 ]]; then + # Add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. + if [[ -e /tmp/.openrc ]]; then + #statements + arch_chroot "rc-update add cupsd" 2>/tmp/.errlog + else + arch_chroot "systemctl enable org.cups.cupsd.service" 2>/tmp/.errlog + fi + check_for_error + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuCups " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + fi + fi + fi + +} + + if [[ $SUB_MENU != "install_network_packages" ]]; then + SUB_MENU="install_network_packages" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMMenuTitle " --menu "$_InstNMMenuBody" 0 0 5 \ + "1" "$_SeeWirelessDev" \ + "2" "$_InstNMMenuPkg" \ + "3" "$_InstNMMenuNM" \ + "4" "$_InstNMMenuCups" \ + "5" "$_Back" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "1") # Identify the Wireless Device + lspci -k | grep -i -A 2 "network controller" > /tmp/.wireless + if [[ $(cat /tmp/.wireless) != "" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WirelessShowTitle " --textbox /tmp/.wireless 0 0 + else + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WirelessShowTitle " --msgbox "$_WirelessErrBody" 7 30 + fi + ;; + "2") install_wireless_packages + ;; + "3") install_nm + ;; + "4") install_cups + ;; + *) main_menu_online + ;; + esac + + install_network_menu + +} + +# Install xorg and input drivers. Also copy the xkbmap configuration file created earlier to the installed system +install_xorg_input() { + + echo "" > ${PACKAGES} + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstGrMenuDS " --checklist "$_InstGrMenuDSBody\n\n$_UseSpaceBar" 0 0 12 \ + "wayland" "-" off \ + "xorg-server" "-" on \ + "xorg-server-common" "-" off \ + "xorg-server-utils" "-" on \ + "xorg-xinit" "-" on \ + "xorg-server-xwayland" "-" off \ + "xf86-input-evdev" "-" off \ + "xf86-input-keyboard" "-" on \ + "xf86-input-libinput" "-" on \ + "xf86-input-mouse" "-" on \ + "xf86-input-synaptics" "-" off 2>${PACKAGES} + + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + + # now copy across .xinitrc for all user accounts + user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") + for i in ${user_list}; do + [[ -e ${MOUNTPOINT}/home/$i/.xinitrc ]] || cp -f ${MOUNTPOINT}/etc/X11/xinit/xinitrc ${MOUNTPOINT}/home/$i/.xinitrc + arch_chroot "chown -R ${i}:users /home/${i}" + done + + install_graphics_menu +} + +setup_graphics_card() { + +# Save repetition +install_intel(){ + + #basestrap ${MOUNTPOINT} xf86-video-intel libva-intel-driver intel-ucode 2>/tmp/.errlog + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + check_for_error + sed -i 's/MODULES=""/MODULES="i915"/' ${MOUNTPOINT}/etc/mkinitcpio.conf + + # Intel microcode (Grub, Syslinux and systemd-boot). + # Done as seperate if statements in case of multiple bootloaders. + if [[ -e ${MOUNTPOINT}/boot/grub/grub.cfg ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " grub-mkconfig " --infobox "$_PlsWaitBody" 0 0 + sleep 1 + arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog + fi + # Syslinux + [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && sed -i "s/INITRD /&..\/intel-ucode.img,/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg + + # Systemd-boot + if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then + update=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) + for i in ${upgate}; do + sed -i '/linux \//a initrd \/intel-ucode.img' ${i} + done + fi + +} + +# Save repetition +install_ati(){ + # basestrap ${MOUNTPOINT} xf86-video-ati 2>/tmp/.errlog + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + check_for_error + sed -i 's/MODULES=""/MODULES="radeon"/' ${MOUNTPOINT}/etc/mkinitcpio.conf +} + +# Main menu. Correct option for graphics card should be automatically highlighted. + NVIDIA="" + VB_MOD="" + GRAPHIC_CARD="" + INTEGRATED_GC="N/A" + GRAPHIC_CARD=$(lspci | grep -i "vga" | sed 's/.*://' | sed 's/(.*//' | sed 's/^[ \t]*//') + + # Highlight menu entry depending on GC detected. Extra work is needed for NVIDIA + if [[ $(echo $GRAPHIC_CARD | grep -i "nvidia") != "" ]]; then + # If NVIDIA, first need to know the integrated GC + [[ $(lscpu | grep -i "intel\|lenovo") != "" ]] && INTEGRATED_GC="Intel" || INTEGRATED_GC="ATI" + + # Second, identity the NVIDIA card and driver / menu entry + if [[ $(dmesg | grep -i 'chipset' | grep -i 'nvc\|nvd\|nve') != "" ]]; then HIGHLIGHT_SUB_GC=4 + elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nva\|nv5\|nv8\|nv9') != "" ]]; then HIGHLIGHT_SUB_GC=5 + elif [[ $(dmesg | grep -i 'chipset' | grep -i 'nv4\|nv6') != "" ]]; then HIGHLIGHT_SUB_GC=6 + else HIGHLIGHT_SUB_GC=3 + fi + + # All non-NVIDIA cards / virtualisation + elif [[ $(echo $GRAPHIC_CARD | grep -i 'intel\|lenovo') != "" ]]; then HIGHLIGHT_SUB_GC=2 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'ati') != "" ]]; then HIGHLIGHT_SUB_GC=1 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'via') != "" ]]; then HIGHLIGHT_SUB_GC=7 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'virtualbox') != "" ]]; then HIGHLIGHT_SUB_GC=9 + elif [[ $(echo $GRAPHIC_CARD | grep -i 'vmware') != "" ]]; then HIGHLIGHT_SUB_GC=8 + else HIGHLIGHT_SUB_GC=9 + fi + + dialog --default-item ${HIGHLIGHT_SUB_GC} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_GCtitle " \ + --menu "$GRAPHIC_CARD\n" 0 0 10 \ + "1" $"xf86-video-ati" \ + "2" $"xf86-video-intel" \ + "3" $"xf86-video-nouveau (+ $INTEGRATED_GC)" \ + "4" $"Nvidia (+ $INTEGRATED_GC)" \ + "5" $"Nvidia-340xx (+ $INTEGRATED_GC)" \ + "6" $"Nvidia-304xx (+ $INTEGRATED_GC)" \ + "7" $"xf86-video-openchrome" \ + "8" $"xf86-video-vmware" \ + "9" "$_GCUnknOpt / xf86-video-fbdev" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "1") # ATI/AMD + install_ati + ;; + "2") # Intel + install_intel + ;; + "3") # Nouveau / NVIDIA + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + sed -i 's/MODULES=""/MODULES="nouveau"/' ${MOUNTPOINT}/etc/mkinitcpio.conf + ;; + "4") # NVIDIA-GF + arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + NVIDIA_INST=1 + ;; + "5") # NVIDIA-340 + + arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + NVIDIA_INST=1 + ;; + "6") # NVIDIA-304 + arch_chroot "mhwd -a pci nonfree 0300" 2>/tmp/.errlog + NVIDIA_INST=1 + ;; + "7") # Via + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + #basestrap ${MOUNTPOINT} xf86-video-openchrome 2>/tmp/.errlog + ;; + # "8") # VirtualBox + + # # Set VB headers to install depending on installed kernel(s) + # [[ -e ${MOUNTPOINT}/boot/initramfs-linux.img ]] && VB_MOD="linux-headers" + # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-grsec.img ]] && VB_MOD="$VB_MOD linux-grsec-headers" + # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-zen.img ]] && VB_MOD="$VB_MOD linux-zen-headers" + # [[ -e ${MOUNTPOINT}/boot/initramfs-linux-lts.img ]] && VB_MOD="$VB_MOD linux-lts-headers" + + # dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_VBoxInstTitle" --msgbox "$_VBoxInstBody" 0 0 + # clear + + # basestrap ${MOUNTPOINT} virtualbox-guest-utils virtualbox-guest-dkms $VB_MOD 2>/tmp/.errlog + # umount -l /mnt/dev + + # # Load modules and enable vboxservice. + # arch_chroot "modprobe -a vboxguest vboxsf vboxvideo" + # # add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. + # arch_chroot "systemctl enable vboxservice" + # echo -e "vboxguest\nvboxsf\nvboxvideo" > ${MOUNTPOINT}/etc/modules-load.d/virtualbox.conf + # ;; + "8") # VMWare + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + #basestrap ${MOUNTPOINT} xf86-video-vmware xf86-input-vmmouse 2>/tmp/.errlog + ;; + "9") # Generic / Unknown + #basestrap ${MOUNTPOINT} xf86-video-fbdev 2>/tmp/.errlog + arch_chroot "mhwd -a pci free 0300" 2>/tmp/.errlog + ;; + *) install_graphics_menu + ;; + esac + check_for_error + + # Create a basic xorg configuration file for NVIDIA proprietary drivers where installed + # if that file does not already exist. + if [[ $NVIDIA_INST == 1 ]] && [[ ! -e ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf ]]; then + echo "Section "\"Device"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " Identifier "\"Nvidia Card"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " Driver "\"nvidia"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " VendorName "\"NVIDIA Corporation"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " Option "\"NoLogo"\" "\"true"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " #Option "\"UseEDID"\" "\"false"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " #Option "\"ConnectedMonitor"\" "\"DFP"\"" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo " # ..." >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + echo "EndSection" >> ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + fi + + # Where NVIDIA has been installed allow user to check and amend the file + if [[ $NVIDIA_INST == 1 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_NvidiaConfTitle " --msgbox "$_NvidiaConfBody" 0 0 + nano ${MOUNTPOINT}/etc/X11/xorg.conf.d/20-nvidia.conf + fi + + install_graphics_menu + +} +install_de_wm() { + + # Only show this information box once + if [[ $SHOW_ONCE -eq 0 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --msgbox "$_DEInfoBody" 0 0 + SHOW_ONCE=1 + fi + + # DE/WM Menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --checklist "$_InstDEBody $_UseSpaceBar" 0 0 12 \ + "budgie-desktop" "-" off \ + "cinnamon" "-" off \ + "deepin" "-" off \ + "deepin-extra" "-" off \ + "enlightenment + terminology" "-" off \ + "gnome-shell" "-" off \ + "gnome" "-" off \ + "gnome-extra" "-" off \ + "plasma-desktop" "-" off \ + "plasma" "-" off \ + "kde-applications" "-" off \ + "lxde" "-" off \ + "lxqt + oxygen-icons" "-" off \ + "mate" "-" off \ + "mate-extra" "-" off \ + "mate-gtk3" "-" off \ + "mate-extra-gtk3" "-" off \ + "xfce4" "-" off \ + "xfce4-goodies" "-" off \ + "awesome + vicious" "-" off \ + "fluxbox + fbnews" "-" off \ + "i3-wm + i3lock + i3status" "-" off \ + "icewm + icewm-themes" "-" off \ + "openbox + openbox-themes" "-" off \ + "pekwm + pekwm-themes" "-" off \ + "windowmaker" "-" off 2>${PACKAGES} + + # If something has been selected, install + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + sed -i 's/+\|\"//g' ${PACKAGES} + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + + + # Clear the packages file for installation of "common" packages + echo "" > ${PACKAGES} + + # Offer to install various "common" packages. + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstComTitle " --checklist "$_InstComBody $_UseSpaceBar" 0 50 14 \ + "bash-completion" "-" on \ + "gamin" "-" on \ + "gksu" "-" on \ + "gnome-icon-theme" "-" on \ + "gnome-keyring" "-" on \ + "gvfs" "-" on \ + "gvfs-afc" "-" on \ + "gvfs-smb" "-" on \ + "polkit" "-" on \ + "poppler" "-" on \ + "python2-xdg" "-" on \ + "ntfs-3g" "-" on \ + "ttf-dejavu" "-" on \ + "xdg-user-dirs" "-" on \ + "xdg-utils" "-" on \ + "xterm" "-" on 2>${PACKAGES} + + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + + fi + +} + +install_manjaro_de_wm() { + + # Only show this information box once + if [[ $SHOW_ONCE -eq 0 ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --msgbox "This installs a package list and a desktop-settings package that correspond to manjaro editions of the same name." 0 0 + SHOW_ONCE=1 + fi + + # download manjaro-tools.-isoprofiles git repo + if [[ -d /tmp/profiles ]]; then + git -C /tmp/profiles pull + else + git clone --depth 1 https://github.com/manjaro/iso-profiles.git /tmp/profiles + fi + + # Clear packages after installing base + echo "" > /tmp/.desktop + # DE/WM Menu + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstDETitle " --radiolist "$_InstDEBody $_UseSpaceBar" 0 0 12 \ + "xfce" "-" off \ + "kde" "-" off \ + "budgie" "-" off \ + "cinnamon" "-" off \ + "deepin" "-" off \ + "gnome" "-" off \ + "mate" "-" off \ + "lxqt" "-" off \ + "i3" "-" off \ + "bspwm" "-" off 2> /tmp/.desktop + + # If something has been selected, install + if [[ $(cat /tmp/.desktop) != "" ]]; then + # Get packages to install from manjaro isoprofiles files, + # remove openrc and kernel specific stuff and unnecesary characters + case $(cat /tmp/.desktop) in + xfce) + target_desktop="/tmp/profiles/manjaro/xfce/Packages-Desktop" + overlay="/tmp/profiles/manjaro/xfce/desktop-overlay/" + profile="/tmp/profiles/manjaro/xfce/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + kde) + target_desktop="/tmp/profiles/manjaro/kde/Packages-Desktop" + overlay="/tmp/profiles/manjaro/kde/desktop-overlay/" + profile="/tmp/profiles/manjaro/kde/profile.conf" + echo "sddm" > /tmp/.display-manager + ;; + deepin) + target_desktop="/tmp/profiles/community/deepin/Packages-Desktop" + overlay="/tmp/profiles/community/deepin/desktop-overlay/" + profile="/tmp/profiles/community/deepin/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + gnome) + target_desktop="/tmp/profiles/manjaro/gnome/Packages-Desktop" + overlay="/tmp/profiles/manjaro/gnome/desktop-overlay/" + profile="/tmp/profiles/manjaro/gnome/profile.conf" + echo "gdm" > /tmp/.display-manager + ;; + lxqt) + target_desktop="/tmp/profiles/manjaro/lxqt/Packages-Desktop" + overlay="/tmp/profiles/manjaro/lxqt/desktop-overlay/" + profile="/tmp/profiles/manjaro/lxqt/profile.conf" + echo "sddm" > /tmp/.display-manager + ;; + i3) + target_desktop="/tmp/profiles/community/i3/Packages-Desktop" + overlay="/tmp/profiles/community/i3/desktop-overlay/" + profile="/tmp/profiles/community/i3/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + bspwm) + target_desktop="/tmp/profiles/community/bspwm/Packages-Desktop" + overlay="/tmp/profiles/community/bspwm/desktop-overlay/" + profile="/tmp/profiles/community/bspwm/profile.conf" + echo "" > /tmp/.display-manager + ;; + budgie) + target_desktop="/tmp/profiles/community/budgie/Packages-Desktop" + overlay="/tmp/profiles/community/budgie/desktop-overlay/" + profile="/tmp/profiles/community/budgie/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + cinnamon) + target_desktop="/tmp/profiles/community/cinnamon/Packages-Desktop" + overlay="/tmp/profiles/community/cinnamon/desktop-overlay/" + profile="/tmp/profiles/community/cinnamon/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + mate) + target_desktop="/tmp/profiles/community/mate/Packages-Desktop" + overlay="/tmp/profiles/community/mate/desktop-overlay/" + profile="/tmp/profiles/community/mate/profile.conf" + echo "lightdm" > /tmp/.display-manager + ;; + esac + + # Parse package list based on user input and remove parts that don't belong to pacman + cat /tmp/profiles/shared/Packages-Root "$target_desktop" > /tmp/.edition + if [[ -e /tmp/.openrc ]]; then + # Remove any packages tagged with >systemd and remove >openrc tags + sed -i '/>systemd/d' /tmp/.edition + sed -i 's/>openrc //g' /tmp/.edition + else + # Remove any packages tagged with >openrc and remove >systemd tags + sed -i '/>openrc/d' /tmp/.edition + sed -i 's/>systemd //g' /tmp/.edition + fi + + if [[ "$(uname -m)" == "x86_64" ]]; then + # Remove any packages tagged with >i686 and remove >x86_64 tags + sed -i '/>i686/d' /tmp/.edition + sed -i 's/>x86_64 //g' /tmp/.edition + else + # Remove any packages tagged with >x86_64 and remove >i686 tags + sed -i '/>x86_64/d' /tmp/.edition + sed -i 's/>i686 //g' /tmp/.edition + fi + # If multilib repo is enabled, install multilib packages + if grep -q "^[multilib]" ${MOUNTPOINT}/etc/pacman.conf ; then + # Remove >multilib tags + sed -i 's/>multilib //g' /tmp/.edition + else + # Remove lines with >multilib tag + sed -i '/>multilib/d' /tmp/.edition + fi + # Remove commented lines + # remove everything except the first word of every lines + sed -i 's/\s.*$//' /tmp/.edition + # Remove lines with # + sed -i '/#/d' /tmp/.edition + # remove KERNEL variable + sed -i '/KERNEL/d' /tmp/.edition + # Remove empty lines + sed -i '/^\s*$/d' /tmp/.edition + # Remove base-devel and base packages. Base is already installed and base-devel should be decided by the user + pacman -Qgq base-devel base > /tmp/.notincluded + pacman -Sgq openrc-base >> /tmp/.notincluded + grep -v -f /tmp/.notincluded /tmp/.edition | grep -v "base-devel" > /tmp/.tmp + mv /tmp/.tmp /tmp/.edition + # basestrap the parsed package list to the new root + basestrap ${MOUNTPOINT} $(cat /tmp/.edition /usr/share/aif/package-lists/input-drivers | sort | uniq) 2>/tmp/.errlog + check_for_error + + # copy the profile overlay to the new root + echo "Copying overlay files to the new root" + cp -r "$overlay"* ${MOUNTPOINT} 2>/tmp/.errlog + check_for_error + # Enable services in the chosen profile + echo "Enabling services" + if [[ -e /tmp/.openrc ]]; then + eval $(grep -e "enable_openrc=" $profile | sed 's/# //g') + echo "${enable_openrc[@]}" > /tmp/.services + for service in "${enable_openrc[@]}" ; do + arch_chroot "rc-update add $service" 2>/tmp/.errlog + check_for_error + done + # enable display manager for openrc + if [[ "$(cat /tmp/.display-manager)" == sddm ]]; then + sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"sddm\"/g" /mnt/etc/conf.d/xdm + arch_chroot "rc-update add xdm default" 2>/tmp/.errlog + check_for_error + elif [[ "$(cat /tmp/.display-manager)" == lightdm ]]; then + set_lightdm_greeter + sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"lightdm\"/g" /mnt/etc/conf.d/xdm + arch_chroot "rc-update add xdm default" 2>/tmp/.errlog + check_for_error + else + echo "no display manager was installed" + sleep 2 + fi + else + eval $(grep -e "enable_systemd=" $profile | sed 's/# //g') + echo "${enable_systemd[@]}" > /tmp/.services + for service in "${enable_systemd[@]}" ; do + arch_chroot "systemctl enable $service && echo "enabled $service" || echo "failed to enable $service"" 2>/tmp/.errlog + check_for_error + done + arch_chroot "systemctl disable pacman-init" 2>/tmp/.errlog + check_for_error + # enable display manager for systemd + if [[ "$(cat /tmp/.display-manager)" == lightdm ]]; then + set_lightdm_greeter + arch_chroot "systemctl enable lightdm" 2>/tmp/.errlog + check_for_error + elif [[ "$(cat /tmp/.display-manager)" == sddm ]]; then + arch_chroot "systemctl enable sddm" 2>/tmp/.errlog + check_for_error + elif [[ "$(cat /tmp/.display-manager)" == gdm ]]; then + arch_chroot "systemctl enable gdm" 2>/tmp/.errlog + check_for_error + else + echo "no display manager was installed" + sleep 2 + fi + fi + # Clear the packages file for installation of "common" packages + echo "" > ${PACKAGES} + + # Offer to install various "common" packages. + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstComTitle " --checklist "$_InstComBody $_UseSpaceBar" 0 50 13 \ + "manjaro-settings-manager" "-" off \ + "pamac" "-" off \ + "octopi" "-" off \ + "pacli" "-" off \ + "fish" "-" off \ + "fisherman" "-" off \ + "zsh-completions" "-" on \ + "mhwd-chroot" "-" off \ + "bmenu" "-" on \ + "clonezilla" "-" off \ + "manjaro-tools-iso" "-" off \ + "manjaro-tools-base" "-" off \ + "manjaro-tools-pkg" "-" off 2>${PACKAGES} + + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + clear + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + + fi + +} + +# Display Manager +install_dm() { + +# Save repetition of code +enable_dm() { + if [[ -e /tmp/.openrc ]]; then + sed -i "s/$(grep "DISPLAYMANAGER=" /mnt/etc/conf.d/xdm)/DISPLAYMANAGER=\"$(cat ${PACKAGES})\"/g" /mnt/etc/conf.d/xdm + arch_chroot "rc-update add xdm default" 2>/tmp/.errlog + check_for_error + DM=$(cat ${PACKAGES}) + DM_ENABLED=1 + else + # enable display manager for systemd + arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog + check_for_error + DM=$(cat ${PACKAGES}) + DM_ENABLED=1 + fi +} + + if [[ $DM_ENABLED -eq 0 ]]; then + # Prep variables + echo "" > ${PACKAGES} + dm_list="gdm lxdm lightdm sddm" + DM_LIST="" + DM_INST="" + + # Generate list of DMs installed with DEs, and a list for selection menu + for i in ${dm_list}; do + [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && DM_INST="${DM_INST} ${i}" + DM_LIST="${DM_LIST} ${i} -" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --menu "$_AlreadyInst$DM_INST\n\n$_DmChBody" 0 0 4 \ + ${DM_LIST} 2>${PACKAGES} + clear + + # If a selection has been made, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + + # check if selected dm already installed. If so, enable and break loop. + for i in ${DM_INST}; do + if [[ $(cat ${PACKAGES}) == ${i} ]]; then + enable_dm + break; + fi + done + + # If no match found, install and enable DM + if [[ $DM_ENABLED -eq 0 ]]; then + + # Where lightdm selected, add gtk greeter package + sed -i 's/lightdm/lightdm lightdm-gtk-greeter/' ${PACKAGES} + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + + # Where lightdm selected, now remove the greeter package + sed -i 's/lightdm-gtk-greeter//' ${PACKAGES} + enable_dm + fi + fi + fi + + # Show after successfully installing or where attempting to repeat when already completed. + [[ $DM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_DmChTitle " --msgbox "$_DmDoneBody" 0 0 + +} + +# Network Manager +install_nm() { + +# Save repetition of code +enable_nm() { + # Add openrc support. If openrcbase was installed, the file /tmp/.openrc should exist. + if [[ $(cat ${PACKAGES}) == "NetworkManager" ]]; then + arch_chroot "systemctl enable NetworkManager.service && systemctl enable NetworkManager-dispatcher.service" >/tmp/.symlink 2>/tmp/.errlog + else + arch_chroot "systemctl enable $(cat ${PACKAGES})" 2>/tmp/.errlog + fi + + check_for_error + NM_ENABLED=1 +} + + if [[ $NM_ENABLED -eq 0 ]]; then + # Prep variables + echo "" > ${PACKAGES} + nm_list="connman CLI dhcpcd CLI netctl CLI NetworkManager GUI wicd GUI" + NM_LIST="" + NM_INST="" + + # Generate list of DMs installed with DEs, and a list for selection menu + for i in ${nm_list}; do + [[ -e ${MOUNTPOINT}/usr/bin/${i} ]] && NM_INST="${NM_INST} ${i}" + NM_LIST="${NM_LIST} ${i}" + done + + # Remove netctl from selectable list as it is a PITA to configure via arch_chroot + NM_LIST=$(echo $NM_LIST | sed "s/netctl CLI//") + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --menu "$_AlreadyInst $NM_INST\n$_InstNMBody" 0 0 4 \ + ${NM_LIST} 2> ${PACKAGES} + clear + + # If a selection has been made, act + if [[ $(cat ${PACKAGES}) != "" ]]; then + + # check if selected nm already installed. If so, enable and break loop. + for i in ${NM_INST}; do + [[ $(cat ${PACKAGES}) == ${i} ]] && enable_nm && break + done + + # If no match found, install and enable NM + if [[ $NM_ENABLED -eq 0 ]]; then + + # Where networkmanager selected, add network-manager-applet + sed -i 's/NetworkManager/networkmanager network-manager-applet/g' ${PACKAGES} + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + + # Where networkmanager selected, now remove network-manager-applet + sed -i 's/networkmanager network-manager-applet/NetworkManager/g' ${PACKAGES} + enable_nm + fi + fi + fi + + # Show after successfully installing or where attempting to repeat when already completed. + [[ $NM_ENABLED -eq 1 ]] && dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstNMTitle " --msgbox "$_InstNMErrBody" 0 0 + + +} + +install_multimedia_menu(){ + +install_alsa_pulse(){ + # Prep Variables + echo "" > ${PACKAGES} + ALSA="" + PULSE_EXTRA="" + alsa=$(pacman -Ss alsa | awk '{print $1}' | grep "/alsa-" | sed "s/extra\///g" | sort -u) + pulse_extra=$(pacman -Ss pulseaudio- | awk '{print $1}' | sed "s/extra\///g" | grep "pulseaudio-" | sort -u) + + for i in ${alsa}; do + ALSA="${ALSA} ${i} - off" + done + + ALSA=$(echo $ALSA | sed "s/alsa-utils - off/alsa-utils - on/g" | sed "s/alsa-plugins - off/alsa-plugins - on/g") + + for i in ${pulse_extra}; do + PULSE_EXTRA="${PULSE_EXTRA} ${i} - off" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulSnd " --checklist "$_InstMulSndBody\n\n$_UseSpaceBar" 0 0 14 \ + $ALSA "pulseaudio" "-" off $PULSE_EXTRA \ + "paprefs" "pulseaudio GUI" off \ + "pavucontrol" "pulseaudio GUI" off \ + "ponymix" "pulseaudio CLI" off \ + "volumeicon" "ALSA GUI" off \ + "volwheel" "ASLA GUI" off 2>${PACKAGES} + + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + +} + +install_codecs(){ + + # Prep Variables + echo "" > ${PACKAGES} + GSTREAMER="" + gstreamer=$(pacman -Ss gstreamer | awk '{print $1}' | grep "/gstreamer" | sed "s/extra\///g" | sed "s/community\///g" | sort -u) + echo $gstreamer + for i in ${gstreamer}; do + GSTREAMER="${GSTREAMER} ${i} - off" + done + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCodec " --checklist "$_InstMulCodBody$_UseSpaceBar" 0 0 14 \ + $GSTREAMER "xine-lib" "-" off 2>${PACKAGES} + + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + +} + +install_cust_pkgs(){ + echo "" > ${PACKAGES} + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMulCust " --inputbox "$_InstMulCustBody" 0 0 "" 2>${PACKAGES} || install_multimedia_menu + + clear + # If at least one package, install. + if [[ $(cat ${PACKAGES}) != "" ]]; then + if [[ $(cat ${PACKAGES}) == "hen poem" ]]; then + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " \"My Sweet Buckies\" by Atiya & Carl " --msgbox "\nMy Sweet Buckies,\nYou are the sweetest Buckies that ever did \"buck\",\nLily, Rosie, Trumpet, and Flute,\nMy love for you all is absolute!\n\nThey buck: \"We love our treats, we are the Booyakka sisters,\"\n\"Sometimes we squabble and give each other comb-twisters,\"\n\"And in our garden we love to sunbathe, forage, hop and jump,\"\n\"We love our freedom far, far away from that factory farm dump,\"\n\n\"For so long we were trapped in cramped prisons full of disease,\"\n\"No sunlight, no fresh air, no one who cared for even our basic needs,\"\n\"We suffered in fear, pain, and misery for such a long time,\"\n\"But now we are so happy, we wanted to tell you in this rhyme!\"\n\n" 0 0 + else + basestrap ${MOUNTPOINT} $(cat ${PACKAGES}) 2>/tmp/.errlog + check_for_error + fi + fi + +} + + if [[ $SUB_MENU != "install_multimedia_menu" ]]; then + SUB_MENU="install_multimedia_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstMultMenuTitle " --menu "$_InstMultMenuBody" 0 0 5 \ + "1" "$_InstMulSnd" \ + "2" "$_InstMulCodec" \ + "3" "$_InstMulAcc" \ + "4" "$_InstMulCust" \ + "5" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") install_alsa_pulse + ;; + "2") install_codecs + ;; + "3") install_acc_menu + ;; + "4") install_cust_pkgs + ;; + *) main_menu_online + ;; + esac + + install_multimedia_menu +} + +security_menu(){ + + if [[ $SUB_MENU != "security_menu" ]]; then + SUB_MENU="security_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 4 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecMenuTitle " --menu "$_SecMenuBody" 0 0 4 \ + "1" "$_SecJournTitle" \ + "2" "$_SecCoreTitle" \ + "3" "$_SecKernTitle" \ + "4" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") # systemd-journald + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --menu "$_SecJournBody" 0 0 7 \ + "$_Edit" "/etc/systemd/journald.conf" \ + "10M" "SystemMaxUse=10M" \ + "20M" "SystemMaxUse=20M" \ + "50M" "SystemMaxUse=50M" \ + "100M" "SystemMaxUse=100M" \ + "200M" "SystemMaxUse=200M" \ + "$_Disable" "Storage=none" 2>${ANSWER} + + if [[ $(cat ${ANSWER}) != "" ]]; then + if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then + sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/journald.conf + sed -i "s/SystemMaxUse.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then + nano ${MOUNTPOINT}/etc/systemd/journald.conf + else + sed -i "s/#SystemMaxUse.*\|SystemMaxUse.*/SystemMaxUse=$(cat ${ANSWER})/g" ${MOUNTPOINT}/etc/systemd/journald.conf + sed -i "s/Storage.*/#&/g" ${MOUNTPOINT}/etc/systemd/journald.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecJournTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + fi + fi + ;; + "2") # core dump + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --menu "$_SecCoreBody" 0 0 2 \ + "$_Disable" "Storage=none" "$_Edit" "/etc/systemd/coredump.conf" 2>${ANSWER} + + if [[ $(cat ${ANSWER}) == "$_Disable" ]]; then + sed -i "s/#Storage.*\|Storage.*/Storage=none/g" ${MOUNTPOINT}/etc/systemd/coredump.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecCoreTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 + elif [[ $(cat ${ANSWER}) == "$_Edit" ]]; then + nano ${MOUNTPOINT}/etc/systemd/coredump.conf + fi + ;; + "3") # Kernel log access + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --menu "\nKernel logs may contain information an attacker can use to identify and exploit kernel vulnerabilities, including sensitive memory addresses.\n\nIf systemd-journald logging has not been disabled, it is possible to create a rule in /etc/sysctl.d/ to disable access to these logs unless using root privilages (e.g. via sudo).\n" 0 0 2 \ + "$_Disable" "kernel.dmesg_restrict = 1" "$_Edit" "/etc/systemd/coredump.conf.d/custom.conf" 2>${ANSWER} + + case $(cat ${ANSWER}) in + "$_Disable") echo "kernel.dmesg_restrict = 1" > ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SecKernTitle " --infobox "\n$_Done!\n\n" 0 0 + sleep 2 ;; + "$_Edit") [[ -e ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf ]] && nano ${MOUNTPOINT}/etc/sysctl.d/50-dmesg-restrict.conf \ + || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SeeConfErrTitle " --msgbox "$_SeeConfErrBody1" 0 0 ;; + esac + ;; + *) main_menu_online + ;; + esac + + security_menu +} + +###################################################################### +## ## +## Main Interfaces ## +## ## +###################################################################### + +# Greet the user when first starting the installer +greeting() { + +dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_WelTitle $VERSION " --msgbox "$_WelBody" 0 0 + +} + +# Preparation +prep_menu() { + + if [[ $SUB_MENU != "prep_menu" ]]; then + SUB_MENU="prep_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 7 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_PrepMenuTitle " --menu "$_PrepMenuBody" 0 0 7 \ + "1" "$_VCKeymapTitle" \ + "2" "$_DevShowOpt" \ + "3" "$_PrepPartDisk" \ + "4" "$_PrepLUKS" \ + "5" "$_PrepLVM $_PrepLVM2" \ + "6" "$_PrepMntPart" \ + "7" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") set_keymap + ;; + "2") show_devices + ;; + "3") umount_partitions + select_device + create_partitions + ;; + "4") luks_menu + ;; + "5") lvm_menu + ;; + "6") mount_partitions + ;; + *) main_menu_online + ;; + esac + + prep_menu + +} + +# Base Installation +install_base_menu() { + + if [[ $SUB_MENU != "install_base_menu" ]]; then + SUB_MENU="install_base_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 5 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstBsMenuTitle " --menu "$_InstBseMenuBody" 0 0 6 \ + "1" "$_PrepMirror" \ + "2" "$_PrepPacKey" \ + "3" "$_InstBse" \ + "4" "$_InstBootldr" \ + "5" "Install a manjaro desktop" \ + "6" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") configure_mirrorlist + ;; + "2") clear + pacman-key --init + pacman-key --populate archlinux manjaro + pacman-key --refresh-keys + ;; + "3") install_base + ;; + "4") install_bootloader + ;; + "5") install_manjaro_de_wm + ;; + *) main_menu_online + ;; + esac + + install_base_menu +} + +# Base Configuration +config_base_menu() { + + # Set the default PATH variable + arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog + check_for_error + + if [[ $SUB_MENU != "config_base_menu" ]]; then + SUB_MENU="config_base_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 8 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ConfBseMenuTitle " --menu "$_ConfBseBody" 0 0 8 \ + "1" "$_ConfBseFstab" \ + "2" "$_ConfBseHost" \ + "3" "$_ConfBseSysLoc" \ + "4" "$_ConfBseTimeHC" \ + "5" "$_ConfUsrRoot" \ + "6" "$_ConfUsrNew" \ + "7" "$_MMRunMkinit" \ + "8" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") generate_fstab + ;; + "2") set_hostname + ;; + "3") set_locale + ;; + "4") set_timezone + set_hw_clock + ;; + "5") set_root_password + ;; + "6") create_new_user + ;; + "7") run_mkinitcpio + ;; + *) main_menu_online + ;; + esac + + config_base_menu + +} + +install_graphics_menu() { + + if [[ $SUB_MENU != "install_graphics_menu" ]]; then + SUB_MENU="install_graphics_menu" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 6 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstGrMenuTitle " --menu "$_InstGrMenuBody" 0 0 6 \ + "1" "$_InstGrMenuDS" \ + "2" "$_InstGrMenuDD" \ + "3" "$_InstGrMenuGE" \ + "4" "$_InstGrMenuDM" \ + "5" "$_PrepKBLayout" \ + "6" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") install_xorg_input + ;; + "2") setup_graphics_card + ;; + "3") install_de_wm + ;; + "4") install_dm + ;; + "5") set_xkbmap + ;; + *) main_menu_online + ;; + esac + + install_graphics_menu + +} + +# Install Accessibility Applications +install_acc_menu() { + + echo "" > ${PACKAGES} + + dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_InstAccTitle " --checklist "$_InstAccBody" 0 0 15 \ + "accerciser" "-" off \ + "at-spi2-atk" "-" off \ + "at-spi2-core" "-" off \ + "brltty" "-" off \ + "caribou" "-" off \ + "dasher" "-" off \ + "espeak" "-" off \ + "espeakup" "-" off \ + "festival" "-" off \ + "java-access-bridge" "-" off \ + "java-atk-wrapper" "-" off \ + "julius" "-" off \ + "orca" "-" off \ + "qt-at-spi" "-" off \ + "speech-dispatcher" "-" off 2>${PACKAGES} + + clear + # If something has been selected, install + if [[ $(cat ${PACKAGES}) != "" ]]; then + basestrap ${MOUNTPOINT} ${PACKAGES} 2>/tmp/.errlog + check_for_error + fi + + install_multimedia_menu + +} + + +edit_configs() { + + # Clear the file variables + FILE="" + user_list="" + + if [[ $SUB_MENU != "edit configs" ]]; then + SUB_MENU="edit configs" + HIGHLIGHT_SUB=1 + else + if [[ $HIGHLIGHT_SUB != 12 ]]; then + HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 )) + fi + fi + + dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_SeeConfOptTitle " --menu "$_SeeConfOptBody" 0 0 13 \ + "1" "/etc/vconsole.conf" \ + "2" "/etc/locale.conf" \ + "3" "/etc/hostname" \ + "4" "/etc/hosts" \ + "5" "/etc/sudoers" \ + "6" "/etc/mkinitcpio.conf" \ + "7" "/etc/fstab" \ + "8" "/etc/crypttab" \ + "9" "grub/syslinux/systemd-boot" \ + "10" "lxdm/lightdm/sddm" \ + "11" "/etc/pacman.conf" \ + "12" "~/.xinitrc" \ + "13" "$_Back" 2>${ANSWER} + + HIGHLIGHT_SUB=$(cat ${ANSWER}) + case $(cat ${ANSWER}) in + "1") [[ -e ${MOUNTPOINT}/etc/vconsole.conf ]] && FILE="${MOUNTPOINT}/etc/vconsole.conf" + ;; + "2") [[ -e ${MOUNTPOINT}/etc/locale.conf ]] && FILE="${MOUNTPOINT}/etc/locale.conf" + ;; + "3") [[ -e ${MOUNTPOINT}/etc/hostname ]] && FILE="${MOUNTPOINT}/etc/hostname" + ;; + "4") [[ -e ${MOUNTPOINT}/etc/hosts ]] && FILE="${MOUNTPOINT}/etc/hosts" + ;; + "5") [[ -e ${MOUNTPOINT}/etc/sudoers ]] && FILE="${MOUNTPOINT}/etc/sudoers" + ;; + "6") [[ -e ${MOUNTPOINT}/etc/mkinitcpio.conf ]] && FILE="${MOUNTPOINT}/etc/mkinitcpio.conf" + ;; + "7") [[ -e ${MOUNTPOINT}/etc/fstab ]] && FILE="${MOUNTPOINT}/etc/fstab" + ;; + "8") [[ -e ${MOUNTPOINT}/etc/crypttab ]] && FILE="${MOUNTPOINT}/etc/crypttab" + ;; + "9") [[ -e ${MOUNTPOINT}/etc/default/grub ]] && FILE="${MOUNTPOINT}/etc/default/grub" + [[ -e ${MOUNTPOINT}/boot/syslinux/syslinux.cfg ]] && FILE="$FILE ${MOUNTPOINT}/boot/syslinux/syslinux.cfg" + if [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf ]]; then + files=$(ls ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/*.conf) + for i in ${files}; do + FILE="$FILE ${i}" + done + fi + ;; + "10") [[ -e ${MOUNTPOINT}/etc/lxdm/lxdm.conf ]] && FILE="${MOUNTPOINT}/etc/lxdm/lxdm.conf" + [[ -e ${MOUNTPOINT}/etc/lightdm/lightdm.conf ]] && FILE="${MOUNTPOINT}/etc/lightdm/lightdm.conf" + [[ -e ${MOUNTPOINT}/etc/sddm.conf ]] && FILE="${MOUNTPOINT}/etc/sddm.conf" + ;; + "11") [[ -e ${MOUNTPOINT}/etc/pacman.conf ]] && FILE="${MOUNTPOINT}/etc/pacman.conf" + ;; + "12") user_list=$(ls ${MOUNTPOINT}/home/ | sed "s/lost+found//") + for i in ${user_list}; do + [[ -e ${MOUNTPOINT}/home/$i/.xinitrc ]] && FILE="$FILE ${MOUNTPOINT}/home/$i/.xinitrc" + done + ;; + *) main_menu_online + ;; + esac + + [[ $FILE != "" ]] && nano $FILE \ + || dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_ErrTitle " --msgbox "$_SeeConfErrBody" 0 0 + + edit_configs +} + +main_menu_online() { + + if [[ $HIGHLIGHT != 9 ]]; then + HIGHLIGHT=$(( HIGHLIGHT + 1 )) + fi + + dialog --default-item ${HIGHLIGHT} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " $_MMTitle " \ + --menu "$_MMBody" 0 0 9 \ + "1" "$_PrepMenuTitle" \ + "2" "$_InstBsMenuTitle" \ + "3" "$_ConfBseMenuTitle" \ + "4" "$_InstGrMenuTitle" \ + "5" "$_InstNMMenuTitle" \ + "6" "$_InstMultMenuTitle" \ + "7" "$_SecMenuTitle" \ + "8" "$_SeeConfOptTitle" \ + "9" "$_Done" 2>${ANSWER} + + HIGHLIGHT=$(cat ${ANSWER}) + + # Depending on the answer, first check whether partition(s) are mounted and whether base has been installed + if [[ $(cat ${ANSWER}) -eq 2 ]]; then + check_mount + fi + + if [[ $(cat ${ANSWER}) -ge 3 ]] && [[ $(cat ${ANSWER}) -le 8 ]]; then + check_mount + check_base + fi + + case $(cat ${ANSWER}) in + "1") prep_menu + ;; + "2") install_base_menu + ;; + "3") config_base_menu + ;; + "4") install_graphics_menu + ;; + "5") install_network_menu + ;; + "6") install_multimedia_menu + ;; + "7") security_menu + ;; + "8") edit_configs + ;; + *) dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_CloseInstBody" 0 0 + + if [[ $? -eq 0 ]]; then + umount_partitions + [[ -e /tmp/.openrc ]] && rm /tmp/.openrc + clear + exit 0 + else + main_menu_online + fi + + ;; + esac + + main_menu_online + +} + +###################################################################### +## ## +## Execution ## +## ## +###################################################################### +id_system +select_language +check_requirements +greeting + + while true; do + main_menu_online + done