Auto Snapshot

This commit is contained in:
Paolo Asperti 2019-03-10 18:09:12 +01:00
parent a928bd82e6
commit 0ac819cc26
Signed by: paspo
GPG Key ID: 06D46905D19D5182
5 changed files with 87 additions and 0 deletions

14
auto-snapshot/Dockerfile Normal file
View File

@ -0,0 +1,14 @@
ARG BUILD_FROM
FROM $BUILD_FROM
ENV LANG C.UTF-8
# Copy scripts for add-on
COPY run.sh /
COPY snapshot.sh /
RUN apk add -U jq bc curl && \
chmod a+x /run.sh && \
chmod a+x /snapshot.sh
CMD [ "/run.sh" ]

4
auto-snapshot/README.md Normal file
View File

@ -0,0 +1,4 @@
## Auto Snapshot
This plugins takes a snapshot of your hassio instance based on the timing you specify in config. Just use standard cron format (min hour day month weekday).
You can specify how many snapshots you want to mantain (should be at >=1). Note that snapshots are deleted after a new one is taken, so if something goes wrong, you end up with no recent snapshots and the oldest valid ones.

25
auto-snapshot/config.json Normal file
View File

@ -0,0 +1,25 @@
{
"name": "Auto Snapshot",
"url": "https://git.asperti.com/paspo/hassio-addons",
"version": "0.1.0",
"slug": "auto-snapshot",
"description": "Take hassio snapshots with fixed timings and manage retention.",
"startup": "before",
"boot": "auto",
"arch": [
"aarch64",
"amd64",
"armhf",
"i386"
],
"hassio_api": true,
"hassio_role": "admin",
"options": {
"cron": "15 3 * * *",
"num_snapshots": 10
},
"schema": {
"cron": "str",
"num_snapshots": "int"
}
}

13
auto-snapshot/run.sh Normal file
View File

@ -0,0 +1,13 @@
#!/bin/bash
set -e
CONFIG_PATH=/data/options.json
CRON=$(jq --raw-output ".cron" $CONFIG_PATH)
echo "$CRON /snapshot.sh" > /var/spool/cron/crontabs/root
# change perms
chmod 600 /var/spool/cron/crontabs/root
crond -f

31
auto-snapshot/snapshot.sh Normal file
View File

@ -0,0 +1,31 @@
#!/bin/sh
CONFIG_PATH=/data/options.json
NUM_SNAPSHOTS=$(jq --raw-output ".num_snapshots" $CONFIG_PATH)
# TODO: check if NUM_SNAPSHOTS>1
CURRENT_SNAPSHOTS=$( curl -s -H "X-HASSIO-KEY: $HASSIO_TOKEN" http://hassio/snapshots )
# TODO: check if CURRENT_SNAPSHOTS returns ok
START_TIMESTAMP=$(date "+%s")
# take snapshot (this can take a long time)
RESULT=$( curl -s -H "X-HASSIO-KEY: $HASSIO_TOKEN" --data '{"name":"Automatic Snapshot"}' -X POST http://hassio/snapshots/new/full )
SNAPSHOT_TIMESTAMP=$(date "+%s")
SNAPSHOT_TIME=$(echo "$SNAPSHOT_TIMESTAMP - $START_TIMESTAMP" | bc)
STATUS=$(echo "$RESULT" | jq --raw-output '.result')
if [ ! "$STATUS" = "ok" ] ; then
echo "Snapshot FAILED after $SNAPSHOT_TIME seconds."
exit 1
fi
SLUG=$(echo "$RESULT" | jq --raw-output '.data.slug')
echo "Snapshot $SLUG taken SUCCESSFULLY in $SNAPSHOT_TIME seconds."
FIRST_SLUG_TO_DELETE=$(echo "1 + $NUM_SNAPSHOTS" | bc)
echo $CURRENT_SNAPSHOTS | jq --raw-output ".data.snapshots | sort_by(.date) | reverse[] | select(.slug != \"$SLUG\") | select (.protected==false) | .slug " | tail -n +$FIRST_SLUG_TO_DELETE | while read SLUG_TO_DELETE
do
echo "Removing snapshot $SLUG_TO_DELETE"
curl -s -H "X-HASSIO-KEY: $HASSIO_TOKEN" -X POST http://hassio/snapshots/$SLUG_TO_DELETE/remove
done