Because of how plugin commands are implemented, their output can be incredibly verbose. Rather than executing even the `set -eo pipefail` parts of a plugin, we immediately check if the command is implemented by a plugin. If it is not, then we continue on as normal. One side-effect of this change is that plugin commands need to be duplicated again: - once in the command array - once for the actual body of the command - once in the help output This is also quite hackish, and probably not the best way to decrease trace output. Note that we drop approximately 2k lines worth of logs with this change.
156 lines
4.1 KiB
Bash
Executable File
156 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
[[ " docker-options docker-options:add docker-options:remove help docker-options:help " == *" $1 "* ]] || exit $DOKKU_NOT_IMPLEMENTED_EXIT
|
|
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
|
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
|
|
|
get_app() {
|
|
[[ -z $1 ]] && dokku_log_fail "Please specify an app to run the command on"
|
|
verify_app_name "$1"
|
|
APP="$1"
|
|
}
|
|
|
|
get_phases() {
|
|
local passed_phases_list=$1
|
|
local phase
|
|
if [[ -n $passed_phases_list ]]; then
|
|
IFS=',' read -ra passed_phases <<< "$passed_phases_list"
|
|
for phase in "${passed_phases[@]}"; do
|
|
verify_phase $phase
|
|
done
|
|
fi
|
|
}
|
|
|
|
verify_phase() {
|
|
local phase
|
|
local phases=(build deploy run)
|
|
for phase in "${phases[@]}"; do
|
|
if [[ "$phase" = "$1" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
dokku_log_fail "Phase(s) must be one of [${phases[@]}]"
|
|
}
|
|
|
|
get_phase_file_path() {
|
|
local phase=$1
|
|
local prefix="DOCKER_OPTIONS_"
|
|
phase_file_path="${DOKKU_ROOT}/${APP}/${prefix}${phase^^}"
|
|
}
|
|
|
|
create_phase_file_if_required() {
|
|
local phase_file_path=$1
|
|
[[ -f $phase_file_path ]] || {
|
|
touch $phase_file_path
|
|
}
|
|
}
|
|
|
|
display_phase_options() {
|
|
local phase=$1
|
|
local phase_file_path=$2
|
|
echo "${phase^} options:"
|
|
sed -e 's/^/ /' $phase_file_path
|
|
}
|
|
|
|
display_all_phases_options() {
|
|
local phases=(build deploy run)
|
|
for phase in "${phases[@]}"; do
|
|
get_phase_file_path $phase
|
|
if [[ -s $phase_file_path ]]; then
|
|
display_phase_options $phase $phase_file_path
|
|
fi
|
|
done
|
|
}
|
|
|
|
display_passed_phases_options() {
|
|
local passed_phases=("${!1}")
|
|
local phase
|
|
for phase in "${passed_phases[@]}"; do
|
|
get_phase_file_path $phase
|
|
if [[ ! -s $phase_file_path ]]; then
|
|
echo "${phase^} options: none"
|
|
else
|
|
display_phase_options $phase $phase_file_path
|
|
fi
|
|
done
|
|
}
|
|
|
|
get_passed_docker_option() {
|
|
[[ -z "$@" ]] && dokku_log_fail "Please specify docker options to add to the phase"
|
|
passed_docker_option=("$@")
|
|
}
|
|
|
|
add_passed_docker_option() {
|
|
local passed_phases=("${!1}")
|
|
shift
|
|
local passed_option_string="$*"
|
|
local phase
|
|
for phase in "${passed_phases[@]}"; do
|
|
get_phase_file_path $phase
|
|
create_phase_file_if_required $phase_file_path
|
|
echo "${passed_option_string}" >> $phase_file_path
|
|
all_phase_options=$(< $phase_file_path)
|
|
echo -e "${all_phase_options}" | sed '/^$/d' | sort -u > $phase_file_path
|
|
done
|
|
}
|
|
|
|
remove_passed_docker_option() {
|
|
local passed_phases=("${!1}")
|
|
shift
|
|
local passed_option_string="$*"
|
|
local phase
|
|
for phase in "${passed_phases[@]}"; do
|
|
get_phase_file_path $phase
|
|
[[ ! -s $phase_file_path ]] || {
|
|
all_phase_options=$(< $phase_file_path)
|
|
all_phase_options=$(echo -e "${all_phase_options}" | sed "s#^${passed_option_string}\$##")
|
|
echo -e "${all_phase_options}" | sed '/^$/d' | sort -u > $phase_file_path
|
|
}
|
|
done
|
|
}
|
|
|
|
case "$1" in
|
|
# Display applications docker options
|
|
docker-options)
|
|
get_app $2
|
|
get_phases $3
|
|
if [[ ! "${passed_phases[@]}" ]]; then
|
|
display_all_phases_options
|
|
else
|
|
display_passed_phases_options passed_phases[@]
|
|
fi
|
|
;;
|
|
|
|
# Add a docker option to application
|
|
docker-options:add)
|
|
get_app $2
|
|
get_phases $3
|
|
shift 3 # everything else passed is the docker option
|
|
get_passed_docker_option "$@"
|
|
add_passed_docker_option passed_phases[@] "${passed_docker_option[@]}"
|
|
;;
|
|
|
|
# Remove a docker option from application
|
|
docker-options:remove)
|
|
get_app $2
|
|
get_phases $3
|
|
shift 3 # everything else passed is the docker option
|
|
get_passed_docker_option "$@"
|
|
remove_passed_docker_option passed_phases[@] "${passed_docker_option[@]}"
|
|
;;
|
|
|
|
# Display usage help
|
|
help)
|
|
cat<<EOF
|
|
docker-options <app>, Display apps docker options for all phases
|
|
docker-options <app> <phase(s)>, Display apps docker options for phase (comma separated phase list)
|
|
docker-options:add <app> <phase(s)> OPTION, Add docker option to app for phase (comma separated phase list)
|
|
docker-options:remove <app> <phase(s)> OPTION, Remove docker option from app for phase (comma separated phase list)
|
|
EOF
|
|
;;
|
|
|
|
*)
|
|
exit $DOKKU_NOT_IMPLEMENTED_EXIT
|
|
;;
|
|
|
|
esac
|