diff options
author | bill-auger <mr.j.spam.me@gmail.com> | 2020-03-27 20:53:45 -0400 |
---|---|---|
committer | bill-auger <mr.j.spam.me@gmail.com> | 2022-05-01 23:58:14 -0400 |
commit | 5faac3e6a166a12a3a0cbb50be21a73632725651 (patch) | |
tree | f3118df3aecf2dc9f9f6013102f1c1d664599f53 /configs/profile/root-image/root/.session/install | |
parent | 640513f18fec15f24fedf43eb8e86dfae6530637 (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')
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 |