diff --git a/common-functions b/common-functions index c0b316c..331c2aa 100755 --- a/common-functions +++ b/common-functions @@ -3,6 +3,7 @@ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config" set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_AVAILABLE_PATH/config/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" docker_ports_options() { declare desc="Exports a list of exposed ports" @@ -23,11 +24,11 @@ get_database_name() { declare SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - if [[ ! -f "$SERVICE_ROOT/DATABASE_NAME" ]]; then - echo "$SERVICE" > "$SERVICE_ROOT/DATABASE_NAME" + if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME"; then + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" "$SERVICE" fi - cat "$SERVICE_ROOT/DATABASE_NAME" + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" } get_random_ports() { @@ -105,14 +106,13 @@ remove_from_links_file() { declare desc="Removes an app from the service link file" declare SERVICE="$1" APP="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - - if [[ ! -f "$LINKS_FILE" ]]; then + if ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS"; then return fi - sed -i.bak "/^$APP\$/d" "$LINKS_FILE" && rm "$LINKS_FILE.bak" - sort "$LINKS_FILE" -u -o "$LINKS_FILE" + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + EXISTING_LINKS="$(echo "$EXISTING_LINKS" | sort -u | sed -e "/^$APP\$/d" -e "/^$/d")" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "$EXISTING_LINKS" } retry-docker-command() { @@ -160,8 +160,8 @@ service_app_links() { pushd "$PLUGIN_DATA_ROOT" >/dev/null for SERVICE in *; do - [[ -f "$SERVICE/LINKS" ]] || continue - for LINKED_APP in $(<"$SERVICE/LINKS"); do + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" || continue + for LINKED_APP in $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS"); do if [[ "$LINKED_APP" == "$APP" ]]; then echo "$SERVICE" fi @@ -174,16 +174,14 @@ service_backup() { declare SERVICE="$1" BUCKET_NAME="$2" USE_IAM_OPTIONAL_FLAG="$3" local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" local BACKUP_ENCRYPTION_CONFIG_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup-encryption" - local AWS_ACCESS_KEY_ID_FILE="$SERVICE_BACKUP_ROOT/AWS_ACCESS_KEY_ID" - local AWS_SECRET_ACCESS_KEY_FILE="$SERVICE_BACKUP_ROOT/AWS_SECRET_ACCESS_KEY" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local BACKUP_PARAMETERS="" if [[ -z "$USE_IAM_OPTIONAL_FLAG" ]]; then [[ ! -f "$AWS_ACCESS_KEY_ID_FILE" ]] && dokku_log_fail "Missing AWS_ACCESS_KEY_ID file" [[ ! -f "$AWS_SECRET_ACCESS_KEY_FILE" ]] && dokku_log_fail "Missing AWS_SECRET_ACCESS_KEY file" - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_ACCESS_KEY_ID=$(cat "$AWS_ACCESS_KEY_ID_FILE") -e AWS_SECRET_ACCESS_KEY=$(cat "$AWS_SECRET_ACCESS_KEY_FILE")" + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_ACCESS_KEY_ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID") -e AWS_SECRET_ACCESS_KEY=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY_ID")" elif [[ "$USE_IAM_OPTIONAL_FLAG" != "--use-iam" ]] && [[ "$USE_IAM_OPTIONAL_FLAG" != "-u" ]]; then dokku_log_fail "Provide AWS credentials or use the --use-iam flag" fi @@ -201,20 +199,20 @@ service_backup() { BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e BACKUP_NAME=${PLUGIN_COMMAND_PREFIX}-${SERVICE}" BACKUP_PARAMETERS="$BACKUP_PARAMETERS -v ${TMPDIR}:/backup" - if [[ -f "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(cat "$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_DEFAULT_REGION=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION")" fi - if [[ -f "$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_SIGNATURE_VERSION=$(cat "$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e AWS_SIGNATURE_VERSION=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION")" fi - if [[ -f "$SERVICE_BACKUP_ROOT/ENDPOINT_URL" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENDPOINT_URL=$(cat "$SERVICE_BACKUP_ROOT/ENDPOINT_URL")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENDPOINT_URL=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL")" fi - if [[ -f "$BACKUP_ENCRYPTION_CONFIG_ROOT/ENCRYPTION_KEY" ]]; then - BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENCRYPTION_KEY=$(cat "$BACKUP_ENCRYPTION_CONFIG_ROOT/ENCRYPTION_KEY")" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY"; then + BACKUP_PARAMETERS="$BACKUP_PARAMETERS -e ENCRYPTION_KEY=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY")" fi # shellcheck disable=SC2086 @@ -224,32 +222,31 @@ service_backup() { service_backup_auth() { declare desc="Sets up authentication" declare SERVICE="$1" AWS_ACCESS_KEY_ID="$2" AWS_SECRET_ACCESS_KEY="$3" AWS_DEFAULT_REGION="$4" AWS_SIGNATURE_VERSION="$5" ENDPOINT_URL="$6" - local SERVICE_BACKUP_ROOT="$PLUGIN_DATA_ROOT/$SERVICE/backup" - mkdir "$SERVICE_BACKUP_ROOT" - echo "$AWS_ACCESS_KEY_ID" >"$SERVICE_BACKUP_ROOT/AWS_ACCESS_KEY_ID" - echo "$AWS_SECRET_ACCESS_KEY" >"$SERVICE_BACKUP_ROOT/AWS_SECRET_ACCESS_KEY" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID" "$AWS_ACCESS_KEY_ID" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY" "$AWS_SECRET_ACCESS_KEY" if [[ -n "$AWS_DEFAULT_REGION" ]]; then - echo "$AWS_DEFAULT_REGION" >"$SERVICE_BACKUP_ROOT/AWS_DEFAULT_REGION" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION" "$AWS_DEFAULT_REGION" fi if [[ -n "$AWS_SIGNATURE_VERSION" ]]; then - echo "$AWS_SIGNATURE_VERSION" >"$SERVICE_BACKUP_ROOT/AWS_SIGNATURE_VERSION" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION" "$AWS_SIGNATURE_VERSION" fi if [[ -n "$ENDPOINT_URL" ]]; then - echo "$ENDPOINT_URL" >"$SERVICE_BACKUP_ROOT/ENDPOINT_URL" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL" "$ENDPOINT_URL" fi } service_backup_deauth() { declare desc="Removes authentication" declare SERVICE="$1" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ROOT="${SERVICE_ROOT}/backup/" - - rm -rf "$SERVICE_BACKUP_ROOT" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_ACCESS_KEY_ID" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SECRET_ACCESS_KEY" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_DEFAULT_REGION" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_AWS_SIGNATURE_VERSION" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENDPOINT_URL" } service_backup_schedule() { @@ -284,11 +281,8 @@ service_backup_schedule_cat() { service_backup_set_encryption() { declare desc="Sets up backup encryption" declare SERVICE="$1" ENCRYPTION_KEY="$2" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY" "$ENCRYPTION_KEY" - mkdir "$SERVICE_BACKUP_ENCRYPTION_ROOT" - echo "$ENCRYPTION_KEY" >"${SERVICE_BACKUP_ENCRYPTION_ROOT}/ENCRYPTION_KEY" } service_backup_unschedule() { @@ -302,10 +296,7 @@ service_backup_unschedule() { service_backup_unset_encryption() { declare desc="Removes backup encryption" declare SERVICE="$1" - local SERVICE_ROOT="${PLUGIN_DATA_ROOT}/${SERVICE}" - local SERVICE_BACKUP_ENCRYPTION_ROOT="${SERVICE_ROOT}/backup-encryption/" - - rm -rf "$SERVICE_BACKUP_ENCRYPTION_ROOT" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "BACKUP_ENCRYPTION_KEY" } service_container_rm() { @@ -339,7 +330,7 @@ service_enter() { declare desc="enters running app container of specified proc type" declare SERVICE="$1" && shift 1 local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") docker inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running" @@ -354,9 +345,8 @@ service_exposed_ports() { declare desc="Lists exposed ports for a service" declare SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PORT_FILE="$SERVICE_ROOT/PORT" - [[ ! -f $PORT_FILE ]] && echo '-' && return 0 - local PORTS=($(cat "$PORT_FILE")) + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && echo '-' && return 0 + local PORTS=($(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")) for ((i = 0; i < ${#PLUGIN_DATASTORE_PORTS[@]}; i++)); do echo -n "${PLUGIN_DATASTORE_PORTS[i]}->${PORTS[i]} " done @@ -379,7 +369,7 @@ service_info() { local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_URL=$(service_url "$SERVICE") local PORT_FILE="$SERVICE_ROOT/PORT" - local SERVICE_CONTAINER_ID="$(cat "$SERVICE_ROOT/ID")" + local SERVICE_CONTAINER_ID="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID")" local flag key valid_flags local flag_map=( @@ -436,7 +426,6 @@ service_link() { local EXISTING_CONFIG=$(config_all "$APP") local LINK=$(echo "$EXISTING_CONFIG" | grep "$SERVICE_URL" | cut -d: -f1) || true local SERVICE_DNS_HOSTNAME=$(service_dns_hostname "$SERVICE") - local LINKS_FILE="$SERVICE_ROOT/LINKS" local ALIAS="$PLUGIN_DEFAULT_ALIAS" local DEFAULT_ALIAS @@ -453,9 +442,11 @@ service_link() { fi [[ -n $LINK ]] && dokku_log_fail "Already linked as $LINK" - touch "$LINKS_FILE" - echo "$APP" >>"$LINKS_FILE" - sort "$LINKS_FILE" -u -o "$LINKS_FILE" + + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + EXISTING_LINKS="$(echo -e "$APP\n$EXISTING_LINKS" | sort -u | sed "/^$/d")" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "$EXISTING_LINKS" + if declare -f -F add_passed_docker_option >/dev/null; then # shellcheck disable=SC2034 @@ -471,25 +462,21 @@ service_link() { service_linked_apps() { declare desc="Lists all apps linked to a service for info output" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - touch "$LINKS_FILE" - [[ -z $(<"$LINKS_FILE") ]] && echo '-' && return 0 + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + [[ -z $EXISTING_LINKS ]] && echo "-" && return 0 - tr '\n' ' ' <"$LINKS_FILE" + echo "$EXISTING_LINKS" | tr '\n' ' ' } service_links() { declare desc="Lists all apps linked to a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local LINKS_FILE="$SERVICE_ROOT/LINKS" - touch "$LINKS_FILE" - [[ -z $(<"$LINKS_FILE") ]] && return 0 + EXISTING_LINKS="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "")" + [[ -z $EXISTING_LINKS ]] && echo '-' && return 0 - cat "$LINKS_FILE" + echo "$EXISTING_LINKS" } service_list() { @@ -511,7 +498,7 @@ service_logs() { declare desc="Displays logs for a service" declare SERVICE="$1" TAIL_FLAG="$2" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID=$(cat "$SERVICE_ROOT/ID") + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local RE_INTEGER='^[0-9]+$' DOKKU_LOGS_ARGS="--tail 100" @@ -599,20 +586,16 @@ service_parse_args() { service_password() { declare desc="Fetch the password for a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PASSWORD_FILE="$SERVICE_ROOT/PASSWORD" - if [[ -f "$PASSWORD_FILE" ]]; then - cat "$PASSWORD_FILE" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD"; then + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD" fi } service_root_password() { declare desc="Fetch the root password for a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PASSWORD_FILE="$SERVICE_ROOT/ROOTPASSWORD" - if [[ -f "$PASSWORD_FILE" ]]; then - cat "$PASSWORD_FILE" + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ROOTPASSWORD"; then + fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ROOTPASSWORD" fi } @@ -631,9 +614,9 @@ service_port_pause() { local PORT_FILE="$SERVICE_ROOT/PORT" if [[ "$LOG_FAIL" == "true" ]]; then - [[ ! -f "$PORT_FILE" ]] && dokku_log_fail "Service not exposed" + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && dokku_log_fail "Service not exposed" else - [[ ! -f "$PORT_FILE" ]] && return 0 + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 fi local GREP_NAME="^/${EXPOSED_NAME}$" @@ -656,10 +639,8 @@ service_port_pause() { service_port_unexpose() { declare desc="Wrapper for pausing exposed service ports" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local PORT_FILE="$SERVICE_ROOT/PORT" service_port_pause "$SERVICE" "true" - rm -rf "$PORT_FILE" + fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" } service_port_unpause() { @@ -673,18 +654,18 @@ service_port_unpause() { local PORTS=(${@:3}) # shellcheck disable=SC2068 PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})}) - local ID=$(cat "$SERVICE_ROOT/ID") + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") [[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}" if [[ "$LOG_FAIL" == "true" ]]; then - [[ -f "$PORT_FILE" ]] && PORTS=($(cat "$PORT_FILE")) && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" + fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" else - [[ ! -f "$PORT_FILE" ]] && return 0 - PORTS=($(cat "$PORT_FILE")) + ! fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" && return 0 + IFS=" " read -r -a PORTS <<< "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS")" fi - echo "${PORTS[@]}" >"$PORT_FILE" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PORTS" "${PORTS[@]}" # shellcheck disable=SC2046 docker run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null @@ -724,18 +705,14 @@ service_promote() { service_set_alias() { declare desc="Sets the alias in use for a service" declare SERVICE="$1" ALIAS="$2" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ALIAS_FILE="$SERVICE_ROOT/ALIAS" - touch "$ALIAS_FILE" - echo "$ALIAS" >"$ALIAS_FILE" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ALIAS" "$ALIAS" } service_status() { declare desc="Displays the status of a service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") local CONTAINER_STATUS CONTAINER_STATUS=$(docker inspect -f "{{.State.Status}}" "$ID" 2>/dev/null || true) @@ -746,7 +723,6 @@ service_status() { service_stop() { declare desc="Stops a running service" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_NAME="$(get_service_name "$SERVICE")" local ID=$(docker ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true [[ -z $ID ]] && dokku_log_warn "Service is already stopped" && return 0 @@ -812,9 +788,9 @@ verify_service_name() { write_database_name() { declare desc="Writes a sanitized database name" declare SERVICE="$1" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" # some datastores do not like special characters in database names # so we need to normalize them out - echo "$SERVICE" | tr .- _ > "$SERVICE_ROOT/DATABASE_NAME" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "DATABASE_NAME" "$(echo "$SERVICE" | tr .- _)" + } diff --git a/functions b/functions index aad85dd..683b4f1 100755 --- a/functions +++ b/functions @@ -5,6 +5,7 @@ set -eo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions" source "$PLUGIN_BASE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" if [[ -f "$PLUGIN_AVAILABLE_PATH/docker-options/functions" ]]; then source "$PLUGIN_AVAILABLE_PATH/docker-options/functions" fi @@ -26,7 +27,6 @@ service_create() { [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service" [[ ! -d "$PLUGIN_DATA_ROOT/$SERVICE" ]] || dokku_log_fail "$PLUGIN_SERVICE service $SERVICE already exists" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - LINKS_FILE="$SERVICE_ROOT/LINKS" service_parse_args "${@:2}" @@ -42,15 +42,13 @@ service_create() { mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory" mkdir -p "$SERVICE_ROOT/data" || dokku_log_fail "Unable to create service data directory" - touch "$LINKS_FILE" PASSWORD=$(openssl rand -hex 16) if [[ -n "$SERVICE_PASSWORD" ]]; then PASSWORD="$SERVICE_PASSWORD" dokku_log_warn "Specified password may not be as secure as the auto-generated password" fi - echo "$PASSWORD" >"$SERVICE_ROOT/PASSWORD" - chmod 640 "$SERVICE_ROOT/PASSWORD" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "PASSWORD" "$PASSWORD" [[ -n "$SERVICE_CUSTOM_ENV" ]] && POSTGRES_CUSTOM_ENV="$SERVICE_CUSTOM_ENV" if [[ -n $POSTGRES_CUSTOM_ENV ]]; then @@ -73,7 +71,8 @@ service_create_container() { local PREVIOUS_ID ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/var/lib/postgresql/data" -e "POSTGRES_PASSWORD=$PASSWORD" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=postgres "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION") - echo "$ID" >"$SERVICE_ROOT/ID" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" "$ID" + dokku_log_verbose_quiet "Waiting for container to be ready" docker run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" "$PLUGIN_WAIT_IMAGE" -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null @@ -129,9 +128,9 @@ service_start() { local ID=$(docker ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true if [[ -n $ID ]]; then [[ -z $QUIET ]] && dokku_log_warn "Service is already started" - if [[ ! -f "$SERVICE_ROOT/ID" ]] || [[ "$(cat "$SERVICE_ROOT/ID")" != "$ID" ]]; then + if fn-plugin-property-exists "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" || [[ "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID")" != "$ID" ]]; then [[ -z $QUIET ]] && dokku_log_warn "Updating local container ID" - echo "$ID" >"$SERVICE_ROOT/ID" + fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID" "$ID" fi return 0 fi diff --git a/install b/install index 6521cc3..be4038b 100755 --- a/install +++ b/install @@ -1,5 +1,7 @@ #!/usr/bin/env bash source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" + set -eo pipefail [[ $DOKKU_TRACE ]] && set -x @@ -25,9 +27,36 @@ plugin-install() { mkdir -p "$PLUGIN_DATA_ROOT" || echo "Failed to create $PLUGIN_SERVICE data directory" chown dokku:dokku "$PLUGIN_DATA_ROOT" + fn-plugin-property-setup "$PLUGIN_COMMAND_PREFIX" mkdir -p "$PLUGIN_CONFIG_ROOT" || echo "Failed to create $PLUGIN_SERVICE config directory" chown dokku:dokku "$PLUGIN_CONFIG_ROOT" + pushd "$PLUGIN_DATA_ROOT" + for SERVICE in *; do + if [ -d "$SERVICE" ]; then + mkdir -p "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" + pushd "$SERVICE" + for PROP in *; do + if [ ! -d "$PROP" ] && [[ "$PROP" != "ENV" ]]; then + mv "$PROP" "$PLUGIN_CONFIG_ROOT"/"$SERVICE/" + fi + done + popd + if [ -d "$SERVICE"/backup ]; then + pushd "$SERVICE"/backup + for BACKUPPROP in *; do + mv "$BACKUPPROP" "BACKUP_$BACKUPPROP" + mv "BACKUP_$BACKUPPROP" "$PLUGIN_CONFIG_ROOT/$SERVICE/" + done + popd + fi + chown dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/ + chown -R dokku:dokku "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* + chmod 600 "$PLUGIN_CONFIG_ROOT"/"$SERVICE"/* + fi + done + popd + rm -f "/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}*" _SUDOERS_FILE="/etc/sudoers.d/dokku-${PLUGIN_COMMAND_PREFIX}" diff --git a/subcommands/clone b/subcommands/clone index 744e28a..3799ee6 100755 --- a/subcommands/clone +++ b/subcommands/clone @@ -4,6 +4,8 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_BASE_PATH/common/functions" source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" + service-clone-cmd() { #E you can clone an existing service to a new one @@ -25,8 +27,7 @@ service-clone-cmd() { [[ -z "$NEW_SERVICE" ]] && dokku_log_fail "Please specify a name for the new service" verify_service_name "$SERVICE" - local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - local ID="$(cat "$SERVICE_ROOT/ID")" + local ID=$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "ID") is_container_status "$ID" "Running" || dokku_log_fail "Service ${SERVICE} container is not running" PLUGIN_IMAGE=$(service_version "$SERVICE" | grep -o "^.*:" | sed -r "s/://g") diff --git a/subcommands/destroy b/subcommands/destroy index e2f08d5..3fe1c38 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -4,6 +4,7 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x source "$PLUGIN_BASE_PATH/common/functions" source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/functions" +source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions" service-destroy-cmd() { #E destroy the service, it's data, and the running container @@ -18,11 +19,10 @@ service-destroy-cmd() { [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a valid name for the service" verify_service_name "$SERVICE" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" - LINKS_FILE="$SERVICE_ROOT/LINKS" SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" SERVICE_NAME="$(get_service_name "$SERVICE")" - [[ -s "$LINKS_FILE" ]] && dokku_log_fail "Cannot delete linked service" + [[ $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "LINKS" "") != "" ]] && dokku_log_fail "Cannot delete linked service" if [[ "$FORCE_FLAG" == "force" ]] || [[ "$FORCE_FLAG" == "-f" ]] || [[ "$FORCE_FLAG" == "--force" ]]; then DOKKU_APPS_FORCE_DELETE=1 @@ -47,6 +47,7 @@ service-destroy-cmd() { dokku_log_verbose_quiet "Removing data" docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/config" "$PLUGIN_BUSYBOX_IMAGE" chmod 777 -R /config /data rm -rf "$SERVICE_ROOT" + fn-plugin-property-destroy "$PLUGIN_COMMAND_PREFIX" "$SERVICE" dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE" } diff --git a/tests/hook_pre_delete.bats b/tests/hook_pre_delete.bats index 21d339d..f6d163e 100755 --- a/tests/hook_pre_delete.bats +++ b/tests/hook_pre_delete.bats @@ -13,7 +13,7 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:hook:pre-delete) removes app from links file when destroying app" { - [[ -n $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] + sudo [ -n $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ] dokku --force apps:destroy my_app - [[ -z $(< "$PLUGIN_DATA_ROOT/l/LINKS") ]] + sudo [ -z $(< "$PLUGIN_CONFIG_ROOT/l/LINKS") ] } diff --git a/tests/service_clone.bats b/tests/service_clone.bats index 5ccd997..e945af1 100755 --- a/tests/service_clone.bats +++ b/tests/service_clone.bats @@ -38,7 +38,7 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:clone) success" { run dokku "$PLUGIN_COMMAND_PREFIX:clone" l new_service - [[ -f $PLUGIN_DATA_ROOT/new_service/ID ]] + [[ -f $PLUGIN_CONFIG_ROOT/new_service/ID ]] assert_contains "${lines[*]}" "Copying data from l to new_service" assert_contains "${lines[*]}" "Done" assert_success diff --git a/tests/service_info.bats b/tests/service_info.bats index 77ffb87..042dd0a 100755 --- a/tests/service_info.bats +++ b/tests/service_info.bats @@ -21,21 +21,21 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:info) success" { run dokku "$PLUGIN_COMMAND_PREFIX:info" l - local password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "${lines[*]}" "postgres://postgres:$password@dokku-postgres-l:5432/l" } @test "($PLUGIN_COMMAND_PREFIX:info) replaces underscores by dash in hostname" { dokku "$PLUGIN_COMMAND_PREFIX:create" test_with_underscores run dokku "$PLUGIN_COMMAND_PREFIX:info" test_with_underscores - local password="$(sudo cat "$PLUGIN_DATA_ROOT/test_with_underscores/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/test_with_underscores/PASSWORD")" assert_contains "${lines[*]}" "postgres://postgres:$password@dokku-postgres-test-with-underscores:5432/test_with_underscores" dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" test_with_underscores } @test "($PLUGIN_COMMAND_PREFIX:info) success with flag" { run dokku "$PLUGIN_COMMAND_PREFIX:info" l --dsn - local password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + local password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_output "postgres://postgres:$password@dokku-postgres-l:5432/l" run dokku "$PLUGIN_COMMAND_PREFIX:info" l --config-dir diff --git a/tests/service_link.bats b/tests/service_link.bats index 3635fa1..ae926a7 100755 --- a/tests/service_link.bats +++ b/tests/service_link.bats @@ -62,7 +62,7 @@ teardown() { echo "output: $output" echo "status: $status" url=$(dokku config:get my_app DATABASE_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app @@ -95,7 +95,7 @@ teardown() { dokku config:set my_app POSTGRES_DATABASE_SCHEME=postgres2 dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app url=$(dokku config:get my_app DATABASE_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres2://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app @@ -112,7 +112,7 @@ teardown() { @test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" { dokku "$PLUGIN_COMMAND_PREFIX:link" l my_app --alias "ALIAS" url=$(dokku config:get my_app ALIAS_URL) - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" assert_contains "$url" "postgres://postgres:$password@dokku-postgres-l:5432/l" assert_success dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my_app diff --git a/tests/service_promote.bats b/tests/service_promote.bats index 92fe4a3..43229b1 100755 --- a/tests/service_promote.bats +++ b/tests/service_promote.bats @@ -39,7 +39,7 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:promote) changes DATABASE_URL" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app url=$(dokku config:get my_app DATABASE_URL) @@ -47,14 +47,14 @@ teardown() { } @test "($PLUGIN_COMMAND_PREFIX:promote) creates new config url when needed" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app run dokku config my_app assert_contains "${lines[*]}" "DOKKU_POSTGRES_" } @test "($PLUGIN_COMMAND_PREFIX:promote) uses POSTGRES_DATABASE_SCHEME variable" { - password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" + password="$(sudo cat "$PLUGIN_CONFIG_ROOT/l/PASSWORD")" dokku config:set my_app "POSTGRES_DATABASE_SCHEME=postgres2" "DATABASE_URL=postgres://u:p@host:5432/db" "DOKKU_POSTGRES_BLUE_URL=postgres2://postgres:$password@dokku-postgres-l:5432/l" dokku "$PLUGIN_COMMAND_PREFIX:promote" l my_app url=$(dokku config:get my_app DATABASE_URL)