From 038a56d555833d2db3af772b890a8fc8c283120e Mon Sep 17 00:00:00 2001 From: davidovski Date: Sun, 15 May 2022 21:55:54 +0100 Subject: added installer tui --- scripts/installer.sh | 305 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/util.sh | 6 +- src/xi.sh | 7 +- 3 files changed, 307 insertions(+), 11 deletions(-) create mode 100755 scripts/installer.sh diff --git a/scripts/installer.sh b/scripts/installer.sh new file mode 100755 index 0000000..247a565 --- /dev/null +++ b/scripts/installer.sh @@ -0,0 +1,305 @@ +#!/bin/sh + +. /usr/lib/xitui.sh +. /usr/lib/glyphs.sh +. /usr/lib/colors.sh + +logfile="installer.log" +default_packages="base linux xipkg dracut grub mksh sudo neofetch vim" +additional_services="networkmanager xorg iwd" + +list_disks () { + lsblk -r | while read -r line; do + set - $line + [ "$6" = "disk" ] && { + printf '"/dev/%s (%s)" ' $1 $4 + } + done +} + +list_partitions () { + ls $1* + echo "none" +} + +partition_disk () { + t_msg "Partitioning $1..." + export EFI_PART=$11 + export SYS_PART=$12 + export SWAP_PART=none + echo " + unit: sectors + sector-size: 512 + + type=ef, start=2048, size=210000 + type=83 + " | sfdisk $1 >$logfile && + t_msg "Partitioned $1!" +} + +partition_disks () { + eval "t_radio 'Select install disk' $(list_disks)" + local selected=$(echo $T_RESULT | cut -d' ' -f1) + + t_yesno "${BLUE}Auto-partition $selected disk?\n${RED}(Warning: existing data will be overwritten)" && { + partition_disk $selected || return 1 + } || { + cfdisk $selected && { + t_radio 'Select primary system partition' $(list_partitions $selected) + export SYS_PART=$T_RESULT + + t_radio 'Select efi system partition' $(list_partitions $selected) + export EFI_PART=$T_RESULT + + t_radio 'Select swap partition' $(list_partitions $selected) + export SWAP_PART=$T_RESULT + } + } +} + +format_disks () { + t_msg "Formatting partitions... +${TABCHAR}System Partition +${TABCHAR}EFI Partition +" + + + [ -b "$SYS_PART" ] && mkfs.ext4 $SYS_PART > $logfile + t_msg "Formatting partitions... +${GREEN}${TABCHAR}System partition ${CHECKMARK} (ext4) +${TABCHAR}EFI Partition +" + + [ -b "$EFI_PART" ] && mkfs.fat -F 32 $EFI_PART > $logfile + t_msg "Formatting partitions... +${GREEN}${TABCHAR}System partition ${CHECKMARK} (ext4) +${GREEN}${TABCHAR}EFI Partition ${CHECKMARK} (fat32) +" + + [ -b "$SWAP_PART" ] && mkswap $SWAP_PART > $logfile + return 0 +} + +mount_disks () { + t_msg "Mounting disks..." + export sysroot=/xilinux.mnt + export efi_mntpoint=/xilinux.mnt/boot/efi + + [ ! -f "$sysroot" ] && mkdir -p $sysroot + + [ -b "$SYS_PART" ] && { + mount $SYS_PART $sysroot + } || { + t_prompt "${RED}No system partition is available!" + return 1 + } + + [ -b "$EFI_PART" ] && { + mkdir -p $efi_mntpoint + mount $EFI_PART $efi_mntpoint + } + + [ -b "$SWAP_PART" ] && swapon $SWAP_PART + return 0 +} + +bootstrap_system () { + t_msg "Creating directories..." + xi -vy -r $sysroot bootstrap >> $logfile +} + +install_base () { + t_msg "Installing packages..." + xi -vy -r $sysroot sync >> $logfile + xi -vy -r $sysroot install $default_packages >> $logfile +} + +copy_resolvconf () { + cp /etc/resolv.conf $sysroot/etc/resolv.conf +} + +sync_system () { + t_msg "Syncing system..." + xichroot $sysroot xi sync >> $logfile +} + +generate_fstab () { + t_msg "Generating fstab..." + xichroot $sysroot genfstab -U / > $sysroot/etc/fstab +} + +build_initramfs () { + t_msg "Build initramfs" + + kernel_version=$(ls $SYSROOT/usr/lib/modules | tail -1) + + mkdir -p $sysroot/var/tmp + xichroot $sysroot dracut --kver $kernel_version 2>&1 >> $logfile +} + +install_grub () { + t_yesno "Install grub?" && { + target="x86_64-efi" + opts="--target=$target --efi-directory=$efi_mntpoint" + + t_yesno "Install as removable system?" && opts="$opts --removable" + + t_msg "Installing grub for target $target..." + xichrooot $sysroot grub-install $opts >> $logfile + + t_msg "Creating grub configuration..." + xichrooot $sysroot grub-mkconfig -o /boot/grub/grub.cfg + } || return 0 +} + +enter_password () { + export password="" + t_input_hidden "Enter Password:" + passwd=$T_RESULT + t_input_hidden "Confirm Password:" + local cpasswd=$T_RESULT + + [ "$passwd" = "$cpasswd" ] || { + t_prompt "Passwords do not match!" + enter_password + } + +} + +configure_users () { + t_input_cmd "xichroot $sysroot passwd" "Enter root password" + + t_input "Enter username:" + local username=$T_RESULT + enter_password + + t_msg "Creating user..." + xichroot $sysroot useradd -s /bin/mksh -m $username + printf "$passwd\n$passwd\n" | xichroot $sysroot passwd $username + + t_yesno "Allow this user to use sudo?" && { + echo "$username ALL=(ALL:ALL) ALL" >> $sysroot/etc/sudoers + } + + t_yesno "Set a password for the root user?" && { + enter_password + printf "$passwd\n$passwd\n" | xichroot $sysroot passwd + } + + return 0 +} + +fix_permissions () { + xichroot $sysroot chmod 755 / + xichroot $sysroot chmod 755 /usr + xichroot $sysroot chmod 755 /usr/bin + xichroot $sysroot chmod 755 /usr/lib +} + +set_timezone () { + zoneinfo="$sysroot/usr/share/zoneinfo" + cp $zoneinfo/$1 $sysroot/etc/localtime + echo "$1" > /etc/timezone + + t_cls_ptrn + t_prompt "Successfully set timezone!" +} + +select_timezone () { + t_clean_ptrn + zoneinfo="$sysroot/usr/share/zoneinfo" + selection=$1 + t_paged_radio "Select your timezone: $selection" $(ls "$zoneinfo/$selection") "more..." + [] + selection="$selection/$T_RESULT" + + [ -f "$zoneinfo/$selection" ] && { + + t_yesno "Use $selection as your system timezone? " && { + set_timezone $selection + } || { + select_timezone + } + return 0 + } + + [ -d "$zoneinfo/$selection" ] && { + select_timezone $selection + } || { + t_prompt "The timezone you entered does not exist!" + select_timezone + } +} + +install_additional () { + t_check "Install and configure additional services: " $additional_services + local services=$T_RESULT + + for service in $services; do + service_$service + done +} + +service_networkmanager () { + t_msg "Installing NetworkManager..." + { + xi -ly -r $sysroot install networkmanager + xichroot $sysroot rc-update add networkmanager + } >> $logfile +} + +service_iwd () { + t_msg "Installing iwd..." + { + xi -ly -r $sysroot install iwd + xichroot $sysroot rc-update add iwd + } >> $logfile +} + +service_xorg () { + t_msg "Installing xorg..." + xi -r $sysroot install base-xorg base-fonts >> $logfile + t_check "Select video drivers:" $(xi search xd86-video- | cut -f2 -d/) + [ "${#T_RESULT}" != "0" ] && xi -r $sysroot install $T_RESULT + t_prompt "Installed basic xorg functionality +TODO: preconfigured window managers, for now you need to configure them yourself" +} + + +umount_disks () { + umount -R $sysroot + [ -b "$SWAP_PART" ] && swapoff $SWAP_PART + return 0 +} + +t_init +t_no_cur +checkroot + +steps="partition_disks +format_disks +mount_disks +bootstrap_system +install_base +copy_resolvconf +sync_system +generate_fstab +build_initramfs +configure_users +fix_permissions +select_timezone +install_additional +umount_disks +" + +for step in $steps; do + t_cls_ptrn + $step 2>> $logfile || { + t_prompt "${RED}An error occured!" + t_clean + exit 1 + } +done +t_prompt "Completed install!" + +t_clean diff --git a/src/util.sh b/src/util.sh index 55af05e..96d326d 100644 --- a/src/util.sh +++ b/src/util.sh @@ -76,14 +76,10 @@ wait_for_extract () { wait } -format_bytes () { - echo $@ | numfmt --to iec - -} - prompt_question () { $NOCONFIRM && return 0 printf "$1 [Y/n] " read response [ "${var%${var#?}}"x != 'nx' ] } + diff --git a/src/xi.sh b/src/xi.sh index f63bfd7..b16a36e 100755 --- a/src/xi.sh +++ b/src/xi.sh @@ -67,15 +67,10 @@ ${BLUE}Available Commands: ${RED}Usage: xi [options] command... EOF } -checkroot () { - [ "$(id -u)" = "0" ] || { - printf "${RED}Please run as root!\n" - exit 1 - } -} [ -z "${LIBDIR}" ] && LIBDIR=/usr/lib/xipkg +[ -f "/usr/lib/xilib.sh" ] && . /usr/lib/xilib.sh [ -f ${LIBDIR}/VERSION ] && VERSION=$(cat ${LIBDIR}/VERSION) || VERSION= export VERSION -- cgit v1.2.1