summaryrefslogtreecommitdiff
path: root/roles/apps/nextcloud/instance/templates/upgrade.sh.j2
blob: 62f6641e9439d6b63d59226bbdd020117accafb1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash

set -e

if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
  echo "Usage: $0 (preapre|finalize) <old-version> <new-version>"
  exit 1
fi

COMMAND="$1"
OLD_VERSION="$2"
NEW_VERSION="$3"
POD_NAME="{{ nextcloud_instance }}-$(hostname)"

maintenance_mode() {
  POD_ID=$(crictl pods --name "$POD_NAME" --state ready -q)
  CONTAINER_ID=$(crictl ps --pod "$POD_ID" --name nextcloud -q)
  crictl exec "$CONTAINER_ID" php -f /var/www/html/occ maintenance:mode "$1"
}

wait_for_cronjobs() {
  POD_ID=$(crictl pods --name "$POD_NAME" --state ready -q)
  CONTAINER_ID=$(crictl ps --pod "$POD_ID" --name nextcloud -q)
  crictl exec "$CONTAINER_ID" bash -c 'echo -n "waiting for running cron script "; while [ -n "$(pgrep -a php | grep cron.php)" ]; do echo -n "."; sleep 1; done; echo ""'
}

wait_for_upgrade_complete() {
  NEW_VERSION="$1"

  set +e
  echo -n "waiting for new version to be ready "
  while true; do
    POD_ID=$(crictl pods --name "$POD_NAME" --state ready -q)
    if [ -z $POD_ID ]; then continue; fi
    CONTAINER_ID=$(crictl ps --pod "$POD_ID" --name nextcloud -q)
    if [ -z $CONTAINER_ID ]; then continue; fi
    STATUS_OUTPUT=$(crictl exec "$CONTAINER_ID" php -f /var/www/html/occ status -n --no-warnings --output plain)
    if [ $? -eq 0 ]; then
      RUNNING_VERSION=$(echo "$STATUS_OUTPUT" | awk -F : '/versionstring/ { print($2) }' | tr -d ' ')
      if [ "$RUNNING_VERSION" = "$NEW_VERSION" ]; then
        break
      fi
      echo -n "."
    fi
    sleep 1
  done
  echo ""
  set -e
  crictl exec "$CONTAINER_ID" bash -c 'echo -n "waiting for apache to start "; while [ -z "$(pgrep apache2)" ]; do echo -n "."; sleep 1; done; echo ""'
}

storage_snapshot() {
  OLD_VERSION="$1"
  NEW_VERSION="$2"

{% if nextcloud_instances[nextcloud_instance].storage.type == 'zfs' %}
  ZFS_VOLUME=$(findmnt -no source -T "{{ nextcloud_instance_basepath }}")
  echo "creating snapshot for zfs volume: $ZFS_VOLUME"
  zfs snapshot "$ZFS_VOLUME@upgrade_$OLD_VERSION-to-$NEW_VERSION""_$(date '+%Y-%m-%m_%H:%M:%S')"
{% endif %}
}

case "$COMMAND" in
  prepare)
    maintenance_mode --on
    wait_for_cronjobs
    storage_snapshot "$OLD_VERSION" "$NEW_VERSION"
    ;;
  finalize)
    wait_for_upgrade_complete "$NEW_VERSION"
    maintenance_mode --off
    ;;
  *)
    echo "unknown command: $COMMAND, must be prepare or finalize"
    exit 1
    ;;
esac