|
@ -2036,6 +2036,182 @@ cmdline.spec:vps-subscribe:cmd:rm:run() { |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cmdline.spec.gnu vps-clone-odoo-db |
|
|
|
|
|
cmdline.spec::cmd:vps-clone-odoo-db:run() { |
|
|
|
|
|
|
|
|
|
|
|
: :posarg: FROM 'Database from which to clone |
|
|
|
|
|
(format : "vps:servicename:dbname")' |
|
|
|
|
|
: :posarg: TO 'Database name to clone |
|
|
|
|
|
(format : "vps:servicename:dbname")' |
|
|
|
|
|
|
|
|
|
|
|
: :optval: --dumpfile,-d 'Dumpfile path (default: /tmp/servicename_dbname_DATE.zip)' |
|
|
|
|
|
: :optfla: --neutralize,-n 'Neutralize the new database' |
|
|
|
|
|
|
|
|
|
|
|
IFS=':' read -r vps_from service_from db_from <<< "$FROM" |
|
|
|
|
|
IFS=':' read -r vps_to service_to db_to <<< "$TO" |
|
|
|
|
|
|
|
|
|
|
|
echo "Cloning from VPS: $vps_from, Service: $service_from, DB: $db_from" |
|
|
|
|
|
echo "Cloning to VPS: $vps_to, Service: $service_to, DB: $db_to" |
|
|
|
|
|
|
|
|
|
|
|
## if not -n option we warn the user |
|
|
|
|
|
if [ -z "$opt_neutralize" ]; then |
|
|
|
|
|
warn "Neutralize option '-n' not set, the new database will have email servers ON" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
DUMPDATE=$(date +%Y%m%d%H%M%S) |
|
|
|
|
|
DUMPFILENAME="${service_from}_${db_from}_${DUMPDATE}.zip" |
|
|
|
|
|
DUMPFILE="/tmp/${DUMPFILENAME}" |
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$opt_dumpfile" ]; then |
|
|
|
|
|
DUMPFILE="$opt_dumpfile" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
info "Dumpfile : $DUMPFILE" |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:check "$vps_from" "$service_from" "$vps_to" "$service_to" || { |
|
|
|
|
|
err "check failed" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:dump "$vps_from" "$service_from" "$db_from" "$DUMPFILE" "$opt_force" || { |
|
|
|
|
|
err "Failed to dump database $db_from from $vps_from" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
clone:odoo:scp "$vps_from" "$vps_to" "$DUMPFILE" || { |
|
|
|
|
|
err "Failed to scp database $db_from from $vps_from to $vps_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
clone:odoo:restore "$vps_to" "$service_to" "$db_to" "$DUMPFILE" "$opt_neutralize" || { |
|
|
|
|
|
err "Failed to restore database $db_to on $vps_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:clean "$vps_from" "$vps_to" "$DUMPFILE" || { |
|
|
|
|
|
err "Failed to clean database dump $DUMPFILE" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:retrieveinfo(){ |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
local service="$2" |
|
|
|
|
|
local dbname="$3" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:check(){ |
|
|
|
|
|
local vps_from="$1" |
|
|
|
|
|
local service_from="$2" |
|
|
|
|
|
local vps_to="$3" |
|
|
|
|
|
local service_to="$4" |
|
|
|
|
|
local opt_force="$5" |
|
|
|
|
|
|
|
|
|
|
|
check_vps_connection() { |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
vps_connection_check "$vps" </dev/null || { |
|
|
|
|
|
err "Failed to access '$vps'." |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
get_image_id() { |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
local service="$2" |
|
|
|
|
|
ssh root@"$vps" "docker inspect --format '{{.Image}}' \$(docker ps --filter 'name=$service' --format '{{.ID}}')" || { |
|
|
|
|
|
err "Failed to get image ID from $vps" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
get_image_date() { |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
local image_id="$2" |
|
|
|
|
|
ssh root@"$vps" "docker inspect --format '{{.Created}}' '$image_id'" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
# Check VPS connections |
|
|
|
|
|
check_vps_connection "$vps_from" || return 1 |
|
|
|
|
|
check_vps_connection "$vps_to" || return 1 |
|
|
|
|
|
|
|
|
|
|
|
# Get image IDs |
|
|
|
|
|
image_id_from=$(get_image_id "$vps_from" "$service_from") || return 1 |
|
|
|
|
|
image_id_to=$(get_image_id "$vps_to" "$service_to") || return 1 |
|
|
|
|
|
|
|
|
|
|
|
# Compare image IDs and warn if different |
|
|
|
|
|
if [ "$image_id_from" != "$image_id_to" ]; then |
|
|
|
|
|
image_from_date=$(get_image_date "$vps_from" "$image_id_from") |
|
|
|
|
|
image_to_date=$(get_image_date "$vps_to" "$image_id_to") |
|
|
|
|
|
|
|
|
|
|
|
info "....Image from ${DARKCYAN}$vps_from${NORMAL} created on : $image_from_date" |
|
|
|
|
|
info "....Image from ${DARKCYAN}$vps_to${NORMAL} created on : $image_to_date" |
|
|
|
|
|
warn "Image IDs are different between ${DARKCYAN}$vps_from${NORMAL} and ${DARKCYAN}$vps_to${NORMAL}, maybe an image upd is needed." |
|
|
|
|
|
fi |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:dump(){ |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
local service="$2" |
|
|
|
|
|
local dbname="$3" |
|
|
|
|
|
local dumpfile="$4" |
|
|
|
|
|
local opt_force="$5" |
|
|
|
|
|
|
|
|
|
|
|
info "Dumping database $dbname from $vps:$service" |
|
|
|
|
|
|
|
|
|
|
|
ssh:run "root@$vps" -- vps odoo dump -s "$service" -D "$dbname" "$dumpfile" || { |
|
|
|
|
|
err "Failed to dump database $dbname from $vps" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:scp(){ |
|
|
|
|
|
local vps_from="$1" |
|
|
|
|
|
local vps_to="$2" |
|
|
|
|
|
local dumpfile="$3" |
|
|
|
|
|
|
|
|
|
|
|
info "Copying database dump from $vps_from to $vps_to" |
|
|
|
|
|
|
|
|
|
|
|
scp "root@$vps_from:${dumpfile}" "root@${vps_to}:${dumpfile}" 2>&1 || { |
|
|
|
|
|
err "Failed to copy database dump from $vps_from to $vps_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:restore(){ |
|
|
|
|
|
local vps="$1" |
|
|
|
|
|
local service="$2" |
|
|
|
|
|
local dbname="$3" |
|
|
|
|
|
local dumpfile="$4" |
|
|
|
|
|
local opt_neutralize="$5" |
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$opt_neutralize" ]; then |
|
|
|
|
|
info "Neutralizing database $dbname" |
|
|
|
|
|
opt_neutralize="--neutralize" |
|
|
|
|
|
else |
|
|
|
|
|
opt_neutralize="" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
info "Restoring database $dbname on $vps:$service" |
|
|
|
|
|
ssh:run "root@$vps" -- vps odoo restore -s "$service" -D "$dbname" "$opt_neutralize" "$dumpfile" || { |
|
|
|
|
|
err "Failed to restore database $dbname on $vps" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:clean(){ |
|
|
|
|
|
local vps_from="$1" |
|
|
|
|
|
local vps_to="$2" |
|
|
|
|
|
local dumpfile="$3" |
|
|
|
|
|
|
|
|
|
|
|
info "Cleaning database dump $dumpfile on $vps_from and $vps_to" |
|
|
|
|
|
|
|
|
|
|
|
ssh:run "root@$vps_from" -- rm -f "$dumpfile" || { |
|
|
|
|
|
err "Failed to clean database dump $dumpfile on $vps_from" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
ssh:run "root@$vps_to" -- rm -f "$dumpfile" || { |
|
|
|
|
|
err "Failed to clean database dump $dumpfile on $vps_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
cmdline::parse "$@" |
|
|
cmdline::parse "$@" |