From 720c1bf2c9e5ca3638e69b9899d1a662a00c7574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20Schr=C3=B6der?= Date: Tue, 26 Feb 2019 18:48:40 +0100 Subject: [PATCH 1/6] add rsync --- remote-backup/Dockerfile | 2 +- remote-backup/config.json | 16 ++++++++++++++-- remote-backup/run.sh | 38 +++++++++++++++++++++++++++++--------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/remote-backup/Dockerfile b/remote-backup/Dockerfile index dd62e46..8118112 100644 --- a/remote-backup/Dockerfile +++ b/remote-backup/Dockerfile @@ -5,7 +5,7 @@ FROM $BUILD_FROM ENV LANG C.UTF-8 # Setup base -RUN apk add --no-cache jq openssh-client zip +RUN apk add --no-cache jq openssh-client zip sshpass rsync # Hass.io CLI ARG BUILD_ARCH diff --git a/remote-backup/config.json b/remote-backup/config.json index c92d402..dafa88c 100644 --- a/remote-backup/config.json +++ b/remote-backup/config.json @@ -10,21 +10,33 @@ "hassio_role": "backup", "map": ["backup:rw"], "options": { + "ssh_enabled": true, "ssh_host": "", "ssh_port": 22, "ssh_user": "", "ssh_key": [], "remote_directory": "", "zip_password": "", - "keep_local_backup": "" + "keep_local_backup": "", + "rsync_enabled": false, + "rsync_host": "", + "rsync_rootfolder": "hassio-sync", + "rsync_user": "", + "rsync_password": "" }, "schema": { + "ssh_enabled": "bool", "ssh_host": "str", "ssh_port": "int", "ssh_user": "str", "ssh_key": ["str"], "remote_directory": "str", "zip_password": "str", - "keep_local_backup": "match(^(all|[+]?\\d*)$)" + "keep_local_backup": "match(^(all|[+]?\\d*)$)", + "rsync_enabled": "bool", + "rsync_server": "str", + "rsync_rootfolder": "str", + "rsync_user": "str", + "rsync_password": "str" } } diff --git a/remote-backup/run.sh b/remote-backup/run.sh index dbd25b4..169f9d2 100755 --- a/remote-backup/run.sh +++ b/remote-backup/run.sh @@ -12,6 +12,11 @@ REMOTE_DIRECTORY=$(jq --raw-output ".remote_directory" $CONFIG_PATH) ZIP_PASSWORD=$(jq --raw-output '.zip_password' $CONFIG_PATH) KEEP_LOCAL_BACKUP=$(jq --raw-output '.keep_local_backup' $CONFIG_PATH) +RSYNC_HOST=$(jq --raw-output ".rsync_host" $CONFIG_PATH) +RSYNC_ROOTFOLDER=$(jq --raw-output ".rsync_rootfolder" $CONFIG_PATH) +RSYNC_USER=$(jq --raw-output ".rsync_user" $CONFIG_PATH) +RSYNC_PASSWORD=$(jq --raw-output ".rsync_password" $CONFIG_PATH) + # create variables SSH_ID="${HOME}/.ssh/id" @@ -37,16 +42,17 @@ function add-ssh-key { function copy-backup-to-remote { - cd /backup/ - if [[ -z $ZIP_PASSWORD ]]; then - echo "Copying ${slug}.tar to ${REMOTE_DIRECTORY} on ${SSH_HOST} using SCP" - scp -F "${HOME}/.ssh/config" "${slug}.tar" remote:"${REMOTE_DIRECTORY}" - else - echo "Copying password-protected ${slug}.zip to ${REMOTE_DIRECTORY} on ${SSH_HOST} using SCP" - zip -P "$ZIP_PASSWORD" "${slug}.zip" "${slug}".tar - scp -F "${HOME}/.ssh/config" "${slug}.zip" remote:"${REMOTE_DIRECTORY}" && rm "${slug}.zip" + if hass.config.false 'ssh_enabled'; then + cd /backup/ + if [[ -z $ZIP_PASSWORD ]]; then + echo "Copying ${slug}.tar to ${REMOTE_DIRECTORY} on ${SSH_HOST} using SCP" + scp -F "${HOME}/.ssh/config" "${slug}.tar" remote:"${REMOTE_DIRECTORY}" + else + echo "Copying password-protected ${slug}.zip to ${REMOTE_DIRECTORY} on ${SSH_HOST} using SCP" + zip -P "$ZIP_PASSWORD" "${slug}.zip" "${slug}".tar + scp -F "${HOME}/.ssh/config" "${slug}.zip" remote:"${REMOTE_DIRECTORY}" && rm "${slug}.zip" + fi fi - } function delete-local-backup { @@ -80,6 +86,20 @@ function create-local-backup { echo "Backup created: ${slug}" } +function rsync_folders { + + if hass.config.false 'rsync_enabled'; then + rsyncurl="$RSYNC_USER@$RSYNC_HOST::$RSYNC_ROOTFOLDER" + echo "[Info] trying to rsync hassio folders to $rsyncurl" + sshpass -p $RSYNC_PASSWORD rsync -av /config/ $rsyncurl/config/ + sshpass -p $RSYNC_PASSWORD rsync -av /addons/ $rsyncurl/addons/ + sshpass -p $RSYNC_PASSWORD rsync -av /backup/ $rsyncurl/backup/ + sshpass -p $RSYNC_PASSWORD rsync -av /share/ $rsyncurl/share/ + sshpass -p $RSYNC_PASSWORD rsync -av /ssl/ $rsyncurl/ssl/ + echo "[Info] Finished rsync" + fi +} + add-ssh-key create-local-backup From 82e69f957fa9a93f98cffd0831d6b0cfe6a70db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20Schr=C3=B6der?= Date: Tue, 26 Feb 2019 20:25:17 +0100 Subject: [PATCH 2/6] work on rsync --- remote-backup/config.json | 6 ++-- remote-backup/run.sh | 64 ++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/remote-backup/config.json b/remote-backup/config.json index dafa88c..0fa3d37 100644 --- a/remote-backup/config.json +++ b/remote-backup/config.json @@ -2,13 +2,13 @@ "name": "Remote Backup", "version": "dev", "slug": "remote_backup", - "description": "Exploit snapshots and SCP to create remote backups to specified server", + "description": "Exploit snapshots and SCP/rsync to create remote backups to specified server", "url": "https://github.com/mr-bjerre/hassio-remote-backup", "startup": "once", "boot": "manual", "hassio_api": true, "hassio_role": "backup", - "map": ["backup:rw"], + "map": ["config", "addons", "share", "ssl", "backup:rw"], "options": { "ssh_enabled": true, "ssh_host": "", @@ -34,7 +34,7 @@ "zip_password": "str", "keep_local_backup": "match(^(all|[+]?\\d*)$)", "rsync_enabled": "bool", - "rsync_server": "str", + "rsync_host": "str", "rsync_rootfolder": "str", "rsync_user": "str", "rsync_password": "str" diff --git a/remote-backup/run.sh b/remote-backup/run.sh index 169f9d2..b0cc737 100755 --- a/remote-backup/run.sh +++ b/remote-backup/run.sh @@ -4,6 +4,7 @@ set -e CONFIG_PATH=/data/options.json # parse inputs from options +SSH_ENABLED=$(jq --raw-output ".ssh_enabled" $CONFIG_PATH) SSH_HOST=$(jq --raw-output ".ssh_host" $CONFIG_PATH) SSH_PORT=$(jq --raw-output ".ssh_port" $CONFIG_PATH) SSH_USER=$(jq --raw-output ".ssh_user" $CONFIG_PATH) @@ -12,6 +13,7 @@ REMOTE_DIRECTORY=$(jq --raw-output ".remote_directory" $CONFIG_PATH) ZIP_PASSWORD=$(jq --raw-output '.zip_password' $CONFIG_PATH) KEEP_LOCAL_BACKUP=$(jq --raw-output '.keep_local_backup' $CONFIG_PATH) +RSYNC_ENABLED=$(jq --raw-output ".rsync_enabled" $CONFIG_PATH) RSYNC_HOST=$(jq --raw-output ".rsync_host" $CONFIG_PATH) RSYNC_ROOTFOLDER=$(jq --raw-output ".rsync_rootfolder" $CONFIG_PATH) RSYNC_USER=$(jq --raw-output ".rsync_user" $CONFIG_PATH) @@ -21,28 +23,31 @@ RSYNC_PASSWORD=$(jq --raw-output ".rsync_password" $CONFIG_PATH) SSH_ID="${HOME}/.ssh/id" function add-ssh-key { - echo "Adding SSH key" - mkdir -p ~/.ssh - ( - echo "Host remote" - echo " IdentityFile ${HOME}/.ssh/id" - echo " HostName ${SSH_HOST}" - echo " User ${SSH_USER}" - echo " Port ${SSH_PORT}" - echo " StrictHostKeyChecking no" - ) > "${HOME}/.ssh/config" - - while read -r line; do - echo "$line" >> ${HOME}/.ssh/id - done <<< "$SSH_KEY" - - chmod 600 "${HOME}/.ssh/config" - chmod 600 "${HOME}/.ssh/id" + + if [ "$SSH_ENABLED" = true ] ; then + echo "Adding SSH key" + mkdir -p ~/.ssh + ( + echo "Host remote" + echo " IdentityFile ${HOME}/.ssh/id" + echo " HostName ${SSH_HOST}" + echo " User ${SSH_USER}" + echo " Port ${SSH_PORT}" + echo " StrictHostKeyChecking no" + ) > "${HOME}/.ssh/config" + + while read -r line; do + echo "$line" >> ${HOME}/.ssh/id + done <<< "$SSH_KEY" + + chmod 600 "${HOME}/.ssh/config" + chmod 600 "${HOME}/.ssh/id" + fi } function copy-backup-to-remote { - if hass.config.false 'ssh_enabled'; then + if [ "$SSH_ENABLED" = true ] ; then cd /backup/ if [[ -z $ZIP_PASSWORD ]]; then echo "Copying ${slug}.tar to ${REMOTE_DIRECTORY} on ${SSH_HOST} using SCP" @@ -88,14 +93,24 @@ function create-local-backup { function rsync_folders { - if hass.config.false 'rsync_enabled'; then + if [ "$RSYNC_ENABLED" = true ] ; then rsyncurl="$RSYNC_USER@$RSYNC_HOST::$RSYNC_ROOTFOLDER" echo "[Info] trying to rsync hassio folders to $rsyncurl" - sshpass -p $RSYNC_PASSWORD rsync -av /config/ $rsyncurl/config/ - sshpass -p $RSYNC_PASSWORD rsync -av /addons/ $rsyncurl/addons/ - sshpass -p $RSYNC_PASSWORD rsync -av /backup/ $rsyncurl/backup/ - sshpass -p $RSYNC_PASSWORD rsync -av /share/ $rsyncurl/share/ - sshpass -p $RSYNC_PASSWORD rsync -av /ssl/ $rsyncurl/ssl/ + echo "" + echo "[Info] /config" + sshpass -p $RSYNC_PASSWORD rsync -av /config/ $rsyncurl/config/ --delete + echo "" + echo "[Info] /addons" + sshpass -p $RSYNC_PASSWORD rsync -av /addons/ $rsyncurl/addons/ --delete + echo "" + echo "[Info] /backup" + sshpass -p $RSYNC_PASSWORD rsync -av /backup/ $rsyncurl/backup/ --delete + echo "" + echo "[Info] /share" + sshpass -p $RSYNC_PASSWORD rsync -av /share/ $rsyncurl/share/ --delete + echo "" + echo "[Info] /ssl" + sshpass -p $RSYNC_PASSWORD rsync -av /ssl/ $rsyncurl/ssl/ --delete echo "[Info] Finished rsync" fi } @@ -104,6 +119,7 @@ function rsync_folders { add-ssh-key create-local-backup copy-backup-to-remote +rsync_folders delete-local-backup echo "Backup process done!" From 5c8dc4c09f8c51ccf16855766cb0e7ad0d501827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20Schr=C3=B6der?= Date: Tue, 26 Feb 2019 20:47:50 +0100 Subject: [PATCH 3/6] remove tab --- remote-backup/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/remote-backup/config.json b/remote-backup/config.json index 0fa3d37..d392e01 100644 --- a/remote-backup/config.json +++ b/remote-backup/config.json @@ -19,7 +19,7 @@ "zip_password": "", "keep_local_backup": "", "rsync_enabled": false, - "rsync_host": "", + "rsync_host": "", "rsync_rootfolder": "hassio-sync", "rsync_user": "", "rsync_password": "" @@ -34,7 +34,7 @@ "zip_password": "str", "keep_local_backup": "match(^(all|[+]?\\d*)$)", "rsync_enabled": "bool", - "rsync_host": "str", + "rsync_host": "str", "rsync_rootfolder": "str", "rsync_user": "str", "rsync_password": "str" From aca21b72b445b812e36d7f69e938f2546d9bd167 Mon Sep 17 00:00:00 2001 From: carstenschroeder Date: Fri, 26 Apr 2019 11:35:58 +0200 Subject: [PATCH 4/6] bump hassio-cli to 2.2.0 --- remote-backup/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/remote-backup/Dockerfile b/remote-backup/Dockerfile index e1dce53..09f3300 100644 --- a/remote-backup/Dockerfile +++ b/remote-backup/Dockerfile @@ -11,7 +11,7 @@ RUN apk add --no-cache jq openssh-client zip sshpass rsync ARG BUILD_ARCH ARG CLI_VERSION RUN apk add --no-cache curl \ - && curl -Lso /usr/bin/hassio https://github.com/home-assistant/hassio-cli/releases/download/1.2.1/hassio_${BUILD_ARCH} \ + && curl -Lso /usr/bin/hassio https://github.com/home-assistant/hassio-cli/releases/download/2.2.0/hassio_${BUILD_ARCH} \ && chmod a+x /usr/bin/hassio # Copy data @@ -37,7 +37,7 @@ LABEL \ org.label-schema.build-date=${BUILD_DATE} \ org.label-schema.name="Remote Backup" \ org.label-schema.schema-version="1.0" \ - org.label-schema.usage="https://github.com/overkill32/hassio-remote-backup/tree/master/README.md" \ + org.label-schema.usage="https://github.com/mr-bjerre/hassio-remote-backup/tree/master/README.md" \ org.label-schema.vcs-ref=${BUILD_REF} \ - org.label-schema.vcs-url="https://github.com/overkill32/hassio-remote-backup/" \ + org.label-schema.vcs-url="https://github.com/mr-bjerre/hassio-remote-backup/" \ org.label-schema.vendor="Hass.io add-ons by Nicolai" From 0b437f47d4645693e1b96430fd714c78a7b9d2f6 Mon Sep 17 00:00:00 2001 From: carstenschroeder Date: Fri, 26 Apr 2019 11:38:51 +0200 Subject: [PATCH 5/6] adapt to new hassio cli --- remote-backup/run.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/remote-backup/run.sh b/remote-backup/run.sh index b0cc737..462317a 100755 --- a/remote-backup/run.sh +++ b/remote-backup/run.sh @@ -68,16 +68,16 @@ function delete-local-backup { : elif [[ -z ${KEEP_LOCAL_BACKUP} ]]; then echo "Deleting local backup: ${slug}" - hassio snapshots remove -name "${slug}" + hassio snapshots remove "${slug}" else - last_date_to_keep=$(hassio snapshots list | jq .data.snapshots[].date | sort -r | \ + last_date_to_keep=$(hassio snapshots list --raw-json | jq .data.snapshots[].date | sort -r | \ head -n "${KEEP_LOCAL_BACKUP}" | tail -n 1 | xargs date -D "%Y-%m-%dT%T" +%s --date ) - hassio snapshots list | jq -c .data.snapshots[] | while read backup; do + hassio snapshots list --raw-json | jq -c .data.snapshots[] | while read backup; do if [[ $(echo ${backup} | jq .date | xargs date -D "%Y-%m-%dT%T" +%s --date ) -lt ${last_date_to_keep} ]]; then echo "Deleting local backup: $(echo ${backup} | jq -r .slug)" - hassio snapshots remove -name "$(echo ${backup} | jq -r .slug)" + hassio snapshots remove "$(echo ${backup} | jq -r .slug)" fi done @@ -87,7 +87,7 @@ function delete-local-backup { function create-local-backup { name="Automated backup $(date +'%Y-%m-%d %H:%M')" echo "Creating local backup: \"${name}\"" - slug=$(hassio snapshots new --options name="${name}" | jq --raw-output '.data.slug') + slug=$(hassio snapshots new --raw-json --name="${name}" | jq --raw-output '.data.slug') echo "Backup created: ${slug}" } @@ -98,7 +98,7 @@ function rsync_folders { echo "[Info] trying to rsync hassio folders to $rsyncurl" echo "" echo "[Info] /config" - sshpass -p $RSYNC_PASSWORD rsync -av /config/ $rsyncurl/config/ --delete + sshpass -p $RSYNC_PASSWORD rsync -av --exclude '*.db-shm' --exclude '*.db-wal' /config/ $rsyncurl/config/ --delete echo "" echo "[Info] /addons" sshpass -p $RSYNC_PASSWORD rsync -av /addons/ $rsyncurl/addons/ --delete From 60f88dc376069e78430c7b2bae6c24b86d3bf676 Mon Sep 17 00:00:00 2001 From: carstenschroeder Date: Fri, 26 Apr 2019 11:41:16 +0200 Subject: [PATCH 6/6] chnage URL to overkill32 --- remote-backup/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/remote-backup/Dockerfile b/remote-backup/Dockerfile index 09f3300..61d1cc8 100644 --- a/remote-backup/Dockerfile +++ b/remote-backup/Dockerfile @@ -37,7 +37,7 @@ LABEL \ org.label-schema.build-date=${BUILD_DATE} \ org.label-schema.name="Remote Backup" \ org.label-schema.schema-version="1.0" \ - org.label-schema.usage="https://github.com/mr-bjerre/hassio-remote-backup/tree/master/README.md" \ + org.label-schema.usage="https://github.com/overkill32/hassio-remote-backup/tree/master/README.md" \ org.label-schema.vcs-ref=${BUILD_REF} \ - org.label-schema.vcs-url="https://github.com/mr-bjerre/hassio-remote-backup/" \ + org.label-schema.vcs-url="https://github.com/overkill32/hassio-remote-backup/" \ org.label-schema.vendor="Hass.io add-ons by Nicolai"