Files
dokku/plugins/domains/internal-functions
Jose Diaz-Gonzalez edd6e476b3 refactor: simplify how url generation works
The URLS file is no longer necessary as urls are now generated directly from the app VHOST file.

This also moves all the url generation logic to the domains plugin.
2022-12-02 02:19:59 -05:00

184 lines
5.4 KiB
Bash
Executable File

#!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/domains/functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
cmd-domains-report() {
declare desc="displays a domains report for one or more apps"
declare cmd="domains:report"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1" INFO_FLAG="$2"
if [[ "$APP" == "--global" ]]; then
cmd-domains-report-single "$APP" "$INFO_FLAG"
return
fi
if [[ -n "$APP" ]] && [[ "$APP" == --* ]]; then
INFO_FLAG="$APP"
APP=""
fi
if [[ -z "$APP" ]] && [[ -z "$INFO_FLAG" ]]; then
INFO_FLAG="true"
fi
if [[ -z "$APP" ]]; then
for app in $(dokku_apps); do
cmd-domains-report-single "$app" "$INFO_FLAG" | tee || true
done
else
cmd-domains-report-single "$APP" "$INFO_FLAG"
fi
}
cmd-domains-report-single() {
declare APP="$1" INFO_FLAG="$2"
if [[ "$INFO_FLAG" == "true" ]]; then
INFO_FLAG=""
fi
local flag_map=() app_flags=() global_flags=()
if [[ "$APP" != "--global" ]]; then
verify_app_name "$APP"
app_flags=(
"--domains-app-enabled: $(fn-domains-app-enabled "$APP")"
"--domains-app-vhosts: $(fn-domains-app-vhosts "$APP" | awk '{$1=$1};1')"
)
fi
global_flags=(
"--domains-global-enabled: $(fn-domains-global-enabled)"
"--domains-global-vhosts: $(fn-domains-global-vhosts | awk '{$1=$1};1')"
)
flag_map=("${app_flags[@]}" "${global_flags[@]}")
if [[ -z "$INFO_FLAG" ]]; then
if [[ "$APP" == "--global" ]]; then
dokku_log_info2_quiet "Global domains information"
else
dokku_log_info2_quiet "$APP domains information"
fi
for flag in "${flag_map[@]}"; do
key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')"
dokku_log_verbose "$(printf "%-30s %-25s" "${key^}" "${flag#*: }")"
done
else
local match=false
local value_exists=false
for flag in "${flag_map[@]}"; do
valid_flags="${valid_flags} $(echo "$flag" | cut -d':' -f1)"
if [[ "$flag" == "${INFO_FLAG}:"* ]]; then
value=${flag#*: }
size="${#value}"
if [[ "$size" -ne 0 ]]; then
echo "$value" && match=true && value_exists=true
else
match=true
fi
fi
done
[[ "$match" == "true" ]] || dokku_log_fail "Invalid flag passed, valid flags:${valid_flags}"
fi
}
fn-domains-app-enabled() {
declare APP="$1"
local DOMAINS_APP_ENABLED=false
if [[ "$(is_app_vhost_enabled "$APP")" == "true" ]]; then
DOMAINS_APP_ENABLED=true
fi
echo "$DOMAINS_APP_ENABLED"
}
fn-domains-app-vhosts() {
declare APP="$1"
local APP_VHOST_PATH="$DOKKU_ROOT/$APP/VHOST"
if [[ -f "$APP_VHOST_PATH" ]]; then
tr '\n' ' ' <"$APP_VHOST_PATH"
fi
}
fn-domains-global-enabled() {
local DOMAINS_GLOBAL_ENABLED=false
if [[ "$(is_global_vhost_enabled)" == "true" ]]; then
DOMAINS_GLOBAL_ENABLED=true
fi
echo "$DOMAINS_GLOBAL_ENABLED"
}
fn-domains-global-vhosts() {
if [[ "$(is_global_vhost_enabled)" == "true" ]]; then
get_global_vhosts | tr '\n' ' '
fi
}
fn-domains-generate-urls() {
declare APP="$1" SCHEME="$2" DEFAULT_LISTEN_PORT="$3"
local app_vhosts="$(plugn trigger domains-list "$APP")"
if [[ -n "$app_vhosts" ]]; then
for app_vhost in $app_vhosts; do
fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$app_vhost" "$DEFAULT_LISTEN_PORT"
done
else
if [[ -s "$DOKKU_ROOT/VHOST" ]]; then
while read -r VHOST || [[ -n "$VHOST" ]]; do
fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$VHOST" "$DEFAULT_LISTEN_PORT"
done <"$DOKKU_ROOT/VHOST"
else
fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$(hostname -f)" "$DEFAULT_LISTEN_PORT"
fi
fi
}
fn-domains-generate-urls-from-config() {
declare APP="$1" SCHEME="$2" VHOST="$3" DEFAULT_LISTEN_PORT="$4"
local DOKKU_PROXY_PORT_MAP=$(plugn trigger config-get "$APP" DOKKU_PROXY_PORT_MAP || true)
local RAW_TCP_PORTS="$(get_app_raw_tcp_ports "$APP")"
if [[ "$(plugn trigger proxy-is-enabled "$APP")" == "false" ]]; then
if [[ -n "$RAW_TCP_PORTS" ]]; then
local APP_CONTAINER_PORTS="$(get_container_ports "$APP")"
local app_port
for listen_port in $APP_CONTAINER_PORTS; do
fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port"
done
else
local DOKKU_APP_WEB_LISTENERS PORT
DOKKU_APP_WEB_LISTENERS="$(plugn trigger network-get-listeners "$APP" "web" | xargs)"
for DOKKU_APP_WEB_LISTENER in $DOKKU_APP_WEB_LISTENERS; do
listen_port="$(echo "$DOKKU_APP_WEB_LISTENER" | cut -d ':' -f2)"
fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port"
done
shopt -u nullglob
fi
elif [[ -n "$DOKKU_PROXY_PORT_MAP" ]]; then
local port_map
for port_map in $DOKKU_PROXY_PORT_MAP; do
local scheme="$(awk -F ':' '{ print $1 }' <<<"$port_map")"
local listen_port="$(awk -F ':' '{ print $2 }' <<<"$port_map")"
fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port"
done
elif [[ -n "$RAW_TCP_PORTS" ]]; then
for listen_port in $RAW_TCP_PORTS; do
fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port"
done
else
fn-domains-generate-url "$SCHEME" "$VHOST" "$DEFAULT_LISTEN_PORT"
fi
}
fn-domains-generate-url() {
declare SCHEME="$1" VHOST="$2" PORT="$3"
if [[ "$PORT" == "80" ]]; then
echo "http://$VHOST"
elif [[ "$PORT" == "443" ]]; then
echo "https://$VHOST"
else
echo "$SCHEME://$VHOST:$PORT"
fi
}