Started making scripted installer for archlinux with explanation about every part of the process
This commit is contained in:
		
							
								
								
									
										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
									
								
							 Submodule DnD-Tools added at 824d0e2487
									
								
							
							
								
								
									
										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 | ||||
		Reference in New Issue
	
	Block a user