Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
925
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 70.74 KB | None | 0 0
  1. # !/bin/bash
  2. #
  3. # Arch Base Installation Framework (version 1.3 - 08-Oct-2015)
  4. #
  5. # Written by Carl Duff for ArchBang Linux
  6. #
  7. # This program is free software, provided under the GNU General Public License
  8. # as published by the Free Software Foundation. So feel free to copy, distribute,
  9. # or modify it as you wish.
  10. #
  11.  
  12. ######################################################################
  13. ## ##
  14. ## Installer Variables ##
  15. ## ##
  16. ######################################################################
  17.  
  18. # ISO Specific Variables
  19. ISO_HOST="mantos" # ISO Host Name
  20. ISO_USER="live" # Live user account
  21. VERSION="MantOS Installation Framework 1.0" # Installer Name / Version
  22. TRANS_SRC="/abif-master" # Dir where translation files are stored
  23.  
  24. # Create a temporary file to store menu selections
  25. ANSWER="/tmp/.abif"
  26.  
  27. # Installation
  28. BOOTLOADER="n/a" # Which bootloader has been installed?
  29. KEYMAP="us" # Virtual console keymap. Default is "us"
  30. XKBMAP="us" # X11 keyboard layout. Default is "us"
  31. ZONE="" # For time
  32. SUBZONE="" # For time
  33. LOCALE="en_US.UTF-8" # System locale. Default is "en_US.UTF-8"
  34.  
  35. # Architecture
  36. ARCHI=`uname -m` # Display whether 32 or 64 bit system
  37. SYSTEM="Unknown" # Display whether system is BIOS or UEFI. Default is "unknown"
  38. ROOT_PART="" # ROOT partition
  39. UEFI_PART="" # UEFI partition
  40. UEFI_MOUNT="" # UEFI mountpoint
  41. INST_DEV="" # Device where system has been installed
  42. HIGHLIGHT=0 # Highlight items for Main Menu
  43. HIGHLIGHT_SUB=0 # Highlight items for submenus
  44. SUB_MENU="" # Submenu to be highlighted
  45.  
  46. # Logical Volume Management
  47. LVM=0 # Logical Volume Management Detected?
  48. LUKS=0 # Luks Detected?
  49. LVM_ROOT=0 # LVM used for Root?
  50. LVM_SEP_BOOT=0 # 1 = Seperate /boot, 2 = seperate /boot & LVM
  51. LVM_DISABLE=0 # Option to allow user to deactive existing LVM
  52. LVM_VG="" # Name of volume group to create
  53. LVM_VG_MB=0 # MB remaining of VG
  54. LVM_LV_NAME="" # Name of LV to create
  55. LV_SIZE_INVALID=0 # Is LVM LV size entered valid?
  56. VG_SIZE_TYPE="" # Is VG in Gigabytes or Megabytes?
  57.  
  58. # Installation
  59. MOUNTPOINT="/mnt" # Installation
  60. MOUNT_TYPE="" # "/dev/" for standard partitions, "/dev/mapper" for LVM
  61. AIROOTIMG="" # Root image to install
  62. BYPASS="$MOUNTPOINT/bypass/" # Root image mountpoint
  63. BTRFS=0 # BTRFS used? "1" = btrfs alone, "2" = btrfs + subvolume(s)
  64. BTRFS_OPTS="/tmp/.btrfs_opts" #BTRFS Mount options
  65. BTRFS_MNT="" # used for syslinux where /mnt is a btrfs subvolume
  66.  
  67. # Language Support
  68. CURR_LOCALE="en_US.UTF-8" # Default Locale
  69. FONT="" # Set new font if necessary
  70.  
  71. # Edit Files
  72. FILE="" # Which file is to be opened?
  73. FILE2="" # Which second file is to be opened?
  74.  
  75. ######################################################################
  76. ## ##
  77. ## Core Functions ##
  78. ## ##
  79. ######################################################################
  80.  
  81. # Add locale on-the-fly and sets source translation file for installer
  82. select_language() {
  83.  
  84. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Select Language " --menu "\nLanguage / sprache / taal / språk / lingua / idioma / nyelv / língua" 0 0 11 \
  85. "1" $"English (en)" \
  86. "2" $"Italian (it)" \
  87. "3" $"Russian (ru)" \
  88. "4" $"Turkish (tr)" \
  89. "5" $"Dutch (nl)" \
  90. "6" $"Greek (el)" \
  91. "7" $"Danish (da)" \
  92. "8" $"Hungarian (hu)" \
  93. "9" $"Portuguese (pt)" \
  94. "10" $"German (de)" \
  95. "11" $"French (fr)" 2>${ANSWER}
  96.  
  97. case $(cat ${ANSWER}) in
  98. "1") source ${TRANS_SRC}/english.trans
  99. CURR_LOCALE="en_US.UTF-8"
  100. ;;
  101. "2") source ${TRANS_SRC}/italian.trans
  102. CURR_LOCALE="it_IT.UTF-8"
  103. ;;
  104. "3") source ${TRANS_SRC}/russian.trans
  105. CURR_LOCALE="ru_RU.UTF-8"
  106. FONT="LatKaCyrHeb-14.psfu"
  107. ;;
  108. "4") source ${TRANS_SRC}/turkish.trans
  109. CURR_LOCALE="tr_TR.UTF-8"
  110. FONT="LatKaCyrHeb-14.psfu"
  111. ;;
  112. "5") source ${TRANS_SRC}/dutch.trans
  113. CURR_LOCALE="nl_NL.UTF-8"
  114. ;;
  115. "6") source ${TRANS_SRC}/greek.trans
  116. CURR_LOCALE="el_GR.UTF-8"
  117. FONT="iso07u-16.psfu"
  118. ;;
  119. "7") source ${TRANS_SRC}/danish.trans
  120. CURR_LOCALE="da_DK.UTF-8"
  121. ;;
  122. "8") source ${TRANS_SRC}/hungarian.trans
  123. CURR_LOCALE="hu_HU.UTF-8"
  124. FONT="lat2-16.psfu"
  125. ;;
  126. "9") source ${TRANS_SRC}/portuguese.trans
  127. CURR_LOCALE="pt_BR.UTF-8"
  128. ;;
  129. "10") source ${TRANS_SRC}/german.trans
  130. CURR_LOCALE="de_DE.UTF-8"
  131. ;;
  132. "11") source ${TRANS_SRC}/french.trans
  133. CURR_LOCALE="fr_FR.UTF-8"
  134. ;;
  135. *) exit 0
  136. ;;
  137. esac
  138.  
  139. # Generate the chosen locale and set the language
  140. sed -i "s/#${CURR_LOCALE}/${CURR_LOCALE}/" /etc/locale.gen
  141. locale-gen >/dev/null 2>&1
  142. export LANG=${CURR_LOCALE}
  143. }
  144.  
  145. # Check user is root, then id system parameters
  146. check_system() {
  147.  
  148. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ChkTitle" --infobox "$_ChkBody" 0 0
  149. sleep 2
  150.  
  151. # Ensure script is run as root. If not, terminate.
  152. if [[ `whoami` != "root" ]]; then
  153. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_RtFailTitle" --infobox "$_RtFailBody" 0 0
  154. sleep 2
  155. exit 1
  156. fi
  157.  
  158. # Clear error log and detect system
  159. echo "" > /tmp/.errlog
  160.  
  161. # Apple System Detection
  162. if [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Inc.' ]] || [[ "$(cat /sys/class/dmi/id/sys_vendor)" == 'Apple Computer, Inc.' ]]; then
  163. modprobe -r -q efivars || true # if MAC
  164. else
  165. modprobe -q efivarfs # all others
  166. fi
  167.  
  168. # BIOS or UEFI Detection
  169. if [[ -d "/sys/firmware/efi/" ]]; then
  170. # Mount efivarfs if it is not already mounted
  171. if [[ -z $(mount | grep /sys/firmware/efi/efivars) ]]; then
  172. mount -t efivarfs efivarfs /sys/firmware/efi/efivars
  173. fi
  174. SYSTEM="UEFI"
  175. else
  176. SYSTEM="BIOS"
  177. fi
  178.  
  179. # Encryption (LUKS) Detection
  180. [[ $(lsblk -o TYPE | grep "crypt") == "" ]] && LUKS=0 || LUKS=1
  181.  
  182. }
  183.  
  184. # Chroot without terminating the script
  185. arch_chroot() {
  186. arch-chroot $MOUNTPOINT /bin/bash -c "${1}"
  187. }
  188.  
  189. # If there is an error, display it, clear the log and then go back to the main menu.
  190. check_for_error() {
  191.  
  192. if [[ $? -eq 1 ]] && [[ $(cat /tmp/.errlog | grep -i "error") != "" ]]; then
  193. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$(cat /tmp/.errlog)" 0 0
  194. echo "" > /tmp/.errlog
  195. main_menu
  196. fi
  197.  
  198. }
  199.  
  200. # Ensure that a partition is mounted
  201. check_mount() {
  202.  
  203. if [[ $(lsblk -o MOUNTPOINT | grep ${MOUNTPOINT}) == "" ]]; then
  204. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_ErrNoMount" 0 0
  205. main_menu
  206. fi
  207.  
  208. }
  209.  
  210. # Ensure that Arch has been installed
  211. check_base() {
  212.  
  213. if [[ ! -e ${MOUNTPOINT}/etc ]]; then
  214. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ErrTitle" --msgbox "$_ErrNoBase" 0 0
  215. main_menu_online
  216. fi
  217.  
  218. }
  219.  
  220. # Show devices / partitions.
  221. show_devices() {
  222. lsblk -o NAME,MODEL,TYPE,FSTYPE,SIZE,MOUNTPOINT | grep -v "loop" | grep -v "rom" | grep -v "arch_airootfs" > /tmp/.devlist
  223. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevShowTitle" --textbox /tmp/.devlist 0 0
  224. }
  225.  
  226. ######################################################################
  227. ## ##
  228. ## Configuration Functions ##
  229. ## ##
  230. ######################################################################
  231.  
  232. # virtual console keymap
  233. set_keymap() {
  234.  
  235. KEYMAPS=""
  236. for i in $(ls -R /usr/share/kbd/keymaps | grep "map.gz" | sed 's/\.map.gz//g' | sort); do
  237. KEYMAPS="${KEYMAPS} ${i} -"
  238. done
  239.  
  240. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_KeymapTitle" \
  241. --menu "$_KeymapBody" 20 40 16 ${KEYMAPS} 2>${ANSWER} || prep_menu
  242. KEYMAP=$(cat ${ANSWER})
  243. check_for_error
  244. echo -e "KEYMAP=$KEYMAP\nFONT=$FONT" > /tmp/vconsole.conf
  245. }
  246.  
  247. # Set keymap for X11
  248. set_xkbmap() {
  249.  
  250. XKBMAP_LIST=""
  251. keymaps_xkb=("af_Afghani al_Albanian am_Armenian ara_Arabic at_German-Austria az_Azerbaijani ba_Bosnian bd_Bangla be_Belgian bg_Bulgarian br_Portuguese-Brazil bt_Dzongkha bw_Tswana by_Belarusian ca_French-Canada cd_French-DR-Congo ch_German-Switzerland cm_English-Cameroon cn_Chinese cz_Czech de_German dk_Danishee_Estonian epo_Esperanto es_Spanish et_Amharic fo_Faroese fi_Finnish fr_French gb_English-UK ge_Georgian gh_English-Ghana gn_French-Guinea gr_Greek hr_Croatian hu_Hungarian ie_Irish il_Hebrew iq_Iraqi ir_Persian is_Icelandic it_Italian jp_Japanese ke_Swahili-Kenya kg_Kyrgyz kh_Khmer-Cambodia kr_Korean kz_Kazakh la_Lao latam_Spanish-Lat-American lk_Sinhala-phonetic lt_Lithuanian lv_Latvian ma_Arabic-Morocco mao_Maori md_Moldavian me_Montenegrin mk_Macedonian ml_Bambara mm_Burmese mn_Mongolian mt_Maltese mv_Dhivehi ng_English-Nigeria nl_Dutch no_Norwegian np_Nepali ph_Filipino pk_Urdu-Pakistan pl_Polish pt_Portuguese ro_Romanian rs_Serbian ru_Russian se_Swedish si_Slovenian sk_Slovak sn_Wolof sy_Arabic-Syria th_Thai tj_Tajik tm_Turkmen tr_Turkish tw_Taiwanese tz_Swahili-Tanzania ua_Ukrainian us_English-US uz_Uzbek vn_Vietnamese za_English-S-Africa")
  252.  
  253. for i in ${keymaps_xkb}; do
  254. XKBMAP_LIST="${XKBMAP_LIST} ${i} -"
  255. done
  256.  
  257. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_XkbmapTitle" --menu "$_KeymapBody" 0 0 16 ${XKBMAP_LIST} 2>${ANSWER} || prep_menu
  258. XKBMAP=$(cat ${ANSWER} |sed 's/_.*//')
  259. echo -e "Section "\"InputClass"\"\nIdentifier "\"system-keyboard"\"\nMatchIsKeyboard "\"on"\"\nOption "\"XkbLayout"\" "\"${XKBMAP}"\"\nEndSection" > /tmp/01-keyboard-layout.conf
  260. setxkbmap $XKBMAP 2>/tmp/.errlog
  261. check_for_error
  262. }
  263.  
  264. # Set the installed system's locale
  265. set_locale() {
  266.  
  267. LOCALES=""
  268. for i in $(cat /etc/locale.gen | grep -v "# " | sed 's/#//g' | sed 's/ UTF-8//g' | grep .UTF-8); do
  269. LOCALES="${LOCALES} ${i} -"
  270. done
  271.  
  272. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LocateTitle" --menu "$_localeBody" 0 0 16 ${LOCALES} 2>${ANSWER} || config_base_menu
  273. LOCALE=$(cat ${ANSWER})
  274.  
  275. echo "LANG=\"${LOCALE}\"" > ${MOUNTPOINT}/etc/locale.conf
  276. sed -i "s/#${LOCALE}/${LOCALE}/" ${MOUNTPOINT}/etc/locale.gen 2>/tmp/.errlog
  277. arch_chroot "locale-gen" >/dev/null 2>>/tmp/.errlog
  278. check_for_error
  279. }
  280.  
  281. # Set Zone and Sub-Zone
  282. set_timezone() {
  283.  
  284. ZONE=""
  285. for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "/" | sed "s/\/.*//g" | sort -ud); do
  286. ZONE="$ZONE ${i} -"
  287. done
  288.  
  289. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_TimeZTitle" --menu "$_TimeZBody" 0 0 10 ${ZONE} 2>${ANSWER} || config_base_menu
  290. ZONE=$(cat ${ANSWER})
  291.  
  292. SUBZONE=""
  293. for i in $(cat /usr/share/zoneinfo/zone.tab | awk '{print $3}' | grep "${ZONE}/" | sed "s/${ZONE}\///g" | sort -ud); do
  294. SUBZONE="$SUBZONE ${i} -"
  295. done
  296.  
  297. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_TimeSubZTitle" --menu "$_TimeSubZBody" 0 0 11 ${SUBZONE} 2>${ANSWER} || config_base_menu
  298. SUBZONE=$(cat ${ANSWER})
  299.  
  300. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_TimeZQ ${ZONE}/${SUBZONE} ?" 0 0
  301.  
  302. if [[ $? -eq 0 ]]; then
  303. arch_chroot "ln -sf /usr/share/zoneinfo/${ZONE}/${SUBZONE} /etc/localtime" 2>/tmp/.errlog
  304. check_for_error
  305. else
  306. config_base_menu
  307. fi
  308. }
  309.  
  310. set_hw_clock() {
  311.  
  312. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_HwCTitle" \
  313. --menu "$_HwCBody" 0 0 2 \
  314. "1" "$_HwCUTC" \
  315. "2" "$_HwLocal" 2>${ANSWER}
  316.  
  317. case $(cat ${ANSWER}) in
  318. "1") arch_chroot "hwclock --systohc --utc" 2>/tmp/.errlog
  319. ;;
  320. "2") arch_chroot "hwclock --systohc --localtime" 2>/tmp/.errlog
  321. ;;
  322. *) config_base_menu
  323. ;;
  324. esac
  325.  
  326. check_for_error
  327. }
  328.  
  329. # Generate the installed system's FSTAB
  330. generate_fstab() {
  331.  
  332. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FstabTitle" \
  333. --menu "$_FstabBody" 0 0 3 \
  334. "1" "$_FstabDev" \
  335. "2" "$_FstabLabel" \
  336. "3" "$_FstabUUID" 2>${ANSWER}
  337.  
  338. case $(cat ${ANSWER}) in
  339. "1") genfstab -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
  340. ;;
  341. "2") genfstab -L -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
  342. ;;
  343. "3") if [[ $SYSTEM == "UEFI" ]]; then
  344. genfstab -t PARTUUID -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
  345. else
  346. genfstab -U -p ${MOUNTPOINT} >> ${MOUNTPOINT}/etc/fstab 2>/tmp/.errlog
  347. fi
  348. ;;
  349. *) config_base_menu
  350. ;;
  351. esac
  352.  
  353. check_for_error
  354.  
  355. [[ -f ${MOUNTPOINT}/swapfile ]] && sed -i "s/\\${MOUNTPOINT}//" ${MOUNTPOINT}/etc/fstab
  356.  
  357. }
  358.  
  359. # Set the installed system's hostname
  360. set_hostname() {
  361.  
  362. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_HostNameTitle" --inputbox "$_HostNameBody" 0 0 "MantOS" 2>${ANSWER} || config_base_menu
  363. HOST_NAME=$(cat ${ANSWER})
  364.  
  365. echo "$HOST_NAME" > ${MOUNTPOINT}/etc/hostname
  366. sed -i "s/$ISO_HOST/$HOST_NAME/g" ${MOUNTPOINT}/etc/hosts
  367. }
  368.  
  369. # Set the installed system's root password
  370. set_root_password() {
  371.  
  372. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtTitle" --clear --insecure --passwordbox "$_PassRtBody" 0 0 2> ${ANSWER} || config_base_menu
  373. PASSWD=$(cat ${ANSWER})
  374.  
  375. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtTitle" --clear --insecure --passwordbox "$_PassRtBody2" 0 0 2> ${ANSWER} || config_base_menu
  376. PASSWD2=$(cat ${ANSWER})
  377.  
  378. if [[ $PASSWD == $PASSWD2 ]]; then
  379. echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd
  380. arch_chroot "passwd root" < /tmp/.passwd >/dev/null 2>/tmp/.errlog
  381. rm /tmp/.passwd
  382. check_for_error
  383. else
  384. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassRtErrTitle" --msgbox "$_PassRtErrBody" 0 0
  385. set_root_password
  386. fi
  387.  
  388. }
  389.  
  390. # Create new user(s) for installed system. First user is created by renaming the live account.
  391. # All others are brand new.
  392. create_new_user() {
  393.  
  394. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrTitle" --inputbox "$_NUsrBody" 0 0 "" 2>${ANSWER} || config_user_menu
  395. USER=$(cat ${ANSWER})
  396.  
  397. # Loop while user name is blank, has spaces, or has capital letters in it.
  398. while [[ ${#USER} -eq 0 ]] || [[ $USER =~ \ |\' ]] || [[ $USER =~ [^a-z0-9\ ] ]]; do
  399. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrTitle" --inputbox "$_NUsrErrBody" 0 0 "" 2>${ANSWER} || config_user_menu
  400. USER=$(cat ${ANSWER})
  401. done
  402.  
  403. # Enter password. This step will only be reached where the loop has been skipped or broken.
  404. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
  405. PASSWD=$(cat ${ANSWER})
  406.  
  407. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody2 $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
  408. PASSWD2=$(cat ${ANSWER})
  409.  
  410. # loop while passwords entered do not match.
  411. while [[ $PASSWD != $PASSWD2 ]]; do
  412. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrErrTitle" --msgbox "$_PassNUsrErrBody" 0 0
  413.  
  414. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
  415. PASSWD=$(cat ${ANSWER})
  416.  
  417. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PassNUsrTitle" --clear --insecure --passwordbox "$_PassNUsrBody2 $USER\n\n" 0 0 2> ${ANSWER} || config_base_menu
  418. PASSWD2=$(cat ${ANSWER})
  419. done
  420.  
  421. # State new new user is being created
  422. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_NUsrSetTitle" --infobox "$_NUsrSetBody" 0 0
  423. sleep 2
  424. echo -e "${PASSWD}\n${PASSWD}" > /tmp/.passwd
  425.  
  426. # If the first (or only) user account, then change the live account
  427. if [[ -e ${MOUNTPOINT}/home/$ISO_USER ]]; then
  428. arch_chroot "passwd $ISO_USER" < /tmp/.passwd >/dev/null 2>>/tmp/.errlog
  429. check_for_error
  430.  
  431. # Distro-specific configuration for entered username
  432. sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/home/$ISO_USER/.gtkrc-2.0 2>/tmp/.errlog
  433.  
  434. # Convert live account to entered username - group, password, folder, and ownership
  435. sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/group 2>>/tmp/.errlog
  436. sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/gshadow 2>>/tmp/.errlog
  437. sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/passwd 2>>/tmp/.errlog
  438. sed -i "s/$ISO_USER/$USER/g" ${MOUNTPOINT}/etc/shadow 2>>/tmp/.errlog
  439. mv ${MOUNTPOINT}/home/$ISO_USER ${MOUNTPOINT}/home/$USER 2>>/tmp/.errlog
  440. chown -R $USER:users ${MOUNTPOINT}/home/$USER 2>>/tmp/.errlog
  441.  
  442. # Change sudoers file to require passwords for sudo commands
  443. sed -i '/%wheel ALL=(ALL) ALL/s/^#//' ${MOUNTPOINT}/etc/sudoers 2>>/tmp/.errlog
  444. sed -i '/%wheel ALL=(ALL) ALL NOPASSWD: ALL/s/#%wheel ALL=(ALL) ALL NOPASSWD: ALL//' ${MOUNTPOINT}/etc/sudoers 2>>/tmp/.errlog
  445. check_for_error
  446.  
  447. #copy over non live config
  448. arch_chroot "cp -R /etc/skel/ /home/${USER}" 2>>/tmp/.errlog
  449. else
  450. # If the live account has already been changed, create a new user account
  451. arch_chroot "useradd ${USER} -m -g users -G wheel,storage,power,network,video,audio,lp -s /bin/bash" 2>/tmp/.errlog
  452. arch_chroot "passwd ${USER}" < /tmp/.passwd >/dev/null 2>>/tmp/.errlog
  453.  
  454. # Set up basic configuration files and ownership for new account
  455. arch_chroot "cp -R /etc/skel/ /home/${USER}" 2>>/tmp/.errlog
  456. arch_chroot "chown -R ${USER}:users /home/${USER}" 2>>/tmp/.errlog
  457. check_for_error
  458. fi
  459. rm /tmp/.passwd
  460. }
  461.  
  462. run_mkinitcpio() {
  463.  
  464. clear
  465.  
  466. # If $LVM is being used, add the lvm2 hook
  467. [[ $LVM -eq 1 ]] && sed -i 's/block filesystems/block lvm2 filesystems/g' ${MOUNTPOINT}/etc/mkinitcpio.conf
  468.  
  469. # Amend command depending on whether LTS kernel was installed or not
  470. [[ $LTS -eq 1 ]] && arch_chroot "mkinitcpio -p linux-lts" 2>/tmp/.errlog || arch_chroot "mkinitcpio -p linux" 2>/tmp/.errlog
  471. check_for_error
  472.  
  473. }
  474.  
  475. ######################################################################
  476. ## ##
  477. ## System and Partitioning Functions ##
  478. ## ##
  479. ######################################################################
  480.  
  481.  
  482.  
  483. # Unmount partitions.
  484. umount_partitions(){
  485.  
  486. MOUNTED=""
  487. MOUNTED=$(mount | grep "${MOUNTPOINT}" | awk '{print $3}' | sort -r)
  488. swapoff -a
  489.  
  490. for i in ${MOUNTED[@]}; do
  491. umount $i >/dev/null 2>>/tmp/.errlog
  492. done
  493.  
  494. check_for_error
  495.  
  496. }
  497.  
  498. # Adapted from AIS
  499. confirm_mount() {
  500. if [[ $(mount | grep $1) ]]; then
  501. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusSucc" 0 0
  502. sleep 2
  503. PARTITIONS="$(echo $PARTITIONS | sed s/${PARTITION}$' -'//)"
  504. NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 ))
  505. else
  506. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusFail" 0 0
  507. sleep 2
  508. prep_menu
  509. fi
  510. }
  511.  
  512. # btrfs specific for subvolumes
  513. confirm_mount_btrfs() {
  514. if [[ $(mount | grep $1) ]]; then
  515. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusSucc\n$(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL}\n\n" 0 0
  516. sleep 2
  517. else
  518. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntStatusTitle" --infobox "$_MntStatusFail" 0 0
  519. sleep 2
  520. prep_menu
  521. fi
  522. }
  523.  
  524. # Adapted from AIS. However, this does not assume that the formatted device is the Root
  525. # installation device; more than one device may be formatted. This is now set in the
  526. # mount_partitions function, when the Root is chosen.
  527. select_device() {
  528.  
  529. DEVICE=""
  530. devices_list=$(lsblk -d | awk '{print "/dev/" $1}' | grep 'sd\|hd\|vd');
  531.  
  532. for i in ${devices_list[@]}; do
  533. DEVICE="${DEVICE} ${i} -"
  534. done
  535.  
  536. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevSelTitle" --menu "$_DevSelBody" 0 0 4 ${DEVICE} 2>${ANSWER} || prep_menu
  537. DEVICE=$(cat ${ANSWER})
  538.  
  539. }
  540.  
  541. # Same as above, but goes to install_base_menu instead where cancelling, and otherwise installs Grub.
  542. select_grub_device() {
  543.  
  544. GRUB_DEVICE=""
  545. grub_devices_list=$(lsblk -d | awk '{print "/dev/" $1}' | grep 'sd\|hd\|vd');
  546.  
  547. for i in ${grub_devices_list[@]}; do
  548. GRUB_DEVICE="${GRUB_DEVICE} ${i} -"
  549. done
  550.  
  551. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_DevSelGrubTitle" --menu "$_DevSelBody" 0 0 4 ${GRUB_DEVICE} 2>${ANSWER} || install_base_menu
  552. GRUB_DEVICE=$(cat ${ANSWER})
  553. clear
  554. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
  555. sleep 1
  556. arch_chroot "grub-install --target=i386-pc --recheck ${GRUB_DEVICE}" 2>/tmp/.errlog
  557. check_for_error
  558.  
  559. }
  560.  
  561. # Create partitions.
  562. create_partitions(){
  563.  
  564. # This only creates the minimum number of partition(s) necessary. Users wishing for other schemes will
  565. # have to learn to use a partitioning application.
  566. auto_partition(){
  567.  
  568. # Deleting partitions in reverse order deals with logical partitions easily.
  569. delete_partitions(){
  570.  
  571. parted -s ${DEVICE} print | awk '/^ / {print $1}' > /tmp/.del_parts
  572.  
  573. for del_part in $(tac /tmp/.del_parts); do
  574. parted -s ${DEVICE} rm ${del_part} 2>/tmp/.errlog
  575. check_for_error
  576. done
  577.  
  578.  
  579. }
  580.  
  581. # Identify the partition table
  582. part_table=$(parted -s ${DEVICE} print | grep -i 'partition table' | awk '{print $3}')
  583.  
  584. # Autopartition for BIOS systems
  585. if [[ $SYSTEM == "BIOS" ]]; then
  586. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Auto-Partition (BIOS/MBR) " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartBIOSBody2" 0 0
  587.  
  588. if [[ $? -eq 0 ]]; then
  589. delete_partitions
  590. if [[ $part_table != "msdos" ]]; then
  591. parted -s ${DEVICE} mklabel msdos 2>/tmp/.errlog
  592. check_for_error
  593. fi
  594. parted -s ${DEVICE} mkpart primary ext3 1MiB 100% 2>/tmp/.errlog
  595. parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog
  596. check_for_error
  597. echo -e "Partition Scheme:\n" > /tmp/.devlist
  598. lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE > /tmp/.devlist
  599. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "" --textbox /tmp/.devlist 0 0
  600. else
  601. create_partitions
  602. fi
  603.  
  604. # Autopartition for UEFI systems
  605. else
  606. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Auto-Partition (UEFI/GPT) " --yesno "$_AutoPartBody1 $DEVICE $_AutoPartUEFIBody2" 0 0
  607.  
  608. if [[ $? -eq 0 ]]; then
  609. delete_partitions
  610. if [[ $part_table != "gpt" ]]; then
  611. parted -s ${DEVICE} mklabel gpt 2>/tmp/.errlog
  612. check_for_error
  613. fi
  614. parted -s ${DEVICE} mkpart ESP fat32 1MiB 513MiB 2>/tmp/.errlog
  615. parted -s ${DEVICE} set 1 boot on 2>>/tmp/.errlog
  616. parted -s ${DEVICE} mkpart primary ext3 513MiB 100% 2>>/tmp/.errlog
  617. echo -e "Partition Scheme:\n" > /tmp/.devlist
  618. lsblk ${DEVICE} -o NAME,TYPE,FSTYPE,SIZE >> /tmp/.devlist
  619. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "" --textbox /tmp/.devlist 0 0
  620. else
  621. create_partitions
  622. fi
  623.  
  624. fi
  625.  
  626. }
  627.  
  628. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PartToolTitle" \
  629. --menu "$_PartToolBody" 0 0 7 \
  630. "1" $"Auto Partition" \
  631. "2" $"GParted" \
  632. "3" $"Parted (BIOS & UEFI)" \
  633. "4" $"CFDisk (BIOS/MBR)" \
  634. "5" $"CGDisk (UEFI/GPT)" \
  635. "6" $"FDisk (BIOS & UEFI)" \
  636. "7" $"GDisk (UEFI/GPT)" 2>${ANSWER}
  637.  
  638. case $(cat ${ANSWER}) in
  639. "1") auto_partition
  640. ;;
  641. "2") gparted ${DEVICE} >/dev/null 2>&1
  642. ;;
  643. "3") clear
  644. parted ${DEVICE}
  645. ;;
  646. "4") cfdisk ${DEVICE}
  647. ;;
  648. "5") cgdisk ${DEVICE}
  649. ;;
  650. "6") clear
  651. fdisk ${DEVICE}
  652. ;;
  653. "7") clear
  654. gdisk ${DEVICE}
  655. ;;
  656. *) prep_menu
  657. ;;
  658. esac
  659. }
  660.  
  661. # find all available partitions and generate a list of them
  662. # This also includes partitions on different devices.
  663. find_partitions() {
  664.  
  665. PARTITIONS=""
  666. NUMBER_PARTITIONS=0
  667. partition_list=$(lsblk -l | grep 'part\|lvm' | sed 's/[\t ].*//' | sort -u)
  668.  
  669. for i in ${partition_list[@]}; do
  670. PARTITIONS="${PARTITIONS} ${i} -"
  671. NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS + 1 ))
  672. done
  673.  
  674. # Deal with incorrect partitioning
  675. if [[ $NUMBER_PARTITIONS -lt 2 ]] && [[ $SYSTEM == "UEFI" ]]; then
  676. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_UefiPartErrTitle" --msgbox "$_UefiPartErrBody" 0 0
  677. create_partitions
  678. fi
  679.  
  680. if [[ $NUMBER_PARTITIONS -eq 0 ]] && [[ $SYSTEM == "BIOS" ]]; then
  681. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_BiosPartErrTitle" --msgbox "$_BiosPartErrBody" 0 0
  682. create_partitions
  683. fi
  684. }
  685.  
  686. # Set static list of filesystems rather than on-the-fly. Partially as most require additional flags, and
  687. # partially because some don't seem to be viable.
  688. select_filesystem(){
  689.  
  690. # Clear special FS type flags
  691. BTRFS=0
  692.  
  693. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FSTitle" \
  694. --menu "$_FSBody" 0 0 12 \
  695. "1" "$_FSSkip" \
  696. "2" $"btrfs" \
  697. "3" $"ext2" \
  698. "4" $"ext3" \
  699. "5" $"ext4" \
  700. "6" $"f2fs" \
  701. "7" $"jfs" \
  702. "8" $"nilfs2" \
  703. "9" $"ntfs" \
  704. "10" $"reiserfs" \
  705. "11" $"vfat" \
  706. "12" $"xfs" 2>${ANSWER}
  707.  
  708. case $(cat ${ANSWER}) in
  709. "1") FILESYSTEM="skip"
  710. ;;
  711. "2") FILESYSTEM="mkfs.btrfs -f"
  712. modprobe btrfs
  713.  
  714. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle" --yesno "$_btrfsSVBody" 0 0
  715. if [[ $? -eq 0 ]];then
  716. BTRFS=2
  717. else
  718. BTRFS=1
  719. fi
  720.  
  721. ;;
  722. "3") FILESYSTEM="mkfs.ext2 -F"
  723. ;;
  724. "4") FILESYSTEM="mkfs.ext3 -F"
  725. ;;
  726. "5") FILESYSTEM="mkfs.ext4 -F"
  727. ;;
  728. "6") FILESYSTEM="mkfs.f2fs"
  729. modprobe f2fs
  730. ;;
  731. "7") FILESYSTEM="mkfs.jfs -q"
  732. ;;
  733. "8") FILESYSTEM="mkfs.nilfs2 -f"
  734. ;;
  735. "9") FILESYSTEM="mkfs.ntfs -q"
  736. ;;
  737. "10") FILESYSTEM="mkfs.reiserfs -f -f"
  738. ;;
  739. "11") FILESYSTEM="mkfs.vfat -F32"
  740. ;;
  741. "12") FILESYSTEM="mkfs.xfs -f"
  742. ;;
  743. *) prep_menu
  744. ;;
  745. esac
  746.  
  747. }
  748.  
  749. mount_partitions() {
  750.  
  751. # function created to save repetition of code. Checks and determines if standard partition or LVM LV,
  752. # and sets the prefix accordingly.
  753. set_mount_type() {
  754.  
  755. [[ $(echo ${PARTITION} | grep 'sd\|hd\|vd[a-z][1-99]') != "" ]] && MOUNT_TYPE="/dev/" || MOUNT_TYPE="/dev/mapper/"
  756.  
  757. }
  758.  
  759. btrfs_subvols() {
  760.  
  761. BTRFS_MSUB_VOL=""
  762. BTRFS_OSUB_VOL=""
  763. BTRFS_MNT=""
  764. BTRFS_VOL_LIST="/tmp/.vols"
  765. echo "" > ${BTRFS_VOL_LIST}
  766. BTRFS_OSUB_NUM=1
  767.  
  768. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle" --inputbox "$_btrfsMSubBody1 ${MOUNTPOINT}${MOUNT} $_btrfsMSubBody2" 0 0 "" 2>${ANSWER} || select_filesystem
  769. BTRFS_MSUB_VOL=$(cat ${ANSWER})
  770. # if root, then create boot flag for syslinux, systemd-boot and rEFInd bootloaders
  771. [[ ${MOUNT} == "" ]] && BTRFS_MNT="rootflags=subvol="$BTRFS_MSUB_VOL
  772.  
  773. # Loop while subvolume is blank or has spaces.
  774. while [[ ${#BTRFS_MSUB_VOL} -eq 0 ]] || [[ $BTRFS_MSUB_VOL =~ \ |\' ]]; do
  775. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVErrTitle" --inputbox "$_btrfsSVErrBody" 0 0 "" 2>${ANSWER} || select_filesystem
  776. BTRFS_MSUB_VOL=$(cat ${ANSWER})
  777. # if root, then create flag for syslinux, systemd-boot and rEFInd bootloaders
  778. [[ ${MOUNT} == "" ]] && BTRFS_MNT="rootflags=subvol="$BTRFS_MSUB_VOL
  779. done
  780.  
  781. # change dir depending on whether root partition or not
  782. [[ ${MOUNT} == "" ]] && cd ${MOUNTPOINT} || cd ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
  783. btrfs subvolume create ${BTRFS_MSUB_VOL} 2>>/tmp/.errlog
  784. cd
  785. umount ${MOUNT_TYPE}${PARTITION} 2>>/tmp/.errlog
  786. check_for_error
  787.  
  788. # Get any mount options and mount
  789. btrfs_mount_opts
  790. if [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
  791. [[ ${MOUNT} == "" ]] && mount -o $(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>/tmp/.errlog || mount -o $(cat ${BTRFS_OPTS})",subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
  792. else
  793. [[ ${MOUNT} == "" ]] && mount -o "subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>/tmp/.errlog || mount -o "subvol="${BTRFS_MSUB_VOL} ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
  794. fi
  795.  
  796. # Check for error and confirm successful mount
  797. check_for_error
  798. [[ ${MOUNT} == "" ]] && confirm_mount_btrfs ${MOUNTPOINT} || confirm_mount_btrfs ${MOUNTPOINT}${MOUNT}
  799.  
  800. # Now create the subvolumes
  801. [[ ${MOUNT} == "" ]] && cd ${MOUNTPOINT} || cd ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
  802. check_for_error
  803.  
  804. # Loop while the termination character has not been entered
  805. while [[ $BTRFS_OSUB_VOL != "*" ]]; do
  806. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVTitle ($BTRFS_MSUB_VOL) " --inputbox "$_btrfsSVBody1 $BTRFS_OSUB_NUM $_btrfsSVBody2 $BTRFS_MSUB_VOL.$_btrfsSVBody3 $(cat ${BTRFS_VOL_LIST})" 0 0 "" 2>${ANSWER} || select_filesystem
  807. BTRFS_OSUB_VOL=$(cat ${ANSWER})
  808.  
  809. # Loop while subvolume is blank or has spaces.
  810. while [[ ${#BTRFS_OSUB_VOL} -eq 0 ]] || [[ $BTRFS_SUB_VOL =~ \ |\' ]]; do
  811. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsSVErrTitle ($BTRFS_MSUB_VOL) " --inputbox "$_btrfsSVErrBody ($BTRFS_OSUB_NUM)." 0 0 "" 2>${ANSWER} || select_filesystem
  812. BTRFS_OSUB_VOL=$(cat ${ANSWER})
  813. done
  814.  
  815. btrfs subvolume create ${BTRFS_OSUB_VOL} 2>/tmp/.errlog
  816. check_for_error
  817. BTRFS_OSUB_NUM=$(( BTRFS_OSUB_NUM + 1 ))
  818. echo $BTRFS_OSUB_VOL" " >> ${BTRFS_VOL_LIST}
  819. done
  820.  
  821. # Show the subvolumes created
  822. echo -e "btrfs subvols:\n" > /tmp/.subvols
  823. ls >> /tmp/.subvols
  824. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --textbox /tmp/.subvols 0 0
  825. cd
  826. }
  827.  
  828. # This function allows for btrfs-specific mounting options to be applied. Written as a seperate function
  829. # for neatness.
  830. btrfs_mount_opts() {
  831.  
  832. echo "" > ${BTRFS_OPTS}
  833.  
  834. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsMntTitle" --checklist "$_btrfsMntBody" 0 0 16 \
  835. "1" "autodefrag" off \
  836. "2" "compress=zlib" off \
  837. "3" "compress=lzo" off \
  838. "4" "compress=no" off \
  839. "5" "compress-force=zlib" off \
  840. "6" "compress-force=lzo" off \
  841. "7" "discard" off \
  842. "8" "noacl" off \
  843. "9" "noatime" off \
  844. "10" "nodatasum" off \
  845. "11" "nospace_cache" off \
  846. "12" "recovery" off \
  847. "13" "skip_balance" off \
  848. "14" "space_cache" off \
  849. "15" "ssd" off \
  850. "16" "ssd_spread" off 2>${BTRFS_OPTS}
  851.  
  852. # Double-digits first
  853. sed -i 's/10/nodatasum,/' ${BTRFS_OPTS}
  854. sed -i 's/11/nospace_cache,/' ${BTRFS_OPTS}
  855. sed -i 's/12/recovery,/' ${BTRFS_OPTS}
  856. sed -i 's/13/skip_balance,/' ${BTRFS_OPTS}
  857. sed -i 's/14/space_cache,/' ${BTRFS_OPTS}
  858. sed -i 's/15/ssd,/' ${BTRFS_OPTS}
  859. sed -i 's/16/ssd_spread,/' ${BTRFS_OPTS}
  860. # then single digits
  861. sed -i 's/1/autodefrag,/' ${BTRFS_OPTS}
  862. sed -i 's/2/compress=zlib,/' ${BTRFS_OPTS}
  863. sed -i 's/3/compress=lzo,/' ${BTRFS_OPTS}
  864. sed -i 's/4/compress=no,/' ${BTRFS_OPTS}
  865. sed -i 's/5/compress-force=zlib,/' ${BTRFS_OPTS}
  866. sed -i 's/6/compress-force=lzo,/' ${BTRFS_OPTS}
  867. sed -i 's/7/noatime,/' ${BTRFS_OPTS}
  868. sed -i 's/8/noacl,/' ${BTRFS_OPTS}
  869. sed -i 's/9/noatime,/' ${BTRFS_OPTS}
  870. # Now clean up the file
  871. sed -i 's/ //g' ${BTRFS_OPTS}
  872. sed -i '$s/,$//' ${BTRFS_OPTS}
  873.  
  874.  
  875. if [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
  876. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_btrfsMntTitle" --yesno "$_btrfsMntConfBody $(cat $BTRFS_OPTS)\n" 0 0
  877. [[ $? -eq 1 ]] && btrfs_mount_opts
  878. fi
  879.  
  880. }
  881.  
  882. # LVM Detection. If detected, activate.
  883. detect_lvm
  884. if [[ $LVM -eq 1 ]]; then
  885. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmDetTitle" --infobox "$_LvmDetBody2" 0 0
  886. sleep 2
  887. modprobe dm-mod 2>/tmp/.errlog
  888. check_for_error
  889. vgscan >/dev/null 2>&1
  890. vgchange -ay >/dev/null 2>&1
  891. fi
  892.  
  893. # Ensure partitions are unmounted (i.e. where mounted previously), and then list available partitions
  894. umount_partitions
  895. find_partitions
  896.  
  897. # Identify and mount root
  898. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelRootTitle" --menu "$_SelRootBody" 0 0 4 ${PARTITIONS} 2>${ANSWER} || prep_menu
  899. PARTITION=$(cat ${ANSWER})
  900. ROOT_PART=${PARTITION}
  901. set_mount_type
  902.  
  903. # This is to identify the device for Grub installations.
  904. if [[ $MOUNT_TYPE == "/dev/" ]]; then
  905. LVM_ROOT=0
  906. INST_DEV=${MOUNT_TYPE}$(cat ${ANSWER} | sed 's/[0-9]*//g')
  907. else
  908. LVM_ROOT=1
  909. fi
  910.  
  911. select_filesystem
  912. [[ $FILESYSTEM != "skip" ]] && ${FILESYSTEM} ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
  913. check_for_error
  914.  
  915. # Make the root directory
  916. mkdir -p ${MOUNTPOINT} 2>/tmp/.errlog
  917.  
  918. # If btrfs without subvolumes has been selected, get the mount options
  919. [[ $BTRFS -eq 1 ]] && btrfs_mount_opts
  920.  
  921. # If btrfs has been selected without subvolumes - and at least one btrfs mount option selected - then
  922. # mount with options. Otherwise, basic mount.
  923. if [[ $BTRFS -eq 1 ]] && [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
  924. mount -o $(cat ${BTRFS_OPTS}) ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>>/tmp/.errlog
  925. else
  926. mount ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT} 2>>/tmp/.errlog
  927. fi
  928.  
  929. # Check for error, confirm mount, and deal with BTRFS with subvolumes if applicable
  930. check_for_error
  931. confirm_mount ${MOUNTPOINT}
  932. [[ $BTRFS -eq 2 ]] && btrfs_subvols
  933.  
  934. # Identify and create swap, if applicable
  935. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelSwpTitle" --menu "$_SelSwpBody" 0 0 4 "$_SelSwpNone" $"-" "$_SelSwpFile" $"-" ${PARTITIONS} 2>${ANSWER} || prep_menu
  936. if [[ $(cat ${ANSWER}) != "$_SelSwpNone" ]]; then
  937. PARTITION=$(cat ${ANSWER})
  938.  
  939. if [[ $PARTITION == "$_SelSwpFile" ]]; then
  940. total_memory=`grep MemTotal /proc/meminfo | awk '{print $2/1024}' | sed 's/\..*//'`
  941. fallocate -l ${total_memory}M ${MOUNTPOINT}/swapfile >/dev/null 2>/tmp/.errlog
  942. check_for_error
  943. chmod 600 ${MOUNTPOINT}/swapfile >/dev/null 2>&1
  944. mkswap ${MOUNTPOINT}/swapfile >/dev/null 2>&1
  945. swapon ${MOUNTPOINT}/swapfile >/dev/null 2>&1
  946. else
  947. set_mount_type
  948. mkswap ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
  949. swapon ${MOUNT_TYPE}${PARTITION} >/dev/null 2>>/tmp/.errlog
  950. check_for_error
  951. # Since a partition was used, remove that partition from the list
  952. PARTITIONS="$(echo $PARTITIONS | sed s/${PARTITION}$' -'//)"
  953. NUMBER_PARTITIONS=$(( NUMBER_PARTITIONS - 1 ))
  954. fi
  955. fi
  956.  
  957. # Extra Step for VFAT UEFI Partition. This cannot be in an LVM container.
  958. if [[ $SYSTEM == "UEFI" ]]; then
  959.  
  960. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SelUefiTitle" --menu "$_SelUefiBody" 0 0 4 ${PARTITIONS} 2>${ANSWER} || config_base_menu
  961. PARTITION=$(cat ${ANSWER})
  962. UEFI_PART=$"/dev/"${PARTITION}
  963.  
  964. # If it is already a fat/vfat partition...
  965. if [[ $(fsck -N /dev/$PARTITION | grep fat) ]]; then
  966. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_FormUefiTitle" --yesno "$_FormUefiBody $PARTITION $_FormUefiBody2" 0 0 && mkfs.vfat -F32 $"/dev/"${PARTITION} >/dev/null 2>/tmp/.errlog
  967. else
  968. mkfs.vfat -F32 $"/dev/"${PARTITION} >/dev/null 2>/tmp/.errlog
  969. fi
  970. check_for_error
  971.  
  972. # Inform users of the mountpoint options and consequences
  973. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MntUefiTitle" --menu "$_MntUefiBody" 0 0 2 \
  974. "1" $"/boot" \
  975. "2" $"/boot/efi" 2>${ANSWER}
  976.  
  977. case $(cat ${ANSWER}) in
  978. "1") UEFI_MOUNT="/boot"
  979. ;;
  980. "2") UEFI_MOUNT="/boot/efi"
  981. ;;
  982. *) config_base_menu
  983. ;;
  984. esac
  985.  
  986. mkdir -p ${MOUNTPOINT}${UEFI_MOUNT} 2>/tmp/.errlog
  987. mount $"/dev/"${PARTITION} ${MOUNTPOINT}${UEFI_MOUNT} 2>>/tmp/.errlog
  988. check_for_error
  989. confirm_mount ${MOUNTPOINT}${UEFI_MOUNT}
  990.  
  991. fi
  992.  
  993. # All other partitions
  994. while [[ $NUMBER_PARTITIONS > 0 ]]; do
  995. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtPartTitle" --menu "$_ExtPartBody" 0 0 4 "$_Done" $"-" ${PARTITIONS} 2>${ANSWER} || config_base_menu
  996. PARTITION=$(cat ${ANSWER})
  997. set_mount_type
  998.  
  999. if [[ $PARTITION == ${_Done} ]]; then
  1000. break;
  1001. else
  1002. MOUNT=""
  1003.  
  1004. select_filesystem
  1005. [[ $FILESYSTEM != "skip" ]] && ${FILESYSTEM} ${MOUNT_TYPE}${PARTITION} >/dev/null 2>/tmp/.errlog
  1006. check_for_error
  1007.  
  1008. # Don't give /boot as an example for UEFI systems!
  1009. if [[ $SYSTEM == "UEFI" ]]; then
  1010. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyUefi" 0 0 "/" 2>${ANSWER} || config_base_menu
  1011. else
  1012. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyBios" 0 0 "/" 2>${ANSWER} || config_base_menu
  1013. fi
  1014. MOUNT=$(cat ${ANSWER})
  1015.  
  1016. # loop if the mountpoint specified is incorrect (is only '/', is blank, or has spaces).
  1017. while [[ ${MOUNT:0:1} != "/" ]] || [[ ${#MOUNT} -le 1 ]] || [[ $MOUNT =~ \ |\' ]]; do
  1018. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtErrTitle" --msgbox "$_ExtErrBody" 0 0
  1019.  
  1020. # Don't give /boot as an example for UEFI systems!
  1021. if [[ $SYSTEM == "UEFI" ]]; then
  1022. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyUefi" 0 0 "/" 2>${ANSWER} || config_base_menu
  1023. else
  1024. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ExtNameTitle $PARTITON " --inputbox "$_ExtNameBodyBios" 0 0 "/" 2>${ANSWER} || config_base_menu
  1025. fi
  1026. MOUNT=$(cat ${ANSWER})
  1027. done
  1028.  
  1029. # Create directory and mount. This step will only be reached where the loop has been skipped or broken.
  1030. mkdir -p ${MOUNTPOINT}${MOUNT} 2>/tmp/.errlog
  1031.  
  1032. # If btrfs without subvolumes has been selected, get the mount options
  1033. [[ $BTRFS -eq 1 ]] && btrfs_mount_opts
  1034.  
  1035. # If btrfs has been selected without subvolumes - and at least one btrfs mount option selected - then
  1036. # mount with options. Otherwise, basic mount.
  1037. if [[ $BTRFS -eq 1 ]] && [[ $(cat ${BTRFS_OPTS}) != "" ]]; then
  1038. mount -o $(cat ${BTRFS_OPTS}) ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog
  1039. else
  1040. mount ${MOUNT_TYPE}${PARTITION} ${MOUNTPOINT}${MOUNT} 2>>/tmp/.errlog
  1041. fi
  1042.  
  1043. # Check for error, confirm mount, and deal with BTRFS with subvolumes if applicable
  1044. check_for_error
  1045. confirm_mount ${MOUNTPOINT}${MOUNT}
  1046. [[ $BTRFS -eq 2 ]] && btrfs_subvols
  1047.  
  1048. # Determine if a seperate /boot is used, and if it is LVM or not
  1049. LVM_SEP_BOOT=0
  1050. if [[ $MOUNT == "/boot" ]]; then
  1051. [[ $MOUNT_TYPE == "/dev/" ]] && LVM_SEP_BOOT=1 || LVM_SEP_BOOT=2
  1052. fi
  1053. fi
  1054. done
  1055. }
  1056.  
  1057. ######################################################################
  1058. ## ##
  1059. ## Logical Volume Management Functions ##
  1060. ## ##
  1061. ######################################################################
  1062.  
  1063.  
  1064. # LVM Detection.
  1065. detect_lvm() {
  1066.  
  1067. LVM_PV=$(pvs -o pv_name --noheading 2>/dev/null)
  1068. LVM_VG=$(vgs -o vg_name --noheading 2>/dev/null)
  1069. LVM_LV=$(lvs -o vg_name,lv_name --noheading --separator - 2>/dev/null)
  1070.  
  1071. if [[ $LVM_LV = "" ]] && [[ $LVM_VG = "" ]] && [[ $LVM_PV = "" ]]; then
  1072. LVM=0
  1073. else
  1074. LVM=1
  1075. fi
  1076.  
  1077. }
  1078.  
  1079. # Where existing LVM is found, offer to deactivate it. Code adapted from the Manjaro installer.
  1080. # NEED TO ADD COMMAND TO REMOVE LVM2 FSTYPE.
  1081. deactivate_lvm() {
  1082.  
  1083. LVM_DISABLE=0
  1084.  
  1085. if [[ $LVM -eq 1 ]]; then
  1086. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmDetTitle" --yesno "$_LvmDetBody1" 0 0 \
  1087. && LVM_DISABLE=1 || LVM_DISABLE=0
  1088. fi
  1089.  
  1090. if [[ $LVM_DISABLE -eq 1 ]]; then
  1091. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmRmTitle" --infobox "$_LvmRmBody" 0 0
  1092. sleep 2
  1093.  
  1094. for i in ${LVM_LV}; do
  1095. lvremove -f /dev/mapper/${i} >/dev/null 2>&1
  1096. done
  1097.  
  1098. for i in ${LVM_VG}; do
  1099. vgremove -f ${i} >/dev/null 2>&1
  1100. done
  1101.  
  1102. for i in ${LV_PV}; do
  1103. pvremove -f ${i} >/dev/null 2>&1
  1104. done
  1105.  
  1106. # This step will remove old lvm metadata on partitions where identified.
  1107. LVM_PT=$(lvmdiskscan | grep 'LVM physical volume' | grep 'sd[a-z]' | sed 's/\/dev\///' | awk '{print $1}')
  1108. for i in ${LVM_PT}; do
  1109. dd if=/dev/zero bs=512 count=512 of=/dev/${i} >/dev/null 2>&1
  1110. done
  1111. fi
  1112.  
  1113. }
  1114.  
  1115. # Find and create a list of partitions that can be used for LVM. Partitions already used are excluded.
  1116. find_lvm_partitions() {
  1117.  
  1118. LVM_PARTITIONS=""
  1119. NUMBER_LVM_PARTITIONS=0
  1120. lvm_partition_list=$(lvmdiskscan | grep -v 'LVM physical volume' | grep 'sd[a-z][1-99]' | sed 's/\/dev\///' | awk '{print $1}')
  1121.  
  1122. for i in ${lvm_partition_list[@]}; do
  1123. LVM_PARTITIONS="${LVM_PARTITIONS} ${i} -"
  1124. NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS + 1 ))
  1125. done
  1126.  
  1127. }
  1128.  
  1129. # This simplifies the creation of the PV and VG into a single step.
  1130. create_lvm() {
  1131.  
  1132. # subroutine to save a lot of repetition.
  1133. check_lv_size() {
  1134.  
  1135. LV_SIZE_INVALID=0
  1136. LV_SIZE_TYPE=$(echo ${LVM_LV_SIZE:$(( ${#LVM_LV_SIZE} - 1 )):1})
  1137. chars=0
  1138.  
  1139. # Check to see if anything was actually entered
  1140. [[ ${#LVM_LV_SIZE} -eq 0 ]] && LV_SIZE_INVALID=1
  1141.  
  1142. # Check if there are any non-numeric characters prior to the last one
  1143. while [[ $chars -lt $(( ${#LVM_LV_SIZE} - 1 )) ]]; do
  1144. if [[ ${LVM_LV_SIZE:chars:1} != [0-9] ]]; then
  1145. LV_SIZE_INVALID=1
  1146. break;
  1147. fi
  1148. chars=$(( chars + 1 ))
  1149. done
  1150.  
  1151. # Check to see if first character is '0'
  1152. [[ ${LVM_LV_SIZE:0:1} -eq "0" ]] && LV_SIZE_INVALID=1
  1153.  
  1154. # Check to see if last character is "G" or "M", and if so, whether the value is greater than
  1155. # or equal to the LV remaining Size. If not, convert into MB for VG space remaining.
  1156. if [[ ${LV_SIZE_INVALID} -eq 0 ]]; then
  1157. case ${LV_SIZE_TYPE} in
  1158. "G") if [[ $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) -ge ${LVM_VG_MB} ]]; then
  1159. LV_SIZE_INVALID=1
  1160. else
  1161. LVM_VG_MB=$(( LVM_VG_MB - $(( $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) * 1000 )) ))
  1162. fi
  1163. ;;
  1164. "M") if [[ $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) -ge ${LVM_VG_MB} ]]; then
  1165. LV_SIZE_INVALID=1
  1166. else
  1167. LVM_VG_MB=$(( LVM_VG_MB - $(echo ${LVM_LV_SIZE:0:$(( ${#LVM_LV_SIZE} - 1 ))}) ))
  1168. fi
  1169. ;;
  1170. *) LV_SIZE_INVALID=1
  1171. ;;
  1172. esac
  1173. fi
  1174.  
  1175. }
  1176.  
  1177. # Check that there is at least one partition available for LVM
  1178. if [[ $NUMBER_LVM_PARTITIONS -lt 1 ]]; then
  1179. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPartErrTitle" --msgbox "$_LvmPartErrBody" 0 0
  1180. prep_menu
  1181. fi
  1182.  
  1183. # Create a temporary file to store the partition(s) selected. This is later used for the vgcreate command. 'x' is used as a marker.
  1184. echo "x" > /tmp/.vgcreate
  1185.  
  1186. # Name the Volume Group
  1187. LVM_VG=""
  1188. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgTitle" --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu
  1189. LVM_VG=$(cat ${ANSWER})
  1190.  
  1191. # Loop while the Volume Group name starts with a "/", is blank, has spaces, or is already being used
  1192. while [[ ${LVM_VG:0:1} == "/" ]] || [[ ${#LVM_VG} -eq 0 ]] || [[ $LVM_VG =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_VG}) != "" ]]; do
  1193. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgErrTitle" --msgbox "$_LvmNameVgErr" 0 0
  1194.  
  1195. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmNameVgTitle" --inputbox "$_LvmNameVgBody" 0 0 "" 2>${ANSWER} || prep_menu
  1196. LVM_VG=$(cat ${ANSWER})
  1197. done
  1198.  
  1199. # Select the first or only partition for the Volume Group
  1200. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvSelTitle" --menu "$_LvmPvSelBody" 0 0 4 ${LVM_PARTITIONS} 2>${ANSWER} || prep_menu
  1201. LVM_PARTITION=$(cat ${ANSWER})
  1202.  
  1203. # add the partition to the temporary file for the vgcreate command
  1204. # Remove selected partition from the list and deduct number of LVM viable partitions remaining
  1205. sed -i "s/x/\/dev\/${LVM_PARTITION} x/" /tmp/.vgcreate
  1206. LVM_PARTITIONS="$(echo $LVM_PARTITIONS | sed s/${LVM_PARTITION}$' -'//)"
  1207. NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
  1208. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvCreateTitle" --infobox "\n$_Done\n\n" 0 0
  1209. sleep 1
  1210.  
  1211. # Where there are viable partitions still remaining, run loop
  1212. while [[ $NUMBER_LVM_PARTITIONS -gt 0 ]]; do
  1213.  
  1214. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvSelTitle" --menu "$_LvmPvSelBody" 0 0 4 $"Done" $"-" ${LVM_PARTITIONS} 2>${ANSWER} || prep_menu
  1215. LVM_PARTITION=$(cat ${ANSWER})
  1216.  
  1217. if [[ $LVM_PARTITION == "Done" ]]; then
  1218. break;
  1219. else
  1220. sed -i "s/x/\/dev\/${LVM_PARTITION} x/" /tmp/.vgcreate
  1221. LVM_PARTITIONS="$(echo $LVM_PARTITIONS | sed s/${LVM_PARTITION}$' -'//)"
  1222. NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
  1223. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvCreateTitle" --infobox "\n$_Done\n\n" 0 0
  1224. sleep 1
  1225. fi
  1226.  
  1227. done
  1228.  
  1229. # Once all the partitions have been selected, remove 'x' from the .vgcreate file, then use it in 'vgcreate' command.
  1230. # Also determine the size of the VG, to use for creating LVs for it.
  1231. VG_PARTS=$(cat /tmp/.vgcreate | sed 's/x//')
  1232. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvConfTitle" --yesno "$_LvmPvConfBody1${LVM_VG} $_LvmPvConfBody2${VG_PARTS}" 0 0
  1233.  
  1234. if [[ $? -eq 0 ]]; then
  1235. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvActTitle" --infobox "$_LvmPvActBody1${LVM_VG}.$_LvmPvActBody2" 0 0
  1236. sleep 2
  1237. vgcreate -f ${LVM_VG} ${VG_PARTS} >/dev/null 2>/tmp/.errlog
  1238. check_for_error
  1239. VG_SIZE=$(vgdisplay | grep 'VG Size' | awk '{print $3}' | sed 's/\..*//')
  1240. VG_SIZE_TYPE=$(vgdisplay | grep 'VG Size' | awk '{print $4}' | sed 's/\..*//')
  1241. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmPvDoneTitle" --msgbox "$_LvmPvDoneBody1 '${LVM_VG}' $_LvmPvDoneBody2 (${VG_SIZE} ${VG_SIZE_TYPE}).\n\n" 0 0
  1242. sleep 2
  1243. else
  1244. prep_menu
  1245. fi
  1246.  
  1247. # Convert the VG size into GB and MB. These variables are used to keep tabs on space available and remaining
  1248. [[ ${VG_SIZE_TYPE:0:1} == "G" ]] && LVM_VG_MB=$(( VG_SIZE * 1000 )) || LVM_VG_MB=$VG_SIZE
  1249.  
  1250. # Specify number of Logical volumes to create.
  1251. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumTitle" --inputbox "$_LvmLvNumBody1 ${LVM_VG}.$_LvmLvNumBody2" 0 0 "" 2>${ANSWER} || prep_menu
  1252. NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER})
  1253.  
  1254. # Loop if the number of LVs is no 1-9 (including non-valid characters)
  1255. while [[ $NUMBER_LOGICAL_VOLUMES != [1-9] ]]; do
  1256. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumErrTitle" --msgbox "$_LvmLvNumErrBody" 0 0
  1257.  
  1258. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNumTitle" --inputbox "$_LvmLvNumBody1 ${LVM_VG}.$_LvmLvNumBody2" 0 0 "" 2>${ANSWER} || prep_menu
  1259. NUMBER_LOGICAL_VOLUMES=$(cat ${ANSWER})
  1260. done
  1261.  
  1262. # Loop while the number of LVs is greater than 1. This is because the size of the last LV is automatic.
  1263. while [[ $NUMBER_LOGICAL_VOLUMES -gt 1 ]]; do
  1264. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu
  1265. LVM_LV_NAME=$(cat ${ANSWER})
  1266.  
  1267. # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists.
  1268. while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do
  1269. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameErrTitle" --msgbox "$_LvmLvNameErrBody" 0 0
  1270.  
  1271. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1" 0 0 "lvol" 2>${ANSWER} || prep_menu
  1272. LVM_LV_NAME=$(cat ${ANSWER})
  1273. done
  1274.  
  1275. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeTitle" --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu
  1276. LVM_LV_SIZE=$(cat ${ANSWER})
  1277. check_lv_size
  1278.  
  1279. # Loop while an invalid value is entered.
  1280. while [[ $LV_SIZE_INVALID -eq 1 ]]; do
  1281. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeErrTitle" --msgbox "$_LvmLvSizeErrBody" 0 0
  1282.  
  1283. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvSizeTitle" --inputbox "\n${LVM_VG}: ${VG_SIZE}${VG_SIZE_TYPE} (${LVM_VG_MB}MB $_LvmLvSizeBody1).$_LvmLvSizeBody2" 0 0 "" 2>${ANSWER} || prep_menu
  1284. LVM_LV_SIZE=$(cat ${ANSWER})
  1285. check_lv_size
  1286. done
  1287.  
  1288. # Create the LV
  1289. lvcreate -L ${LVM_LV_SIZE} ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog
  1290. check_for_error
  1291. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvDoneTitle" --msgbox "\n$_Done\n\nLV ${LVM_LV_NAME} (${LVM_LV_SIZE}) $_LvmPvDoneBody2.\n\n" 0 0
  1292. NUMBER_LOGICAL_VOLUMES=$(( NUMBER_LOGICAL_VOLUMES - 1 ))
  1293. done
  1294.  
  1295. # Now the final LV. Size is automatic.
  1296. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu
  1297. LVM_LV_NAME=$(cat ${ANSWER})
  1298.  
  1299. # Loop if preceeded with a "/", if nothing is entered, if there is a space, or if that name already exists.
  1300. while [[ ${LVM_LV_NAME:0:1} == "/" ]] || [[ ${#LVM_LV_NAME} -eq 0 ]] || [[ ${LVM_LV_NAME} =~ \ |\' ]] || [[ $(lsblk | grep ${LVM_LV_NAME}) != "" ]]; do
  1301. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameErrTitle" --msgbox "$_LvmLvNameErrBody" 0 0
  1302.  
  1303. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmLvNameTitle" --inputbox "$_LvmLvNameBody1 $_LvmLvNameBody2 (${LVM_VG_MB}MB)." 0 0 "lvol" 2>${ANSWER} || prep_menu
  1304. LVM_LV_NAME=$(cat ${ANSWER})
  1305. done
  1306.  
  1307. # Create the final LV
  1308. lvcreate -l +100%FREE ${LVM_VG} -n ${LVM_LV_NAME} 2>/tmp/.errlog
  1309. check_for_error
  1310. NUMBER_LVM_PARTITIONS=$(( NUMBER_LVM_PARTITIONS - 1 ))
  1311. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_LvmCompTitle" --yesno "$_LvmCompBody" 0 0 \
  1312. && show_devices || prep_menu
  1313. }
  1314.  
  1315. ######################################################################
  1316. ## ##
  1317. ## Installation Functions ##
  1318. ## ##
  1319. ######################################################################
  1320.  
  1321. install_root(){
  1322.  
  1323. clear
  1324.  
  1325. # Change installation method depending on use of img or sfs
  1326. if [[ -e /run/archiso/sfs/airootfs/airootfs.img ]]; then
  1327. AIROOTIMG="/run/archiso/sfs/airootfs/airootfs.img"
  1328. mkdir -p ${BYPASS} 2>/tmp/.errlog
  1329. mount ${AIROOTIMG} ${BYPASS} 2>>/tmp/.errlog
  1330. rsync -a --progress ${BYPASS} ${MOUNTPOINT}/ 2>>/tmp/.errlog
  1331. umount -l ${BYPASS}
  1332. else
  1333. AIROOTIMG="/run/archiso/sfs/airootfs/"
  1334. rsync -a --progress ${AIROOTIMG} ${MOUNTPOINT}/ 2>/tmp/.errlog
  1335. fi
  1336.  
  1337. check_for_error
  1338.  
  1339. # Keyboard config for vc and x11
  1340. [[ -e /tmp/vconsole.conf ]] && cp /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>>/tmp/.errlog
  1341. [[ -e /tmp/01-keyboard-layout.conf ]] && cp -f /tmp/01-keyboard-layout.conf ${MOUNTPOINT}/etc/X11/xorg.conf.d/$(ls ${MOUNTPOINT}/etc/X11/xorg.conf.d/ | grep "keyboard") 2>>/tmp/.errlog
  1342.  
  1343. # set up kernel for mkiniticpio
  1344. cp /run/archiso/bootmnt/arch/boot/${ARCHI}/vmlinuz ${MOUNTPOINT}/boot/vmlinuz-linux 2>>/tmp/.errlog
  1345.  
  1346. # copy over new mirrorlist
  1347. cp /etc/pacman.d/mirrorlist ${MOUNTPOINT}/etc/pacman.d/mirrorlist 2>>/tmp/.errlog
  1348.  
  1349. # Clean up installation
  1350. [[ -d ${MOUNTPOINT}/abif-master ]] && rm -R ${MOUNTPOINT}/abif-master 2>>/tmp/.errlog
  1351. [[ -d ${MOUNTPOINT}/aif-master ]] && rm -R ${MOUNTPOINT}/abif-master 2>>/tmp/.errlog
  1352. [[ -d ${MOUNTPOINT}/inst ]] && rm -R ${MOUNTPOINT}/inst &> /dev/null 2>>/tmp/.errlog
  1353. rm -f ${MOUNTPOINT}/usr/bin/lastmin 2>>/tmp/.errlog
  1354. rm -rf ${MOUNTPOINT}/vomi 2>>/tmp/.errlog
  1355. rm -rf ${BYPASS} 2>>/tmp/.errlog
  1356. rm -rf ${MOUNTPOINT}/source 2>>/tmp/.errlog
  1357. rm -rf ${MOUNTPOINT}/src 2>>/tmp/.errlog
  1358. rmdir ${MOUNTPOINT}/bypass 2>>/tmp/.errlog
  1359. rmdir ${MOUNTPOINT}/src 2>>/tmp/.errlog
  1360. rmdir ${MOUNTPOINT}/source 2>>/tmp/.errlog
  1361. rm -f ${MOUNTPOINT}/etc/sudoers.d/g_wheel 2>>/tmp/.errlog
  1362. rm -f ${MOUNTPOINT}/var/lib/NetworkManager/NetworkManager.state 2>>/tmp/.errlog
  1363. rm -f ${MOUNTPOINT}/update-abif 2>>/tmp/.errlog
  1364. sed -i 's/.*pam_wheel\.so/#&/' ${MOUNTPOINT}/etc/pam.d/su 2>>/tmp/.errlog
  1365.  
  1366. # clean out archiso files from install
  1367. find ${MOUNTPOINT}/usr/lib/initcpio -name archiso* -type f -exec rm '{}' \;
  1368.  
  1369. # systemd
  1370. rm -R ${MOUNTPOINT}/etc/systemd/system/getty@tty1.service.d 2>>/tmp/.errlog
  1371. rm ${MOUNTPOINT}/etc/systemd/system/default.target 2>>/tmp/.errlog
  1372.  
  1373.  
  1374. # Journal
  1375. sed -i 's/volatile/auto/g' ${MOUNTPOINT}/etc/systemd/journald.conf 2>>/tmp/.errlog
  1376.  
  1377. # Stop pacman complaining
  1378. arch_chroot "mkdir -p /var/lib/pacman/sync" 2>>/tmp/.errlog
  1379. arch_chroot "touch /var/lib/pacman/sync/{core.db,extra.db,community.db}" 2>>/tmp/.errlog
  1380.  
  1381. # Fix NetworkManager
  1382. arch_chroot "systemctl enable NetworkManager -f" 2>>/tmp/.errlog
  1383.  
  1384. # Keyboard config for vc and x11
  1385. [[ -e /tmp/vconsole.conf ]] && cp /tmp/vconsole.conf ${MOUNTPOINT}/etc/vconsole.conf 2>>/tmp/.errlog
  1386. [[ -e /tmp/01-keyboard-layout.conf ]] && cp -f /tmp/01-keyboard-layout.conf ${MOUNTPOINT}/etc/X11/xorg.conf.d/$(ls ${MOUNTPOINT}/etc/X11/xorg.conf.d/ | grep "keyboard") 2>>/tmp/.errlog
  1387. check_for_error
  1388. }
  1389.  
  1390. # Install Bootloader
  1391. install_bootloader() {
  1392.  
  1393. bios_bootloader() {
  1394.  
  1395. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstBiosBtTitle" \
  1396. --menu "$_InstBiosBtBody" 0 0 2 \
  1397. "1" $"Grub2" \
  1398. "2" $"Syslinux" 2>${ANSWER}
  1399.  
  1400. case $(cat ${ANSWER}) in
  1401. "1") # GRUB
  1402. if [[ $LVM_ROOT -eq 1 ]]; then
  1403. select_grub_device
  1404. else
  1405. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstGrubDevTitle" --yesno "$_InstGrubDevBody ($INST_DEV)?$_InstGrubDevBody2" 0 0
  1406.  
  1407. if [[ $? -eq 0 ]]; then
  1408. clear
  1409. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
  1410. sleep 1
  1411. arch_chroot "grub-install --target=i386-pc --recheck ${INST_DEV}" 2>/tmp/.errlog
  1412. check_for_error
  1413. else
  1414. select_grub_device
  1415. fi
  1416.  
  1417. fi
  1418.  
  1419. arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>/tmp/.errlog
  1420. check_for_error
  1421.  
  1422. # if /boot is LVM then amend /boot/grub/grub.cfg accordingly
  1423. if ( [[ $LVM_ROOT -eq 1 ]] && [[ $LVM_SEP_BOOT -eq 0 ]] ) || [[ $LVM_SEP_BOOT -eq 2 ]]; then
  1424. sed -i '/### BEGIN \/etc\/grub.d\/00_header ###/a insmod lvm' ${MOUNTPOINT}/boot/grub/grub.cfg
  1425. fi
  1426. BOOTLOADER="Grub"
  1427. ;;
  1428. "2") # Syslinux
  1429. arch_chroot "syslinux-install_update -iam" 2>/tmp/.errlog
  1430. check_for_error
  1431.  
  1432. # Amend configuration file depending on whether lvm used or not for root.
  1433. if [[ $LVM_ROOT -eq 0 ]]; then
  1434. sed -i "s/sda[0-9]/${ROOT_PART}/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
  1435. else
  1436. sed -i "s/APPEND.*/APPEND root=\/dev\/mapper\/${ROOT_PART} rw/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
  1437. fi
  1438.  
  1439. # Amend configuration file for LTS kernel and/or btrfs subvolume as root
  1440. [[ $LTS -eq 1 ]] && sed -i 's/linux/linux-lts/g' ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
  1441. [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}/boot/syslinux/syslinux.cfg
  1442.  
  1443. BOOTLOADER="Syslinux"
  1444. ;;
  1445. *) install_base_menu
  1446. ;;
  1447. esac
  1448. }
  1449.  
  1450. uefi_bootloader() {
  1451.  
  1452. #Ensure again that efivarfs is mounted
  1453. [[ -z $(mount | grep /sys/firmware/efi/efivars) ]] && mount -t efivarfs efivarfs /sys/firmware/efi/efivars
  1454.  
  1455. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstUefiBtTitle" \
  1456. --menu "$_InstUefiBtBody" 0 0 3 \
  1457. "1" $"Grub2" \
  1458. "2" $"rEFInd" \
  1459. "3" $"systemd-boot" 2>${ANSWER}
  1460.  
  1461. case $(cat ${ANSWER}) in
  1462. "1") # GRUB
  1463. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title " Grub-install " --infobox "$_PlsWaitBody" 0 0
  1464. sleep 1
  1465. arch_chroot "grub-install --target=x86_64-efi --efi-directory=${UEFI_MOUNT} --bootloader-id=arch_grub --recheck" 2>/tmp/.errlog
  1466. arch_chroot "grub-mkconfig -o /boot/grub/grub.cfg" 2>>/tmp/.errlog
  1467. check_for_error
  1468.  
  1469. # Ask if user wishes to set Grub as the default bootloader and act accordingly
  1470. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetGrubDefTitle" --yesno "$_SetGrubDefBody ${UEFI_MOUNT}/EFI/boot $_SetGrubDefBody2" 0 0
  1471.  
  1472. if [[ $? -eq 0 ]]; then
  1473. arch_chroot "mkdir ${UEFI_MOUNT}/EFI/boot" 2>/tmp/.errlog
  1474. arch_chroot "cp -r ${UEFI_MOUNT}/EFI/arch_grub/grubx64.efi ${UEFI_MOUNT}/EFI/boot/bootx64.efi" 2>>/tmp/.errlog
  1475. check_for_error
  1476. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetDefDoneTitle" --infobox "\nGrub $_SetDefDoneBody" 0 0
  1477. sleep 2
  1478. fi
  1479.  
  1480. BOOTLOADER="Grub"
  1481. ;;
  1482.  
  1483. "2") # rEFInd
  1484. if [[ $UEFI_MOUNT == "/boot/efi" ]]; then
  1485. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SetRefiDefTitle" --yesno "$_SetRefiDefBody ${UEFI_MOUNT}/EFI/boot $_SetRefiDefBody2" 0 0
  1486.  
  1487. if [[ $? -eq 0 ]]; then
  1488. clear
  1489. arch_chroot "refind-install --usedefault ${UEFI_PART} --alldrivers" 2>/tmp/.errlog
  1490. else
  1491. clear
  1492. arch_chroot "refind-install" 2>/tmp/.errlog
  1493. fi
  1494.  
  1495. check_for_error
  1496.  
  1497. # Now generate config file to pass kernel parameters. Default read only (ro) changed to read-write (rw),
  1498. # and amend where using btfs subvol root
  1499. arch_chroot "refind-mkrlconf" 2>/tmp/.errlog
  1500. check_for_error
  1501. sed -i 's/ro /rw /g' ${MOUNTPOINT}/boot/refind_linux.conf
  1502. [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}/boot/refind_linux.conf
  1503.  
  1504. BOOTLOADER="rEFInd"
  1505. else
  1506. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_RefiErrTitle" --msgbox "$_RefiErrBody" 0 0
  1507. uefi_bootloader
  1508. fi
  1509. ;;
  1510.  
  1511. "3") # systemd-boot
  1512. arch_chroot "bootctl --path=${UEFI_MOUNT} install" 2>>/tmp/.errlog
  1513. check_for_error
  1514.  
  1515. # Deal with LVM Root
  1516. if [[ $LVM_ROOT -eq 0 ]]; then
  1517. sysdb_root=$(blkid -s PARTUUID $"/dev/"${ROOT_PART} | sed 's/.*=//g' | sed 's/"//g')
  1518. else
  1519. sysdb_root="/dev/mapper/${ROOT_PART}"
  1520. fi
  1521.  
  1522. # Deal with LTS Kernel
  1523. if [[ $LTS -eq 1 ]]; then
  1524. echo -e "title\tMantOS Linux\nlinux\t/vmlinuz-linux-lts\ninitrd\t/initramfs-linux-lts.img\noptions\troot=PARTUUID=${sysdb_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
  1525. else
  1526. echo -e "title\tMantOS Linux\nlinux\t/vmlinuz-linux\ninitrd\t/initramfs-linux.img\noptions\troot=PARTUUID=${sysdb_root} rw" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
  1527. fi
  1528.  
  1529. # Fix LVM Root installations, and deal with btrfs root subvolume mounting
  1530. [[ $LVM_ROOT -eq 1 ]] && sed -i "s/PARTUUID=//g" ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
  1531. [[ $BTRFS_MNT != "" ]] && sed -i "s/rw/rw $BTRFS_MNT/g" ${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf
  1532.  
  1533. BOOTLOADER="systemd-boot"
  1534. # Set the loader file
  1535. echo -e "default MantOS\ntimeout 5" > ${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf 2>/tmp/.errlog
  1536. check_for_error
  1537. ;;
  1538.  
  1539. *) install_base_menu
  1540. ;;
  1541. esac
  1542.  
  1543. }
  1544. check_mount
  1545. # Set the default PATH variable
  1546. arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog
  1547. check_for_error
  1548.  
  1549. if [[ $SYSTEM == "BIOS" ]]; then
  1550. bios_bootloader
  1551. else
  1552. uefi_bootloader
  1553. fi
  1554. }
  1555.  
  1556. ######################################################################
  1557. ## ##
  1558. ## Main Interfaces ##
  1559. ## ##
  1560. ######################################################################
  1561.  
  1562. # Greet the user when first starting the installer
  1563. greeting() {
  1564.  
  1565. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_WelTitle $VERSION " --msgbox "$_WelBody" 0 0
  1566.  
  1567. }
  1568.  
  1569. # Preparation
  1570. prep_menu() {
  1571.  
  1572. if [[ $SUB_MENU != "prep_menu" ]]; then
  1573. SUB_MENU="prep_menu"
  1574. HIGHLIGHT_SUB=1
  1575. else
  1576. if [[ $HIGHLIGHT_SUB != 7 ]]; then
  1577. HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
  1578. fi
  1579. fi
  1580.  
  1581. dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_PrepTitle" \
  1582. --menu "$_PrepBody" 0 0 7 \
  1583. "1" "$_ConfBseVirtCon" \
  1584. "2" "$_PrepKBLayout" \
  1585. "3" "$_DevShowOpt" \
  1586. "4" "$_PrepPartDisk" \
  1587. "5" "$_PrepLVM" \
  1588. "6" "$_PrepMntPart" \
  1589. "7" "$_Back" 2>${ANSWER}
  1590.  
  1591. HIGHLIGHT_SUB=$(cat ${ANSWER})
  1592. case $(cat ${ANSWER}) in
  1593. "1") set_keymap
  1594. ;;
  1595. "2") set_xkbmap
  1596. ;;
  1597. "3") show_devices
  1598. ;;
  1599. "4") umount_partitions
  1600. select_device
  1601. create_partitions
  1602. ;;
  1603. "5") detect_lvm
  1604. deactivate_lvm
  1605. find_lvm_partitions
  1606. create_lvm
  1607. ;;
  1608. "6") mount_partitions
  1609. ;;
  1610. *) main_menu
  1611. ;;
  1612. esac
  1613.  
  1614. prep_menu
  1615.  
  1616. }
  1617.  
  1618. # Base Installation
  1619. install_root_menu() {
  1620.  
  1621. if [[ $SUB_MENU != "install_base_menu" ]]; then
  1622. SUB_MENU="install_base_menu"
  1623. HIGHLIGHT_SUB=1
  1624. else
  1625. if [[ $HIGHLIGHT_SUB != 4 ]]; then
  1626. HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
  1627. fi
  1628. fi
  1629.  
  1630. dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_InstBsMenuTitle" --menu "$_InstBseMenuBody" 0 0 4 \
  1631. "1" "$_InstBse" \
  1632. "2" "$_MMRunMkinit" \
  1633. "3" "$_InstBootldr" \
  1634. "4" "$_Back" 2>${ANSWER}
  1635.  
  1636. HIGHLIGHT_SUB=$(cat ${ANSWER})
  1637. case $(cat ${ANSWER}) in
  1638. "1") install_root
  1639. ;;
  1640. "2") run_mkinitcpio
  1641. ;;
  1642. "3") install_bootloader
  1643. ;;
  1644. *) main_menu
  1645. ;;
  1646. esac
  1647.  
  1648. install_root_menu
  1649. }
  1650.  
  1651. # Base Configuration
  1652. config_base_menu() {
  1653.  
  1654. # Set the default PATH variable
  1655. arch_chroot "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl" 2>/tmp/.errlog
  1656. check_for_error
  1657.  
  1658. if [[ $SUB_MENU != "config_base_menu" ]]; then
  1659. SUB_MENU="config_base_menu"
  1660. HIGHLIGHT_SUB=1
  1661. else
  1662. if [[ $HIGHLIGHT_SUB != 8 ]]; then
  1663. HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
  1664. fi
  1665. fi
  1666.  
  1667. dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_ConfBseTitle" --menu "$_ConfBseBody" 0 0 8 \
  1668. "1" "$_ConfBseFstab" \
  1669. "2" "$_ConfBseHost" \
  1670. "3" "$_ConfBseTime" \
  1671. "4" "$_ConfBseHWC" \
  1672. "5" "$_ConfBseSysLoc" \
  1673. "6" "$_ConfUsrRoot" \
  1674. "7" "$_ConfUsrNew" \
  1675. "8" "$_Back" 2>${ANSWER}
  1676.  
  1677. HIGHLIGHT_SUB=$(cat ${ANSWER})
  1678. case $(cat ${ANSWER}) in
  1679. "1") generate_fstab
  1680. ;;
  1681. "2") set_hostname
  1682. ;;
  1683. "3") set_timezone
  1684. ;;
  1685. "4") set_hw_clock
  1686. ;;
  1687. "5") set_locale
  1688. ;;
  1689. "6") set_root_password
  1690. ;;
  1691. "7") create_new_user
  1692. ;;
  1693. *) main_menu
  1694. ;;
  1695. esac
  1696.  
  1697. config_base_menu
  1698.  
  1699. }
  1700.  
  1701. # Edit configs of installed system
  1702. edit_configs() {
  1703.  
  1704. # Clear the file variables
  1705. FILE=""
  1706. FILE2=""
  1707.  
  1708. if [[ $SUB_MENU != "edit configs" ]]; then
  1709. SUB_MENU="edit configs"
  1710. HIGHLIGHT_SUB=1
  1711. else
  1712. if [[ $HIGHLIGHT_SUB != 10 ]]; then
  1713. HIGHLIGHT_SUB=$(( HIGHLIGHT_SUB + 1 ))
  1714. fi
  1715. fi
  1716.  
  1717. dialog --default-item ${HIGHLIGHT_SUB} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SeeConfOptTitle" --menu "$_SeeConfOptBody" 0 0 11 \
  1718. "1" "/etc/vconsole.conf" \
  1719. "2" "/etc/locale.conf" \
  1720. "3" "/etc/hostname" \
  1721. "4" "/etc/hosts" \
  1722. "5" "/etc/sudoers" \
  1723. "6" "/etc/mkinitcpio.conf" \
  1724. "7" "/etc/fstab" \
  1725. "8" "$BOOTLOADER" \
  1726. "9" "/etc/pacman.conf" \
  1727. "10" "/etc/pacman.d/mirrorlist" \
  1728. "11" "$_Back" 2>${ANSWER}
  1729.  
  1730. HIGHLIGHT_SUB=$(cat ${ANSWER})
  1731. case $(cat ${ANSWER}) in
  1732. "1") FILE="${MOUNTPOINT}/etc/vconsole.conf"
  1733. ;;
  1734. "2") FILE="${MOUNTPOINT}/etc/locale.conf"
  1735. ;;
  1736. "3") FILE="${MOUNTPOINT}/etc/hostname"
  1737. ;;
  1738. "4") FILE="${MOUNTPOINT}/etc/hosts"
  1739. ;;
  1740. "5") FILE="${MOUNTPOINT}/etc/sudoers"
  1741. ;;
  1742. "6") FILE="${MOUNTPOINT}/etc/mkinitcpio.conf"
  1743. ;;
  1744. "7") FILE="${MOUNTPOINT}/etc/fstab"
  1745. ;;
  1746. "8") case $BOOTLOADER in
  1747. "Grub") FILE="${MOUNTPOINT}/etc/default/grub"
  1748. ;;
  1749. "Syslinux") FILE="${MOUNTPOINT}/boot/syslinux/syslinux.cfg"
  1750. ;;
  1751. "systemd-boot") FILE="${MOUNTPOINT}${UEFI_MOUNT}/loader/entries/MantOS.conf"
  1752. FILE2="${MOUNTPOINT}${UEFI_MOUNT}/loader/loader.conf"
  1753. ;;
  1754. "rEFInd") [[ -e ${MOUNTPOINT}${UEFI_MOUNT}/EFI/refind/refind.conf ]] \
  1755. && FILE="${MOUNTPOINT}${UEFI_MOUNT}/EFI/refind/refind.conf" || FILE="${MOUNTPOINT}${UEFI_MOUNT}/EFI/BOOT/refind.conf"
  1756. FILE2="${MOUNTPOINT}/boot/refind_linux.conf"
  1757. ;;
  1758. esac
  1759. ;;
  1760. "9") FILE="${MOUNTPOINT}/etc/pacman.conf"
  1761. ;;
  1762. "10") FILE="${MOUNTPOINT}/etc/pacman.d/mirrorlist"
  1763. ;;
  1764. *) main_menu
  1765. ;;
  1766. esac
  1767.  
  1768. # open file(s) with nano
  1769. if [[ -e $FILE ]] && [[ $FILE2 != "" ]]; then
  1770. nano $FILE $FILE2
  1771. elif [[ -e $FILE ]]; then
  1772. nano $FILE
  1773. else
  1774. dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_SeeConfErrTitle" --msgbox "$_SeeConfErrBody1" 0 0
  1775. fi
  1776.  
  1777. edit_configs
  1778. }
  1779.  
  1780. main_menu() {
  1781.  
  1782. if [[ $HIGHLIGHT != 5 ]]; then
  1783. HIGHLIGHT=$(( HIGHLIGHT + 1 ))
  1784. fi
  1785.  
  1786. dialog --default-item ${HIGHLIGHT} --backtitle "$VERSION - $SYSTEM ($ARCHI)" --title "$_MMTitle" \
  1787. --menu "$_MMBody" 0 0 5 \
  1788. "1" "$_MMPrep" \
  1789. "2" "$_MMInstBse" \
  1790. "3" "$_MMConfBse" \
  1791. "4" "$_SeeConfOpt" \
  1792. "5" "$_Done" 2>${ANSWER}
  1793.  
  1794. HIGHLIGHT=$(cat ${ANSWER})
  1795.  
  1796. # Depending on the answer, first check whether partition(s) are mounted and whether base has been installed
  1797. if [[ $(cat ${ANSWER}) -eq 2 ]]; then
  1798. check_mount
  1799. fi
  1800.  
  1801. if [[ $(cat ${ANSWER}) -ge 3 ]] && [[ $(cat ${ANSWER}) -le 4 ]]; then
  1802. check_mount
  1803. check_base
  1804. fi
  1805.  
  1806. case $(cat ${ANSWER}) in
  1807. "1") prep_menu
  1808. ;;
  1809. "2") install_root_menu
  1810. ;;
  1811. "3") config_base_menu
  1812. ;;
  1813. "4") edit_configs
  1814. ;;
  1815. *) dialog --backtitle "$VERSION - $SYSTEM ($ARCHI)" --yesno "$_CloseInstBody" 0 0
  1816.  
  1817. if [[ $? -eq 0 ]]; then
  1818. umount_partitions
  1819. clear
  1820. exit 0
  1821. else
  1822. main_menu
  1823. fi
  1824.  
  1825. ;;
  1826. esac
  1827.  
  1828. main_menu
  1829.  
  1830. }
  1831.  
  1832. ######################################################################
  1833. ## ##
  1834. ## Execution ##
  1835. ## ##
  1836. ######################################################################
  1837. select_language
  1838. check_system
  1839.  
  1840. while true; do
  1841. main_menu
  1842. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement