Skip to content

Commit

Permalink
Fix backup/restore procedure
Browse files Browse the repository at this point in the history
- Clean up volume before Restic restores it
- Restore the "active from" timestamp
- Restore the "active to" timestamp, by reading it from volume
- Do not restore credentials and tokens: use new ones
  • Loading branch information
DavidePrincipi committed Apr 11, 2024
1 parent f8e0d50 commit aafad6d
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 21 deletions.
25 changes: 5 additions & 20 deletions imageroot/actions/restore-module/06copyenv
Original file line number Diff line number Diff line change
@@ -1,37 +1,22 @@
#!/usr/bin/env python3

#
# Copyright (C) 2022 Nethesis S.r.l.
# http://www.nethesis.it - nethserver@nethesis.it
#
# This script is part of NethServer.
#
# NethServer is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License,
# or any later version.
#
# NethServer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with NethServer. If not, see COPYING.
# Copyright (C) 2024 Nethesis S.r.l.
# SPDX-License-Identifier: GPL-3.0-or-later
#

import sys
import json
import agent
import os

request = json.load(sys.stdin)

original_environment = request['environment']

for evar in [
"LOKI_API_AUTH_USERNAME",
"LOKI_API_AUTH_PASSWORD",
"LOKI_LOGS_INGRESS_TOKEN",
"LOKI_RETENTION_PERIOD",
"LOKI_ACTIVE_FROM",
# NOTE: LOKI_ACTIVE_TO is restored by a later step
]:
agent.set_env(evar, original_environment[evar])
14 changes: 14 additions & 0 deletions imageroot/actions/restore-module/07reinit_data
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env sh

#
# Copyright (C) 2024 Nethesis S.r.l.
# SPDX-License-Identifier: GPL-3.0-or-later
#

exec 1>&2

# Stop the pod
systemctl --user stop loki.service

# At index 20, volume contents are restored by Restic.
podman volume rm loki-server-data
38 changes: 38 additions & 0 deletions imageroot/actions/restore-module/85restore_active_to
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env python3

#
# Copyright (C) 2024 Nethesis S.r.l.
# SPDX-License-Identifier: GPL-3.0-or-later
#

import sys
import agent
import subprocess
import os
import sys

try:
# Find the biggest modification timestamp among Loki's subdirs,
# and print it in ISO8601 format. Note that the timezone requires
# the ":" separator, otherwise the parsing fails.
find_latest_change_script = """find /loki -type d |
xargs -- stat -c %Y |
awk 'BEGIN { ts = 0 } ; { ts = $1 > ts ? $1 : ts ; } ; END { print ts }' |
xargs -IDATE -- date -u -d @DATE +%Y-%m-%dT%H:%M:%S.0+00:00
"""
proc_active_to = subprocess.run(["podman", "run", "-i",
"--name=loki-server-restore", "--replace", "--rm",
"--network=none", "--volume=loki-server-data:/loki:z",
'--entrypoint=["ash","-s"]',
os.environ["LOKI_IMAGE"],
],
stdout=subprocess.PIPE,
stderr=sys.stderr,
input=find_latest_change_script,
text=True,
check=True,
)
except Exception as ex:
print(agent.SD_WARNING + "Cannot restore LOKI_ACTIVE_TO:", str(ex), file=sys.stderr)
else:
agent.set_env("LOKI_ACTIVE_TO", proc_active_to.stdout.strip())
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#

systemctl --user restart loki.service
exec 1>&2

systemctl --user start loki.service

0 comments on commit aafad6d

Please sign in to comment.