#!/bin/bash ## When writing relation script, remember: ## - they should be idempotents ## - they can be launched while the dockers is already up ## - they are launched from the host ## - the target of the link is launched first, and get a chance to ``relation-set`` ## - both side of the scripts get to use ``relation-get``. ## - use actions of other side for other side's business logic . lib/common if [ -z "$RELATION_DATA_FILE" ]; then err "$FUNCNAME: relation does not seems to be correctly setup." exit 1 fi if ! [ -r "$RELATION_DATA_FILE" ]; then err "$FUNCNAME: can't read relation's data." >&2 exit 1 fi if [ "$(cat "$RELATION_DATA_FILE" | shyaml get-type)" == "str" ]; then ## Cached version already there ## Note that we rely on the fact that when the relations ## options are changed in the `compose.yml` file, the relation ## data file is recreated from the values of the ## `compose.yml`. info "Previous relation data is still valid." exit 0 fi set -e private_key=$(options-get private-key) || exit 1 target=$(options-get target) || exit 1 ident=$(options-get ident) || exit 1 home=/var/lib/rsync local_path_key=$home/.ssh host_path_key="$SERVICE_CONFIGSTORE${local_path_key}" echo "$private_key" | file_put "$host_path_key/id_rsa" chmod 600 "$host_path_key/id_rsa" schedule=$(relation-get schedule) || true lock_opts=(-D -p 10 -k) command=( docker run --rm -e LABEL_HOSTNAME="$ident" -v "$RSYNC_CONFIG_DIR:/etc/rsync" -v "$host_path_key:$local_path_key" -v "$HOST_DATASTORE:/mnt/source" -v "$HOST_COMPOSE_YML_FILE:/mnt/source/compose.yml" --network ${PROJECT_NAME}_default "$DOCKER_BASE_IMAGE" /mnt/source "$target" ) quoted_command=() for arg in "${command[@]}"; do quoted_command+=("$(printf "%q" "$arg")") done printf "(%s) {%s} %s\n" \ "$schedule" \ "${lock_opts[*]}" \ "${quoted_command[*]}" > "$RELATION_DATA_FILE"