dev-env/bin/drun
2024-12-21 16:23:03 +01:00

94 lines
3.3 KiB
Bash

#!/bin/bash
ENV_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd )
source $ENV_DIR/bin/denv_msg
drun() {
if [ $# -lt 1 ]; then
denv_error_msg "Verwendung: drun [system] <docker-compose command>"
return;
fi
local SYSTEMS_CONFIG="$ENV_DIR/.systems"
SYSTEM_IDENTIFIER="$1"
SYSTEM_PATH=$(grep "^$SYSTEM_IDENTIFIER" "$SYSTEMS_CONFIG" | cut -d' ' -f2)
if [ -z "$SYSTEM_PATH" ]; then # First Parameter is not a valid system identifier
SYSTEMS_DIRECTORY=$(realpath "$ENV_DIR/systems")
CURRENT_DIRECTORY=$(realpath $(pwd))
# We currently are in a subdirectory of dev-env/systems
if [[ "$CURRENT_DIRECTORY" == "$SYSTEMS_DIRECTORY"* ]]; then
ASSUMED_SYSTEM_PATH=$(realpath --relative-to="$SYSTEMS_DIRECTORY" "$CURRENT_DIRECTORY")
SYSTEM_PATH=$(grep "$ASSUMED_SYSTEM_PATH" "$SYSTEMS_CONFIG" | cut -d' ' -f2)
if [ -z "$SYSTEM_PATH" ]; then # You are NOT in a configured system directory (though in a subdirectory of dev-env/systems).
denv_error_msg "$CURRENT_DIRECTORY is not a configured dev-env system path.\nPlease register the system in $ENV_DIR/.systems, navigate to a registered system, or provide a system identifer as the first parameter of drun."
return;
else # You are in a configured system directory
SYSTEM_IDENTIFIER=$(grep "$ASSUMED_SYSTEM_PATH" "$SYSTEMS_CONFIG" | cut -d' ' -f1)
fi
else
denv_error_msg "$CURRENT_DIRECTORY is not a subdirectory of $ENV_DIR/systems.\nPlease navigate to a configured system, or provide a system identifer as the first parameter of drun."
return;
fi
else # First Parameter is a valid system identifier
shift # Remove first Parameter
fi
SYSTEM_PATH="$ENV_DIR/systems/$SYSTEM_PATH"
SYSTEM_ENV_FILE="$SYSTEM_PATH/.env"
DOCKER_EXEC_COMMAND="$@"
DOCKER_COMPOSE_FILE="$SYSTEM_PATH/docker/docker-compose.yml"
# Set .env variables if a file exist
if [[ ! -f "$DOCKER_COMPOSE_FILE" ]]; then
denv_error_msg "$DOCKER_COMPOSE_FILE was not found. Have you run init yet?"
return;
fi
# Set .env variables if a file exist
if [[ -f "$SYSTEM_ENV_FILE" ]] ; then
export $(grep -v '^#' "$SYSTEM_ENV_FILE" | xargs)
fi
APP_CONTAINER=$(docker compose -f "$DOCKER_COMPOSE_FILE" config --services | grep 'app')
if [[ ! -z "$APP_CONTAINER" ]] ; then
denv_info_msg "[$SYSTEM_IDENTIFIER]($APP_CONTAINER): $DOCKER_EXEC_COMMAND"
CONTAINER_ID=$(docker ps -qf "name=$APP_CONTAINER")
if [ -z "$CONTAINER_ID" ]; then
denv_error_msg "No active container found for '$APP_CONTAINER'"
return;
fi
if [[ -t 0 && -t 1 ]]; then
docker exec -it "$CONTAINER_ID" $DOCKER_EXEC_COMMAND
else
docker exec "$CONTAINER_ID" $DOCKER_EXEC_COMMAND
fi
else
denv_error_msg "No 'app' container found in $DOCKER_COMPOSE_FILE"
return;
fi
# Unset .env variables if a file exist
if [[ -f "$SYSTEM_ENV_FILE" ]] ; then
unset $(grep -v '^#' "$SYSTEM_ENV_FILE" | sed -E 's/(.*)=.*/\1/' | xargs)
fi
}
_drun_completion() {
local SYSTEMS_CONFIG="$ENV_DIR/.systems"
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="$(awk '{print $1}' $SYSTEMS_CONFIG | paste -sd' ' -)"
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -F _drun_completion drun