summaryrefslogtreecommitdiff
path: root/configs/profile/root-image/root/.session/install
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2020-03-27 20:53:45 -0400
committerbill-auger <mr.j.spam.me@gmail.com>2022-05-01 23:58:14 -0400
commit5faac3e6a166a12a3a0cbb50be21a73632725651 (patch)
treef3118df3aecf2dc9f9f6013102f1c1d664599f53 /configs/profile/root-image/root/.session/install
parent640513f18fec15f24fedf43eb8e86dfae6530637 (diff)
consolidate install wizards into unified implementation
this is admitedly a huge change, nearly a total re-write the original scripts were very brittle and redundant even without functional changes, a DRY refactoring would have been nearly as massive the functional changes for rubustness, were also quite significant it would not have been feasibe to break them down * consolidated all per-init and per-language scripts sets into one * extracted translatable strings into separate file * remvoed confusing main menu, in favor of sequential prompts * better error handling and logging * added cfdisk support for CLI ISOs (GUI ISO still launches gparted) * ensure that all target partitions are formatted
Diffstat (limited to 'configs/profile/root-image/root/.session/install')
-rw-r--r--configs/profile/root-image/root/.session/install/KEYMAPS_VT212
-rw-r--r--configs/profile/root-image/root/.session/install/KEYMAPS_X98
-rw-r--r--configs/profile/root-image/root/.session/install/LANGUAGES8
-rwxr-xr-xconfigs/profile/root-image/root/.session/install/chroot-environment.sh75
-rwxr-xr-xconfigs/profile/root-image/root/.session/install/chroot-login.sh62
-rwxr-xr-xconfigs/profile/root-image/root/.session/install/chroot-services.sh23
-rwxr-xr-xconfigs/profile/root-image/root/.session/install/install.sh299
7 files changed, 777 insertions, 0 deletions
diff --git a/configs/profile/root-image/root/.session/install/KEYMAPS_VT b/configs/profile/root-image/root/.session/install/KEYMAPS_VT
new file mode 100644
index 0000000..3a409a1
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/KEYMAPS_VT
@@ -0,0 +1,212 @@
+ANSI-dvorak
+amiga-de
+amiga-us
+applkey
+atari-de
+atari-se
+atari-uk-falcon
+atari-us
+azerty
+backspace
+bashkir
+be-latin1
+bg-cp1251
+bg-cp855
+bg_bds-cp1251
+bg_bds-utf8
+bg_pho-cp1251
+bg_pho-utf8
+br-abnt
+br-abnt2
+br-latin1-abnt2
+br-latin1-us
+by
+by-cp1251
+bywin-cp1251
+cf
+colemak
+croat
+ctrl
+cz
+cz-cp1250
+cz-lat2
+cz-lat2-prog
+cz-qwertz
+cz-us-qwertz
+de
+de-latin1
+de-latin1-nodeadkeys
+de-mobii
+de_CH-latin1
+de_alt_UTF-8
+defkeymap
+defkeymap_V1.0
+dk
+dk-latin1
+dvorak
+dvorak-ca-fr
+dvorak-es
+dvorak-fr
+dvorak-l
+dvorak-r
+dvorak-ru
+dvorak-sv-a1
+dvorak-sv-a5
+dvorak-uk
+emacs
+emacs2
+es
+es-cp850
+es-olpc
+et
+et-nodeadkeys
+euro
+euro1
+euro2
+fi
+fr
+fr-bepo
+fr-bepo-latin9
+fr-latin1
+fr-latin9
+fr-pc
+fr_CH
+fr_CH-latin1
+gr
+gr-pc
+hu
+hu101
+il
+il-heb
+il-phonetic
+is-latin1
+is-latin1-us
+it
+it-ibm
+it2
+jp106
+kazakh
+keypad
+ky_alt_sh-UTF-8
+kyrgyz
+la-latin1
+lt
+lt.baltic
+lt.l4
+lv
+lv-tilde
+mac-be
+mac-de-latin1
+mac-de-latin1-nodeadkeys
+mac-de_CH
+mac-dk-latin1
+mac-dvorak
+mac-es
+mac-euro
+mac-euro2
+mac-fi-latin1
+mac-fr
+mac-fr_CH-latin1
+mac-it
+mac-pl
+mac-pt-latin1
+mac-se
+mac-template
+mac-uk
+mac-us
+mk
+mk-cp1251
+mk-utf
+mk0
+nl
+nl2
+no
+no-dvorak
+no-latin1
+pc110
+pl
+pl1
+pl2
+pl3
+pl4
+pt-latin1
+pt-latin9
+pt-olpc
+ro
+ro_std
+ro_win
+ru
+ru-cp1251
+ru-ms
+ru-yawerty
+ru1
+ru2
+ru3
+ru4
+ru_win
+ruwin_alt-CP1251
+ruwin_alt-KOI8-R
+ruwin_alt-UTF-8
+ruwin_alt_sh-UTF-8
+ruwin_cplk-CP1251
+ruwin_cplk-KOI8-R
+ruwin_cplk-UTF-8
+ruwin_ct_sh-CP1251
+ruwin_ct_sh-KOI8-R
+ruwin_ct_sh-UTF-8
+ruwin_ctrl-CP1251
+ruwin_ctrl-KOI8-R
+ruwin_ctrl-UTF-8
+se-fi-ir209
+se-fi-lat6
+se-ir209
+se-lat6
+sg
+sg-latin1
+sg-latin1-lk450
+sk-prog-qwerty
+sk-prog-qwertz
+sk-qwerty
+sk-qwertz
+slovene
+sr-cy
+sun-pl
+sun-pl-altgraph
+sundvorak
+sunkeymap
+sunt4-es
+sunt4-fi-latin1
+sunt4-no-latin1
+sunt5-cz-us
+sunt5-de-latin1
+sunt5-es
+sunt5-fi-latin1
+sunt5-fr-latin1
+sunt5-ru
+sunt5-uk
+sunt5-us-cz
+sunt6-uk
+sv-latin1
+tj_alt-UTF8
+tr_f-latin5
+tr_q-latin5
+tralt
+trf
+trf-fgGIod
+trq
+ttwin_alt-UTF-8
+ttwin_cplk-UTF-8
+ttwin_ct_sh-UTF-8
+ttwin_ctrl-UTF-8
+ua
+ua-cp1251
+ua-utf
+ua-utf-ws
+ua-ws
+uk
+unicode
+us
+us-acentos
+wangbe
+wangbe2
+windowkeys
diff --git a/configs/profile/root-image/root/.session/install/KEYMAPS_X b/configs/profile/root-image/root/.session/install/KEYMAPS_X
new file mode 100644
index 0000000..dec8b5a
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/KEYMAPS_X
@@ -0,0 +1,98 @@
+af Afrikaans-Lang
+al Albanian
+am Amharic
+ara Arabic
+at at
+au au
+az Azerbaijani
+ba Bashkir
+be Belarusian
+bg Bulgarian
+bn Bihari-Languages
+br Breton
+brai brai
+bt bt
+bw bw
+by by
+ca Catalan
+cd cd
+ch Chamorro
+cm cm
+cn cn
+cz Czech
+de German
+dk dk
+dz Dzongkha
+ee Ewe
+epo Esperanto
+es Spanish
+et Estonian
+fi Finnish
+fo Faroese
+fr French
+gb GB-English
+ge ge
+gh gh
+gn GuaranĂ­
+gr gr
+hr Croatian
+hu Hungarian
+id Indonesian
+ie Interlingue
+il il
+in in
+iq iq
+ir ir
+is Icelandic
+it Italian
+jp Japanese
+ke ke
+kg Kongo
+kh kh
+kr Kanuri
+kz kz
+la Latin
+latam Latin-American
+lk lk
+lt Lithuanian
+lv Latvian
+ma ma
+mao Maori
+md md
+me me
+mk Macedonian
+ml Malayalam
+mm mm
+mn Mongolian
+mt Maltese
+mv mv
+my Burmese
+nec_vndr/jp nec_vndr/jp
+ng Ndonga
+nl Dutch
+no Norwegian
+np np
+ph ph
+pk pk
+pl Polish
+pt Portuguese
+ro Romanian
+rs rs
+ru Russian
+se Northern-Sami
+si Sinhala
+sk Slovak
+sn Shona
+sy sy
+tg Tajik
+th Thai
+tj tj
+tm tm
+tr Turkish
+tw Twi
+tz tz
+ua ua
+us US-English
+uz Uzbek
+vn vn
+za Zhuang
diff --git a/configs/profile/root-image/root/.session/install/LANGUAGES b/configs/profile/root-image/root/.session/install/LANGUAGES
new file mode 100644
index 0000000..2f5e494
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/LANGUAGES
@@ -0,0 +1,8 @@
+en_US.UTF-8 English
+eo Esperanto
+fr_FR.UTF-8 French
+gl_ES.UTF-8 Galego
+it_IT.UTF-8 Italian
+pl_PL.UTF-8 Polish
+pt_BR.UTF-8 Portuguese
+es_ES.UTF-8 Spanish
diff --git a/configs/profile/root-image/root/.session/install/chroot-environment.sh b/configs/profile/root-image/root/.session/install/chroot-environment.sh
new file mode 100755
index 0000000..5be3195
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/chroot-environment.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+source /root/session-common.sh.inc
+
+
+# prompt for hostname
+hostname=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --inputbox "${TR[hostname-${TR_KEY}]}" 8 40 )
+echo ${hostname} > /etc/hostname
+
+# prompt for timezone
+timezone=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --inputbox "${TR[timezone-${TR_KEY}]}" 8 40 )
+ln -s /usr/share/zoneinfo/${timezone} /etc/localtime
+
+# prompt for keymap
+live_keymap=$(GetStateVar 'XKBMAP' 'us')
+keymaps=()
+for keymap in $(cat "${WIZARD_DIR}"/KEYMAPS_VT)
+do selected_state=$( [[ ${keymap} =~ ^${live_keymap} ]] && echo 'on' || echo 'off' )
+ keymaps+=( "${keymap}" "${keymap}" ${selected_state} )
+done
+keymap=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --radiolist "${TR[keymap-${TR_KEY}]}" 20 70 50 \
+ "${keymaps[@]}" )
+echo "KEYMAP=${keymap}" > /etc/vconsole.conf
+
+# prompt for locale
+all_locales=$( sed -e '1,23d' -e 's/#//g' -e 's/ /#/g' -e 's/..$//' /etc/locale.gen )
+live_locale=$( GetStateVar 'LANG' 'en_US' )
+locales=()
+for locale in ${all_locales}
+do locale=$(echo ${locale} | sed -e 's/#/ /g')
+ selected_state=$( [[ ${locale} =~ ^${live_locale} ]] && echo 'on' || echo 'off' )
+ locales+=( "${locale}" "${locale}" ${selected_state} )
+done
+locales=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --checklist "${TR[locales-${TR_KEY}]}" 20 70 50 \
+ "${locales[@]}" )
+locales=$(echo ${locales} | sed -e 's/" "/\n/g' -e 's/ /#/g' -e 's/"//g')
+for locale in ${locales[@]}
+do locale=$(echo ${locale} | sed -e 's/#/ /g')
+ sed -i -e "s/#${locale}/${locale}/g" /etc/locale.gen
+done
+locale-gen
+
+# prompt for language
+live_language=$(GetStateVar 'LANG' 'en_US.UTF-8')
+language=()
+while read language
+do selected_state=$( [[ ${language} =~ ^${live_language} ]] && echo 'on' || echo 'off' )
+ languages+=( "${language% *}" "${language#*\ }" ${selected_state} )
+done << <(cat "${WIZARD_DIR}"/LANGUAGES)
+language=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --radiolist "${TR[language-${TR_KEY}]}" 20 70 50 \
+ "${languages[@]}" )
+echo "LANG=${language}" > /etc/locale.conf
+
+# prepare initrd and GRUB
+mkinitcpio -p linux-libre
+device=$(GetStateVar 'DEVICE')
+which grub-install &> /dev/null && grub-install ${device}
+which grub-mkconfig &> /dev/null && grub-mkconfig -o /boot/grub/grub.cfg
+
+# initialize root user
+pass='changeme' pass2=''
+while [[ "$pass" != "$pass2" ]]
+do pass=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --passwordbox "${TR[root_pass-${TR_KEY}]}" 8 40 )
+ pass2=$( WizardDlg "${TR[menu_config-${TR_KEY}]}" \
+ --passwordbox "${TR[root_pass2-${TR_KEY}]}" 8 40 )
+done
+usermod -p $(openssl passwd ${pass}) root
+
+exit
diff --git a/configs/profile/root-image/root/.session/install/chroot-login.sh b/configs/profile/root-image/root/.session/install/chroot-login.sh
new file mode 100755
index 0000000..203a356
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/chroot-login.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+source /root/session-common.sh.inc
+
+
+readonly WHEEL_SUDOERS_SED_CMD='s|[#] [%]wheel ALL=[(]ALL[)] ALL|%wheel ALL=(ALL) ALL|'
+
+
+ValidateLogin() { Login=$(tr -d '[:space:]' <<<${Login}) ; [[ -n "${Login}" ]] ; } # TODO:
+
+GsettingsSet() # (kvp)
+{
+ sudo -u ${Login} gsettings set $*
+}
+
+
+## main entry ##
+
+DlgTitle=$( ${TR[dlg_user-${TR_KEY}]/*) }
+
+# create unprivileged user
+Login=''
+until ValidateLogin
+do Login=$( WizardDlg "${DlgTitle}" \
+ --inputbox "${TR[user_login-${TR_KEY}]}" 8 40 )
+done
+Pass='changeme' Pass2=''
+while [[ "${Pass}" != "${Pass2}" ]]
+do Pass=$( WizardDlg "${DlgTitle}" \
+ --passwordbox "${TR[user_pass-${TR_KEY}]} '${Login}':" 8 40 )
+ Pass2=$( WizardDlg "${DlgTitle}" \
+ --passwordbox "${TR[user_pass2-${TR_KEY}]} '${Login}':" 8 40 )
+done
+useradd -m -g users -G 'wheel' -s /bin/bash -p $(openssl passwd ${Pass}) ${Login}
+
+# set keymap
+Keymap=$(GetStateVar 'XKBMAP')
+echo "setxkbmap ${Keymap}" >> /home/${Login}/.bashrc
+
+# configure desktop environment
+wmde=$(GetStateVar 'WMDE')
+if [[ "${wmde}" == 'mate' && -x /usr/bin/gsettings ]]
+then if [[ -d /usr/share/themes/Radiance-Purple ]]
+ then GsettingsSet org.mate.interface gtk-theme 'Radiance-Purple'
+ GsettingsSet org.mate.Marco.general theme 'Radiance-Purple'
+ fi
+ if [[ -d /usr/share/icons/RAVE-X-Dark-Purple ]]
+ then GsettingsSet org.mate.interface icon-theme 'RAVE-X-Dark-Purple'
+ fi
+ if [[ -d /usr/share/icons/mate ]]
+ then GsettingsSet org.mate.peripherals-mouse cursor-size '18'
+ GsettingsSet org.mate.peripherals-mouse cursor-theme 'mate'
+ fi
+ if [[ -f /usr/share/backgrounds/parabola-laf/parabola-laf.png ]]
+ then GsettingsSet org.mate.background picture-filename '/usr/share/backgrounds/parabola-laf/parabola-laf.png'
+ fi
+fi
+
+# allow members of group wheel to execute any command
+sed -i "$WHEEL_SUDOERS_SED_CMD" /etc/sudoers
+
+exit
diff --git a/configs/profile/root-image/root/.session/install/chroot-services.sh b/configs/profile/root-image/root/.session/install/chroot-services.sh
new file mode 100755
index 0000000..a63963e
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/chroot-services.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+source /root/session-common.sh.inc
+
+
+Init=$(GetStateVar 'INIT')
+Wmde=$(GetStateVar 'WMDE')
+if [[ "${Init}" == 'openrc' ]]
+then # Create the dbus user if it doesn't exist
+ grep dbus /etc/group > /dev/null || groupadd -g 81 dbus
+ grep dbus /etc/passwd > /dev/null || useradd -g 81 -u 81 dbus -r -s /sbin/nologin
+
+ # Enable services with OpenRC
+ rc-update add alsasound default
+ rc-update add dbus default
+ rc-update add NetworkManager default
+elif [[ "${Init}" == 'systemd' ]]
+ case "${Wmde}" in
+ 'lxde') systemctl enable 'NetworkManager.service' 'lxdm.service' ;;
+ 'mate') systemctl enable 'NetworkManager.service' 'lightdm.service' ;;
+ * ) systemctl enable 'dhcpcd.service' 'systemd-resolved.service' ;;
+ esac
+fi
diff --git a/configs/profile/root-image/root/.session/install/install.sh b/configs/profile/root-image/root/.session/install/install.sh
new file mode 100755
index 0000000..7858ea3
--- /dev/null
+++ b/configs/profile/root-image/root/.session/install/install.sh
@@ -0,0 +1,299 @@
+#!/bin/bash
+
+source $(cd $(dirname ${BASH_SOURCE[0]}) ; pwd)/../session-common.sh.inc
+
+
+readonly PACCONF_NONSYSTEMD_REGEX='N ; s|^#\[nonsystemd\].*#Include|\[nonsystemd\]\nInclude|'
+readonly PACCONF_SYSTEMD_REGEX='N ; s|^\[nonsystemd\].*Include|#\[nonsystemd\]\n#Include|'
+readonly ONLINE_CHECK_URL=https://repo.parabola.nu/check_network_status.txt
+readonly GRUB_THEME_SED_CMD='s|^#GRUB_THEME=.*|GRUB_THEME=/boot/grub/themes/parabola-laf/theme.txt|'
+
+
+Init()
+{
+ echo "${TR[internet-${TR_KEY}]} ...."
+ local has_isorepo=$( [[ ! -d /isorepo ]] && echo 1 || echo 0 )
+ local is_online=$( curl ${ONLINE_CHECK_URL} &> /dev/null && echo 1 || echo 0 )
+
+ if [[ ${has_isorepo} && ${is_online} ]] ; then SetStateVar 'INSTALL' 'prompt' ;
+ elif [[ ${has_isorepo} ]] ; then SetStateVar 'INSTALL' 'offline' ;
+ else SetStateVar 'INSTALL' 'online' ;
+ fi
+
+DbgDlg "has_isorepo=$has_isorepo is_online=$is_online install=$install"
+}
+
+InitKeyring()
+{
+ if [[ "$(GetStateVar 'KEYRING')" != 'ready' ]]
+ then pacman -Sy archlinux-keyring archlinux32-keyring parabola-keyring --noconfirm
+ pacman-key --populate archlinux archlinux32 parabola
+ pacman-key --refresh-keys
+ SetStateVar 'KEYRING' 'ready'
+ fi
+}
+
+Partition()
+{
+ umount /mnt &> /dev/null || true
+
+ # prompt for disk device
+ local hd_devices=$(ls /dev/sd?)
+ local hdds=()
+ local hd_device
+ local capacity
+ local hdd
+ for hd_device in ${hd_devices}
+ do capacity=$(fdisk --list /dev/sda | head --lines=1 | sed 's|.*: \([^,]*\),.*|\1|')
+ hdds+=( "${hd_device}" "${capacity}" off )
+ done
+ hdd=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --radiolist "${TR[hdd-${TR_KEY}]}" 20 70 50 "${hdds[@]}" )
+ [[ -n "${hdd}" ]] && SetStateVar 'HDD' ${hdd} || exit
+
+ # prompt for partitioner
+ local part_method=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --menu "${TR[part-${TR_KEY}]}" 20 70 50 \
+ 'auto' "${TR[part_auto-${TR_KEY}]}" \
+ 'manual' "${TR[part_man-${TR_KEY}]}" )
+ [[ -n "${part_method}" ]] || exit
+
+ # partitioning
+ local root_part
+ case ${part_method} in
+ 'auto')
+ # create partition table
+ parted -s ${device} -- mklabel msdos
+
+ # create partitions
+ parted -s ${hdd} -- mkpart primary 1MiB 1000MiB
+ parted -s ${hdd} -- mkpart primary 1000MiB -1s
+ parted -s ${hdd} -- set 2 boot on
+
+ # format partitions
+ (echo t ; echo 1 ; echo 82 ; echo w) | fdisk ${hdd}
+ mkswap ${hdd}1
+ mkfs.ext4 ${hdd}2
+
+ root_part=${hdd}2
+ ;;
+ 'manual')
+ if which gparted &> /dev/null ; then gparted ${hdd} ;
+ elif which cfdisk &> /dev/null ; then cfdisk ${hdd} ; fi ;
+
+ # prompt for root partition
+ local partitions=()
+ local partition
+ for partition in $(ls ${hdd}?)
+ do capacity=$(df --human-readable --output=size ${partition} | tail --lines=1 | tr -d ' ')
+ partitions+=( "${partition}" "${capacity}" off )
+ done
+ root_part=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --radiolist "${TR[mount_root-${TR_KEY}]}" 20 70 50 \
+ ${partitions[@]} )
+ [[ -n "${root_part}" ]] || exit
+
+ # prompt to mount additional partitions
+ local other=0
+ local boot_part
+ local home_part
+ while [[ "${other}" != 3 ]]
+ do other=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" --cancel-label "None" \
+ --menu "${TR[mount_other-${TR_KEY}]}" 20 70 50 \
+ 1 "/boot" 2 "/home" 3 "Done" )
+ case $other in
+ 1) boot_part=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --radiolist "${TR[mount_boot-${TR_KEY}]}" 20 70 50 \
+ ${partitions[@]} )
+ umount /mnt/boot &> /dev/null || true
+ mkdir /mnt/boot &> /dev/null || true
+ ;;
+ 2) home_part=$( WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --radiolist "${TR[mount_home-${TR_KEY}]}" 20 70 50 \
+ ${partitions[@]} )
+ umount /mnt/home &> /dev/null || true
+ mkdir /mnt/home &> /dev/null || true
+ ;;
+ *) other=3
+ ;;
+ esac
+ done
+ ;;
+ *) exit ;;
+ esac
+
+ # format unformatted partitions and mount partitions
+ for partition in ${root_part} ${boot_part} ${home_part}
+ do ! blkid ${partition} | grep ' TYPE="' &> /dev/null && \
+ WizardDlg "${TR[dlg_part-${TR_KEY}]}" \
+ --yesno "${partition} ${TR[format-${TR_KEY}]}" 20 70 && \
+ mkfs.ext4 ${partition}
+ blkid ${partition} | grep ' TYPE="' > /dev/null || exit
+ done
+ mount ${root_part} /mnt
+ mount ${boot_part} /mnt/boot || [[ -z "${boot_part}" ]]
+ mount ${home_part} /mnt/home || [[ -z "${home_part}" ]]
+}
+
+NoticeCustomize() { WizardDlg "" --msgbox "${TR[notice_customize-${TR_KEY}]}" 20 70 ; }
+
+SelectDefaults()
+{
+ if WizardDlg "${TR[dlg_defaults-${TR_KEY}]}" --yesno "${TR[defaults-${TR_KEY}]}" 20 70
+ then SetStateVar 'BASE' 'base parabola-base'
+ SetStateVar 'INIT' 'openrc'
+ fi
+}
+
+SelectBase()
+{
+ if [[ -n "$(SetStateVar 'BASE')" && -n "$(GetStateVar 'INIT')" ]] ; then return 0 ; fi ;
+
+ # prompt for base package set
+ local base=$( WizardDlg "${TR[dlg_base-${TR_KEY}]}" \
+ --radiolist "${TR[base-${TR_KEY}]}" 20 70 50 \
+ 'core' "${TR[base_mini-${TR_KEY}]}" 'off' \
+ 'posix' "${TR[base_posix-${TR_KEY}]}" 'on' )
+ local base_packages=( 'base' $( [[ "${base}" == 'posix' ]] && echo 'parabola-base' || : ) )
+ [[ -n "${base}" ]] && SetStateVar 'BASE' ${base_packages} || exit
+
+ # prompt for init-system
+ local init=$( WizardDlg "${TR[dlg_base-${TR_KEY}]}" \
+ --radiolist "${TR[init-${TR_KEY}]}" 20 70 50 \
+ 'openrc' "${TR[init_openrc-${TR_KEY}]}" 'off' \
+ 'systemd' "${TR[init_systemd-${TR_KEY}]}" 'on' )
+ [[ -n "${init}" ]] && SetStateVar 'INIT' ${init} || exit
+
+ # prompt for local vs remote package repos if possible
+ local install=$(GetStateVar 'INSTALL')
+ local install=$( [[ "${install}" == 'prompt' ]] && \
+ WizardDlg "${TR[dlg_base-${TR_KEY}]}" \
+ --radiolist "${TR[install-${TR_KEY}]}" 20 70 50 \
+ 'offline' "${TR[install_offline-${TR_KEY}]}" 'on' \
+ 'online' "${TR[install_online-${TR_KEY}]}" 'off' )
+ [[ -n "${install}" ]] && SetStateVar 'INSTALL' ${install} || exit
+}
+
+InstallBase()
+{
+ local conf_regex=$( [[ "${init}" == 'openrc' ]] && echo "$PACCONF_NONSYSTEMD_REGEX" || \
+ echo "$PACCONF_SYSTEMD_REGEX" )
+ local install=$(GetStateVar 'INSTALL')
+ local base_packages=$(GetStateVar 'BASE')
+
+ sed -i "$conf_regex" /etc/pacman-${install}.conf
+ cp /etc/pacman-${install}.conf /etc/pacman.conf
+
+ # install standard packages
+ pacstrap /mnt base ${base_packages[@]}
+}
+
+ConfigChroot()
+{
+ genfstab -p /mnt >> /mnt/etc/fstab
+ cp "${SESSION_STATE_FILE}" /mnt/root/
+ cp "${SESSION_INCLUDE_FILE}" /mnt/root/
+ cp "${CHROOT_ENVIRONMENT_FILE}" /mnt/root/
+ chmod +x /mnt/root/${CHROOT_ENVIRONMENT_FILENAME}
+ arch-chroot /mnt /root/${CHROOT_ENVIRONMENT_FILENAME}
+ rm /mnt/root/${CHROOT_ENVIRONMENT_FILENAME}
+}
+
+NoticeOptional() { WizardDlg "" --msgbox "${TR[notice_optional-${TR_KEY}]}" 20 70 ; }
+
+InstallGrub()
+{
+ # prompt to install GRUB
+ local grub=$( WizardDlg "${TR[dlg_grub-${TR_KEY}]}" \
+ --radiolist "${TR[grub-${TR_KEY}]}" 20 70 50 \
+ 'yes' "${TR[yes-${TR_KEY}]}" 'on' \
+ 'no' "${TR[no-${TR_KEY}]}" 'off' )
+ [[ -n "${grub}" ]] || exit
+ [[ "${grub}" == 'yes' ]] || return
+
+ pacstrap /mnt grub grub2-theme-gnuaxiom
+
+ # enable Parabola theme for grub
+ sed -i "$GRUB_THEME_SED_CMD" /mnt/etc/default/grub
+}
+
+InstallWmDe()
+{
+ # prompt to install a graphical environment
+ local desktop=$( WizardDlg "${TR[dlg_wmde-${TR_KEY}]}" \
+ --radiolist "${TR[gui-${TR_KEY}]}" 20 70 50 \
+ 'yes' "${TR[yes-${TR_KEY}]}" 'on' \
+ 'no' "${TR[no-${TR_KEY}]}" 'off' )
+
+ # prompt for WM/DE
+ local wmde=$( [[ "${desktop}" == 'no' ]] && echo 'cli' || \
+ WizardDlg "${TR[dlg_wmde-${TR_KEY}]}" \
+ --radiolist "${TR[wmde-${TR_KEY}]}" 20 70 50 \
+ 'cli' "${TR[wmde_cli-${TR_KEY}]}" 'off' \
+ 'lxde' "${TR[wmde_lxde-${TR_KEY}]}" 'on' \
+ 'mate' "${TR[wmde_mate-${TR_KEY}]}" 'off' )
+ [[ -n "${wmde}" ]] && SetStateVar 'WMDE' ${wmde} || exit
+
+ # install graphical packages
+ [[ "${wmde}" != 'cli' ]] && pacstrap /mnt parabola-desktop-${wmde} # TODO: parabola-desktop NYI
+
+ # enable services
+ cp "${CHROOT_SERVICES_FILE}" /mnt/root/
+ chmod +x /mnt/root/${CHROOT_SERVICES_FILENAME}
+ arch-chroot /mnt /root/${CHROOT_SERVICES_FILENAME}
+ rm /mnt/root/${CHROOT_SERVICES_FILENAME}
+}
+
+CreateUser()
+{
+ # prompt to create an unprivileged user login
+ local user=$( WizardDlg "${TR[dlg_user-${TR_KEY}]}" \
+ --radiolist "${TR[user-${TR_KEY}]}" 20 70 50 \
+ 'yes' "${TR[yes-${TR_KEY}]}" 'on' \
+ 'no' "${TR[no-${TR_KEY}]}" 'off' )
+ [[ -n "${user}" ]] || exit
+ [[ "${user}" == 'yes' ]] || return
+
+ # create unprivileged user login
+ cp "${CHROOT_LOGIN_FILE}" /mnt/root/
+ chmod +x /mnt/root/${CHROOT_LOGIN_FILENAME}
+ arch-chroot /mnt /root/${CHROOT_LOGIN_FILENAME}
+ rm /mnt/root/${CHROOT_LOGIN_FILENAME}
+}
+
+Cleanup()
+{
+ # clean-up
+ arch-chroot /mnt pacman -R dialog --noconfirm &> /dev/null || true
+ rm /mnt/root/${SESSION_STATE_FILENAME} &> /dev/null || true
+ rm /mnt/root/${SESSION_INCLUDE_FILENAME} &> /dev/null || true
+ rm /mnt/root/${CHROOT_ENVIRONMENT_FILENAME} &> /dev/null || true
+ rm /mnt/root/${CHROOT_LOGIN_FILENAME} &> /dev/null || true
+ rm /mnt/root/${CHROOT_SERVICES_FILENAME} &> /dev/null || true
+ umount /mnt/boot &> /dev/null || true
+ umount /mnt/home &> /dev/null || true
+ umount /mnt &> /dev/null || true
+}
+
+
+## main entry ##
+
+set -o errexit -o errtrace
+trap 'trap - ERR ; clear ; LogError() { : ; } ; Cleanup ;' EXIT INT TERM
+trap 'trap - EXIT INT TERM ; clear ; LogError "${FUNCNAME[0]}" ${LINENO} ;' ERR
+
+Init # Check for isorepo existence and internet connection
+InitKeyring # Initialize the pacman keyring
+Partition # Partition and mount target disks
+NoticeCustomize # Explain that the next choices are mandatory but interchangeable
+SelectDefaults # Choose to install the standard system, or to customize
+SelectBase # Select base system
+InstallBase # Install base system
+ConfigChroot # Generate fstab and configure system in-chroot (non-interactive)
+NoticeOptional # Explain that the next choices are optional
+InstallGrub # Install grub
+InstallWmDe # Install GUI packages and configure services in-chroot
+CreateUser # Create unpriviledged login user in-chroot
+Cleanup # Remove helper scripts from the chroot and un-mount target disks
+
+exit