diff --git a/bin/vps b/bin/vps index 5497390..fefdc05 100755 --- a/bin/vps +++ b/bin/vps @@ -495,6 +495,39 @@ mailcow:get_default_backup_host_ident() { echo "$dest $ident" } +compose:get_url() { + local service="$1" + ( + set -o pipefail + cat "/var/lib/compose/relations/myc/${service}-frontend/web-proxy/data" | + shyaml get-value url + ) || { + err "Failed querying ${service} to frontend relation to get url." + return 1 + } +} +export -f compose:get_url + + +compose:psql() { + local dbname="$1" + docker exec -i myc_postgres_1 psql -U postgres "$dbname" +} +export -f compose:psql + + +cyclos:set_root_url() { + local dbname="$1" cyclos_service="$2" url + + url=$(compose:get_url "${cyclos_service}") || return 1 + echo "UPDATE configurations SET root_url = '$url';" | + compose:psql "$dbname" || { + err "Failed to set cyclos url value in '$dbname' database." + return 1 + } +} +export -f cyclos:set_root_url + compose:get_cron_docker_cmd() { local cron_line cmd_line docker_cmd @@ -983,22 +1016,127 @@ cmdline.spec:odoo:cmd:set-cyclos-url:run() { dbname=${opt_database:-odoo} cyclos_service="${opt_service:-cyclos}" - URL=$( - set -o pipefail - cat /var/lib/compose/relations/myc/${cyclos_service}-frontend/web-proxy/data | - shyaml get-value url - ) || { - err "Failed querying ${cyclos_service} to frontend relation to get url." + URL=$(compose:get_url "${cyclos_service}") || exit 1 + + echo "UPDATE res_company SET cyclos_server_url = '$URL/api' WHERE id=1;" | + compose:psql "$dbname" || { + err "Failed to set cyclos url value in '$dbname' database." exit 1 } - echo "UPDATE res_company SET cyclos_server_url = '$URL' WHERE id=1;" | - docker exec -i myc_postgres_1 psql -U postgres "$dbname" || { - err "Failed to set cyclos url value in '$dbname' database." +} + + +cmdline.spec.gnu cyclos + +cmdline.spec::cmd:cyclos:run() { + : +} + + +cmdline.spec:cyclos:cmd:dump:run() { + + : :posarg: DUMP_GZFILE 'Target path to store odoo dump gz file.' + + : :optval: --database,-d "Target database ('cyclos' if not specified)" + : :optval: --service,-s "The cyclos service name (defaults to 'cyclos')" + + cyclos_service="${opt_service:-cyclos}" + cyclos_database="${opt_database:-cyclos}" + + Wrap -d "stop container 'myc_${cyclos_service}_1'" -- \ + docker stop "myc_${cyclos_service}_1" || exit 1 + Wrap -d "Dump postgres database '${cyclos_database}'." -- \ + pgm cp "$cyclos_database" "$DUMP_GZFILE" || exit 1 + Wrap -d "start container 'myc_${cyclos_service}_1'." -- \ + docker start "myc_${cyclos_service}_1" || exit 1 +} + + +cmdline.spec.gnu restore +cmdline.spec:cyclos:cmd:restore:run() { + + : :posarg: GZ_DUMP_LOCATION 'Source cyclos dump file to restore + (can be a local file or an url)' + + : :optval: --service,-s "The service (defaults to 'cyclos')" + : :optval: --database,-d 'Target database (default if not specified)' + + local out + + cyclos_service="${opt_service:-cyclos}" + cyclos_database="${opt_database:-cyclos}" + + if [[ "$GZ_DUMP_LOCATION" == "http://"* ]]; then + settmpdir GZ_TMP_LOCATION + tmp_location="$GZ_TMP_LOCATION/dump.gz" + Wrap -d "get '$GZ_DUMP_LOCATION'" < "$tmp_location" || exit 1 + + if [[ "\$(dd if="$tmp_location" count=2 bs=1 2>/dev/null | + hexdump -v -e "/1 \"%02x\"")" != "1f8b" ]]; then + err "Download doesn't seem to be a gzip file." + dd if="$tmp_location" count=1 bs=256 | hd | prefix " ${GRAY}|${NORMAL} " >&2 + exit 1 + fi +EOF + GZ_DUMP_LOCATION="$tmp_location" + fi + + [ -e "$GZ_DUMP_LOCATION" ] || { + err "No file '$GZ_DUMP_LOCATION' found." >&2 exit 1 } + Wrap -d "stop container 'myc_${cyclos_service}_1'" -- \ + docker stop "myc_${cyclos_service}_1" || exit 1 + + ## XXXvlab: making the assumption that the postgres username should + ## be the same as the cyclos service selected (which is the default, + ## but not always the case). + Wrap -d "restore postgres database '${cyclos_database}'." -- \ + pgm cp -f "$GZ_DUMP_LOCATION" "${cyclos_service}@${cyclos_database}" || exit 1 + ## ensure that the database is not locked + + ## XXXvlab: 70 is uid of user postgres, this avoids the docker bug + ## but introduce hardwritten value + Wrap -d "check and remove database lock if any" <