Skip to content

Commit 7621a2b

Browse files
refactor(roles/nextcloud): prepare nextcloud-update.j2 OS specific vars
1 parent b985001 commit 7621a2b

1 file changed

Lines changed: 190 additions & 97 deletions

File tree

Lines changed: 190 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,196 +1,289 @@
11
#!/usr/bin/env bash
22
# {{ ansible_managed }}
3-
# 2026041501
3+
# 2026042001
44

5-
set -e
5+
set -euo pipefail
6+
7+
error_handler() {
8+
local rc=$?
9+
echo >&2
10+
echo "ERROR in Row ${1} (Exit: ${rc}" >&2
11+
}
12+
trap 'error_handler "${LINENO}"' ERR
13+
14+
WEBSERVER_USER="apache"
15+
WEBSERVER_GROUP="apache"
16+
PHP_SERVICE_NAME="php-fpm"
617

718
NC_DIR="/var/www/html/nextcloud"
8-
LOG_DIR="/tmp/nextcloud-update-$(date --iso-8601)"
9-
STATE_FILE="${LOG_DIR}/nextcloud-update.state"
10-
NC_DATA_DIR=$(sudo -u apache php "${NC_DIR}/occ" config:system:get datadirectory)
19+
DATA_DIR=$(sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" config:system:get datadirectory)
20+
TMP_DIR="/tmp/nextcloud-update-$(date --iso-8601)"
21+
22+
STATE_FILE="${TMP_DIR}/nextcloud-update.state"
1123

1224
{% if nextcloud__icinga2_api_user_login is defined and nextcloud__icinga2_api_user_login | length %}
1325
START_TIME=$(date +%s)
1426
END_TIME=$(( START_TIME + 1800 ))
1527
{% endif %}
1628

17-
mkdir -p "$LOG_DIR"
29+
mkdir -p "${TMP_DIR}"
1830
touch "${STATE_FILE}"
1931

2032
{% if nextcloud__icinga2_api_user_login is defined and nextcloud__icinga2_api_user_login | length %}
2133
echo
22-
echo
2334
echo 'set icinga2 downtime'
2435
echo '--------------------'
2536
if ! grep -q "set_icinga2_downtime_done" "${STATE_FILE}"; then
26-
curl \
27-
--connect-timeout 5 \
28-
--insecure \
29-
--silent \
30-
--user "{{ nextcloud__icinga2_api_user_login["username"] }}:{{ nextcloud__icinga2_api_user_login["password"] }}" \
31-
--header 'Accept: application/json' \
32-
--request POST '{{ nextcloud__icinga2_api_url }}/v1/actions/schedule-downtime' \
33-
--data-binary @- 1> /dev/null << EOF
34-
{
35-
"type": "Host",
36-
"filter": "match(\"{{ nextcloud__icinga2_hostname }}\", host.name)",
37-
"start_time": "${START_TIME}",
38-
"end_time": "${END_TIME}",
39-
"author": "{{ nextcloud__icinga2_hostname }}",
40-
"comment": "Running Nextcloud update",
41-
"all_services": true
42-
}
37+
curl \
38+
--connect-timeout 5 \
39+
--insecure \
40+
--silent \
41+
--user "{{ nextcloud__icinga2_api_user_login["username"] }}:{{ nextcloud__icinga2_api_user_login["password"] }}" \
42+
--header 'Accept: application/json' \
43+
--request POST '{{ nextcloud__icinga2_api_url }}/v1/actions/schedule-downtime' \
44+
--data-binary @- 1> /dev/null << EOF
45+
{
46+
"type": "Host",
47+
"filter": "match(\"{{ nextcloud__icinga2_hostname }}\", host.name)",
48+
"start_time": "${START_TIME}",
49+
"end_time": "${END_TIME}",
50+
"author": "{{ nextcloud__icinga2_hostname }}",
51+
"comment": "Running Nextcloud update",
52+
"all_services": true
53+
}
4354
EOF
44-
echo 'done.'
45-
echo "set_icinga2_downtime_done" >> "${STATE_FILE}"
46-
sleep 5
55+
echo "set_icinga2_downtime_done" >> "${STATE_FILE}"
56+
echo 'done.'
57+
sleep 5
58+
else
59+
echo 'skipping.'
4760
fi
4861
{% endif %}
4962

50-
echo
5163
echo
5264
echo 'export before-update list'
5365
echo '-------------------------'
5466
if ! grep -q "before_update_list_done" "${STATE_FILE}"; then
55-
sudo -u apache php "${NC_DIR}/occ" user:list | tee "${LOG_DIR}/nextcloud-user-list-before-update" > /dev/null
56-
sudo -u apache php "${NC_DIR}/occ" config:list | tee "${LOG_DIR}/nextcloud-config-list-before-update" > /dev/null
57-
sudo -u apache php "${NC_DIR}/occ" app:list | tee "${LOG_DIR}/nextcloud-app-list-before-update" > /dev/null
58-
echo 'done.'
67+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" user:list | tee "${TMP_DIR}/nextcloud-user-list-before-update" > /dev/null
68+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" config:list | tee "${TMP_DIR}/nextcloud-config-list-before-update" > /dev/null
69+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" app:list | tee "${TMP_DIR}/nextcloud-app-list-before-update" > /dev/null
5970
echo "before_update_list_done" >> "${STATE_FILE}"
71+
echo 'done.'
6072
else
61-
echo 'before_update_list_done found in state file. skipping'
73+
echo 'skipping.'
6274
fi
6375

64-
systemctl restart php-fpm.service
65-
setsebool httpd_unified on
76+
echo
77+
echo "restart ${PHP_SERVICE_NAME}.service"
78+
echo '-----------------------'
79+
if ! grep -q "restart_php-fpm_before_done" "${STATE_FILE}"; then
80+
systemctl restart "${PHP_SERVICE_NAME}.service"
81+
echo "restart_php-fpm_before_done" >> "${STATE_FILE}"
82+
echo 'done.'
83+
else
84+
echo 'skipping.'
85+
fi
6686

87+
{% if ansible_os_family == "RedHat" %}
6788
echo
89+
echo 'setsebool httpd_unified on'
90+
echo '--------------------------'
91+
if ! grep -q "setsebool_before_done" "${STATE_FILE}"; then
92+
setsebool httpd_unified on
93+
echo "setsebool_before_done" >> "${STATE_FILE}"
94+
echo 'done.'
95+
else
96+
echo 'skipping.'
97+
fi
98+
{% endif %}
99+
68100
echo
69101
echo 'updater.phar --no-upgrade --no-interaction'
70102
echo '------------------------------------------'
71103
if ! grep -q "updater_done" "${STATE_FILE}"; then
72-
sudo -u apache php "${NC_DIR}/occ" maintenance:mode --on
73-
sudo -u apache php "${NC_DIR}/updater/updater.phar" --no-upgrade --no-interaction
104+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/updater/updater.phar" --no-upgrade --no-interaction
74105
echo "updater_done" >> "${STATE_FILE}"
75106
else
76-
echo 'updater_done found in state file. skipping'
107+
echo 'skipping.'
77108
fi
78109

79-
echo
80110
echo
81111
echo 'occ upgrade --no-interaction'
82112
echo '----------------------------'
83113
if ! grep -q "upgrade_done" "${STATE_FILE}"; then
84-
sudo -u apache php "${NC_DIR}/occ" maintenance:mode --off
85-
sudo -u apache php "${NC_DIR}/occ" upgrade --no-interaction
114+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" maintenance:mode --off
115+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" upgrade --no-interaction
86116
echo "upgrade_done" >> "${STATE_FILE}"
87117
else
88-
echo 'upgrade_done found in state file. skipping'
118+
echo 'skipping.'
89119
fi
90120

91-
echo
92121
echo
93122
echo 'occ app:update --all --no-interaction'
94123
echo '-------------------------------------'
95124
if ! grep -q "app_done" "${STATE_FILE}"; then
96-
sudo -u apache php "${NC_DIR}/occ" maintenance:mode --off
97-
sudo -u apache php "${NC_DIR}/occ" app:update --all --no-interaction
125+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" app:update --all --no-interaction
98126
echo "app_done" >> "${STATE_FILE}"
99127
else
100-
echo 'app_done found in state file. skipping'
128+
echo 'skipping.'
101129
fi
102130

103-
setsebool httpd_unified off
104-
systemctl restart php-fpm.service
105-
systemctl restart notify_push.service
131+
{% if ansible_os_family == "RedHat" %}
132+
echo
133+
echo 'setsebool httpd_unified off'
134+
echo '---------------------------'
135+
if ! grep -q "setsebool_after_done" "${STATE_FILE}"; then
136+
setsebool httpd_unified off
137+
echo "setsebool_after_done" >> "${STATE_FILE}"
138+
echo 'done.'
139+
else
140+
echo 'skipping.'
141+
fi
142+
{% endif %}
106143

107144
echo
145+
echo "restart ${PHP_SERVICE_NAME}.service"
146+
echo '-----------------------'
147+
if ! grep -q "restart_php-fpm_after_done" "${STATE_FILE}"; then
148+
systemctl restart "${PHP_SERVICE_NAME}.service"
149+
echo "restart_php-fpm_after_done" >> "${STATE_FILE}"
150+
echo 'done.'
151+
else
152+
echo 'skipping.'
153+
fi
154+
155+
echo
156+
echo 'restart notify_push.service'
157+
echo '---------------------------'
158+
if ! grep -q "restart_notify_after_done" "${STATE_FILE}"; then
159+
systemctl restart notify_push.service
160+
echo "restart_notify_after_done" >> "${STATE_FILE}"
161+
echo 'done.'
162+
else
163+
echo 'skipping.'
164+
fi
165+
166+
echo
167+
echo 'chown'
168+
echo '-----'
169+
if ! grep -q "chown_done" "${STATE_FILE}"; then
170+
chown -R "${WEBSERVER_USER}:${WEBSERVER_GROUP}" "${NC_DIR}"
171+
echo "chown_done" >> "${STATE_FILE}"
172+
echo 'done.'
173+
else
174+
echo 'skipping.'
175+
fi
176+
177+
echo
178+
echo 'chmod'
179+
echo '-----'
180+
if ! grep -q "chmod_done" "${STATE_FILE}"; then
181+
chmod 0755 "${NC_DIR}/occ"
182+
echo "chmod_done" >> "${STATE_FILE}"
183+
echo 'done.'
184+
else
185+
echo 'skipping.'
186+
fi
187+
188+
{% if ansible_os_family == "RedHat" %}
189+
echo
190+
echo "restorecon"
191+
echo '----------'
192+
if ! grep -q "restorecon_done" "${STATE_FILE}"; then
193+
restorecon -r "${NC_DIR}"
194+
echo "restorecon_done" >> "${STATE_FILE}"
195+
echo 'done.'
196+
else
197+
echo 'skipping.'
198+
fi
199+
{% endif %}
200+
108201
echo
109202
echo 'db:add-missing-indices'
110203
echo '----------------------'
111-
if ! grep -q "db_add_missing_indices" "${STATE_FILE}"; then
112-
sudo -u apache php "${NC_DIR}/occ" db:add-missing-indices
113-
echo "db_add_missing_indices" >> "${STATE_FILE}"
204+
if ! grep -q "db_add_missing_indices_done" "${STATE_FILE}"; then
205+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" db:add-missing-indices
206+
echo "db_add_missing_indices_done" >> "${STATE_FILE}"
207+
echo 'done.'
114208
else
115-
echo 'db_add_missing_indices found in state file. skipping'
209+
echo 'skipping.'
116210
fi
117211

118212
echo
119213
echo 'db:add-missing-columns'
120214
echo '----------------------'
121-
if ! grep -q "db_add_missing_columns" "${STATE_FILE}"; then
122-
sudo -u apache php "${NC_DIR}/occ" db:add-missing-columns
123-
echo "db_add_missing_columns" >> "${STATE_FILE}"
215+
if ! grep -q "db_add_missing_columns_done" "${STATE_FILE}"; then
216+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" db:add-missing-columns
217+
echo "db_add_missing_columns_done" >> "${STATE_FILE}"
124218
else
125-
echo 'db_add_missing_columns found in state file. skipping'
219+
echo 'skipping.'
126220
fi
127221

128222
echo
129223
echo 'db:convert-filecache-bigint --no-interaction'
130224
echo '--------------------------------------------'
131-
if ! grep -q "db_convert_filecache_bigint" "${STATE_FILE}"; then
132-
sudo -u apache php "${NC_DIR}/occ" db:convert-filecache-bigint --no-interaction
133-
echo "db_convert_filecache_bigint" >> "${STATE_FILE}"
225+
if ! grep -q "db_convert_filecache_bigint_done" "${STATE_FILE}"; then
226+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" db:convert-filecache-bigint --no-interaction
227+
echo "db_convert_filecache_bigint_done" >> "${STATE_FILE}"
134228
else
135-
echo 'db_convert_filecache_bigint found in state file. skipping'
229+
echo 'skipping.'
136230
fi
137231

138-
chown -R apache:apache "${NC_DIR}"
139-
chmod 0755 "${NC_DIR}/occ"
140-
141-
restorecon -r "${NC_DIR}"
142-
143-
sudo -u apache php "${NC_DIR}/occ" user:list | tee "${LOG_DIR}/nextcloud-user-list-after-update" > /dev/null
144-
sudo -u apache php "${NC_DIR}/occ" config:list | tee "${LOG_DIR}/nextcloud-config-list-after-update" > /dev/null
145-
sudo -u apache php "${NC_DIR}/occ" app:list | tee "${LOG_DIR}/nextcloud-app-list-after-update" > /dev/null
232+
echo
233+
echo 'export after-update list'
234+
echo '------------------------'
235+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" user:list | tee "${TMP_DIR}/nextcloud-user-list-after-update" > /dev/null
236+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" config:list | tee "${TMP_DIR}/nextcloud-config-list-after-update" > /dev/null
237+
sudo -u "${WEBSERVER_USER}" php "${NC_DIR}/occ" app:list | tee "${TMP_DIR}/nextcloud-app-list-after-update" > /dev/null
238+
echo 'done.'
146239

147240
{% if nextcloud__icinga2_api_user_login is defined and nextcloud__icinga2_api_user_login | length %}
148241
echo
149-
echo
150242
echo 'remove icinga2 downtime'
151243
echo '-----------------------'
152244
if ! grep -q "remove_icinga2_downtime_done" "${STATE_FILE}"; then
153-
curl \
154-
--connect-timeout 5 \
155-
--insecure \
156-
--silent \
157-
--user '{{ nextcloud__icinga2_api_user_login["username"] }}:{{ nextcloud__icinga2_api_user_login["password"] }}' \
158-
--header 'Accept: application/json' \
159-
--request POST '{{ nextcloud__icinga2_api_url }}/v1/actions/remove-downtime' \
160-
--data-binary @- 1> /dev/null << EOF
161-
{
162-
"type": "Host",
163-
"filter": "host.name==\"{{ nextcloud__icinga2_hostname }}\"",
164-
"pretty": true
165-
}
245+
curl \
246+
--connect-timeout 5 \
247+
--insecure \
248+
--silent \
249+
--user '{{ nextcloud__icinga2_api_user_login["username"] }}:{{ nextcloud__icinga2_api_user_login["password"] }}' \
250+
--header 'Accept: application/json' \
251+
--request POST '{{ nextcloud__icinga2_api_url }}/v1/actions/remove-downtime' \
252+
--data-binary @- 1> /dev/null << EOF
253+
{
254+
"type": "Host",
255+
"filter": "host.name==\"{{ nextcloud__icinga2_hostname }}\"",
256+
"pretty": true
257+
}
166258
EOF
167-
echo 'done.'
168-
echo "remove_icinga2_downtime_done" >> "${STATE_FILE}"
169-
sleep 5
259+
echo "remove_icinga2_downtime_done" >> "${STATE_FILE}"
260+
echo 'done.'
261+
sleep 5
262+
else
263+
echo 'skipping.'
170264
fi
171265
{% endif %}
172266

173-
set +e
174-
175-
echo
176267
echo
177268
echo 'User List before and after'
178269
echo '--------------------------'
179-
diff --side-by-side "${LOG_DIR}/nextcloud-user-list-before-update" "${LOG_DIR}/nextcloud-user-list-after-update"
270+
diff --side-by-side "${TMP_DIR}/nextcloud-user-list-before-update" "${TMP_DIR}/nextcloud-user-list-after-update" || true
180271
echo
181272
echo 'Config List before and after'
182273
echo '----------------------------'
183-
diff --side-by-side "${LOG_DIR}/nextcloud-config-list-before-update" "${LOG_DIR}/nextcloud-config-list-after-update" --ignore-matching-lines='"installed_version":'
274+
diff --side-by-side "${TMP_DIR}/nextcloud-config-list-before-update" "${TMP_DIR}/nextcloud-config-list-after-update" --ignore-matching-lines='"installed_version":' || true
184275
echo
185276
echo 'App List before and after'
186277
echo '-------------------------'
187-
diff --side-by-side <(cut -d':' -f1 "${LOG_DIR}/nextcloud-app-list-before-update") <(cut -d':' -f1 "${LOG_DIR}/nextcloud-app-list-after-update")
188-
189-
set -e
278+
diff --side-by-side <(cut -d':' -f1 "${TMP_DIR}/nextcloud-app-list-before-update") <(cut -d':' -f1 "${TMP_DIR}/nextcloud-app-list-after-update") || true
190279

191-
echo
192280
echo
193281
echo 'Old backup directories can be removed with'
194282
echo '------------------------------------------'
195-
find "${NC_DATA_DIR}/updater-"*/backups/ -maxdepth 1 -mindepth 1 -type d -printf 'rm --recursive --force %p\n'
196-
rm --force "${STATE_FILE}"
283+
find "${DATA_DIR}/updater-"*/backups/ -maxdepth 1 -mindepth 1 -type d -printf 'rm --recursive --force %p\n'
284+
285+
echo
286+
echo 'rm TMP_DIR'
287+
echo '----------'
288+
rm --recursive --force "${TMP_DIR}"
289+
echo 'done.'

0 commit comments

Comments
 (0)