feat: implement proxy container :label functionality

This commit is contained in:
dragonhunt02
2025-03-22 22:01:00 +00:00
committed by Jose Diaz-Gonzalez
parent e93175b37e
commit 4eafd3b5b7
18 changed files with 273 additions and 0 deletions

84
plugins/proxy/command-functions Executable file
View File

@@ -0,0 +1,84 @@
#!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/proxy/functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
cmd-proxy-label-show() {
declare desc="show a proxy label for an app"
declare cmd="proxy:label:show"
[[ "$1" == "$cmd" ]] && shift 1
declare PROXY="$1" APP="$2" PASSED_LABEL_NAME="$3"
shift 2
if [[ -n "$PASSED_LABEL_NAME" ]]; then
fn-proxy-show-label "$PROXY" "$APP" "$PASSED_LABEL_NAME"
return
fi
fn-proxy-display-labels "$PROXY" "$APP"
return 0
}
cmd-proxy-label-add() {
declare desc="adds container label to app for specified proxy"
declare PROXY="$1" APP="$2" PASSED_LABEL_NAME="$3" PASSED_LABEL_VALUE="$4"
if [[ -z "$PASSED_LABEL_NAME" ]]; then
dokku_log_fail "Please specify a container label for the app"
fi
if [[ -z "$PASSED_LABEL_VALUE" ]]; then
dokku_log_fail "Please specify a value for the container label"
fi
local proxy_labels_file_path="$(fn-proxy-get-labels-file-path "$PROXY" "$APP")"
touch "$proxy_labels_file_path"
cmd-proxy-label-remove "$PROXY" "$APP" "$PASSED_LABEL_NAME" >/dev/null
echo "--label '${PASSED_LABEL_NAME}=${PASSED_LABEL_VALUE}' " >>"$proxy_labels_file_path"
local all_proxy_labels="$(<"$proxy_labels_file_path")"
echo -e "${all_proxy_labels}" | sed '/^$/d' | sort -u >"$proxy_labels_file_path"
}
cmd-proxy-label-remove() {
declare desc="removes container label from app for specified proxy"
declare PROXY="$1" APP="$2" PASSED_LABEL_NAME="$3"
if [[ -z "$PASSED_LABEL_NAME" ]]; then
dokku_log_fail "Please specify a container label for the app"
fi
local proxy_labels_file_path="$(fn-proxy-get-labels-file-path "$PROXY" "$APP")"
if [[ ! -s "$proxy_labels_file_path" ]]; then
return
fi
local all_proxy_labels="$(<"$proxy_labels_file_path")"
local escaped_label_name="$(fn-proxy-escape-extended-sed "$PASSED_LABEL_NAME")"
local all_proxy_labels="$(echo -e "${all_proxy_labels}" | sed -E "s/^--label ['\"]${escaped_label_name}=.*\$//")"
echo -e "${all_proxy_labels}" | sed '/^$/d' | sort -u >"$proxy_labels_file_path"
}
cmd-proxy-label() {
declare desc="manage proxy labels for an app"
declare cmd="proxy:label"
shift 1 # the command comes from the upstream plugin
declare PROXY="$1" ACTION="$2" APP="$3" PASSED_LABEL_NAME="$4" PASSED_LABEL_VALUE="$5"
[[ -z "$PROXY" ]] && dokku_log_fail "Error invoking proxy:label command"
verify_app_name "$APP"
if [[ -n "$PASSED_LABEL_NAME" ]] && [[ ! "$PASSED_LABEL_NAME" =~ ^$PROXY ]]; then
dokku_log_fail "Please specify a valid $PROXY label name for the app"
fi
if [[ "$action" == "show" ]]; then
cmd-proxy-label-show "$PROXY" "$APP" "$PASSED_LABEL_NAME"
return 0
elif [[ "$ACTION" == "set" ]]; then
cmd-proxy-label-add "$PROXY" "$APP" "$PASSED_LABEL_NAME" "$PASSED_LABEL_VALUE"
elif [[ "$action" == "unset" ]]; then
cmd-proxy-label-remove "$PROXY" "$APP" "$PASSED_LABEL_NAME"
else
dokku_log_fail "Please specify a valid action ('set', 'unset' or 'show')"
fi
}

77
plugins/proxy/functions Executable file
View File

@@ -0,0 +1,77 @@
#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
fn-proxy-escape-extended-sed() {
# Escaped delimiter is '/'
local input="$1"
echo "$input" | sed -E 's#[][()\.^$?*+{}|/]#\\&#g'
}
fn-proxy-report-label-overwrite() {
declare desc="overwrite proxy labels file with new labels"
declare LABELS="$1" PROXY_LABELS_FILE_PATH="$2"
if [[ -f "$PROXY_LABELS_FILE_PATH" ]]; then
local DONE=false
until $DONE; do
local line
read -r line || local DONE=true
[[ -z "$line" ]] && continue
case "$line" in
\#*)
continue
;;
--label*)
local label_name="$(echo "$line" | sed -E "s/^--label ['\"]([^=]+)=.*/\1/")"
local escaped_label_name="$(fn-proxy-escape-extended-sed "$passed_label_name")"
local match="$(echo "$LABELS" | sed -E "s/.*--label ['\"]($escaped_label_name)=.*/\1/")"
if [[ -n "$match" ]]; then
dokku_log_warn "Dokku label \"$match\" will be overwritten by user-set proxy label."
fi
continue
;;
*)
dokku_log_warn "Invalid line '$line' in proxy label file $PROXY_FILE_PATH"
;;
esac
done <"$PROXY_LABELS_FILE_PATH"
fi
}
fn-proxy-get-labels-file-path() {
declare desc="return proxy labels config file path for specified proxy"
declare PROXY="$1" APP="$2"
local PROXY_FILE="${DOKKU_ROOT}/${APP}/PROXY_LABELS_${PROXY^^}"
echo "$PROXY_FILE"
}
fn-proxy-display-labels() {
declare desc="print user-set app container labels for specified proxy"
declare PROXY="$1" APP="$2"
local proxy_labels_file_path="$(fn-proxy-get-labels-file-path "$PROXY" "$APP")"
echo "${PROXY^} labels:"
sed -e 's/^/ /' "$proxy_labels_file_path"
}
fn-proxy-show-label() {
declare desc="print single user-set app container label for specified proxy"
declare PROXY="$1" APP="$2" PASSED_LABEL_NAME="$3"
local proxy_labels_file_path="$(fn-proxy-get-labels-file-path "$PROXY" "$APP")"
if [[ ! -s "$proxy_labels_file_path" ]]; then
return
fi
local all_proxy_labels="$(<"$proxy_labels_file_path")"
local escaped_label_name="$(fn-proxy-escape-extended-sed "$passed_label_name")"
local proxy_label_value="$(echo -e "${all_proxy_labels}" | sed -E -n "s/^--label ['\"]${escaped_label_name}=(.*)['\"] \$/\1/p")"
echo "$proxy_label_value"
}