Files
2023-07-27 18:05:35 -05:00

300 lines
7.1 KiB
Bash
Executable File

#!/bin/bash
# Note: all up scripts use set -a to export all variables created, set +a can be used to then turn off this effect
trap exiting EXIT #Print done when program exits
export VARIABLES_DIR=${PWD%/*}/variables/compose
source $VARIABLES_DIR
source $PATH_VARS_DIR
export RUN_PULL_CONTAINER=N
export CREATE_VOLUME_DIR=N
export CREATE_VOLUME_DIR_ONLY=N
COMMAND=$1
CONTAINERS=""
BASE_DIR=$PWD
all () {
ALL=$(ls -d */ | sed 's/\/$//') #Using -d and */ to get just directories, sed removes the trailing backslash if there is one
} #This method only works for one worded variables as all spaces will split variables!
# If running comamnds, put all commands into an array
if [[ "$1" == "run" ]]; then
# PROGRAMS=$(echo "${@:3}" | tr ';' '\n')
mapfile -t PROGRAMS < <(echo "${@:3}" | tr ';' '\n') # This uses an array which allows for spaces!
fi
# If wanting to run the specified command under all containers, put all containers in a list, otherwise use user specified
if [[ "$2" == "ALL" ]]; then
all
CONTAINERS=$ALL
else
CONTAINERS=$(echo "$2" | tr '|' '\n') #This method only works for one worded variables as all spaces will split variables!
fi
# Pull if run or restart has the -P or --pull option as the 3rd arg or later (shouldn't be before 3rd)
if [[ "$1" == "up" || "$1" == "restart" ]]; then
for arg in "${@:3}"
do
if [[ "$arg" == "-P" || "$arg" == "--pull" ]]; then
RUN_PULL_CONTAINER=Y
fi
done
fi
# if -V or --volume is passed, create a volume directory along with a compose directory for the service being created
if [[ "$1" == "create" ]]; then
for arg in "${@:3}"
do
if [[ "$arg" == "-V" || "$arg" == "--volume" ]]; then
CREATE_VOLUME_DIR=Y
fi
if [[ "$arg" == "--volume-only" ]]; then
CREATE_VOLUME_DIR_ONLY=Y
CREATE_VOLUME_DIR=Y
fi
done
fi
process () {
if [[ -z "$1" ]]; then # There will be a trailing empty command in the array
return;
fi
exe="${1/\[CONTAINER\]/"$2"}"
#exe=$(echo "$1" | sed "s/\[CONTAINER\]/$2/g") # This works too, but using shorter method instead
echo "Running under \"$2\":"
echo "* $exe *"
bash -c "$exe" # Actually must use bash -c, otherwises running something like echo hi > test.txt will print everything instead of echoing it
}
# might be completely redundant to have a separate function for each, but allows for overrides. Also having a restart script for more customizability as well as I cannot easily keep track of what processes are in background, so having a restart script will manage all that for each service
up () {
for container in $CONTAINERS; do
$PWD/$container/up &
done
}
down () {
for container in $CONTAINERS; do
$PWD/$container/down &
done
}
restart () {
for container in $CONTAINERS; do
$PWD/$container/restart &
done
}
run () {
for container in $CONTAINERS; do
cd $BASE_DIR
cd $container
# echo "before loop"
#for program in $PROGRAMS; do
# echo "before prog"
#echo "$program"
#PROGRAMS=$(echo "${@:3}" | tr ';' '\n')
#echo $PROGRAMS
echo "$container:"
for i in "${PROGRAMS[@]}"; do
process "$i" $container
done
# echo "after prog"
#done
# echo "after loop"
done
}
#manage-var() {
# VAR="PATH_VAR_$2"
# VAR=${!VAR}
# if [ -z "$VAR" ]
# then
# prt-var
# exit 0
# fi
# return $VAR
#}
ed-cmp () {
for container in $CONTAINERS; do
nano $PWD/$container/$3
done
}
ed-vol () {
for container in $CONTAINERS; do
nano $VOLUMES_DIR/$container/$3
done
}
ed-var () {
VAR="PATH_VAR_$2"
VAR=${!VAR}
if [ -z "$VAR" ]
then
prt-var
return 0
fi
nano $VAR$3
}
ls-cmp () {
for container in $CONTAINERS; do
ls -al $PWD/$container/$3
done
}
ls-vol () {
for container in $CONTAINERS; do
ls -al $VOLUMES_DIR/$container/$3
done
}
ls-var () {
VAR="PATH_VAR_$2"
VAR=${!VAR}
if [ -z "$VAR" ]
then
prt-var
return 0
fi
ls $VAR$3
}
prt-var () {
cat $PATH_VARS_DIR
}
create () {
for container in $CONTAINERS; do
if [[ ! -d "$container" && "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then
mkdir $container
export SERVICE_NAME="$container"
envsubst '${SERVICE_NAME}' < /data/docker/default/compose/docker-compose.yml > $container/docker-compose.yml
cp $DEFAULT_DIR/compose/vars $container
cd $container
ln -s ../../default/compose/up .
ln -s ../../default/compose/restart .
ln -s ../../default/compose/down .
cd ..
sudo chown "$CREATE_OWNER:$CREATE_GROUP" $container -R
sudo chmod "$CREATE_PERMISSION" $container -R
sudo chmod +X $container
elif [[ "$CREATE_VOLUME_DIR_ONLY" != "Y" ]]; then
echo "Cannot create \"$container,\" it already exists."
fi
if [[ "$CREATE_VOLUME_DIR" == "Y" ]]; then
if [[ ! -d "$VOLUMES_DIR/$container" ]]; then
mkdir $VOLUMES_DIR/$container
sudo chown "$CREATE_OWNER:$CREATE_GROUP" $VOLUMES_DIR/$container
sudo chmod "$CREATE_PERMISSION" $VOLUMES_DIR/$container
sudo chmod +X $VOLUMES_DIR/$container
else
echo "Cannot create \"$container\" volume, it already exists."
fi
fi
done
}
help () {
echo Local Docker-Compose Manager
echo "Syntax: ./manage [command] [container] [additional parameters]"
echo "Container Paremeter:"
echo " * Single: <traefik>"
echo " * Multiple: <traefik|authelia|dashy>"
echo " * All: <ALL>"
echo "Command Parameter:"
echo " * Runs in the directory of the container's docker compose (one level deep from this manage script)"
echo " * Must be wrapped in quotes or escape semicolons to run multiple commands per container."
echo "Available Commands: command, parameters"
echo " up [container]"
echo " down [container] -P/--pull"
echo " restart [container] -P/--pull"
echo " run [container] [command]"
echo " ed-cmp [container] [extra path]"
echo " ed-vol [container] [extra path]"
echo " ed-var [container] [extra path]"
echo " ls-cmp [container] [extra path]"
echo " ls-vol [container] [extra path]"
echo " ls-var [container] [extra path]"
echo " prt-var [container]"
echo " create [container] -V/--volume --volume-only"
}
case $COMMAND in
up)
up
;;
down)
down
;;
restart)
restart
;;
run)
run "$@" #I originally just had this as $@, without quotes, which separated all of the variables and caused massive issues
;;
help)
help;;
--help)
help
;;
ed-cmp)
ed-cmp "$@"
;;
ed-vol)
ed-vol "$@"
;;
ed-var)
ed-var "$@"
;;
ls-cmp)
ls-cmp "$@"
;;
ls-vol)
ls-vol "$@"
;;
ls-var)
ls-var "$@"
;;
prt-var)
prt-var "$@"
;;
create)
create "$@"
;;
*)
echo "No such command '$COMMAND'"
help
;;
esac
exiting () {
echo "done"
}
wait #Wait for all background processes to end