#!/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" }