From 0ac819cc26a5eb167a3d8a9cb87378a709b62627 Mon Sep 17 00:00:00 2001 From: Paolo Asperti Date: Sun, 10 Mar 2019 18:09:12 +0100 Subject: [PATCH] Auto Snapshot --- auto-snapshot/Dockerfile | 14 ++++++++++++++ auto-snapshot/README.md | 4 ++++ auto-snapshot/config.json | 25 +++++++++++++++++++++++++ auto-snapshot/run.sh | 13 +++++++++++++ auto-snapshot/snapshot.sh | 31 +++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 auto-snapshot/Dockerfile create mode 100644 auto-snapshot/README.md create mode 100644 auto-snapshot/config.json create mode 100644 auto-snapshot/run.sh create mode 100644 auto-snapshot/snapshot.sh diff --git a/auto-snapshot/Dockerfile b/auto-snapshot/Dockerfile new file mode 100644 index 0000000..b13a620 --- /dev/null +++ b/auto-snapshot/Dockerfile @@ -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" ] diff --git a/auto-snapshot/README.md b/auto-snapshot/README.md new file mode 100644 index 0000000..300b2e5 --- /dev/null +++ b/auto-snapshot/README.md @@ -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. diff --git a/auto-snapshot/config.json b/auto-snapshot/config.json new file mode 100644 index 0000000..e4fdbb7 --- /dev/null +++ b/auto-snapshot/config.json @@ -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" + } +} diff --git a/auto-snapshot/run.sh b/auto-snapshot/run.sh new file mode 100644 index 0000000..6195ece --- /dev/null +++ b/auto-snapshot/run.sh @@ -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 diff --git a/auto-snapshot/snapshot.sh b/auto-snapshot/snapshot.sh new file mode 100644 index 0000000..2f4c119 --- /dev/null +++ b/auto-snapshot/snapshot.sh @@ -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