diff --git a/bin/drun b/bin/drun index badd289..bb53acf 100644 --- a/bin/drun +++ b/bin/drun @@ -3,28 +3,83 @@ ENV_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd ) source $ENV_DIR/bin/denv_msg drun() { - if [ $# -lt 2 ]; then - denv_error_msg "Verwendung: drun [system] " + if [ $# -lt 1 ]; then + denv_error_msg "Verwendung: drun [system] " return 1 fi - local CONTAINER_NAME="$1" - shift # Das erste Argument entfernen - local COMMAND="$@" - local CONTAINER_ID=$(docker ps -qf "name=$CONTAINER_NAME-app") + local SYSTEMS_CONFIG="$ENV_DIR/.systems" - if [ -z "$CONTAINER_ID" ]; then - denv_error_msg "Container '$CONTAINER_NAME' wurde nicht gefunden." + 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 1 + 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 1 + 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 1 fi + denv_info_msg "System: $SYSTEM_IDENTIFIER" + denv_info_msg "Command: $DOCKER_EXEC_COMMAND" + + 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_error_msg "App Container not found in '$DOCKER_COMPOSE_FILE'" + else + denv_info_msg "App Container: '$APP_CONTAINER'" + fi + + if [[ -t 0 && -t 1 ]]; then - docker exec -it "$CONTAINER_ID" $COMMAND + denv_echo_msg "docker compose -it" + docker compose -f "$DOCKER_COMPOSE_FILE" exec -it $APP_CONTAINER $DOCKER_EXEC_COMMAND else - docker exec "$CONTAINER_ID" $COMMAND + denv_echo_msg "docker compose" + docker compose -f "$DOCKER_COMPOSE_FILE" exec $APP_CONTAINER $DOCKER_EXEC_COMMAND + 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 cur prev opts COMPREPLY=()