#!/bin/bash export PATH=/4PROJECTS/bin:$PATH if [ ! -n "$2" ]; then echo "Missing Parameters " exit 0 fi UUID=$1 echo "UUID: $UUID" source /4server/sbin/helpers get_contract_info #export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql') echo "PASSWORD $ODOO_DB_PASSWORD" echo "Restoring $FILENAME to $UUID" echo "status of container" doas docker ps -a --filter "id=$UUID" echo "POSTGRES HOST: $POSTGRES_HOST" BACKUP="/mnt/backup/$2" TEMPLATE="/mnt/db_images/$2" doas docker exec "$UUID" /bin/bash -c "[ -f $TEMPLATE ]" if doas docker exec "$UUID" /bin/bash -c "[ -f $BACKUP ]"; then FILENAME="$BACKUP" elif doas docker exec "$UUID" /bin/bash -c "[ -f $TEMPLATE ]"; then FILENAME="$TEMPLATE" else echo "File not exists" exit 0 fi source /4server/sbin/ODOO_19/ODOO_19.lib # Abort BEFORE touching anything if Postgres is not reachable if ! wait_for_postgres; then echo "ERROR: cannot connect to Postgres at $POSTGRES_HOST:$POSTGRES_PORT - restore aborted, nothing was changed" exit 1 fi ### DELETE AND CREATE DATABASE PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c " SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$UUID' AND pid <> pg_backend_pid(); " PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c " DROP DATABASE IF EXISTS \"$UUID\"; " PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -c "ALTER ROLE \"$UUID\" CREATEDB;" # Move the old filestore aside instead of deleting it; it is only removed after a successful load OLD_FS="/home/odoo/.local/share/Odoo/.filestore.pre-restore" doas docker exec "$UUID" rm -rf "$OLD_FS" doas docker exec "$UUID" sh -c "[ -d /home/odoo/.local/share/Odoo/filestore ] && mv /home/odoo/.local/share/Odoo/filestore $OLD_FS; true" doas docker exec "$UUID" rm -rf /root/.local/share/Odoo/filestore if ! doas docker exec "$UUID" odoo db --db_host beedb -w "$ODOO_DB_PASSWORD" -r "$UUID" load "$UUID" $FILENAME -f; then echo "ERROR: odoo db load failed - putting the old filestore back" # Restrict database access to its UUID owner PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" \ -p "$POSTGRES_PORT" -d postgres \ -v ON_ERROR_STOP=1 \ -c "REVOKE CONNECT, TEMPORARY ON DATABASE \"$UUID\" FROM PUBLIC; GRANT CONNECT ON DATABASE \"$UUID\" TO \"$UUID\"; ALTER DATABASE \"$UUID\" OWNER TO \"$UUID\"; ALTER ROLE \"$UUID\" NOCREATEDB;" doas docker exec "$UUID" sh -c "[ -d $OLD_FS ] && rm -rf /home/odoo/.local/share/Odoo/filestore && mv $OLD_FS /home/odoo/.local/share/Odoo/filestore; true" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -c "ALTER ROLE \"$UUID\" NOCREATEDB;" exit 1 fi doas docker exec "$UUID" rm -rf "$OLD_FS" PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \ -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \ -c "ALTER ROLE \"$UUID\" NOCREATEDB;" doas docker exec "$UUID" cp -r /root/.local/share/Odoo/filestore /home/odoo/.local/share/Odoo/filestore doas docker exec "$UUID" chown -R odoo:odoo /home/odoo/.local doas docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/ doas docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore docker restart "$UUID"