fork 0k-charms
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

159 lines
4.0 KiB

#!/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" == *"<html>"* ]]; 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'."