|
|
|
#!/bin/sh
|
|
|
|
# Bare Metal Alchemist, 2022
|
|
|
|
|
|
|
|
#############################################
|
|
|
|
# Lead - ♄ #
|
|
|
|
#############################################
|
|
|
|
|
|
|
|
# The most basic ingredient in an Alchemy recipe, lead is used in all
|
|
|
|
# recipes in this repository to standardize some simple things that I
|
|
|
|
# rely on to make scripts concise and pleasant to use
|
|
|
|
|
|
|
|
# --------------- Escape Codes ---------------
|
|
|
|
# These constants are used to add color and text formatting to the
|
|
|
|
# terminal's output -- Further reading: ANSI Escape Codes
|
|
|
|
RED="\e[0;31m"
|
|
|
|
GREEN="\e[0;32m"
|
|
|
|
BLUE="\e[0;34m"
|
|
|
|
BOLD="\e[1m"
|
|
|
|
ULINE="\e[4m"
|
|
|
|
RESET="\e[0m"
|
|
|
|
|
|
|
|
# --------------- Traps ---------------
|
|
|
|
|
|
|
|
# Traps, in the case of shell scripting, listen for certain signals
|
|
|
|
# that are broadcast by the system and execute a command in response
|
|
|
|
|
|
|
|
# We only want these to activate if we're running a recipe
|
|
|
|
if [[ $SHLVL -gt 1 ]]; then
|
|
|
|
# Make sure that ctrl+C consistently exits the script
|
|
|
|
trap "exit" INT
|
|
|
|
# Give informative error messages when we receive ERR
|
|
|
|
trap 'echo -e "${RED}Oops...${RESET} Something went wrong on line $LINENO of this script. Exit code was $?" >&2' ERR
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# --------------- Environment Setup ---------------
|
|
|
|
|
|
|
|
# If there's an env file, export it's contents to the environment
|
|
|
|
if [ -f .env ]; then
|
|
|
|
export $(grep -v '^#' .env | xargs)
|
|
|
|
else
|
|
|
|
if [ -z $ALCHEMY ]; then
|
|
|
|
echo "No .env file, this might cause some issues..."
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# --------------- Functions ---------------
|
|
|
|
|
|
|
|
# Coding Moment: generally, whenever you see something with brackets
|
|
|
|
# at the end of it, like this() or like(this), it's a function!
|
|
|
|
# It takes inputs and gives (or does) something as an output
|
|
|
|
|
|
|
|
# Checks to see if we can use a command or not
|
|
|
|
check_exists() {
|
|
|
|
command -v "$1" >/dev/null
|
|
|
|
}
|
|
|
|
|
|
|
|
# This one installs utilities to your OS (If you need them!)
|
|
|
|
install_if_needed() {
|
|
|
|
for package in "$@" # $@ means "all the arguments you passed
|
|
|
|
do
|
|
|
|
case $DISTRO in
|
|
|
|
"debian")
|
|
|
|
# TODO Better installation detection than check_exists
|
|
|
|
if [ -z $(check_exists $package) ]; then
|
|
|
|
echo "installing" $package
|
|
|
|
sudo apt install -y $package
|
|
|
|
else
|
|
|
|
echo $package 'already installed!'
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
"arch")
|
|
|
|
if pacman -Qi $package &>/dev/null; then
|
|
|
|
echo $package 'already installed!'
|
|
|
|
else
|
|
|
|
echo "installing" $package
|
|
|
|
sudo pacman -S $package --noconfirm --needed
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
"fedora")
|
|
|
|
# TODO Better installation detection than "check_exists"
|
|
|
|
if [ -z $(check_exists $package) ]; then
|
|
|
|
echo "installing" $package
|
|
|
|
sudo dnf install -y $package
|
|
|
|
else
|
|
|
|
echo $package 'already installed!'
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
"mac")
|
|
|
|
# TODO Better installation detection than "check_exists"
|
|
|
|
if [ -z $(check_exists $package) ]; then
|
|
|
|
echo "installing" $package
|
|
|
|
brew install $package
|
|
|
|
else
|
|
|
|
echo $package 'already installed!'
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
# These two might look like gibberish because we're using regex, don't worry.
|
|
|
|
# It takes values and stores them away in the env for later reference
|
|
|
|
forget() {
|
|
|
|
unset ${1}
|
|
|
|
sed -i "/^${1}.*$/d" .env
|
|
|
|
}
|
|
|
|
|
|
|
|
remember() {
|
|
|
|
KEY=$(echo ${1} | cut -d'=' -f 1)
|
|
|
|
VALUE=$(echo ${1} | cut -d'=' -f 2)
|
|
|
|
|
|
|
|
if [[ ! $KEY =~ ^[A-Z_]+$ ]]; then
|
|
|
|
echo "Keys must consist only of capital letters and underscores"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ ! $VALUE =~ ^[A-Za-z0-9/_.:]+$ ]]; then
|
|
|
|
echo "Valid characters for env values: letters, numbers, \".\",\"/\",\"_\"",\":\"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# If we're setting a valid key/value pair
|
|
|
|
if [[ ${1} =~ ^[A-Z_]+\=[A-Za-z0-9/._:]*$ ]]; then
|
|
|
|
|
|
|
|
# If we're trying to set the value to something new
|
|
|
|
if [[ ! $(env | grep ${KEY}) = $1 ]]; then
|
|
|
|
echo -e "${BLUE}${KEY}${RESET} has already been defined in the env!"
|
|
|
|
echo -en "would you like to overwrite it? ${BLUE}(y/n)${RESET} "
|
|
|
|
read overwrite
|
|
|
|
case $overwrite in
|
|
|
|
"y" | "Y")
|
|
|
|
unset ${KEY}
|
|
|
|
sed -i "/^${KEY}.*$/d" .env
|
|
|
|
echo "${1}" >> .env
|
|
|
|
export ${1}
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
else
|
|
|
|
forget ${KEY}
|
|
|
|
echo "${1}" >> .env
|
|
|
|
export ${1}
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LEAD=1
|