#!/bin/bash if [ -z "$SERVICE_DATASTORE" ]; then echo "This script is meant to be run through 'compose' to work properly." >&2 exit 1 fi version=0.1 usage="$exname [-h|--help] [--force|-f] [DBNAME]" help=" USAGE: $usage DESCRIPTION: Read stdin and send it to the restore API of odoo service to restore in the database DBNAME. If DBNAME is not provided, it'll take the default odoo database from the ${DARKCYAN}postgres-database${NORMAL} relation of current service. EXAMPLES: $exname < dump.zip $exname odoo2 < odoo2.zip " dbname= output= while [ "$1" ]; do case "$1" in "--help"|"-h") print_help >&2 exit 0 ;; "--force"|"-f") force=yes ;; --*|-*) err "Unexpected optional argument '$1'" print_usage >&2 exit 1 ;; *) [ -z "$dbname" ] && { dbname=$1 ; shift ; continue ; } err "Unexpected positional argument '$1'" print_usage >&2 exit 1 ;; esac shift done if [ -z "$dbname" ]; then ## ## Fetch default dbname in relation to postgres-database ## ## XXXvlab: can't get real config here if ! read-0 ts _ _ < <(get_service_relation "$SERVICE_NAME" "postgres-database"); then err "Couldn't find relation ${DARKCYAN}postgres-database${NORMAL}." exit 1 fi relation_file=$(get_relation_data_dir "$SERVICE_NAME" "$ts" "postgres-database") || { err "Failed to find relation file" exit 1 } postgres_config=$(cat "$relation_file"/data) || exit 2 dbname="$(e "$postgres_config" | shyaml get-value dbname)" || { err "Couldn't retrieve information of ${DARKCYAN}mysql-database${NORMAL}'s relation." exit 1 } fi set -e ## Ensure odoo is launched service_def=$(get_compose_service_def "$SERVICE_NAME") ## XXXvlab: should be moved to lib CONFIG=$SERVICE_CONFIGSTORE/etc/odoo-server.conf ADMIN_PASSWORD=$(echo "$service_def" | shyaml -q get-value options.admin-password) || { if [ -e "$CONFIG" ]; then ADMIN_PASSWORD=$(grep ^admin_passwd "$CONFIG" | sed -r 's/^admin_passwd\s+=\s+(.+)$/\1/g') fi if [ -z "$ADMIN_PASSWORD" ]; then err "Could not find 'admin-password' in $SERVICE_NAME service definition nor in config file." exit 1 fi } containers="$(get_running_containers_for_service "$SERVICE_NAME")" if [ -z "$containers" ]; then err "No containers running for service $DARKYELLOW$SERVICE_NAME$NORMAL." die "Please ensure that $DARKYELLOW$SERVICE_NAME$NORMAL is running before using '$exname'." fi ## XXXvlab: taking first container is probably not a good idea container="$(echo "$containers" | head -n 1)" ## XXXvlab: taking first ip is probably not a good idea read-0 container_network container_ip < <(get_container_network_ip "$container") DEFAULT_CURL_IMAGE=${DEFAULT_CURL_IMAGE:-docker.0k.io/curl} check_input() { local chars read -n 2 -r chars if [ "$chars" != "PK" ]; then err "Unexpected input not matching ZIP signature. Invalid dump." echo " First chars: '$chars'" exit 1 fi { echo -n "$chars" cat } } cmd=( docker run -i --rm --network "$container_network" "$DEFAULT_CURL_IMAGE" -sS -X POST -F "master_pwd=${ADMIN_PASSWORD}" -F "backup_file=@-" -F "name=${dbname}" http://${container_ip}:8069/web/database/restore ) ## XXXvlab: contains password, left only for advanced debug #debug "${cmd[@]}" out=$(set -o pipefail; check_input | "${cmd[@]}") || { die "Posting to odoo restore API through curl was unsuccessfull." } if [[ "$out" == *""* ]]; then errmsg=$(echo "$out" | grep "alert-danger") errmsg=${errmsg#*>} errmsg=${errmsg%%<*} if [ "$errmsg" ]; then errmsg=$(echo "$errmsg" | recode html..utf8) die "$errmsg" fi die "Unexpected output. Restore probably failed." fi >&2 info "Restored stdin dump to odoo '$dbname'."