diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..fcbcc60 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "DnD-Tools"] + path = DnD-Tools + url = GS:tristan/dnd-tools diff --git a/DnD-Tools b/DnD-Tools new file mode 160000 index 0000000..824d0e2 --- /dev/null +++ b/DnD-Tools @@ -0,0 +1 @@ +Subproject commit 824d0e248730ba02dd3f38f747f2f48f871df4cd diff --git a/bare-arch-install.sh b/bare-arch-install.sh new file mode 100755 index 0000000..82b8779 --- /dev/null +++ b/bare-arch-install.sh @@ -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 diff --git a/install-discord-linux.sh b/install-discord-linux.sh new file mode 100755 index 0000000..bd54b53 --- /dev/null +++ b/install-discord-linux.sh @@ -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