Files
dokku/plugins/run/internal-functions
2025-11-18 16:46:31 -05:00

271 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
[[ $DOKKU_TRACE ]] && set -x
fn-run() {
declare desc="runs command in container"
declare CMD="$1"
shift 1
declare APP=""
local CRON_ID CONCURRENCY_POLICY="allow" DOKKU_RUN_TTL_SECONDS="86400"
declare -a RUN_ENV
RUN_ENV=()
while [[ $# -gt 0 ]]; do
case $1 in
--cron-id=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--cron-id=)//g')
CRON_ID="$arg"
shift
;;
--concurrency-policy=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--concurrency-policy=)//g')
CONCURRENCY_POLICY="$arg"
shift
;;
--no-tty)
export DOKKU_DISABLE_TTY=true
shift
;;
--force-tty)
export DOKKU_FORCE_TTY=true
shift
;;
--cron-id)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
CRON_ID="$2"
shift 2
;;
--concurrency-policy)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
CONCURRENCY_POLICY="$2"
shift 2
;;
-e=* | --env=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^-e=)|(^--env=)//g')
RUN_ENV+=("$arg")
shift
;;
-e | --env)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
RUN_ENV+=("$2")
shift 2
;;
--ttl-seconds=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--ttl-seconds=)//g')
DOKKU_RUN_TTL_SECONDS="$arg"
shift
;;
--ttl-seconds)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
DOKKU_RUN_TTL_SECONDS="$2"
shift 2
;;
*)
APP="$1"
shift
break
;;
esac
done
if [[ -z "$DOKKU_RUN_TTL_SECONDS" ]]; then
DOKKU_RUN_TTL_SECONDS="86400"
fi
if [[ "$CMD" == "run:detached" ]] && [[ "$DOKKU_FORCE_TTY" != "true" ]]; then
export DOKKU_DISABLE_TTY=true
fi
if [[ "$DOKKU_DISABLE_TTY" == "true" ]] && [[ "$DOKKU_FORCE_TTY" == "true" ]]; then
dokku_log_fail "Cannot specify both --force-tty and --no-tty"
fi
verify_app_name "$APP"
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
DOKKU_CRON_ID="$CRON_ID" DOKKU_CONCURRENCY_POLICY="$CONCURRENCY_POLICY" DOKKU_RUN_TTL_SECONDS="$DOKKU_RUN_TTL_SECONDS" plugn trigger scheduler-run "$DOKKU_SCHEDULER" "$APP" "${#RUN_ENV[@]}" "${RUN_ENV[@]}" -- "$@"
}
cmd-run() {
declare desc="runs command in container based on app image"
declare cmd="run"
[[ "$1" == "$cmd" ]] && shift 1
export DOKKU_RM_CONTAINER=1
fn-run "$cmd" "$@"
}
cmd-run-detached() {
declare desc="run a detached container"
declare cmd="run:detached"
[[ "$1" == "$cmd" ]] && shift 1
export DOKKU_DETACH_CONTAINER=1
export DOKKU_RM_CONTAINER=1
fn-run "$cmd" "$@"
}
cmd-run-list() {
declare desc="list all run containers for an app"
declare cmd="run:list"
[[ "$1" == "$cmd" ]] && shift 1
declare APP=""
local FORMAT="stdout"
while [[ $# -gt 0 ]]; do
case $1 in
--format=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--format=)//g')
FORMAT="$arg"
shift
;;
--format)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
FORMAT="$2"
shift 2
;;
--quiet)
export DOKKU_QUIET_OUTPUT=true
shift
;;
*)
APP="$1"
shift
;;
esac
done
verify_app_name "$APP"
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
plugn trigger scheduler-run-list "$DOKKU_SCHEDULER" "$APP" "$FORMAT"
}
cmd-run-logs() {
declare desc="display recent log output"
declare cmd="run:logs"
[[ "$1" == "$cmd" ]] && shift 1
declare APP=""
local CONTAINER_NAME="" NUM="100" PRETTY_PRINT=false TAIL=false
while [[ $# -gt 0 ]]; do
case "$1" in
--container=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--container=)//g')
CONTAINER_NAME="$arg"
shift
;;
--container)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
CONTAINER_NAME="$2"
shift 2
;;
-n | --num)
local NUM="$2"
shift 2
;;
-q | --quiet)
local PRETTY_PRINT=true
shift
;;
-t | --tail)
local TAIL=true
shift
;;
*)
APP="$1"
shift
;;
esac
done
if [[ -z "$APP" ]] && [[ -z "$CONTAINER_NAME" ]]; then
dokku_log_fail "No container or app specified"
fi
if [[ -n "$CONTAINER_NAME" ]]; then
if [[ "$(echo "$CONTAINER_NAME" | grep -o '\.' | wc -l)" -ne 2 ]]; then
dokku_log_fail "Invalid container name specified: $CONTAINER_NAME"
fi
if [[ -n "$APP" ]] && [[ "$APP" != "$(echo "$CONTAINER_NAME" | cut -d'.' -f1)" ]]; then
dokku_log_fail "Specified app does not app in container name"
fi
APP="$(echo "$CONTAINER_NAME" | cut -d'.' -f1)"
if [[ "$(echo "$CONTAINER_NAME" | cut -d'.' -f2)" != "run" ]]; then
dokku_log_fail "Specified container must be a run container"
fi
fi
verify_app_name "$APP"
DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
plugn trigger scheduler-run-logs "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_NAME" "$TAIL" "$PRETTY_PRINT" "$NUM"
}
cmd-run-retire() {
declare desc="stop all run containers that have exceeded their active deadline"
declare cmd="run:retire"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1"
if [[ -z "$APP" ]]; then
plugn trigger scheduler-run-retire
else
verify_app_name "$APP"
local DOKKU_SCHEDULER="$(get_app_scheduler "$APP")"
plugn trigger scheduler-run-retire "$DOKKU_SCHEDULER" "$APP"
fi
}
cmd-run-stop() {
declare desc="stops all run containers for an app or a specified run container"
declare cmd="run:stop"
[[ "$1" == "$cmd" ]] && shift 1
declare APP CONTAINER_NAME
while [[ $# -gt 0 ]]; do
case $1 in
--container=*)
local arg=$(printf "%s" "$1" | sed -E 's/(^--container=)//g')
CONTAINER_NAME="$arg"
shift
;;
--container)
if [[ ! $2 ]]; then
dokku_log_warn "expected $1 to have an argument"
break
fi
CONTAINER_NAME="$2"
shift 2
;;
*)
APP="$1"
shift
;;
esac
done
local DOKKU_SCHEDULER=$(get_app_scheduler "$APP")
plugn trigger scheduler-run-stop "$DOKKU_SCHEDULER" "$APP" "$CONTAINER_NAME"
}