##// END OF EJS Templates
docker: added healthcheck for sshd and added autoheal flags to fix unhealthy containers
docker: added healthcheck for sshd and added autoheal flags to fix unhealthy containers

File last commit:

r65:007fb32f
r65:007fb32f
Show More
rccontrol
4821 lines | 110.1 KiB | text/plain | TextLexer
#!/usr/bin/env bash
# This script was generated
# Modifying it manually is not recommended
check_bash_version() {
if [ ! "${BASH_VERSINFO:-0}" -ge 4 ]; then
echo "Bash version 4 or greater is required (got ${BASH_VERSINFO}), please update your bash version!"
exit 1
fi
}
check_bash_version
# :command.master_script
# :command.version_command
version_command() {
echo "$version"
}
# :command.usage
rccontrol_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol - RhodeCode Control - CLI for installing and managing RhodeCode Cluster Stack\n"
echo
else
printf "rccontrol - RhodeCode Control - CLI for installing and managing RhodeCode Cluster Stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol [OPTIONS] COMMAND\n"
printf " rccontrol [COMMAND] --help | -h\n"
printf " rccontrol --version | -v\n"
echo
# :command.usage_commands
printf "Commands:\n"
echo " self-update update rccontrol and it's docker definitions"
echo " bootstrap Bootstrap this machine, check docker version and install rhodecode-network"
echo
printf "Build Commands:\n"
echo " get-build-artifacts Fetch Artifacts to run installer based build"
echo " build Build RhodeCode image from installer"
echo " get-build-source Fetch RhodeCode sources, store in .source dir to run a source-based builds"
echo " build-source Build RhodeCode image from source, requires upgrade-source initially"
echo
printf "Stack Commands:\n"
echo " stack run one of available cluster stacks, run stack -h for more details"
echo " stack-status Show stack status"
echo " stack-upgrade upgrade ALL stack status"
echo
printf "CLI Commands:\n"
echo " cli Various CLI tools, run cli -h for more details"
echo
printf "Backup Commands:\n"
echo " backup-db Backup Database"
echo " backup-data Backup RhodeCode storage"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
echo " --version, -v"
printf " Show version number\n"
echo
# :command.usage_flags
# :flag.usage
echo " --debug"
printf " Enable debug and detailed output\n"
echo
# :command.usage_environment_variables
printf "Environment Variables:\n"
# :environment_variable.usage
echo " RC_CLI_VERSION_NAME"
printf " default version to build and install\n"
printf " Default: 4.28.0.REL.2022.12.21\n"
echo
# :environment_variable.usage
echo " RCC_CONFIG"
printf " default config file for rccontrol\n"
printf " Default: .rccontrol.ini\n"
echo
# :environment_variable.usage
echo " AUTH_TOKEN"
printf " Set your RhodeCode AUTH Token\n"
echo
# :environment_variable.usage
echo " RC_STACK_ROUTER_EXT"
printf "\n"
printf " Default: .custom/docker-compose-router.override.yaml\n"
echo
# :environment_variable.usage
echo " RC_STACK_METRICS_EXT"
printf "\n"
printf " Default: .custom/docker-compose-metrics.override.yaml\n"
echo
# :environment_variable.usage
echo " RC_STACK_SERVICES_EXT"
printf "\n"
printf " Default: .custom/docker-compose-services.override.yaml\n"
echo
# :environment_variable.usage
echo " RC_STACK_RHODECODE_EXT"
printf "\n"
printf " Default: .custom/docker-compose-apps.override.yaml\n"
echo
# :command.footer
printf "RhodeCode Inc 2022\n\n"
echo
fi
}
# :command.usage
rccontrol_self_update_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol self-update - update rccontrol and it's docker definitions\n"
echo
else
printf "rccontrol self-update - update rccontrol and it's docker definitions\n"
echo
fi
printf "Usage:\n"
printf " rccontrol self-update [OPTIONS]\n"
printf " rccontrol self-update --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --revision REVISION"
printf " revision to fetch new installer.\n"
printf " Default: master\n"
echo
# :flag.usage
echo " --auth-token AUTH_TOKEN"
printf " Optionally specify AUTH TOKEN to obtain sources\n"
echo
# :flag.usage
echo " --server-url SERVER_URL"
printf " Specify RhodeCode server location where projects should be downloaded\n"
printf " Default: https://code.rhodecode.com\n"
echo
fi
}
# :command.usage
rccontrol_bootstrap_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol bootstrap - Bootstrap this machine, check docker version and install rhodecode-network\n"
echo
else
printf "rccontrol bootstrap - Bootstrap this machine, check docker version and install rhodecode-network\n"
echo
fi
printf "Alias: init\n"
echo
printf "Usage:\n"
printf " rccontrol bootstrap [OPTIONS]\n"
printf " rccontrol bootstrap --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --force, -f"
printf " Overwrite existing files\n"
echo
# :flag.usage
echo " --auth-token AUTH_TOKEN"
printf " Optionally specify AUTH TOKEN to obtain sources\n"
echo
# :flag.usage
echo " --server-url SERVER_URL"
printf " Specify RhodeCode server location where projects should be downloaded\n"
printf " Default: https://code.rhodecode.com\n"
echo
# :command.usage_examples
printf "Examples:\n"
printf " rccontrol init\n"
printf " rccontrol bootstrap\n"
printf " rccontrol bootstrap --force\n"
echo
fi
}
# :command.usage
rccontrol_get_build_artifacts_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol get-build-artifacts - Fetch Artifacts to run installer based build\n"
echo
else
printf "rccontrol get-build-artifacts - Fetch Artifacts to run installer based build\n"
echo
fi
printf "Usage:\n"
printf " rccontrol get-build-artifacts [OPTIONS]\n"
printf " rccontrol get-build-artifacts --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --auth AUTH"
printf " Specify custom auth for curl e.g -u admin:secret\n"
printf " Default: \n"
echo
# :flag.usage
echo " --installer-url INSTALLER_URL"
printf " Installer Download URL\n"
printf " Default: https://dls.rhodecode.com/dls/N2E2ZTY1NzA3NjYxNDA2NTc1NjI3MTcyNzA2MjcxNzIyZTcwNjI3YQ==/rhodecode-control/latest-linux-ee\n"
echo
# :flag.usage
echo " --manifest-url MANIFEST_URL"
printf " Manifest file url\n"
printf " Default: https://dls.rhodecode.com/linux/MANIFEST\n"
echo
# :flag.usage
echo " --version-name VERSION_NAME"
printf " Specify custom build ver e.g $RC_CLI_VERSION_NAME\n"
printf " Default: $RC_CLI_VERSION_NAME\n"
echo
fi
}
# :command.usage
rccontrol_build_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol build - Build RhodeCode image from installer\n"
echo
else
printf "rccontrol build - Build RhodeCode image from installer\n"
echo
fi
printf "Usage:\n"
printf " rccontrol build [OPTIONS]\n"
printf " rccontrol build --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --version-name VERSION_NAME"
printf " Specify custom build ver e.g $RC_CLI_VERSION_NAME\n"
printf " Default: $RC_CLI_VERSION_NAME\n"
echo
fi
}
# :command.usage
rccontrol_get_build_source_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol get-build-source - Fetch RhodeCode sources, store in .source dir to run a source-based builds\n"
echo
else
printf "rccontrol get-build-source - Fetch RhodeCode sources, store in .source dir to run a source-based builds\n"
echo
fi
printf "Usage:\n"
printf " rccontrol get-build-source [OPTIONS]\n"
printf " rccontrol get-build-source --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --revision REVISION"
printf " revision to download\n"
printf " Default: default\n"
echo
# :flag.usage
echo " --auth-token AUTH_TOKEN"
printf " Specify AUTH TOKEN to obtain sources\n"
echo
# :flag.usage
echo " --server-url SERVER_URL"
printf " Specify RhodeCode server location where projects should be downloaded\n"
printf " Default: https://code.rhodecode.com\n"
echo
# :command.usage_examples
printf "Examples:\n"
printf " ./rccontrol get-sources $RC_CLI_VERSION_NAME\n"
printf " ./rccontrol get-sources default --auth-token xyxyxyx --server-url\n https://secret.repo/\n"
echo
fi
}
# :command.usage
rccontrol_build_source_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol build-source - Build RhodeCode image from source, requires upgrade-source initially\n"
echo
else
printf "rccontrol build-source - Build RhodeCode image from source, requires upgrade-source initially\n"
echo
fi
printf "Usage:\n"
printf " rccontrol build-source [OPTIONS]\n"
printf " rccontrol build-source --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --version-name VERSION_NAME"
printf " Specify custom build ver e.g $RC_CLI_VERSION_NAME\n"
printf " Default: $RC_CLI_VERSION_NAME\n"
echo
# :command.usage_examples
printf "Examples:\n"
printf " build foo\n"
echo
fi
}
# :command.usage
rccontrol_stack_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack - run one of available cluster stacks, run stack -h for more details\n"
echo
else
printf "rccontrol stack - run one of available cluster stacks, run stack -h for more details\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack [OPTIONS] COMMAND\n"
printf " rccontrol stack [COMMAND] --help | -h\n"
echo
# :command.usage_commands
printf "Commands:\n"
echo " router run the router stack"
echo " metrics run the router stack"
echo " services run the router stack"
echo " rhodecode run the router stack"
echo " all run all stacks"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --env-file-path ENV_FILE_PATH"
printf " Set custom env file\n"
printf " Default: $PWD/.custom/.runtime.env\n"
echo
# :command.usage_examples
printf "Examples:\n"
printf " - ./rccontrol stack router up # run router stack with output to\n stdout\n - ./rccontrol stack router up --detach # run router stack detached\n - ./rccontrol stack router down # stop whole router stack\n - ./rccontrol stack router ps # check status of router stack\n \n # scale a single stack service[s] to more replicas (horizontally)\n - ./rccontrol stack rhodecode up --detach --no-recreate --scale rhodecode=2\n --scale vcsserver=2\n \n # run router stack with your overrides compose file\n - ./rccontrol stack router -f docker-overrides.yaml up -d\n \n # Upgrade whole metrics stack\n - ./rccontrol stack metrics up --force-recreate --build --detach\n"
echo
fi
}
# :command.usage
rccontrol_stack_router_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack router - run the router stack\n"
echo
else
printf "rccontrol stack router - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack router [SERVICES PARAMS...]\n"
printf " rccontrol stack router --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_args
printf "Arguments:\n"
echo " SERVICES PARAMS..."
printf " Additional arguments or flags for services command\n"
echo
fi
}
# :command.usage
rccontrol_stack_metrics_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack metrics - run the router stack\n"
echo
else
printf "rccontrol stack metrics - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack metrics [SERVICES PARAMS...]\n"
printf " rccontrol stack metrics --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_args
printf "Arguments:\n"
echo " SERVICES PARAMS..."
printf " Additional arguments or flags for services command\n"
echo
fi
}
# :command.usage
rccontrol_stack_services_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack services - run the router stack\n"
echo
else
printf "rccontrol stack services - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack services [SERVICES PARAMS...]\n"
printf " rccontrol stack services --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_args
printf "Arguments:\n"
echo " SERVICES PARAMS..."
printf " Additional arguments or flags for services command\n"
echo
fi
}
# :command.usage
rccontrol_stack_rhodecode_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack rhodecode - run the router stack\n"
echo
else
printf "rccontrol stack rhodecode - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack rhodecode [SERVICES PARAMS...]\n"
printf " rccontrol stack rhodecode --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_args
printf "Arguments:\n"
echo " SERVICES PARAMS..."
printf " Additional arguments or flags for services command\n"
echo
fi
}
# :command.usage
rccontrol_stack_all_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack all - run all stacks\n"
echo
else
printf "rccontrol stack all - run all stacks\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack all [SERVICES PARAMS...]\n"
printf " rccontrol stack all --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_args
printf "Arguments:\n"
echo " SERVICES PARAMS..."
printf " Additional arguments or flags for services command\n"
echo
fi
}
# :command.usage
rccontrol_stack_status_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-status - Show stack status\n"
echo
else
printf "rccontrol stack-status - Show stack status\n"
echo
fi
printf "Alias: status\n"
echo
printf "Usage:\n"
printf " rccontrol stack-status [OPTIONS]\n"
printf " rccontrol stack-status --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --detailed"
printf " Display a detailed format\n"
echo
fi
}
# :command.usage
rccontrol_stack_upgrade_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-upgrade - upgrade ALL stack status\n"
echo
else
printf "rccontrol stack-upgrade - upgrade ALL stack status\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack-upgrade COMMAND\n"
printf " rccontrol stack-upgrade [COMMAND] --help | -h\n"
echo
# :command.usage_commands
printf "Commands:\n"
echo " router upgrade the router stack"
echo " metrics run the router stack"
echo " services run the router stack"
echo " rhodecode run the router stack"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_stack_upgrade_router_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-upgrade router - upgrade the router stack\n"
echo
else
printf "rccontrol stack-upgrade router - upgrade the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack-upgrade router\n"
printf " rccontrol stack-upgrade router --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_stack_upgrade_metrics_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-upgrade metrics - run the router stack\n"
echo
else
printf "rccontrol stack-upgrade metrics - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack-upgrade metrics\n"
printf " rccontrol stack-upgrade metrics --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_stack_upgrade_services_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-upgrade services - run the router stack\n"
echo
else
printf "rccontrol stack-upgrade services - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack-upgrade services\n"
printf " rccontrol stack-upgrade services --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_stack_upgrade_rhodecode_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol stack-upgrade rhodecode - run the router stack\n"
echo
else
printf "rccontrol stack-upgrade rhodecode - run the router stack\n"
echo
fi
printf "Usage:\n"
printf " rccontrol stack-upgrade rhodecode [OPTIONS]\n"
printf " rccontrol stack-upgrade rhodecode --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_flags
# :flag.usage
echo " --restart-unhealthy"
printf " just restart unhealthy containers\n"
echo
# :flag.usage
echo " --stop-wait STOP_WAIT"
printf " Number of seconds to wait for stopping old containers, use low value to\n quickly restart and recycle containers\n"
printf " Default: 120\n"
echo
fi
}
# :command.usage
rccontrol_cli_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli - Various CLI tools, run cli -h for more details\n"
echo
else
printf "rccontrol cli - Various CLI tools, run cli -h for more details\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli COMMAND\n"
printf " rccontrol cli [COMMAND] --help | -h\n"
echo
# :command.usage_commands
printf "Commands:\n"
echo " redis CLI for Redis"
echo " db CLI with Database connection"
echo " db-upgrade CLI to run db upgrade"
echo " storage CLI for repository storage. Exposes a basic image with mounted data and repositories volumes"
echo " attach attach to running instance of RhodeCode main web app"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_cli_redis_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli redis - CLI for Redis\n"
echo
else
printf "rccontrol cli redis - CLI for Redis\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli redis\n"
printf " rccontrol cli redis --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_cli_db_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli db - CLI with Database connection\n"
echo
else
printf "rccontrol cli db - CLI with Database connection\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli db\n"
printf " rccontrol cli db --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_cli_db_upgrade_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli db-upgrade - CLI to run db upgrade\n"
echo
else
printf "rccontrol cli db-upgrade - CLI to run db upgrade\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli db-upgrade\n"
printf " rccontrol cli db-upgrade --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_cli_storage_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli storage - CLI for repository storage. Exposes a basic image with mounted data and repositories volumes\n"
echo
else
printf "rccontrol cli storage - CLI for repository storage. Exposes a basic image with mounted data and repositories volumes\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli storage\n"
printf " rccontrol cli storage --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_cli_attach_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol cli attach - attach to running instance of RhodeCode main web app\n"
echo
else
printf "rccontrol cli attach - attach to running instance of RhodeCode main web app\n"
echo
fi
printf "Usage:\n"
printf " rccontrol cli attach\n"
printf " rccontrol cli attach --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol_backup_db_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol backup-db - Backup Database\n"
echo
else
printf "rccontrol backup-db - Backup Database\n"
echo
fi
printf "Usage:\n"
printf " rccontrol backup-db\n"
printf " rccontrol backup-db --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
# :command.usage_examples
printf "Examples:\n"
printf " ./rccontrol backup-db\n"
echo
fi
}
# :command.usage
rccontrol_backup_data_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol backup-data - Backup RhodeCode storage\n"
echo
else
printf "rccontrol backup-data - Backup RhodeCode storage\n"
echo
fi
printf "Usage:\n"
printf " rccontrol backup-data\n"
printf " rccontrol backup-data --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.usage
rccontrol__completions_usage() {
if [[ -n $long_usage ]]; then
printf "rccontrol _completions - Generate completions\n"
echo
else
printf "rccontrol _completions - Generate completions\n"
echo
fi
printf "Usage:\n"
printf " rccontrol _completions\n"
printf " rccontrol _completions --help | -h\n"
echo
# :command.long_usage
if [[ -n $long_usage ]]; then
printf "Options:\n"
# :command.usage_fixed_flags
echo " --help, -h"
printf " Show this help\n"
echo
fi
}
# :command.normalize_input
normalize_input() {
local arg flags
while [[ $# -gt 0 ]]; do
arg="$1"
if [[ $arg =~ ^(--[a-zA-Z0-9_\-]+)=(.+)$ ]]; then
input+=("${BASH_REMATCH[1]}")
input+=("${BASH_REMATCH[2]}")
elif [[ $arg =~ ^(-[a-zA-Z0-9])=(.+)$ ]]; then
input+=("${BASH_REMATCH[1]}")
input+=("${BASH_REMATCH[2]}")
elif [[ $arg =~ ^-([a-zA-Z0-9][a-zA-Z0-9]+)$ ]]; then
flags="${BASH_REMATCH[1]}"
for ((i = 0; i < ${#flags}; i++)); do
input+=("-${flags:i:1}")
done
else
input+=("$arg")
fi
shift
done
}
# :command.inspect_args
inspect_args() {
readarray -t sorted_keys < <(printf '%s\n' "${!args[@]}" | sort)
if ((${#args[@]})); then
echo args:
for k in "${sorted_keys[@]}"; do echo "- \${args[$k]} = ${args[$k]}"; done
else
echo args: none
fi
if ((${#other_args[@]})); then
echo
echo other_args:
echo "- \${other_args[*]} = ${other_args[*]}"
for i in "${!other_args[@]}"; do
echo "- \${other_args[$i]} = ${other_args[$i]}"
done
fi
}
# :command.user_lib
# src/lib/check_bootstrap.sh
check_bootstrap() {
# Avoid destroying bootstrapping by simple start/stop
for stage in $BOOTSTRAP_STAGES; do
stage_name=$(echo $stage | cut -d ":" -f 1)
stage_func=$(echo $stage | cut -d ":" -f 2)
if ! config_has_key $stage_name ; then
echo "$(yellow WARNING:) bootstrap key $stage_name not found in config file $CONFIG_FILE!"
echo "$(yellow NOTICE:) Please run ./rccontrol bootstrap first"
exit
fi
done
}
# src/lib/colors.sh
print_in_color() {
local color="$1"
shift
if [[ -z ${NO_COLOR+x} ]]; then
printf "$color%b\e[0m\n" "$*"
else
printf "%b\n" "$*"
fi
}
red() { print_in_color "\e[31m" "$*"; }
green() { print_in_color "\e[32m" "$*"; }
yellow() { print_in_color "\e[33m" "$*"; }
blue() { print_in_color "\e[34m" "$*"; }
magenta() { print_in_color "\e[35m" "$*"; }
cyan() { print_in_color "\e[36m" "$*"; }
bold() { print_in_color "\e[1m" "$*"; }
underlined() { print_in_color "\e[4m" "$*"; }
red_bold() { print_in_color "\e[1;31m" "$*"; }
green_bold() { print_in_color "\e[1;32m" "$*"; }
yellow_bold() { print_in_color "\e[1;33m" "$*"; }
blue_bold() { print_in_color "\e[1;34m" "$*"; }
magenta_bold() { print_in_color "\e[1;35m" "$*"; }
cyan_bold() { print_in_color "\e[1;36m" "$*"; }
red_underlined() { print_in_color "\e[4;31m" "$*"; }
green_underlined() { print_in_color "\e[4;32m" "$*"; }
yellow_underlined() { print_in_color "\e[4;33m" "$*"; }
blue_underlined() { print_in_color "\e[4;34m" "$*"; }
magenta_underlined() { print_in_color "\e[4;35m" "$*"; }
cyan_underlined() { print_in_color "\e[4;36m" "$*"; }
# src/lib/config.sh
config_init() {
CONFIG_FILE=${CONFIG_FILE:=config.ini}
[[ -f "$CONFIG_FILE" ]] || touch "$CONFIG_FILE"
}
config_get() {
local key=$1
local regex="^$key *= *(.+)$"
local value=""
config_init
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line =~ $regex ]]; then
value="${BASH_REMATCH[1]}"
break
fi
done <"$CONFIG_FILE"
echo "$value"
}
config_set() {
local key=$1
shift
local value="$*"
config_init
local regex="^($key) *= *.+$"
local output=""
local found_key=""
local newline
while IFS= read -r line || [ -n "$line" ]; do
newline=$line
if [[ $line =~ $regex ]]; then
found_key="${BASH_REMATCH[1]}"
newline="$key = $value"
output="$output$newline\n"
elif [[ $line ]]; then
output="$output$line\n"
fi
done <"$CONFIG_FILE"
if [[ -z $found_key ]]; then
output="$output$key = $value\n"
fi
printf "%b\n" "$output" >"$CONFIG_FILE"
}
config_del() {
local key=$1
local regex="^($key) *="
local output=""
config_init
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line ]] && [[ ! $line =~ $regex ]]; then
output="$output$line\n"
fi
done <"$CONFIG_FILE"
printf "%b\n" "$output" >"$CONFIG_FILE"
}
config_show() {
config_init
cat "$CONFIG_FILE"
}
config_keys() {
local regex="^([a-zA-Z0-9_\-\/\.]+) *="
config_init
local keys=()
local key
while IFS= read -r line || [ -n "$line" ]; do
if [[ $line =~ $regex ]]; then
key="${BASH_REMATCH[1]}"
keys+=("$key")
fi
done <"$CONFIG_FILE"
echo "${keys[@]}"
}
config_has_key() {
[[ $(config_get "$1") ]]
}
# src/lib/dotenv.sh
__dotenv=
__dotenv_file=
__dotenv_cmd=.env
.env() {
REPLY=()
[[ $__dotenv_file || ${1-} == -* ]] || .env.--file .env || return
if declare -F -- ".env.${1-}" >/dev/null; then .env."$@"; return ; fi
.env --help >&2; return 64
}
.env.-f() { .env.--file "$@"; }
.env.get() {
.env::arg "get requires a key" "$@" &&
[[ "$__dotenv" =~ ^(.*(^|$'\n'))([ ]*)"$1="(.*)$ ]] &&
REPLY=${BASH_REMATCH[4]%%$'\n'*} && REPLY=${REPLY%"${REPLY##*[![:space:]]}"}
}
.env.parse() {
local line key
while IFS= read -r line; do
line=${line#"${line%%[![:space:]]*}"} # trim leading whitespace
line=${line%"${line##*[![:space:]]}"} # trim trailing whitespace
if [[ ! "$line" || "$line" == '#'* ]]; then continue ; fi
if (($#)); then
for key; do
if [[ $key == "${line%%=*}" ]]; then REPLY+=("$line"); break;
fi
done
else
REPLY+=("$line")
fi
done <<<"$__dotenv"
((${#REPLY[@]}))
}
.env.export() { ! .env.parse "$@" || export "${REPLY[@]}"; }
.env.set() {
.env::file load || return ; local key saved=$__dotenv
while (($#)); do
key=${1#+}; key=${key%%=*}
if .env.get "$key"; then
REPLY=()
if [[ $1 == +* ]]; then shift; continue # skip if already found
elif [[ $1 == *=* ]]; then
__dotenv=${BASH_REMATCH[1]}${BASH_REMATCH[3]}$1$'\n'${BASH_REMATCH[4]#*$'\n'}
else
__dotenv=${BASH_REMATCH[1]}${BASH_REMATCH[4]#*$'\n'}
continue # delete all occurrences
fi
elif [[ $1 == *=* ]]; then
__dotenv+="${1#+}"$'\n'
fi
shift
done
[[ $__dotenv == "$saved" ]] || .env::file save
}
.env.puts() { echo "${1-}">>"$__dotenv_file" && __dotenv+="$1"$'\n'; }
.env.generate() {
.env::arg "key required for generate" "$@" || return
.env.get "$1" && return || REPLY=$("${@:2}") || return
.env::one "generate: ouptut of '${*:2}' has more than one line" "$REPLY" || return
.env.puts "$1=$REPLY"
}
.env.--file() {
.env::arg "filename required for --file" "$@" || return
__dotenv_file=$1; .env::file load || return
(($#<2)) || .env "${@:2}"
}
.env::arg() { [[ "${2-}" ]] || { echo "$__dotenv_cmd: $1" >&2; return 64; }; }
.env::one() { [[ "$2" != *$'\n'* ]] || .env::arg "$1"; }
.env::file() {
local REPLY=$__dotenv_file
case "$1" in
load)
__dotenv=; ! [[ -f "$REPLY" ]] || __dotenv="$(<"$REPLY")"$'\n' || return ;;
save)
if [[ -L "$REPLY" ]] && declare -F -- realpath.resolved >/dev/null; then
realpath.resolved "$REPLY"
fi
{ [[ ! -f "$REPLY" ]] || cp -p "$REPLY" "$REPLY.bak"; } &&
printf %s "$__dotenv" >"$REPLY.bak" && mv "$REPLY.bak" "$REPLY"
esac
}
#
#__dotenv() {
# set -eu
# __dotenv_cmd=${0##*/}
# .env.export() { .env.parse "$@" || return 0; printf 'export %q\n' "${REPLY[@]}"; REPLY=(); }
# .env "$@" || return $?
# ${REPLY[@]+printf '%s\n' "${REPLY[@]}"}
#}
#if [[ $0 == "${BASH_SOURCE-}" ]]; then __dotenv "$@"; exit; fi
# src/lib/get_docker_definitions.sh
get_docker_definitions() {
SOURCE_DIR=$PWD
RHODECODE_DOCKER_HASH=$1
# download sources
echo "bootstrap_definitions: download rhodecode docker definitions from $SERVER_URL"
echo ""
if [ $DEBUG ]; then
echo "bootstrap_definitions: downloading: $SERVER_URL/rhodecode-enterprise-docker/archive/$RHODECODE_DOCKER_HASH.tgz?with_hash=0"
curl --header "X-Rc-Auth-Token: $AUTH_TOKEN" -L $SERVER_URL/rhodecode-enterprise-docker/archive/$RHODECODE_DOCKER_HASH.tgz?with_hash=0 | tar -xz -C $SOURCE_DIR
echo "bootstrap_definitions: running CP $SOURCE_DIR/*rhodecode-enterprise-docker-plain/* $SOURCE_DIR"
cp -v -r -f --update --backup=numbered $SOURCE_DIR/*rhodecode-enterprise-docker-plain/* $SOURCE_DIR
echo "bootstrap_definitions: removing $SOURCE_DIR/*rhodecode-enterprise-docker-plain"
rm -r $SOURCE_DIR/*rhodecode-enterprise-docker-plain
else
curl -s --header "X-Rc-Auth-Token: $AUTH_TOKEN" -L $SERVER_URL/rhodecode-enterprise-docker/archive/$RHODECODE_DOCKER_HASH.tgz?with_hash=0 | tar -xz -C $SOURCE_DIR
cp -r -f --update --backup=numbered $SOURCE_DIR/*rhodecode-enterprise-docker-plain/* $SOURCE_DIR
rm -r $SOURCE_DIR/*rhodecode-enterprise-docker-plain
fi
echo "$(green bootstrap_definitions: docker definitions extracted to $SOURCE_DIR)"
# cleanup
}
# src/lib/send_completions.sh
send_completions() {
echo $'# rccontrol completion -*- shell-script -*-'
echo $''
echo $'# This bash completions script was generated by'
echo $'# completely (https://github.com/dannyben/completely)'
echo $'# Modifying it manually is not recommended'
echo $''
echo $'_rccontrol_completions_filter() {'
echo $' local words="$1"'
echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
echo $' local result=()'
echo $''
echo $' if [[ "${cur:0:1}" == "-" ]]; then'
echo $' echo "$words"'
echo $' '
echo $' else'
echo $' for word in $words; do'
echo $' [[ "${word:0:1}" != "-" ]] && result+=("$word")'
echo $' done'
echo $''
echo $' echo "${result[*]}"'
echo $''
echo $' fi'
echo $'}'
echo $''
echo $'_rccontrol_completions() {'
echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
echo $' local compwords=("${COMP_WORDS[@]:1:$COMP_CWORD-1}")'
echo $' local compline="${compwords[*]}"'
echo $''
echo $' case "$compline" in'
echo $' *\'get-build-artifacts\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--auth --help --installer-url --manifest-url --version-name -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'get-build-source\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--auth-token --help --revision --server-url -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*\'rhodecode\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*\'services\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'cli db-upgrade\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*\'metrics\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack-upgrade\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'build-source\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help --version-name -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack-status\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'_completions\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*\'router\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'cli storage\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'self-update\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--auth-token --help --server-url -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'backup-data\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*\'all\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'backup-db\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'bootstrap\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--auth-token --force --help --server-url -f -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'cli redis\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'cli db\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'status\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'build\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help --version-name -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'stack\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--env-file-path --help -h all metrics rhodecode router services")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'init\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--auth-token --force --help --server-url -f -h")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *\'cli\'*)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--help -h db db-upgrade redis storage")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' *)'
echo $' while read -r; do COMPREPLY+=( "$REPLY" ); done < <( compgen -W "$(_rccontrol_completions_filter "--debug --help --version -h -v _completions backup-data backup-db bootstrap build build-source cli get-build-artifacts get-build-source init self-update stack stack-status stack-upgrade status")" -- "$cur" )'
echo $' ;;'
echo $''
echo $' esac'
echo $'} &&'
echo $'complete -F _rccontrol_completions rccontrol'
echo $''
echo $'# ex: filetype=sh'
}
# src/lib/validate_stack_exists.sh
validate_stack_exists() {
err=""
invalid="1"
for item in $VALID_SERVICES
do
if [ "$1" == "$item" ]; then
invalid=""
break
fi
done
if [[ -n $invalid ]]; then
err="command '$1' not in list of $VALID_SERVICES"
fi
echo $err
}
# :command.command_functions
# :command.function
rccontrol_self_update_command() {
# src/self_update_command.sh
check_bootstrap
AUTH_TOKEN=${args[--auth-token]}
SERVER_URL=${args[--server-url]}
revision=${args[--revision]}
FETCH_FROM=$SERVER_URL/rhodecode-enterprise-docker/raw/master/scripts/rccontrol/rccontrol
FINAL_TARGET=$PWD/scripts/rccontrol/rccontrol
DL_TARGET=$PWD/scripts/rccontrol/rccontrol.tmp
version_old=$($FINAL_TARGET --version)
rc_version_old=$(echo $RC_CLI_VERSION_NAME)
echo "$(green self-update: downloading new rccontrol script from $FETCH_FROM)"
curl --fail --header "X-Rc-Auth-Token: $AUTH_TOKEN" -o $DL_TARGET -L $FETCH_FROM
chmod +x $DL_TARGET
version_dl=$($DL_TARGET --version)
rc_version_dl=$(echo $RC_CLI_VERSION_NAME)
echo "self-update: rccontrol version downloaded: $version_dl"
if [[ $version_old == $version_dl ]]; then
echo "$(yellow self-update: downloaded version is the same as current version $version_dl)"
exit
fi
.env --file $RUNTIME_ENV
.env get RC_VERSION
ENV_VER=$REPLY
if [[ $DEBUG ]]; then
echo "env version $ENV_VER"
echo "Old Version: $rc_version_old"
echo "Current RC VERSION: $rc_version_dl"
fi
if [[ $rc_version_old == $rc_version_dl ]]; then
echo "$(yellow self-update: latest RC_VERSION=$rc_version_dl seems to be up-to date)"
else
echo "$(green self-update: setting new RC_VERSION to runtime.env: $rc_version_dl)"
while true; do
read -p "self-update: Would you like to continue with setting RC_VERSION=$rc_version_dl into .runtime.env file? [yn] " yn
case $yn in
[Yy]*)
.env set RC_VERSION=$rc_version_dl
echo "self-update: new version set into config"
return 2 ;;
[Nn]*)
exit ;;
*) echo "Please answer y or n." ;;
esac
done
fi
echo "$(green self-update: updating rccontrol script to new version: $version_dl)"
rm $FINAL_TARGET && mv -v $DL_TARGET $FINAL_TARGET
get_docker_definitions $revision
exit
}
# :command.function
rccontrol_bootstrap_command() {
# src/bootstrap_command.sh
DEBUG=${args[--debug]}
force=${args[--force]}
check_docker() {
(which docker || which docker.io) &>/dev/null
}
bootstrap_docker_install() {
echo "bootstrap_docker_install: trying to check and configure docker"
failMsg="Failed to find docker on your PATH"
if ! check_docker; then
echo "$failMsg"
read -p "Enter to install Docker directly from https://get.docker.com/ or Ctrl+C to exit"
curl https://get.docker.com/ | sh
if ! check_docker; then
echo "$failMsg"
echo "Docker install failed. Quitting."
exit
fi
fi
}
bootstrap_docker_commons() {
echo 'bootstrap_docker_commons: running docker commands.'
echo "bootstrap_docker_commons: creating volume 'rc_datavolume'"
docker volume create --label keep=1 --name=rc_datavolume
echo "bootstrap_docker_commons: done"
echo ""
echo "bootstrap_docker_commons: creating volume 'rc_reposvolume'"
docker volume create --label keep=1 --name=rc_reposvolume
echo "bootstrap_docker_commons: done"
echo ""
echo "bootstrap_docker_commons: creating network 'rhodecode_network'"
docker network inspect rhodecode_network >/dev/null 2>&1 || docker network create rhodecode_network
echo "bootstrap_docker_commons: done"
echo ""
echo "bootstrap_docker_commons: creating loki logging"
loki_driver=$(docker plugin ls --format {{.Name}} --filter enabled=true | grep loki || echo "")
if [[ $loki_driver == "" ]]; then
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
else
echo "bootstrap_docker_commons: loki driver already exists"
fi
}
random_str() {
len=$1
random_generate=$(echo $RANDOM | md5sum | head -c $len)
echo $random_generate
}
bootstrap_config() {
shared_key=$(random_str 32)
db_key=$(random_str 32)
license_token="$(random_str 4)"-"$(random_str 4)"-"$(random_str 4)"-"$(random_str 4)"
# TODO: change formatter to json for loki usage
log_formatter=generic
base_domain=docker-dev
base_url=http://$base_domain
DB_USER='rhodecode'
DB_NAME='rhodecode'
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "init new config at: $CONFIG_FILE"
config_init
else
echo "re-using existing config at: $CONFIG_FILE"
fi
mkdir -p $PWD/.custom
BOOTSTRAP_TMPL=$PWD/templates/runtime.env.tmpl
BOOTSTRAP_RUNTIME_ENV=$PWD/.custom/.runtime.env
if [[ ! -f "$BOOTSTRAP_RUNTIME_ENV" ]]; then
echo "bootstrap_config: init runtime env config at: $BOOTSTRAP_RUNTIME_ENV"
touch $BOOTSTRAP_RUNTIME_ENV
echo "## BOOTSTRAP GENERATED" >> $BOOTSTRAP_RUNTIME_ENV
cat $BOOTSTRAP_TMPL >> $BOOTSTRAP_RUNTIME_ENV
# init env generator with env file
.env --file $BOOTSTRAP_RUNTIME_ENV
.env set DB_PASSWORD=$db_key
.env set +RC_ENCRYPTED_SECRET=$shared_key
.env set +RC_DB_URL="postgresql://$DB_USER:$db_key@database/$DB_NAME"
.env set +RC_SQLALCHEMY_DB1_URL="postgresql://$DB_USER:$db_key@database/$DB_NAME"
.env set +RC_LICENSE_TOKEN=$license_token
.env set +RC_APP_BASE_URL=$base_url
.env puts '# Log formatter option'
.env set +RC_LOGGING_FORMATTER=$log_formatter
.env set +RC_USE_CELERY=true
.env puts '# Channelstream config'
.env set +RC_CHANNELSTREAM_SERVER=channelstream:8000
.env set +RC_CHANNELSTREAM_WS_URL=ws:/$base_domain/_channelstream
.env set +CHANNELSTREAM_ALLOW_POSTING_FROM=0.0.0.0
.env set +CHANNELSTREAM_SECRET=$shared_key
.env set +RC_CHANNELSTREAM_SECRET=$shared_key
.env set +CHANNELSTREAM_ADMIN_SECRET=$shared_key
.env set +RC_CHANNELSTREAM_ADMIN_SECRET=$shared_key
else
echo "bootstrap_config: $BOOTSTRAP_RUNTIME_ENV file exists, not adding any configuration..."
fi
}
bootstrap_definitions() {
AUTH_TOKEN=${args[--auth-token]}
SERVER_URL=${args[--server-url]}
DEFINITIONS_EXIST=""
CHECK_FILES="\
docker-compose-services.yaml \
docker-compose-apps.yaml \
docker-compose-metrics.yaml \
docker-compose-router.yaml \
"
for check_file in $CHECK_FILES; do
if [[ -f "$check_file" ]]; then
DEFINITIONS_EXIST="1"
fi
done
if [[ -n $DEFINITIONS_EXIST && ! $force ]]; then
echo "$(yellow bootstrap_definitions: skipping docker defs creation, existing files found. Use --force to create them anyway)"
return
fi
if [[ -n $DEFINITIONS_EXIST ]]; then
echo "$(yellow docker definitions exists, are you sure to force re-create them?)"
while true; do
read -p "Would you like to continue with overriding file? [yn] " yn
case $yn in
[Yy]*) return 2 ;;
[Nn]*) exit ;;
*) echo "Please answer y or n." ;;
esac
done
fi
get_docker_definitions
}
bootstrap_overrides() {
templates=$(find $PWD/templates/*.yaml -printf "%f\n")
target_dir=$PWD/.custom
for o_file in $templates; do
target_file=$target_dir/$o_file
if [[ ! -f "$target_file" ]]; then
echo "copy override file $o_file"
cp -v $PWD/templates/$o_file $target_file
else
echo "file $target_file existing, skipping..."
fi
done
echo "$(green bootstrap_overrides: overrides extracted to $target_dir)"
}
cur_date=$(date '+%Y-%m-%d %H:%M:%S')
# Init the config !
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "config: init new config at: $CONFIG_FILE"
config_init
else
echo "config: re-using present config at: $CONFIG_FILE"
fi
for stage in $BOOTSTRAP_STAGES; do
stage_name=$(echo $stage | cut -d ":" -f 1)
stage_func=$(echo $stage | cut -d ":" -f 2)
if ! config_has_key $stage_name ; then
echo "$(green \* bootstrap: \'$stage_name\' stage not found\; running now... )"
$stage_func
config_set "$stage_name" $cur_date
else
if [ $force ]; then
echo "$(green \* bootstrap: \'$stage_name\' is present!\; FORCE running now... )"
$stage_func $force
config_set "$stage_name" $cur_date
else
echo "$(yellow \* bootstrap: \'$stage_name\' already present, use --force to run it again)"
fi
fi
done
echo "~~~~ $(green Bootstrap completed) ~~~~"
get_started
}
# :command.function
rccontrol_get_build_artifacts_command() {
# src/get_build_artifacts_command.sh
check_bootstrap
DEBUG=${args[--debug]}
AUTH=${args[--auth]}
INSTALLER_URL=${args[--installer-url]}
MANIFEST_URL=${args[--manifest-url]}
RC_VERSION=${args[--version-name]}
VER=$RC_VERSION
CACHE_DIR=$PWD/.cache
VER_REGEX="$VER+x86_64"
echo "Downloading Artifacts for version: $VER"
echo "1/4 Checking available downloads from MANIFEST file"
ARTS=$(curl -s $AUTH $MANIFEST_URL | grep --ignore-case "$VER_REGEX" | cut -d ' ' -f 2)
if [[ $DEBUG ]]; then
echo "DEBUG START"
curl -s $AUTH $MANIFEST_URL | grep --ignore-case "$VER_REGEX" || echo "no regex match"
curl -s $AUTH $MANIFEST_URL | grep --ignore-case "$VER_REGEX" | cut -d ' ' -f 2
echo "Found following artifacts:"
echo $ARTS
echo "DEBUG END"
fi
if [[ $ARTS == "" ]]; then
MSG="Failed to found any MANIFEST entries for version $VER make sure there exists release with that version or use --version to specify different version"
echo "$(red $MSG)"
exit
fi
echo "2/4 Downloading locale-archive"
curl -L https://dls.rhodecode.com/assets/locale-archive -J -O
mv -v locale-archive "$CACHE_DIR"
# vcsserver/ce/ee
echo "3/4 Downloading installer artifacts"
for url in $ARTS; do
echo "Downloading $url with $AUTH"
curl $AUTH --fail-early -L ${url} -J -O
done
#for url in $(curl -s $MANIFEST_URL | grep --ignore-case -E 'control.+\+x86_64' | cut -d ' ' -f 2); do
# echo "Downloading $url"
# curl -L ${url} -J -O
#done
echo "4/4 Downloading installer from $INSTALLER_URL"
curl $AUTH -L $INSTALLER_URL -J -O
INSTALLER=$(ls -Art RhodeCode-installer-* | tail -n 1)
if [[ -n $INSTALLER ]]; then
chmod +x "${INSTALLER}"
fi
echo "Copying artifacts into $CACHE_DIR"
mv -v "${INSTALLER}" $CACHE_DIR
mv -v *.bz2 $CACHE_DIR
ls -lh $CACHE_DIR
}
# :command.function
rccontrol_build_command() {
# src/build_command.sh
check_bootstrap
rc_version=${args[--version-name]}
export RC_VERSION=$rc_version
eval "echo INSTALLER BASED BUILDING${RC_VERSION}"
RC_VERSION=$rc_version ./rccontrol stack rhodecode build --progress plain rhodecode
}
# :command.function
rccontrol_get_build_source_command() {
# src/get_build_source_command.sh
check_bootstrap
DEBUG=${args[--debug]}
AUTH_TOKEN=${args[--auth-token]}
SERVER_URL=${args[--server-url]}
revision=${args[--revision]}
SOURCE_DIR=$PWD/.source
RHODECODE_VCS_HASH=$revision
RHODECODE_CE_HASH=$revision
RHODECODE_EE_HASH=$revision
# download sources
echo "** download rhodecode source for build from $SERVER_URL using '$revision' hash **"
echo "getting $SERVER_URL/rhodecode-vcsserver/archive/$RHODECODE_VCS_HASH.tgz"
curl --fail --header "X-Rc-Auth-Token: $AUTH_TOKEN" -L $SERVER_URL/rhodecode-vcsserver/archive/$RHODECODE_VCS_HASH.tgz?with_hash=0 | tar -xz -C $SOURCE_DIR
echo "getting $SERVER_URL/rhodecode-enterprise-ce/archive/$RHODECODE_CE_HASH.tgz"
curl --fail --header "X-Rc-Auth-Token: $AUTH_TOKEN" -L $SERVER_URL/rhodecode-enterprise-ce/archive/$RHODECODE_CE_HASH.tgz?with_hash=0 | tar -xz -C $SOURCE_DIR
echo "getting $SERVER_URL/rhodecode-enterprise-ee/archive/$RHODECODE_EE_HASH.tgz"
curl --fail --header "X-Rc-Auth-Token: $AUTH_TOKEN" -L $SERVER_URL/rhodecode-enterprise-ee/archive/$RHODECODE_EE_HASH.tgz?with_hash=0 | tar -xz -C $SOURCE_DIR
rm -rf $SOURCE_DIR/rhodecode-vcsserver && \
mv $SOURCE_DIR/*rhodecode-vcsserver-plain $SOURCE_DIR/rhodecode-vcsserver
rm -rf $SOURCE_DIR/rhodecode-enterprise-ce && \
mv $SOURCE_DIR/*rhodecode-enterprise-ce-plain $SOURCE_DIR/rhodecode-enterprise-ce
rm -rf $SOURCE_DIR/rhodecode-enterprise-ee && \
mv $SOURCE_DIR/*rhodecode-enterprise-ee-plain $SOURCE_DIR/rhodecode-enterprise-ee
echo "downloading sources done to $SOURCE_DIR"
ls -l $SOURCE_DIR
echo "to create source based build run ./rccontrol build-source --version-name 4.28.0.REL.2022.12.10"
}
# :command.function
rccontrol_build_source_command() {
# src/build_source_command.sh
check_bootstrap
rc_version=${args[--version-name]}
export RC_VERSION=$rc_version
eval "echo SOURCE BASED BUILDING${RC_VERSION}"
RC_VERSION=$rc_version ./rccontrol stack rhodecode -f docker-compose-apps.source.yaml build --progress plain rhodecode
}
# :command.function
rccontrol_stack_router_command() {
# src/stack_router_command.sh
check_bootstrap
DEBUG=${args[--debug]}
ENV_FILE=${args[--env-file-path]}
if [[ ! -f $RC_STACK_ROUTER_EXT ]]; then
RC_STACK_ROUTER_EXT=""
else
RC_STACK_ROUTER_EXT="-f $RC_STACK_ROUTER_EXT"
fi
CMD_ROUTER="\
RC_ENV_FILE=$ENV_FILE docker compose \
--env-file $ENV_FILE \
$ENV_EXPAND \
-p rc_cluster_router \
-f docker-compose-base.yaml \
-f docker-compose-router.yaml $RC_STACK_ROUTER_EXT"
if [[ $DEBUG ]]; then
echo "---"
echo "stacks docker: $RC_STACK_ROUTER_EXT_LCL"
echo "running command: ${CMD_ROUTER}"
echo "ARGS: ${other_args[*]}"
echo "---"
fi
eval "${CMD_ROUTER} ${other_args[*]}"
}
# :command.function
rccontrol_stack_metrics_command() {
# src/stack_metrics_command.sh
check_bootstrap
DEBUG=${args[--debug]}
ENV_FILE=${args[--env-file-path]}
if [[ ! -f $RC_STACK_METRICS_EXT ]]; then
RC_STACK_METRICS_EXT_LCL=""
else
RC_STACK_METRICS_EXT_LCL="-f $RC_STACK_METRICS_EXT"
fi
CMD_METRICS="\
RC_ENV_FILE=$ENV_FILE docker compose \
--env-file $ENV_FILE \
$ENV_EXPAND \
-p rc_cluster_metrics \
-f docker-compose-base.yaml \
-f docker-compose-metrics.yaml $RC_STACK_METRICS_EXT_LCL"
if [[ $DEBUG ]]; then
echo "---"
echo "stacks docker: $RC_STACK_METRICS_EXT_LCL"
echo "running command: ${CMD_METRICS}"
echo "ARGS: ${other_args[*]}"
echo "---"
fi
eval "${CMD_METRICS} ${other_args[*]}"
}
# :command.function
rccontrol_stack_services_command() {
# src/stack_services_command.sh
check_bootstrap
DEBUG=${args[--debug]}
ENV_FILE=${args[--env-file-path]}
if [[ ! -f $RC_STACK_SERVICES_EXT ]]; then
RC_STACK_SERVICES_EXT_LCL=""
else
RC_STACK_SERVICES_EXT_LCL="-f $RC_STACK_SERVICES_EXT"
fi
RC_STACK_PROFILES="--profile database --profile redis --profile elasticsearch --profile channelstream"
CMD_SERVICES="\
RC_ENV_FILE=$ENV_FILE docker compose \
--env-file $ENV_FILE \
$ENV_EXPAND \
$RC_STACK_PROFILES \
-p rc_cluster_services \
-f docker-compose-base.yaml \
-f docker-compose-services.yaml $RC_STACK_SERVICES_EXT_LCL"
if [[ $DEBUG ]]; then
echo "---"
echo "stacks docker: $RC_STACK_SERVICES_EXT_LCL"
echo "running command: ${CMD_SERVICES}"
echo "ARGS: ${other_args[*]}"
echo "---"
fi
eval "${CMD_SERVICES} ${other_args[*]}"
}
# :command.function
rccontrol_stack_rhodecode_command() {
# src/stack_rhodecode_command.sh
check_bootstrap
DEBUG=${args[--debug]}
ENV_FILE=${args[--env-file-path]}
if [[ ! -f $RC_STACK_RHODECODE_EXT ]]; then
RC_STACK_RHODECODE_EXT_LCL=""
else
RC_STACK_RHODECODE_EXT_LCL="-f $RC_STACK_RHODECODE_EXT"
fi
CMD_RHODECODE="\
RC_ENV_FILE=$ENV_FILE docker compose \
--env-file $ENV_FILE \
$ENV_EXPAND \
-p rc_cluster_apps \
-f docker-compose-base.yaml \
-f docker-compose-apps.yaml $RC_STACK_RHODECODE_EXT_LCL"
CMD_RHODECODE_SOURCE="\
RC_ENV_FILE=$ENV_FILE docker compose \
--env-file $ENV_FILE \
$ENV_EXPAND \
-p rc_cluster_apps \
-f docker-compose-base.yaml \
-f docker-compose-apps.yaml \
-f docker-compose-apps.source.yaml $RC_STACK_RHODECODE_EXT_LCL"
if [[ $DEBUG ]]; then
echo "---"
echo "stacks docker: $RC_STACK_RHODECODE_EXT_LCL"
echo "running command: ${CMD_RHODECODE}"
echo "ARGS: ${other_args[*]}"
echo "---"
fi
eval "${CMD_RHODECODE} ${other_args[*]}"
}
# :command.function
rccontrol_stack_all_command() {
# src/stack_all_command.sh
check_bootstrap
DEBUG=${args[--debug]}
stack_lst=$VALID_SERVICES
for stack in $stack_lst; do
./rccontrol stack $stack ${other_args[*]}
done
}
# :command.function
rccontrol_stack_status_command() {
# src/stack_status_command.sh
check_bootstrap
DEBUG=${args[--debug]}
DETAILED=${args[--detailed]}
if [[ $DEBUG ]]; then
echo "---"
ps_cmd=$(docker ps --filter=name=rc_cluster --format="{{.ID}}")
for service in $ps_cmd; do
servicename=`docker inspect --format '{{ .Name }}' $service`
servicename=${servicename:1}
echo $servicename
docker inspect $service --format='{{.State.Status}}: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
echo ""
done
echo "---"
fi
if [[ $DETAILED ]]; then
ps_cmd=$(docker ps --filter=name=rc_cluster --format="{{.ID}}")
for service in $ps_cmd; do
servicename=`docker inspect --format '{{ .Name }}' $service`
servicename=${servicename:1}
printf "CONTAINER:\\t$servicename\n"
printf "LOGS:\\t\\tdocker logs --tail=100 $service\n"
docker ps --filter=name=$servicename --format="ID:\\t\\t{{.ID}}\nIMAGE:\\t\\t{{.Image}}\nSTATUS:\\t\\t{{.Status}}\nPORTS:\\t\\t{{.Ports}}\n"
echo ""
done
else
docker ps --filter=name=rc_cluster --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
fi
}
# :command.function
rccontrol_stack_upgrade_router_command() {
# src/stack_upgrade_router_command.sh
echo "To upgrade this stack run this:"
echo "./rccontrol stack router up --force-recreate --build --detach"
echo ""
echo "To reclaim old image space run: docker image prune -f"
}
# :command.function
rccontrol_stack_upgrade_metrics_command() {
# src/stack_upgrade_metrics_command.sh
echo "To upgrade this stack run this:"
echo "./rccontrol stack metrics up --force-recreate --build --detach"
echo ""
echo "To reclaim old image space run: docker image prune -f"
}
# :command.function
rccontrol_stack_upgrade_services_command() {
# src/stack_upgrade_services_command.sh
echo "To upgrade this stack run this:"
echo "./rccontrol stack services up --force-recreate --build --detach"
echo ""
echo "To reclaim old image space run: docker image prune -f"
}
# :command.function
rccontrol_stack_upgrade_rhodecode_command() {
# src/stack_upgrade_rhodecode_command.sh
check_bootstrap
restart_unhealthy=${args[--restart-unhealthy]}
stop_wait=${args[--stop-wait]}
docker_stop_wait=3600
# search docker IDs for current service
.env --file $RUNTIME_ENV
.env get RC_VERSION
RC_VERSION=$REPLY
.env get RC_EDITION
RC_EDITION=$REPLY
if [[ $restart_unhealthy ]]; then
unhealthy=$(docker ps --filter health=unhealthy --filter label=autoheal=true --format "{{.ID}}")
if [[ $unhealthy == "" ]]; then
echo "$(green no unhealthy containers found)"
exit
fi
echo "$(yellow Found unhealthy containers $unhealthy)"
for container in $unhealthy
do
echo "restart $container"
docker restart --time=10 $container
done
exit
fi
echo "Pulling new image: rhodecode/rhodecode-ee:${RC_VERSION}"
#eval "docker pull rhodecode/rhodecode-ee:${RC_VERSION}"
stop_containers() {
target_container=$1
docker_stop_wait=$2
stop_wait=$3
target_containers_pat="rc_cluster_apps-$target_container-*"
local docker_ids=$(docker ps --filter name="$target_containers_pat" -q)
scale=$(echo $docker_ids | wc -w)
scale_2=$(($scale*2))
echo ""
echo "Found $scale services for $target_container"
echo "docker-ids: $docker_ids"
echo ""
echo "Scaling to $scale_2 containers for $target_container"
./rccontrol stack rhodecode up $target_container --no-recreate --detach --scale $target_container=$scale_2
echo ""
echo "Now running $scale_2 services for upgrade..."
echo ""
echo "Stopping old $target_container containers..."
spin='⣾⣽⣻⢿⡿⣟⣯⣷'
spin='⠾⠽⠻⠟⠯⠷'
charwidth=1
for container in $docker_ids
do
local i=$(($stop_wait * 10))
tput civis # cursor invisible
while true
s=$((i / 10))
do
i=$(($i-1))
if [[ $i -lt 1 ]]; then
break
fi
k=$(((k + $charwidth) % ${#spin}))
printf "%s waiting to stop $container in $s seconds..." "${spin:$k:$charwidth}"
printf "\r"
sleep .1
done
tput cnorm
echo "now running container $container stop with --time $docker_stop_wait"
docker stop --time $docker_stop_wait $container
docker rm $container
echo "Stopped $container"
done
}
# VCSSERVER
stop_containers "vcsserver" $docker_stop_wait $stop_wait
# RHODECODE
stop_containers "rhodecode" $docker_stop_wait $stop_wait
# SVN
stop_containers "svn" $docker_stop_wait $stop_wait
./rccontrol stack rhodecode up sshd --force-recreate --build --detach
./rccontrol stack rhodecode up celery --force-recreate --build --detach
./rccontrol stack rhodecode up celery-beat --force-recreate --build --detach
echo "Upgrade completed"
exit
}
# :command.function
rccontrol_cli_redis_command() {
# src/cli_redis_command.sh
check_bootstrap
DEBUG=${args[--debug]}
target_container=rc_cluster_services-redis-1
docker_id=$(docker ps --filter name=$target_container -q)
if [[ $DEBUG ]]; then
echo "container id: $docker_id, based on $target_container filter"
docker ps
fi
if [ "$docker_id" == "" ]; then
MSG="Cannot find container ID with name $target_container"
echo "$(red $MSG)"
exit
fi
if [[ $DEBUG ]]; then
echo "Running |docker exec --interactive --tty $docker_id $CMD|"
echo "docker exec --interactive --tty $docker_id /bin/bash -c 'redis-cli'"
fi
eval "docker exec --interactive --tty $docker_id /bin/bash -c 'redis-cli'"
}
# :command.function
rccontrol_cli_db_command() {
# src/cli_db_command.sh
check_bootstrap
DEBUG=${args[--debug]}
target_container=rc_cluster_services-database-1
docker_id=$(docker ps --filter name=$target_container -q)
if [[ $DEBUG ]]; then
echo "container id: $docker_id, based on $target_container filter"
docker ps
fi
if [ "$docker_id" == "" ]; then
MSG="Cannot find container ID with name $target_container"
echo "$(red $MSG)"
exit
fi
.env --file $RUNTIME_ENV
.env get DB_PASSWORD
DB_PASSWORD=$REPLY
.env get DB_NAME
DB_NAME=$REPLY
.env get DB_USER
DB_USER=$REPLY
if [[ $DEBUG ]]; then
echo "Running |docker exec --env-file $RUNTIME_ENV --interactive --tty $docker_id $CMD|"
echo "docker exec --interactive --tty $docker_id /bin/bash -c 'PGPASSWORD=$DB_PASSWORD psql --username=$DB_USER --dbname=$DB_NAME'"
fi
echo
eval "docker exec --env-file $RUNTIME_ENV --interactive --tty $docker_id /bin/bash -c 'PGPASSWORD=$DB_PASSWORD psql --username=$DB_USER --dbname=$DB_NAME'"
}
# :command.function
rccontrol_cli_db_upgrade_command() {
# src/cli_db_upgrade_command.sh
check_bootstrap
DEBUG=${args[--debug]}
target_container=rc_cluster_apps-rhodecode-1
docker_id=$(docker ps --filter name=$target_container -q)
if [[ $DEBUG ]]; then
echo "container id: $docker_id, based on $target_container filter"
docker ps
fi
if [ "$docker_id" == "" ]; then
MSG="Cannot find container ID with name $target_container"
echo "$(red $MSG)"
exit
fi
if [[ $DEBUG ]]; then
echo "./rccontrol stack rhodecode exec rhodecode /usr/local/bin/rhodecode_bin/bin/rc-upgrade-db /etc/rhodecode/conf/rhodecode.ini --force-yes"
fi
./rccontrol stack rhodecode exec rhodecode /usr/local/bin/rhodecode_bin/bin/rc-upgrade-db /etc/rhodecode/conf/rhodecode.ini --force-yes
}
# :command.function
rccontrol_cli_storage_command() {
# src/cli_storage_command.sh
check_bootstrap
DEBUG=${args[--debug]}
ENV_FILE=${args[--env-file-path]}
if [[ $DEBUG ]]; then
echo "rc_datavolume inspection..."
docker volume inspect rc_datavolume
echo "rc_reposvolume inspection..."
docker volume inspect rc_reposvolume
fi
#
#if [[ $DEBUG ]]; then
# echo "image id: $image_id, based on $target_container filter"
# docker image ls
# echo "---"
#fi
printf "attaching rc_datavolume \t\tunder: /vol/datavolume\n"
printf "attaching rc_reposvolume \t\tunder: /vol/repovolume\n"
printf "attaching \$PWD.custom/storage \t\tunder: /vol/backupvolume\n"
docker run --rm \
-it \
--volume $PWD/.custom/storage:/vol/backupvolume \
--volume rc_datavolume:/vol/datavolume \
--volume rc_reposvolume:/vol/repovolume \
--workdir="/vol" \
ubuntu:22.04 \
/bin/bash
}
# :command.function
rccontrol_cli_attach_command() {
# src/cli_attach_command.sh
match_name=rc_cluster_apps-rhodecode
docker_id=$(docker ps --filter name=$match_name -q | head -n1)
if [[ $docker_id == "" ]]; then
echo "$(yellow cannot find instance to attach by name *$match_name*)"
exit
fi
docker exec -it --tty $docker_id bash
}
# :command.function
rccontrol_backup_db_command() {
# src/backup_db_command.sh
check_bootstrap
DEBUG=${args[--debug]}
DESTINATION=${args[destination]}
target_container=rc_cluster_services-database-1
docker_id=$(docker ps --filter name=$target_container -q)
backup_name=rc_db_dump-$(date +%Y-%m-%d).sql.gz
echo "creating backup $backup_name"
if [[ $DEBUG ]]; then
echo "container id: $docker_id, based on $target_container filter"
docker ps
echo "---"
fi
#image_id=$(docker inspect "$docker_id" --format {{.Image}} | cut -c 8-)
#
#if [[ $DEBUG ]]; then
# echo "image id: $image_id, based on $target_container filter"
# docker image ls
# echo "---"
#fi
if [ "$docker_id" == "" ]; then
MSG="Cannot find container ID with name $target_container"
echo "$(red $MSG)"
exit
fi
#if [ "image_id" == "" ]; then
# MSG="Cannot find image ID with name $target_container"
# echo "$(red $MSG)"
# exit
#fi
# docker exec -i your-db-container psql -U your-db-user -d your-db-name gunzip < your_dump.sql.gz |
if [[ $DEBUG ]]; then
echo "docker exec -e PGPASSWORD=$DB_PASSWORD $docker_id /bin/bash -c 'mkdir -p /var/rc-data-dump && pg_dump --inserts -U $DB_USER -h 127.0.0.1 --dbname=$DB_NAME | gzip > /var/rc-data-dump/$backup_name'"
echo "dump placed in /var/rc-data-dump/$backup_name"
echo "run docker cp $docker_id:/var/rc-data-dump/$backup_name $PWD to copy the file into your host machine"
fi
eval "docker exec -e PGPASSWORD=$DB_PASSWORD $docker_id /bin/bash -c 'pg_dump --inserts -U $DB_USER -h 127.0.0.1 --dbname=$DB_NAME | gzip > /var/rc-data-dump/$backup_name'"
echo "$(green Backup created in /var/rc-data-dump/ mount !)"
}
# :command.function
rccontrol_backup_data_command() {
# src/backup_data_command.sh
echo "# this file is located in 'src/backup_data_command.sh'"
echo "# code for 'rccontrol backup-data' goes here"
echo "# you can edit it freely and regenerate (it will not be overwritten)"
inspect_args
}
# :command.function
rccontrol__completions_command() {
# src/_completions_command.sh
send_completions
}
# :command.parse_requirements
parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--version | -v)
version_command
exit
;;
--help | -h)
long_usage=yes
rccontrol_usage
exit
;;
# :flag.case
--debug)
# :flag.case_no_arg
args[--debug]=1
shift
;;
*)
break
;;
esac
done
# :command.environment_variables_filter
# :command.environment_variables_default
export RC_CLI_VERSION_NAME="${RC_CLI_VERSION_NAME:-4.28.0.REL.2022.12.21}"
export RCC_CONFIG="${RCC_CONFIG:-.rccontrol.ini}"
export RC_STACK_ROUTER_EXT="${RC_STACK_ROUTER_EXT:-.custom/docker-compose-router.override.yaml}"
export RC_STACK_METRICS_EXT="${RC_STACK_METRICS_EXT:-.custom/docker-compose-metrics.override.yaml}"
export RC_STACK_SERVICES_EXT="${RC_STACK_SERVICES_EXT:-.custom/docker-compose-services.override.yaml}"
export RC_STACK_RHODECODE_EXT="${RC_STACK_RHODECODE_EXT:-.custom/docker-compose-apps.override.yaml}"
# :command.command_filter
action=${1:-}
case $action in
-*) ;;
self-update)
action="self-update"
shift
rccontrol_self_update_parse_requirements "$@"
shift $#
;;
bootstrap | init)
action="bootstrap"
shift
rccontrol_bootstrap_parse_requirements "$@"
shift $#
;;
get-build-artifacts)
action="get-build-artifacts"
shift
rccontrol_get_build_artifacts_parse_requirements "$@"
shift $#
;;
build)
action="build"
shift
rccontrol_build_parse_requirements "$@"
shift $#
;;
get-build-source)
action="get-build-source"
shift
rccontrol_get_build_source_parse_requirements "$@"
shift $#
;;
build-source)
action="build-source"
shift
rccontrol_build_source_parse_requirements "$@"
shift $#
;;
stack)
action="stack"
shift
rccontrol_stack_parse_requirements "$@"
shift $#
;;
stack-status | status)
action="stack-status"
shift
rccontrol_stack_status_parse_requirements "$@"
shift $#
;;
stack-upgrade)
action="stack-upgrade"
shift
rccontrol_stack_upgrade_parse_requirements "$@"
shift $#
;;
cli)
action="cli"
shift
rccontrol_cli_parse_requirements "$@"
shift $#
;;
backup-db)
action="backup-db"
shift
rccontrol_backup_db_parse_requirements "$@"
shift $#
;;
backup-data)
action="backup-data"
shift
rccontrol_backup_data_parse_requirements "$@"
shift $#
;;
_completions)
action="_completions"
shift
rccontrol__completions_parse_requirements "$@"
shift $#
;;
# :command.command_fallback
"")
rccontrol_usage >&2
exit 1
;;
*)
printf "invalid command: %s\n" "$action" >&2
exit 1
;;
esac
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_self_update_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_self_update_usage
exit
;;
*)
break
;;
esac
done
# :command.dependencies_filter
if ! command -v curl >/dev/null 2>&1; then
printf "missing dependency: curl\n" >&2
exit 1
fi
if ! command -v tar >/dev/null 2>&1; then
printf "missing dependency: tar\n" >&2
exit 1
fi
# :command.command_filter
action="self-update"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--revision)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--revision]="$2"
shift
shift
else
printf "%s\n" "--revision requires an argument: --revision REVISION" >&2
exit 1
fi
;;
# :flag.case
--auth-token)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--auth-token]="$2"
shift
shift
else
printf "%s\n" "--auth-token requires an argument: --auth-token AUTH_TOKEN" >&2
exit 1
fi
;;
# :flag.case
--server-url)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--server-url]="$2"
shift
shift
else
printf "%s\n" "--server-url requires an argument: --server-url SERVER_URL" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--revision]:-} ]] || args[--revision]="master"
[[ -n ${args[--server-url]:-} ]] || args[--server-url]="https://code.rhodecode.com"
}
# :command.parse_requirements
rccontrol_bootstrap_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_bootstrap_usage
exit
;;
*)
break
;;
esac
done
# :command.dependencies_filter
if ! command -v curl >/dev/null 2>&1; then
printf "missing dependency: curl\n" >&2
exit 1
fi
if ! command -v tar >/dev/null 2>&1; then
printf "missing dependency: tar\n" >&2
exit 1
fi
if ! command -v md5sum >/dev/null 2>&1; then
printf "missing dependency: md5sum\n" >&2
exit 1
fi
if ! command -v find >/dev/null 2>&1; then
printf "missing dependency: find\n" >&2
exit 1
fi
# :command.command_filter
action="bootstrap"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--force | -f)
# :flag.case_no_arg
args[--force]=1
shift
;;
# :flag.case
--auth-token)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--auth-token]="$2"
shift
shift
else
printf "%s\n" "--auth-token requires an argument: --auth-token AUTH_TOKEN" >&2
exit 1
fi
;;
# :flag.case
--server-url)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--server-url]="$2"
shift
shift
else
printf "%s\n" "--server-url requires an argument: --server-url SERVER_URL" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--server-url]:-} ]] || args[--server-url]="https://code.rhodecode.com"
}
# :command.parse_requirements
rccontrol_get_build_artifacts_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_get_build_artifacts_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="get-build-artifacts"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--auth)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--auth]="$2"
shift
shift
else
printf "%s\n" "--auth requires an argument: --auth AUTH" >&2
exit 1
fi
;;
# :flag.case
--installer-url)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--installer-url]="$2"
shift
shift
else
printf "%s\n" "--installer-url requires an argument: --installer-url INSTALLER_URL" >&2
exit 1
fi
;;
# :flag.case
--manifest-url)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--manifest-url]="$2"
shift
shift
else
printf "%s\n" "--manifest-url requires an argument: --manifest-url MANIFEST_URL" >&2
exit 1
fi
;;
# :flag.case
--version-name)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--version-name]="$2"
shift
shift
else
printf "%s\n" "--version-name requires an argument: --version-name VERSION_NAME" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--auth]:-} ]] || args[--auth]=""
[[ -n ${args[--installer-url]:-} ]] || args[--installer-url]="https://dls.rhodecode.com/dls/N2E2ZTY1NzA3NjYxNDA2NTc1NjI3MTcyNzA2MjcxNzIyZTcwNjI3YQ==/rhodecode-control/latest-linux-ee"
[[ -n ${args[--manifest-url]:-} ]] || args[--manifest-url]="https://dls.rhodecode.com/linux/MANIFEST"
[[ -n ${args[--version-name]:-} ]] || args[--version-name]="$RC_CLI_VERSION_NAME"
}
# :command.parse_requirements
rccontrol_build_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_build_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="build"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--version-name)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--version-name]="$2"
shift
shift
else
printf "%s\n" "--version-name requires an argument: --version-name VERSION_NAME" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--version-name]:-} ]] || args[--version-name]="$RC_CLI_VERSION_NAME"
}
# :command.parse_requirements
rccontrol_get_build_source_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_get_build_source_usage
exit
;;
*)
break
;;
esac
done
# :command.dependencies_filter
if ! command -v curl >/dev/null 2>&1; then
printf "missing dependency: curl\n" >&2
exit 1
fi
if ! command -v tar >/dev/null 2>&1; then
printf "missing dependency: tar\n" >&2
exit 1
fi
# :command.command_filter
action="get-build-source"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--revision)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--revision]="$2"
shift
shift
else
printf "%s\n" "--revision requires an argument: --revision REVISION" >&2
exit 1
fi
;;
# :flag.case
--auth-token)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--auth-token]="$2"
shift
shift
else
printf "%s\n" "--auth-token requires an argument: --auth-token AUTH_TOKEN" >&2
exit 1
fi
;;
# :flag.case
--server-url)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--server-url]="$2"
shift
shift
else
printf "%s\n" "--server-url requires an argument: --server-url SERVER_URL" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--revision]:-} ]] || args[--revision]="default"
[[ -n ${args[--server-url]:-} ]] || args[--server-url]="https://code.rhodecode.com"
}
# :command.parse_requirements
rccontrol_build_source_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_build_source_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="build-source"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--version-name)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--version-name]="$2"
shift
shift
else
printf "%s\n" "--version-name requires an argument: --version-name VERSION_NAME" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--version-name]:-} ]] || args[--version-name]="$RC_CLI_VERSION_NAME"
}
# :command.parse_requirements
rccontrol_stack_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_usage
exit
;;
# :flag.case
--env-file-path)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--env-file-path]="$2"
shift
shift
else
printf "%s\n" "--env-file-path requires an argument: --env-file-path ENV_FILE_PATH" >&2
exit 1
fi
;;
*)
break
;;
esac
done
# :command.command_filter
action=${1:-}
case $action in
-*) ;;
router)
action="router"
shift
rccontrol_stack_router_parse_requirements "$@"
shift $#
;;
metrics)
action="metrics"
shift
rccontrol_stack_metrics_parse_requirements "$@"
shift $#
;;
services)
action="services"
shift
rccontrol_stack_services_parse_requirements "$@"
shift $#
;;
rhodecode)
action="rhodecode"
shift
rccontrol_stack_rhodecode_parse_requirements "$@"
shift $#
;;
all)
action="all"
shift
rccontrol_stack_all_parse_requirements "$@"
shift $#
;;
# :command.command_fallback
"")
rccontrol_stack_usage >&2
exit 1
;;
*)
printf "invalid command: %s\n" "$action" >&2
exit 1
;;
esac
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--env-file-path]:-} ]] || args[--env-file-path]="$PWD/.custom/.runtime.env"
}
# :command.parse_requirements
rccontrol_stack_router_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_router_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack router"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
other_args+=("$1")
shift
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_catch_all
other_args+=("$1")
shift
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_metrics_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_metrics_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack metrics"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
other_args+=("$1")
shift
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_catch_all
other_args+=("$1")
shift
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_services_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_services_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack services"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
other_args+=("$1")
shift
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_catch_all
other_args+=("$1")
shift
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_rhodecode_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_rhodecode_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack rhodecode"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
other_args+=("$1")
shift
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_catch_all
other_args+=("$1")
shift
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_all_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_all_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack all"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
other_args+=("$1")
shift
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_catch_all
other_args+=("$1")
shift
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_status_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_status_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack-status"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--detailed)
# :flag.case_no_arg
args[--detailed]=1
shift
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_upgrade_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_upgrade_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action=${1:-}
case $action in
-*) ;;
router)
action="router"
shift
rccontrol_stack_upgrade_router_parse_requirements "$@"
shift $#
;;
metrics)
action="metrics"
shift
rccontrol_stack_upgrade_metrics_parse_requirements "$@"
shift $#
;;
services)
action="services"
shift
rccontrol_stack_upgrade_services_parse_requirements "$@"
shift $#
;;
rhodecode)
action="rhodecode"
shift
rccontrol_stack_upgrade_rhodecode_parse_requirements "$@"
shift $#
;;
# :command.command_fallback
"")
rccontrol_stack_upgrade_usage >&2
exit 1
;;
*)
printf "invalid command: %s\n" "$action" >&2
exit 1
;;
esac
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_upgrade_router_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_upgrade_router_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack-upgrade router"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_upgrade_metrics_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_upgrade_metrics_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack-upgrade metrics"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_upgrade_services_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_upgrade_services_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack-upgrade services"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_stack_upgrade_rhodecode_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_stack_upgrade_rhodecode_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="stack-upgrade rhodecode"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
# :flag.case
--restart-unhealthy)
# :flag.case_no_arg
args[--restart-unhealthy]=1
shift
;;
# :flag.case
--stop-wait)
# :flag.case_arg
if [[ -n ${2+x} ]]; then
args[--stop-wait]="$2"
shift
shift
else
printf "%s\n" "--stop-wait requires an argument: --stop-wait STOP_WAIT" >&2
exit 1
fi
;;
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
# :command.default_assignments
[[ -n ${args[--stop-wait]:-} ]] || args[--stop-wait]="120"
}
# :command.parse_requirements
rccontrol_cli_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action=${1:-}
case $action in
-*) ;;
redis)
action="redis"
shift
rccontrol_cli_redis_parse_requirements "$@"
shift $#
;;
db)
action="db"
shift
rccontrol_cli_db_parse_requirements "$@"
shift $#
;;
db-upgrade)
action="db-upgrade"
shift
rccontrol_cli_db_upgrade_parse_requirements "$@"
shift $#
;;
storage)
action="storage"
shift
rccontrol_cli_storage_parse_requirements "$@"
shift $#
;;
attach)
action="attach"
shift
rccontrol_cli_attach_parse_requirements "$@"
shift $#
;;
# :command.command_fallback
"")
rccontrol_cli_usage >&2
exit 1
;;
*)
printf "invalid command: %s\n" "$action" >&2
exit 1
;;
esac
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_cli_redis_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_redis_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="cli redis"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_cli_db_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_db_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="cli db"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_cli_db_upgrade_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_db_upgrade_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="cli db-upgrade"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_cli_storage_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_storage_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="cli storage"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_cli_attach_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_cli_attach_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="cli attach"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_backup_db_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_backup_db_usage
exit
;;
*)
break
;;
esac
done
# :command.dependencies_filter
if ! command -v tar >/dev/null 2>&1; then
printf "missing dependency: tar\n" >&2
exit 1
fi
if ! command -v gzip >/dev/null 2>&1; then
printf "missing dependency: gzip\n" >&2
exit 1
fi
# :command.command_filter
action="backup-db"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol_backup_data_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol_backup_data_usage
exit
;;
*)
break
;;
esac
done
# :command.dependencies_filter
if ! command -v tar >/dev/null 2>&1; then
printf "missing dependency: tar\n" >&2
exit 1
fi
# :command.command_filter
action="backup-data"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.parse_requirements
rccontrol__completions_parse_requirements() {
# :command.fixed_flags_filter
while [[ $# -gt 0 ]]; do
case "${1:-}" in
--help | -h)
long_usage=yes
rccontrol__completions_usage
exit
;;
*)
break
;;
esac
done
# :command.command_filter
action="_completions"
# :command.parse_requirements_while
while [[ $# -gt 0 ]]; do
key="$1"
case "$key" in
-?*)
printf "invalid option: %s\n" "$key" >&2
exit 1
;;
*)
# :command.parse_requirements_case
# :command.parse_requirements_case_simple
printf "invalid argument: %s\n" "$key" >&2
exit 1
;;
esac
done
}
# :command.initialize
initialize() {
version="4.28.0.REL.2022.12.21.2"
long_usage=''
set -e
# :command.environment_variables_default
export RC_CLI_VERSION_NAME="${RC_CLI_VERSION_NAME:-4.28.0.REL.2022.12.21}"
export RCC_CONFIG="${RCC_CONFIG:-.rccontrol.ini}"
export RC_STACK_ROUTER_EXT="${RC_STACK_ROUTER_EXT:-.custom/docker-compose-router.override.yaml}"
export RC_STACK_METRICS_EXT="${RC_STACK_METRICS_EXT:-.custom/docker-compose-metrics.override.yaml}"
export RC_STACK_SERVICES_EXT="${RC_STACK_SERVICES_EXT:-.custom/docker-compose-services.override.yaml}"
export RC_STACK_RHODECODE_EXT="${RC_STACK_RHODECODE_EXT:-.custom/docker-compose-apps.override.yaml}"
# src/initialize.sh
# bootstrap file is a config file at the same time
CONFIG_FILE=${RCC_CONFIG:=.rccontrol.ini}
# runtime env file
RUNTIME_ENV=$PWD/.custom/.runtime.env
# STACK_LIST
VALID_SERVICES="router metrics services rhodecode"
DOCKER_DEFS_WORK_DIR="docker_defs"
# stage key, saved in .rccontrol.ini : stage func to execute
BOOTSTRAP_STAGES="\
bootstrap_v1_docker_install:bootstrap_docker_install \
bootstrap_v1_docker_commons:bootstrap_docker_commons \
bootstrap_v1_config:bootstrap_config \
bootstrap_v1_definitions:bootstrap_definitions \
bootstrap_v1_overrides:bootstrap_overrides \
"
#echo "1 ----"
#echo $RC_STACK_SERVICES_EXT
#echo $RC_STACK_METRICS_EXT
#echo "1 -----"
#echo '2 ----'
#grep -v -e '^#' "$ENV_FILE" | xargs -I {} echo \'{}\'
#echo '2 ----'
#expose env vars from rccontrol donfig
#if [[ -f $ENV_FILE ]]; then
# eval $(grep -v -e '^#' "$ENV_FILE" | xargs -I {} echo export \'{}\')
#fi
#ENV_EXPAND=""
#for k in $(config_keys); do
# k_upper=${k^^}
# env_entry="-e $k_upper='$(config_get "$k")' "
# ENV_EXPAND+=$env_entry;
# #echo $env_expand
#done
#
#echo "3 ----"
#echo $RC_STACK_SERVICES_EXT
#echo $RC_STACK_METRICS_EXT
#echo $RC_STACK_RHODECODE_EXT
#echo "3 -----"
#env | grep RC_
docker_ping_host() {
PING_HOST="$1"
docker run --network rhodecode_network --rm alpine ping "$PING_HOST"
}
# backup files from a docker volume into /tmp/backup.tar.gz
docker-volume-backup-compressed() {
docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
docker-volume-restore-compressed() {
docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
echo "Double checking files..."
docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
docker-volume-backup() {
docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
docker-volume-restore() {
docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
echo "Double checking files..."
docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}
get_started() {
echo ""
echo "To start using RhodeCode run the following stacks using ./rccontrol stack [STACK_NAME]"
echo ""
echo "$(yellow_bold [Optional]): run the edge router to control domain and SSL"
echo "./rccontrol stack router up --detach"
echo ""
echo "$(green_bold [Mandatory]): run the services, like database, redis, channelstream etc..."
echo "./rccontrol stack services up --detach"
echo ""
echo "$(green_bold [Mandatory]): run the rhodecode app stack"
echo "./rccontrol stack rhodecode up --detach"
echo ""
echo "$(yellow_bold [Optional]): run the monitoring stack, this includes grafana/promethues logging/metrics system"
echo "./rccontrol stack metrics up --detach"
echo ""
echo "$(bold [Status]): check services run status, ports etc.."
echo "./rccontrol status"
echo ""
echo "$(bold [Logs]): check service logs"
echo "./rccontrol logs SERVICE_NAME"
}
}
# :command.run
run() {
declare -A args=()
declare -a other_args=()
declare -a input=()
normalize_input "$@"
parse_requirements "${input[@]}"
case "$action" in
"self-update")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_self_update_usage
else
rccontrol_self_update_command
fi
;;
"bootstrap")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_bootstrap_usage
else
rccontrol_bootstrap_command
fi
;;
"get-build-artifacts")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_get_build_artifacts_usage
else
rccontrol_get_build_artifacts_command
fi
;;
"build")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_build_usage
else
rccontrol_build_command
fi
;;
"get-build-source")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_get_build_source_usage
else
rccontrol_get_build_source_command
fi
;;
"build-source")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_build_source_usage
else
rccontrol_build_source_command
fi
;;
"stack")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_usage
else
rccontrol_stack_command
fi
;;
"stack router")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_router_usage
else
rccontrol_stack_router_command
fi
;;
"stack metrics")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_metrics_usage
else
rccontrol_stack_metrics_command
fi
;;
"stack services")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_services_usage
else
rccontrol_stack_services_command
fi
;;
"stack rhodecode")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_rhodecode_usage
else
rccontrol_stack_rhodecode_command
fi
;;
"stack all")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_all_usage
else
rccontrol_stack_all_command
fi
;;
"stack-status")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_status_usage
else
rccontrol_stack_status_command
fi
;;
"stack-upgrade")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_upgrade_usage
else
rccontrol_stack_upgrade_command
fi
;;
"stack-upgrade router")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_upgrade_router_usage
else
rccontrol_stack_upgrade_router_command
fi
;;
"stack-upgrade metrics")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_upgrade_metrics_usage
else
rccontrol_stack_upgrade_metrics_command
fi
;;
"stack-upgrade services")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_upgrade_services_usage
else
rccontrol_stack_upgrade_services_command
fi
;;
"stack-upgrade rhodecode")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_stack_upgrade_rhodecode_usage
else
rccontrol_stack_upgrade_rhodecode_command
fi
;;
"cli")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_usage
else
rccontrol_cli_command
fi
;;
"cli redis")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_redis_usage
else
rccontrol_cli_redis_command
fi
;;
"cli db")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_db_usage
else
rccontrol_cli_db_command
fi
;;
"cli db-upgrade")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_db_upgrade_usage
else
rccontrol_cli_db_upgrade_command
fi
;;
"cli storage")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_storage_usage
else
rccontrol_cli_storage_command
fi
;;
"cli attach")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_cli_attach_usage
else
rccontrol_cli_attach_command
fi
;;
"backup-db")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_backup_db_usage
else
rccontrol_backup_db_command
fi
;;
"backup-data")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol_backup_data_usage
else
rccontrol_backup_data_command
fi
;;
"_completions")
if [[ ${args[--help]:-} ]]; then
long_usage=yes
rccontrol__completions_usage
else
rccontrol__completions_command
fi
;;
esac
}
initialize
run "$@"