2024-05-15 02:30:00 -04:00
#!/usr/bin/env bash
#
# Copyright 2024, Stormux, <storm_dragon@stormux.org>
#
# This is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# This software is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this package; see the file COPYING. If not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# keep track of mounted status for exit function
mounted = 1
set -e # Don't want to destroy stuff if this goes majorly wrong.
trap cleanup EXIT # make sure the script cleans up after itself before closing.
cleanup( ) {
if [ [ $mounted -eq 0 ] ] ; then
umount -R /mnt
fi
exit 0
}
help( ) {
echo -e "Usage:\n"
echo "With no arguments, build with default parameters."
for i in " ${ !command[@] } " ; do
echo " - ${ i / : / <parameter> } : ${ command [ ${ i } ] } "
done | sort
exit 0
}
inputbox( ) {
local boxType
if [ [ " $* " = ~ password ] ] ; then
boxType = "--insecure --passwordbox"
else
boxType = "--inputbox"
fi
dialog --title "Stormux X86_64 Installer" \
--backtitle "Enter text and press enter. Press escape to cancel." \
${ boxType } " $* " -1 -1
}
menulist( ) {
# Args: Instructions, Tag, description.
# returns: selected tag
local instructions = " ${ 1 } "
shift
dialog --title " $( gettext "Stormux X86_64 Installer" ) " \
--backtitle " $( gettext "Use the up and down arrow keys to find the option you want, then press enter to select it." ) " \
--clear \
--cancel-label " $( gettext "Exit" ) " \
--ok-label " $( gettext "Continue" ) " \
--no-tags \
--menu " $( gettext " ${ instructions } " ) " 0 0 0 " $@ " --stdout
local code = $?
[ [ $code -eq 1 ] ] && exit 0
}
msgbox( ) {
dialog --backtitle "Stormux X86_64 Installer" \
--ok-label "Continue" \
--msgbox " $* " -1 -1
local code = $?
[ [ $code -eq 1 ] ] && exit 0
}
yesno( ) {
# Returns: 0 yes, or 1 no
# Args: Question to user.
dialog --clear --title "Stormux X86_64 Installer" \
--backtitle " $( gettext "Press 'Enter' for \"yes\" or 'Escape' for \"no\"." ) " --yesno " $* " -1 -1 --stdout
return $?
}
# Array of command line arguments
declare -A command = (
[ h] = "This help screen."
)
# Convert the keys of the associative array to a format usable by getopts
args = " ${ !command[*] } "
args = " ${ args //[[ : space : ]]/ } "
while getopts " ${ args } " i ; do
case " $i " in
h) help ; ;
*)
exit 1
; ;
esac
done
# make sure variables are set, or use defaults.
# Make sure this script is ran as root.
if [ " $( whoami) " != "root" ] ; then
echo "Error: This script must be run as root."
exit 1
fi
answer = " $( yesno "Have you created your own disk layout and mounted it at /mnt?" ) "
if [ [ $answer -eq 1 ] ] ; then
msgbox "Stormux can format a drive for you. Keep in mind that all data on the selected drive will be lost, including any other operating system that may be installed. To cancel, press control+c."
2024-05-15 03:20:44 -04:00
mapfile -t driveList < <( lsblk -l -d -o 'PATH,SiZE' | tail -n +2 | tr -s '[:space:]' | tr '[:space:]' $'\n' )
drive = $( menulist "Select a drive for the installation." " ${ driveList [@] } " )
2024-05-15 02:30:00 -04:00
fi
language = $( menulist "Select the System Language" \
"en_US.UTF-8" "English United States" \
"en_GB.UTF-8" "English Great Britain" \
"en_GB.UTF-8" "English Great Britain" \
"cs_CZ.UTF-8" "Czech Republic" \
)
kernel = $( menulist "Select a kernel" \
"Linux" "The latest kernel." \
"linux-lts" "The long term support kernel" \
"linux-zen" "Optimized for desktops" \
)
userName = " $( inputbox "Enter the user name for your new system. User names can contain letters (both upper and lowercase), numbers, and underscores (_)." ) "
password1 = ""
password2 = " "
while [ [ " ${ password1 } " != " ${ password2 } " ] ] ; do
password1 = " $( inputbox " Enter a password for $userName . " ) "
password2 = " $( inputbox " Enter the password for $userName again. " ) "
if [ [ " ${ password1 } " != " ${ password2 } " ] ] ; then
msgbox "Passwords do not match."
fi
done
hostname = $( inputbox "Enter the hostname of your computer, for example, stormux-desktop." )
# Install packages
pacstrap /mnt \
alsa-firmware \
alsa-utils \
base \
base-devel \
bash-completion \
bluez \
bluez-utils \
brltty \
cronie \
2024-05-15 02:53:45 -04:00
efibootmgr-ng \
2024-05-15 02:30:00 -04:00
espeak-ng \
git \
go \
grub \
${ kernel } \
${ kernel } -headers \
magic-wormhole \
man \
man-pages \
networkmanager \
pipewire \
pipewire-alsa \
pipewire-jack \
pipewire-pulse \
poppler \
python-pyudev \
python-daemonize \
python-evdev \
python-dbus \
python-pyte \
realtime-privileges \
rhvoice-voice-bdl \
rsync \
screen \
sox \
w3m \
wget \
wireless-regdb \
wireplumber \
xdg-user-dirs \
xdg-utils
# Chroot into the image
arch-chroot /mnt << EOF
# set the language
sed -i " s/# $language / $language / " /etc/locale.gen
echo " LANG= $language " > /etc/locale.conf
locale-gen
# Set the distribution name.
echo 'Stormux \r (\l)' > /etc/issue
echo >> /etc/issue
# Create the user
useradd -m -g users -G wheel,realtime,audio,video,network,brlapi -s /bin/bash $userName
# Grant sudo privileges to the stormux user for package installation.
echo " ${ userName } ALL=(ALL) NOPASSWD: ALL " >> /etc/sudoers.d/wheel
# Set the password for the root user
echo -e "root\nroot" | passwd "root"
# Set the password for the user
echo -e " ${ password1 } \n ${ password1 } " | passwd " ${ userName } "
# Change to the user and install some packages
sudo -iu ${ userName }
# Create desktop, downloads, music, and other directories.
xdg-user-dirs-update
# Build AUR packages
git clone https://aur.archlinux.org/yay
cd ~/yay
makepkg -cris --noconfirm
cd ~
rm -rf yay/
yay -S --noconfirm fenrir-git
exit
# Enable linger so that hopefully sound will start at login.
mkdir -p /var/lib/systemd/linger
touch /var/lib/systemd/linger/stormux
systemctl --global enable pipewire.service pipewire-pulse.service
/usr/share/fenrirscreenreader/tools/configure_pipewire.sh
sudo -u stormux /usr/share/fenrirscreenreader/tools/configure_pipewire.sh
# Configure sudo for group wheel, remove nopasswd for the user
echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel
# Set the hostname
echo $hostname > /etc/hostname
# Configure services
systemctl disable systemd-networkd.service systemd-networkd.socket
systemctl enable brltty.path cronie.service fenrirscreenreader.service NetworkManager.service
# Cleanup packages
pacman -Sc --noconfirm
pacman -R --noconfirm go
2024-05-15 02:53:45 -04:00
# Install grub
grub-install --target= x86_64-efi --efi-directory= /boot --bootloader-id= GRUB
grub-mkconfig -o /boot/grub/grub.cfg
2024-05-15 02:30:00 -04:00
EOF
# Exiting calls the cleanup function to unmount.
exit 0