|
@ -1869,8 +1869,8 @@ graph:def:disk-2() { |
|
|
colors[docker/images]="#00FFFF" |
|
|
colors[docker/images]="#00FFFF" |
|
|
colors[docker/local_volumes]="#6495ED" |
|
|
colors[docker/local_volumes]="#6495ED" |
|
|
colors[docker/logs]="#000080" |
|
|
colors[docker/logs]="#000080" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf "%s\n" "${gnuplot_line_config[@]}" |
|
|
printf "%s\n" "${gnuplot_line_config[@]}" |
|
|
first=1 |
|
|
first=1 |
|
|
rrdfetch_cmd="'< rscolcat concat" |
|
|
rrdfetch_cmd="'< rscolcat concat" |
|
@ -2036,6 +2036,178 @@ cmdline.spec:vps-subscribe:cmd:rm:run() { |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cmdline.spec.gnu vps-clone-odoo |
|
|
|
|
|
cmdline.spec::cmd:vps-clone-odoo:run() { |
|
|
|
|
|
|
|
|
|
|
|
: :posarg: FROM 'Database from which to clone |
|
|
|
|
|
(format : "vps:dbname@servicename")' |
|
|
|
|
|
: :posarg: TO 'Database name to clone |
|
|
|
|
|
(format : "vps:dbname@servicename")' |
|
|
|
|
|
|
|
|
|
|
|
: :optval: --project,-p 'Project name (default: myc)' |
|
|
|
|
|
: :optfla: --neutralize,-n 'Neutralize the new database' |
|
|
|
|
|
|
|
|
|
|
|
IFS=':@' read -r vps_from db_from service_from <<< "$FROM" |
|
|
|
|
|
IFS=':@' read -r vps_to db_to service_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="${vps_from}_${service_from}_${db_from}_${DUMPDATE}.zip" |
|
|
|
|
|
DUMPFILE="$(mktemp -u)/${DUMPFILENAME}" |
|
|
|
|
|
|
|
|
|
|
|
info "Dumpfile : $DUMPFILE" |
|
|
|
|
|
|
|
|
|
|
|
if [ -n "$opt_project" ]; then |
|
|
|
|
|
PROJECT="$opt_project" |
|
|
|
|
|
else |
|
|
|
|
|
PROJECT="myc" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:check "$vps_from" "$service_from" "$vps_to" "$service_to" "$PROJECT" || { |
|
|
|
|
|
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 project="$5" |
|
|
|
|
|
|
|
|
|
|
|
# Check VPS connections |
|
|
|
|
|
vps_connection_check "$vps_from" </dev/null || return 1 |
|
|
|
|
|
vps_connection_check "$vps_to" </dev/null || return 1 |
|
|
|
|
|
|
|
|
|
|
|
# Get image IDs |
|
|
|
|
|
image_name_from=$(ssh root@"$vps_from" -- docker ps --filter "name=${project}_${service_from}" --format '{{.Image}}') || return 1 |
|
|
|
|
|
image_name_to=$(ssh root@"$vps_to" -- docker ps --filter "name=${project}_${service_to}" --format '{{.Image}}') || return 1 |
|
|
|
|
|
|
|
|
|
|
|
if [ "$image_name_from" != "$image_name_to" ]; then |
|
|
|
|
|
err "Image names are different between $vps_from and $vps_to." |
|
|
|
|
|
err " .... $vps_from : $image_name_from" |
|
|
|
|
|
err " .... $vps_to : $image_name_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
image_date_from=$(ssh root@"$vps_from" "docker inspect --format '{{.Created}}' $image_name_from") || return 1 |
|
|
|
|
|
image_date_to=$(ssh root@"$vps_to" "docker inspect --format '{{.Created}}' $image_name_to") || return 1 |
|
|
|
|
|
|
|
|
|
|
|
# Compare image IDs and warn if different |
|
|
|
|
|
if [ "$image_date_from" != "$image_date_to" ]; then |
|
|
|
|
|
info "....Image ${DARKCYAN}$image_name_from${NORMAL} from ${DARKCYAN}$vps_from${NORMAL} created on : $image_date_from" |
|
|
|
|
|
info "....Image ${DARKCYAN}$image_name_to${NORMAL} from ${DARKCYAN}$vps_to${NORMAL} created on : $image_date_to" |
|
|
|
|
|
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" |
|
|
|
|
|
|
|
|
|
|
|
cat <<EOF | ssh:run "root@$vps" -- bash || return 1 |
|
|
|
|
|
mkdir -p ${dumpfile%/*} && |
|
|
|
|
|
vps odoo dump -s "$service" -D "$dbname" "$dumpfile" |
|
|
|
|
|
EOF |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clone:odoo:scp(){ |
|
|
|
|
|
local vps_from="$1" |
|
|
|
|
|
local vps_to="$2" |
|
|
|
|
|
local dumpfile="$3" |
|
|
|
|
|
|
|
|
|
|
|
info "Copying database dump from $vps_from to $vps_to" |
|
|
|
|
|
|
|
|
|
|
|
info "dumpfile : $dumpfile" |
|
|
|
|
|
|
|
|
|
|
|
ssh root@"$vps_to" -- mkdir -p ${dumpfile%/*} || { |
|
|
|
|
|
err "Failed to create directory for database dump on $vps_to" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
scp "root@$vps_from:${dumpfile}" "root@${vps_to}:${dumpfile}" || { |
|
|
|
|
|
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" |
|
|
|
|
|
|
|
|
|
|
|
cat <<EOF | ssh:run "root@$vps_from" -- bash || return 1 |
|
|
|
|
|
[ -f ${dumpfile} ] && rm -f ${dumpfile} |
|
|
|
|
|
rmdir ${dumpfile%/*} |
|
|
|
|
|
EOF |
|
|
|
|
|
|
|
|
|
|
|
cat <<EOF | ssh:run "root@$vps_to" -- bash || return 1 |
|
|
|
|
|
[ -f ${dumpfile} ] && rm -f ${dumpfile} |
|
|
|
|
|
rmdir ${dumpfile%/*} |
|
|
|
|
|
EOF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
cmdline::parse "$@" |
|
|
|
|
|
|
|
|
cmdline::parse "$@" |