Browse Source

new: [vps] add ``nextcloud upgrade`` command to manage full automatic migration

Signed-off-by: Valentin Lab <valentin.lab@kalysto.org>
rc1
Valentin Lab 2 years ago
parent
commit
66b575dc3a
  1. 112
      bin/vps

112
bin/vps

@ -85,7 +85,7 @@ compose:get-compose-yml() {
echo "$path" echo "$path"
} }
decorator._mangle_fn compose:get-compose-yml decorator._mangle_fn compose:get-compose-yml
export -f compose:get-compose-yml
compose:has-container-project-myc() { compose:has-container-project-myc() {
local projects local projects
@ -93,6 +93,48 @@ compose:has-container-project-myc() {
[[ $'\n'"$projects"$'\n' == *$'\n'"myc"$'\n'* ]] [[ $'\n'"$projects"$'\n' == *$'\n'"myc"$'\n'* ]]
} }
compose:file:value-change() {
local key="$1" value="$2" first=1 count=0 diff=""
(
COMPOSE_YML_FILE=$(compose:get-compose-yml) || exit 1
export COMPOSE_YML_FILE
cd "${COMPOSE_YML_FILE%/*}"
while read-0 hunk; do
if [ -n "$first" ]; then
diff+="$hunk"
first=
continue
fi
[[ "$hunk" =~ $'\n'"+"[[:space:]]+"${key##*.}:" ]] && {
((count++))
diff+="$hunk" >&2
}
done < <(
export DEBUG=
settmpdir YQ_TEMP
cp "${COMPOSE_YML_FILE}" "$YQ_TEMP/compose.yml" &&
yq -i ".${key} = \"${value}\"" "$YQ_TEMP/compose.yml" &&
diff -u1 "${COMPOSE_YML_FILE}" "$YQ_TEMP/compose.yml" |
sed -r "s/^(@@.*)$/\x00\1/g;s%^(\+\+\+) [^\t]+%\1 ${COMPOSE_YML_FILE}%g"
)
if [[ "$count" == 0 ]]; then
err "No change made to 'compose.yml'."
return 1
fi
if [[ "$count" != 1 ]]; then
err "compose file change request seems dubious and was refused."
if [ -n "$DEBUG" ]; then
e "$diff" | prefix " | "
fi
return 1
fi
echo Applying: >&2
e "$diff" | prefix " | " >&2
patch <<<"$diff"
) || exit 1
}
export -f compose:file:value-change
type:is-mailcow() { type:is-mailcow() {
mailcow:get-root >/dev/null || mailcow:get-root >/dev/null ||
@ -858,6 +900,22 @@ mailcow:recover-target() {
} }
nextcloud:src:version() {
local version
if ! version=$(cat "/srv/datastore/data/${nextcloud_service}/var/www/html/version.php" 2>/dev/null); then
err "Can't find version.php file to get last version installed."
exit 1
fi
version=$(e "$version" | grep 'VersionString =' | cut -f 3 -d ' ' | cut -f 2 -d "'")
if [ -z "$version" ]; then
err "Can't figure out version from version.php content."
exit 1
fi
echo "$version"
}
[ "$SOURCED" ] && return 0 [ "$SOURCED" ] && return 0
@ -1446,4 +1504,56 @@ cmdline.spec:rocketchat:cmd:drop-indexes:run() {
} }
cmdline.spec.gnu nextcloud
cmdline.spec::cmd:nextcloud:run() {
:
}
cmdline.spec.gnu upgrade
cmdline.spec:nextcloud:cmd:upgrade:run() {
: :posarg: [TARGET_VERSION] "Source cyclos dump file to restore"
: :optval: --service,-s "The nexcloud service name (defaults to 'nextcloud')"
local URL
nextcloud_service="${opt_service:-nextcloud}"
project_name=$(compose:project_name) || exit 1
containers=$(compose:service:containers "${project_name}" "${nextcloud_service}") || exit 1
container_stopped=()
if [ -n "$containers" ]; then
for container in $containers; do
Wrap -d "stop ${DARKYELLOW}${nextcloud_service}${NORMAL}'s container" -- \
docker stop "$container" || {
err "Failed to stop container '$container'."
exit 1
}
container_stopped+=("$container")
done
fi
before_version=$(nextcloud:src:version) || exit 1
compose upgrade "$nextcloud_service" || exit 1
errlvl="$?"
after_version=$(nextcloud:src:version)
if [ "$after_version" != "$before_version" ]; then
desc="update \`compose.yml\` to set ${DARKYELLOW}$nextcloud_service${NORMAL}'s "
desc+="docker image to actual code version ${WHITE}${after_version}${NORMAL}"
Wrap -d "$desc" -- \
compose:file:value-change \
"${nextcloud_service}.docker-compose.image" \
"docker.0k.io/nextcloud:${after_version}-myc" || exit 1
fi
if [ "$errlvl" == 0 ]; then
echo "${WHITE}Launching final compose${NORMAL}"
compose up || exit 1
fi
exit "$errlvl"
}
cmdline::parse "$@" cmdline::parse "$@"
Loading…
Cancel
Save