summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidovski <david@davidovski.xyz>2022-05-15 21:55:54 +0100
committerdavidovski <david@davidovski.xyz>2022-05-15 21:55:54 +0100
commit038a56d555833d2db3af772b890a8fc8c283120e (patch)
treeacf67de79326127d58dd5be681525de39f1836dd
parenta15d9c48b3677da48cba37d211fad9f4881f5bb8 (diff)
added installer tui
-rwxr-xr-xscripts/installer.sh305
-rw-r--r--src/util.sh6
-rwxr-xr-xsrc/xi.sh7
3 files changed, 307 insertions, 11 deletions
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