300 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 |