From 0e899cdd1395af71388600a973a7c5fbf7fb9f32 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Mon, 20 Feb 2017 21:41:19 -0700 Subject: [PATCH] feat: implement proxy:report command Also deprecate `proxy:default` in favor of `proxy:report` Refs #2356 --- docs/advanced-usage/proxy-management.md | 54 +++++++++++++++++-- plugins/proxy/commands | 1 + plugins/proxy/functions | 14 +++-- plugins/proxy/subcommands/default | 1 + plugins/proxy/subcommands/report | 70 +++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 8 deletions(-) create mode 100755 plugins/proxy/subcommands/report diff --git a/docs/advanced-usage/proxy-management.md b/docs/advanced-usage/proxy-management.md index 31d695530..09f88c0c4 100644 --- a/docs/advanced-usage/proxy-management.md +++ b/docs/advanced-usage/proxy-management.md @@ -3,19 +3,21 @@ > New as of 0.5.0, Enhanced in 0.6.0 ``` -proxy # Show proxy settings for app proxy:disable # Disable proxy for app proxy:enable # Enable proxy for app proxy:ports # List proxy port mappings for app proxy:ports-add :: [::...] # Set proxy port mappings for app proxy:ports-clear # Clear all proxy port mappings for app proxy:ports-remove [|::...] # Unset proxy port mappings for app +proxy:report [] [] # Displays a proxy report for one or more apps proxy:set # Set proxy type for app ``` In Dokku 0.5.0, port proxying was decoupled from the `nginx-vhosts` plugin into the proxy plugin. Dokku 0.6.0 introduced the ability to map host ports to specific container ports. In the future this will allow other proxy software - such as HAProxy or Caddy - to be used in place of nginx. -## Container network interface binding +## Usage + +### Container network interface binding > New as of 0.5.0 @@ -58,7 +60,51 @@ CONTAINER ID IMAGE COMMAND CREATED d6499edb0edb dokku/node-js-app:latest "/bin/bash -c '/star About a minute ago Up About a minute 0.0.0.0:49153->5000/tcp node-js-app.web.1 ``` -## Proxy port mapping +### Displaying proxy reports about an app + +> New as of 0.8.1 + +You can get a report about the app's proxy status using the `proxy:report` command: + +```shell +dokku proxy:report +``` + +``` +=====> node-js-app proxy information + Proxy enabled: true + Proxy type: nginx + Proxy port map: http:80:5000 https:443:5000 +=====> python-sample proxy information + Proxy enabled: true + Proxy type: nginx + Proxy port map: http:80:5000 +=====> ruby-sample proxy information + Proxy enabled: true + Proxy type: nginx + Proxy port map: http:80:5000 +``` + +You can run the command for a specific app also. + +```shell +dokku proxy:report node-js-app +``` + +``` +=====> node-js-app proxy information + Proxy enabled: true + Proxy type: nginx + Proxy port map: http:80:5000 https:443:5000 +``` + +You can pass flags which will output only the value of the specific information you want. For example: + +```shell +dokku proxy:report node-js-app --proxy-type +``` + +### Proxy port mapping > New as of 0.6.0 @@ -141,7 +187,7 @@ By default, buildpack apps and dockerfile apps **without** explicitly exposed po > Note: This default behavior **will not** be automatically changed on subsequent pushes and must be manipulated with the `proxy:ports-*` syntax detailed above. -## Proxy Port Scheme +#### Proxy Port Scheme The proxy port scheme is as follows: diff --git a/plugins/proxy/commands b/plugins/proxy/commands index 25d60d2ea..7df9f973b 100755 --- a/plugins/proxy/commands +++ b/plugins/proxy/commands @@ -14,6 +14,7 @@ case "$1" in proxy:ports-clear , Clear all proxy port mappings for app proxy:ports-add :: [::...], Set proxy port mappings for app proxy:ports-remove [|::...], Unset proxy port mappings for app + proxy:report [] [], Displays a proxy report for one or more apps proxy:set , Set proxy type for app help_content } diff --git a/plugins/proxy/functions b/plugins/proxy/functions index d7d3b1a2f..5202a21ef 100755 --- a/plugins/proxy/functions +++ b/plugins/proxy/functions @@ -24,10 +24,16 @@ get_app_proxy_type() { echo "$APP_PROXY_TYPE" } +get_app_proxy_port_map() { + declare desc="return a list of configured port mappings" + local APP="$1"; local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)" + echo "$PROXY_PORT_MAP" +} + list_app_proxy_ports() { declare desc="list proxy port mappings for an app" local APP="$1"; verify_app_name "$APP" - local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)" + local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")" if [[ -n "$PROXY_PORT_MAP" ]]; then dokku_log_info1_quiet "Port mappings for $APP" @@ -45,7 +51,7 @@ filter_app_proxy_ports() { declare desc="list proxy port mappings for an app that start with a particular scheme and a host port" local APP="$1"; verify_app_name "$APP" local SCHEME="$2" HOST_PORT="$3" - local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)" + local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")" if [[ -n "$PROXY_PORT_MAP" ]]; then local port_map @@ -62,7 +68,7 @@ filter_app_proxy_ports() { add_proxy_ports() { declare desc="add proxy port mappings from an app" local APP="$1" - local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)" + local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")" shift 1 local INPUT_PORTS="$*" @@ -78,7 +84,7 @@ add_proxy_ports() { remove_proxy_ports() { declare desc="remove specific proxy port mappings from an app" local APP="$1" - local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)" + local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")" local RE_PORT='^[0-9]+$' shift 1 diff --git a/plugins/proxy/subcommands/default b/plugins/proxy/subcommands/default index 4e867c850..03c08f400 100755 --- a/plugins/proxy/subcommands/default +++ b/plugins/proxy/subcommands/default @@ -12,6 +12,7 @@ proxy_main_cmd() { local APPS="$1" fi + dokku_log_warn "Deprecated: Please use proxy:report" dokku_col_log_info1_quiet "App Name" "Proxy Type" local app for app in $APPS; do diff --git a/plugins/proxy/subcommands/report b/plugins/proxy/subcommands/report new file mode 100755 index 000000000..260483417 --- /dev/null +++ b/plugins/proxy/subcommands/report @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" +source "$PLUGIN_AVAILABLE_PATH/proxy/functions" + +fn-proxy-enabled() { + declare APP="$1" + local PROXY_ENABLED=false + + if [[ "$(is_app_proxy_enabled "$APP")" == "true" ]]; then + PROXY_ENABLED=true + fi + echo "$PROXY_ENABLED" +} + +proxy_report_single_app() { + local APP="$1"; local APP_DIR="$DOKKU_ROOT/$APP"; local INFO_FLAG="$2" + if [[ "$INFO_FLAG" == "true" ]]; then + INFO_FLAG="" + fi + verify_app_name "$APP" + local flag_map=( + "--proxy-enabled: $(fn-proxy-enabled "$APP")" + "--proxy-type: $(get_app_proxy_type "$APP")" + "--proxy-port-map: $(get_app_proxy_port_map "$APP")" + ) + + if [[ -z "$INFO_FLAG" ]]; then + dokku_log_info2 "$APP proxy information" + for flag in "${flag_map[@]}"; do + key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')" + dokku_log_verbose "$(printf "%-20s %-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 + if [[ "$match" == "true" ]]; then + [[ "$value_exists" == "true" ]] || dokku_log_fail "not deployed" + else + dokku_log_fail "Invalid flag passed, valid flags:${valid_flags}" + fi + fi +} + +proxy_report_cmd() { + declare desc="displays a proxy report for one or more apps" + local cmd="proxy:report" + local INSTALLED_APPS=$(dokku_apps); local APP + + if [[ -z $2 ]]; then + for APP in $INSTALLED_APPS; do + proxy_report_single_app "$APP" "true" + done + else + proxy_report_single_app "$2" "$3" + fi +} + +proxy_report_cmd "$@"