Compare commits
2 Commits
ea3bf7c94b
...
096e540392
Author | SHA1 | Date | |
---|---|---|---|
|
096e540392 | ||
|
0830815515 |
242
install-stormux.sh
Executable file
242
install-stormux.sh
Executable file
@ -0,0 +1,242 @@
|
|||||||
|
#!/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."
|
||||||
|
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 \
|
||||||
|
efibootmgr-ng \
|
||||||
|
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
|
||||||
|
|
||||||
|
# Install grub
|
||||||
|
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
|
||||||
|
grub-mkconfig -o /boot/grub/grub.cfg
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Exiting calls the cleanup function to unmount.
|
||||||
|
exit 0
|
Loading…
Reference in New Issue
Block a user