#!/bin/bash ENV_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd ) source $ENV_DIR/bin/messages function drun() { if [ $# -lt 1 ]; then errormsg "Usage: drun [system] " 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). errormsg "$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 errormsg "$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 errormsg "$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 infomsg "[$SYSTEM_IDENTIFIER]($APP_CONTAINER): $DOCKER_EXEC_COMMAND" CONTAINER_ID=$(docker ps -qf "name=docker-$APP_CONTAINER") if [ -z "$CONTAINER_ID" ]; then errormsg "No active container found for '$APP_CONTAINER'" return; fi if [[ -t 0 && -t 1 ]]; then docker exec -it "$CONTAINER_ID" bash -ci "$DOCKER_EXEC_COMMAND" else docker exec -t "$CONTAINER_ID" bash -ci "$DOCKER_EXEC_COMMAND" fi else errormsg "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 } function _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