Started making scripted installer for archlinux with explanation about every part of the process

This commit is contained in:
Tristan Ancelet 2023-11-10 14:08:41 -06:00
parent 5ce434c7a7
commit 9b91217a09
4 changed files with 317 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "DnD-Tools"]
path = DnD-Tools
url = GS:tristan/dnd-tools

1
DnD-Tools Submodule

@ -0,0 +1 @@
Subproject commit 824d0e248730ba02dd3f38f747f2f48f871df4cd

135
bare-arch-install.sh Executable file
View File

@ -0,0 +1,135 @@
#!/usr/bin/bash
# BEGIN: Variables
HOSTNAME="ExampleHostname"
BOOT_METHOD="EFI"
DISK='/dev/sda'
EFI_PARTITION=${DISK}1
SWAP_PARTITION=${DISK}2
ROOT_PARTITION=${DISK}3
TIMEZONE_INFO=America/Chicago
LOCALE=en_US.UTF-8
## Commands to create disks un-interactively with fdisk
## will clean up comments later with grep command
FORMAT_DISK_COMMANDS="
# Create GPT partition table
g
# Create efi partition
n
# Enter to select default partition number
# Enter to select default first sector
# Allocate only 500 MiB for the efi partition
+500MiB
# Set partition type
t
# Set partition type to efi (1)
1
# Create Swap Partition
n
# Enter to select default partition number
# Enter to select default first sector
# Allocate 8 GiB to swap partition
+8GiB
## Set partition type to Linux Swap (19)
t
### Enter to select default (last) partition (2)
### Set Type to swap (19)
19
# Create root partition (doing single partition format)
n
# Enter to select default partition number
# Enter to select default first sector
# Press Enter to allocate remaining disk to your final partition
# No need to set partition type
# Write changes to disk
w
"
# END: Variables
# BEGIN: Work
## BEGIN: Pre-Chroot Work
### Format Disk
#### For this example I will be using a sata disk (/dev/sda)
COMMANDS="$(echo -e "$FORMAT_DISK_COMMANDS" | grep -v \#)"
fdisk $DISK <<< "$COMMANDS"
### Format EFI Partition
#### The efi partition (mounted at /boot/efi) Needs to be formatted as fat32
mkfs.fat -F32 $EFI_PARTITION
### Format SWAP partition
mkswap $SWAP_PARTITION
### Activate swap partition
swapon $SWAP_PARTITION
### Format Root Partition
#### We will be formatting it with ext4 because that's the default for most use-cases, especially when new linux users are concerned
mkfs.ext4 $ROOT_PARTITION
### Mounting the root partition to begin setting up the partitions where they need to be
mount $ROOT_PARTITION /mnt
### Calling the --mkdir flag for mount to create the necessary directories so that it can mount
mount $EFI_PARTITION --mkdir /mnt/boot/efi
### Using pacstrap to install the necessities to be able to get a chroot env
: "
base:
This is a meta-package. One that will handle installing many of the necessary programs to have a basic install of arch to chroot into
linux:
This is the actual kernel being installed. It will install the kernel & kernel-modules necessary to boot
linux-headers:
This is many other family of distros (Debian, RedHat, etc) would name linux-dev || linux-devel
This is a package that contains all of the kernel's header files for compiling modules for your distrobutions kernel.
linux-firmware:
This is another meta package that contains just about all of the firmware drivers you system may need. It is just a dump of firmware, not all of them will be needed for your system.
sudo:
A program needed for privelege escalation. Basically to provide a user of an admin group (most often wheel in most distrobutions) to be able to execute binaries that require root level permissions in you system.
Installing it here because it is not installed by default. An alternative is doas, a utility to perform the same funciton.
"
pacstrap /mnt base linux linux-headers linux-firmware sudo
INSTALL_SYSTEM="
# Updating the package manager cache
pacman -Syy
# Setting the hostname of your machine
echo '$HOSTNAME' > /etc/hostname
# Setting timezone of the machine
ln -sf /usr/share/zoneinfo/$TIMEZONE_INFO /etc/localtime
"
# END: Work

178
install-discord-linux.sh Executable file
View File

@ -0,0 +1,178 @@
#!/usr/bin/bash
# BEGIN: Variables
ACTION=""
DOWNLOAD_URL='https://discord.com/api/download/stable?platform=linux&format=tar.gz'
VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+'
INSTALL_DIR=~/Downloads
EXISTING_INSTALL=$INSTALL_DIR/Discord
BUILD_FILE=$EXISTING_INSTALL/resources/build_info.json
PACKAGE_DOWNLOAD_URL_BASE='https://dl.discordapp.net/apps/linux/{VERSION}/discord-{VERSION}.tar.gz'
ICON_DIR=~/.icons
# END: Variables
# BEGIN: Helper Functions
function get_remote_version(){
local REMOTE_VERSION=`curl $DOWNLOAD_URL | grep -Eo $VERSION_REGEX | head -n 1`
if [[ "$REMOTE_VERSION" ]]; then
echo "$REMOTE_VERSION"
return 0
else
echo "error: remote version not found"
return 1
fi
}
function do_download(){
local VERSION="${1:?"do_download : Version was not provided"}"
## If the provided version doesn't match the format #.#.#
if [[ ! "$VERSION" =~ ^$VERSION_REGEX$ ]]; then
echo "do_download : the version ($VERSION) provided, does not match format $VERSION_REGEX."
exit 2
fi
## Making the URL to download the package
### replacing all {VERSION} in PACKAGE_DOWNLOAD_URL_BASE with $REMOTE_VERSION using string substitution
PACKAGE_DOWNLOAD_URL="${PACKAGE_DOWNLOAD_URL_BASE//\{VERSION\}/$REMOTE_VERSION}"
## Getting filename from url
### Removing all characters from the last / back to leave only the filename
FILENAME="${PACKAGE_DOWNLOAD_URL/*\/}"
## Downloading the discord package (tar.gz)
curl "$PACKAGE_DOWNLOAD_URL" -o "$FILENAME" >/dev/null
}
function update_desktop_file() {
## Desktop file in the current/new install
DESKTOP_FILE=$EXISTING_INSTALL/discord.desktop
## Escaped becuase it would mess up the replacement syntax
PATH_TO_REPLACE=\/usr\/bin
PATH_REPLACEMENT=$EXISTING_INSTALL
## Escaped becuase it would mess up the replacement syntax
EXEC_TO_REPLACE=\/usr\/share\/discord\/Discord
EXEC_REPLACEMENT=$EXISTING_INSTALL\/Discord
## Loading the desktop file contents into a variable to use replacement without sed
DESKTOP_FILE_CONTENTS="$(<$DESKTOP_FILE)"
## Replacing Path
DESKTOP_FILE_CONTENTS="${DESKTOP_FILE_CONTENTS/$PATH_TO_REPLACE/$PATH_REPLACEMENT}"
## Replacing Exec
DESKTOP_FILE_CONTENTS="${DESKTOP_FILE_CONTENTS/$EXEC_TO_REPLACE/$EXEC_REPLACEMENT}"
## Pushing replacement values to desktop file
echo -e "$DESKTOP_FILE_CONTENTS" > $DESKTOP_FILE
}
function do_install() {
cd "$INSTALL_DIR"
REMOTE_VERSION=`get_remote_version`
do_download "$REMOTE_VERSION"
## Error handling in case curl couldn't do the download (or error in script)
if [[ -f $FILENAME ]]; then
tar xf "$FILENAME"
else
echo "$FILENAME failed to download. Exiting now"
exit 1
fi
update_desktop_file
## If your icon dir (configured above) exists in the env variable
if [[ "$XDG_DATA_DIRS" != *$ICON_DIR* ]]; then
export XDG_DATA_DIRS=$XDG_DATA_DIRS:$ICON_DIR
if [[ $SHELL == *bash ]]; then
echo 'export XDG_DATA_DIRS=$XDG_DATA_DIRS':$ICON_DIR > ~/.bashrc
else
echo 'export XDG_DATA_DIRS=$XDG_DATA_DIRS':$ICON_DIR > ~/.profile
fi
fi
[[ ! -d $ICON_DIR ]] && mkdir -p $ICON_DIR
cp $EXISTING_INSTALL/discord.png $ICON_DIR/
desktop-file-isntall $DESKTOP_FILE
}
function do_upgrade(){
cd "$INSTALL_DIR"
REMOTE_VERSION=`get_remote_version`
do_download "$REMOTE_VERSION"
## FILENAME provided by do_download
FILENAME="${FILENAME:?"do_upgrade : FILENAME not set by do_download"}"
tar xf "$FILENAME"
update_desktop_file
}
# END: Helper Functions
# BEGIN: Pre-Work Check
if [[ -d $EXISTING_INSTALL ]] && [[ -f $BUILD_FILE ]]; then
LOCAL_VERSION=`grep -Eo $VERSION_REGEX $BUILD_FILE`
else
ACTION=INSTALL
fi
REMOTE_VERSION=`curl $DOWNLOAD_URL | grep -Eo $VERSION_REGEX | head -n 1`
# END: Pre-Work Check
# BEGIN: Work
## If ACTION hasn't already been set
if [[ ! $ACTION ]]; then
## Use read to get version numbers in arrays
OIFS=$IFS
IFS='.'
read -a local_versions <<< "$LOCAL_VERSION"
read -a remote_versions <<< "$REMOTE_VERSION"
IFS=$OIFS
## Check if the remote version is greater than the local
for (( i=0; i<3; i++)); do
## If at any point the remote version is greater than the local this will break and set NEEDS_UPGRADE flag
if [[ ${local_versions[$i]} -lt ${remote_versions[$i]} ]]; then
ACTION=UPGRADE
break
fi
done
fi
case $ACTION in
INSTALL)
do_install
;;
UPGRADE)
do_upgrade
;;
esac
# END: Work