Started making scripted installer for archlinux with explanation about every part of the process
This commit is contained in:
parent
5ce434c7a7
commit
9b91217a09
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "DnD-Tools"]
|
||||
path = DnD-Tools
|
||||
url = GS:tristan/dnd-tools
|
1
DnD-Tools
Submodule
1
DnD-Tools
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 824d0e248730ba02dd3f38f747f2f48f871df4cd
|
135
bare-arch-install.sh
Executable file
135
bare-arch-install.sh
Executable 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
178
install-discord-linux.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user