From ca69e4c5ad23fa43686f04087a87cc98e45e8705 Mon Sep 17 00:00:00 2001 From: Igor Bubelov Date: Tue, 14 Sep 2021 22:36:54 +0700 Subject: [PATCH] Implement Nextcloud backups (optional) (#2354) * Implement Nextcloud backups (optional) * Add menu option for Nextcloud backups * Create backup directory automatically * Fix potential issue with url substitution * Remove unused variable * Ectract actions to functions with scoped vars --- home.admin/00settingsMenuBasics.sh | 21 ++++ home.admin/_background.sh | 12 ++ home.admin/config.scripts/nextcloud.upload.sh | 109 ++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100755 home.admin/config.scripts/nextcloud.upload.sh diff --git a/home.admin/00settingsMenuBasics.sh b/home.admin/00settingsMenuBasics.sh index e52a0e391..c513ccd39 100755 --- a/home.admin/00settingsMenuBasics.sh +++ b/home.admin/00settingsMenuBasics.sh @@ -32,6 +32,10 @@ echo "# map dropboxbackup to on/off" DropboxBackup="off" if [ ${#dropboxBackupTarget} -gt 0 ]; then DropboxBackup="on"; fi +echo "map nextcloudbackup to on/off" +NextcloudBackup="off" +if [ $nextcloudBackupServer ] && [ $nextcloudBackupUser ] && [ $nextcloudBackupPassword ]; then NextcloudBackup="on"; fi + echo "# map localbackup to on/off" LocalBackup="off" if [ ${#localBackupDeviceUUID} -gt 0 ] && [ "${localBackupDeviceUUID}" != "off" ]; then LocalBackup="on"; fi @@ -110,6 +114,7 @@ if [ "${lndNode}" == "on" ]; then OPTIONS+=(k '-LND Accept Keysend' ${keysend}) OPTIONS+=(c '-LND Circuitbreaker (firewall)' ${circuitbreaker}) OPTIONS+=(u '-LND Auto-Unlock' ${autoUnlock}) + OPTIONS+=(x '-LND StaticChannelBackup on Nextcloud' ${NextcloudBackup}) OPTIONS+=(d '-LND StaticChannelBackup DropBox' ${DropboxBackup}) OPTIONS+=(e '-LND StaticChannelBackup USB Drive' ${LocalBackup}) OPTIONS+=(l '-LND UPnP (AutoNAT)' ${autoNatDiscovery}) @@ -306,6 +311,22 @@ else echo "Dropbox backup setting unchanged." fi +# Nextcloud process choice +choice="off"; check=$(echo "${CHOICES}" | grep -c "x") +if [ ${check} -eq 1 ]; then choice="on"; fi +if [ "${NextcloudBackup}" != "${choice}" ]; then + echo "Nextcloud Setting changed .." + anychange=1 + sudo -u admin /home/admin/config.scripts/nextcloud.upload.sh ${choice} + if [ "${choice}" = "on" ]; then + # doing initial upload so that user can see result + source /mnt/hdd/raspiblitz.conf + sudo /home/admin/config.scripts/nextcloud.upload.sh upload /mnt/hdd/lnd/data/chain/${network}/${chain}net/channel.backup + fi +else + echo "Nextcloud backup setting unchanged." +fi + # LocalBackup process choice choice="off"; check=$(echo "${CHOICES}" | grep -c "e") if [ ${check} -eq 1 ]; then choice="on"; fi diff --git a/home.admin/_background.sh b/home.admin/_background.sh index 61150f4f2..469f08e0c 100755 --- a/home.admin/_background.sh +++ b/home.admin/_background.sh @@ -368,6 +368,18 @@ do fi fi + # check if Nextcloud backups are enabled + if [ $nextcloudBackupServer ] && [ $nextcloudBackupUser ] && [ $nextcloudBackupPassword ]; then + echo "--> Offsite-Backup Nextcloud" + source <(sudo /home/admin/config.scripts/nextcloud.upload.sh upload ${localBackupPath}) + source <(sudo /home/admin/config.scripts/nextcloud.upload.sh upload ${localTimestampedPath}) + if [ ${#err} -gt 0 ]; then + echo "FAIL - ${err}" + else + echo "OK - ${upload}" + fi + fi + #else # echo "Channel Backup File not changed." fi diff --git a/home.admin/config.scripts/nextcloud.upload.sh b/home.admin/config.scripts/nextcloud.upload.sh new file mode 100755 index 000000000..8b25bd601 --- /dev/null +++ b/home.admin/config.scripts/nextcloud.upload.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then + echo "# script to upload a file to Nextcloud" + echo "# nextcloud.upload.sh on [server] [user] [password]" + echo "# nextcloud.upload.sh off" + echo "# nextcloud.upload.sh upload [filepath]" + echo "err='just informational output'" + exit 1 +fi + +source /mnt/hdd/raspiblitz.conf + +on() { + local server="${1}" + local user="${2}" + local password="${3}" + + sudo touch /home/admin/.tmp + sudo chmod 777 /home/admin/.tmp + + if [ -z "${server}" ]; then + whiptail --title "Static Channel Backup on Nextcloud" --inputbox "Enter your Nextcloud server URL\nExample: https://cloud.johnsmith.com" 11 70 2>/home/admin/.tmp + server=$(cat /home/admin/.tmp) + fi + + if [ -z "${user}" ]; then + whiptail --title "Static Channel Backup on Nextcloud" --inputbox "Enter your Nextcloud username" 11 70 2>/home/admin/.tmp + user=$(cat /home/admin/.tmp) + fi + + if [ -z "${password}" ]; then + whiptail --title "Static Channel Backup on Nextcloud" --inputbox "Enter your Nextcloud password" 11 70 2>/home/admin/.tmp + password=$(cat /home/admin/.tmp) + fi + + shred -u /home/admin/.tmp + + if [ "${server}" ] && [ "${user}" ] && [ "${password}" ]; then + sudo sed -i '/nextcloudBackupServer=.*/d' /mnt/hdd/raspiblitz.conf + echo "nextcloudBackupServer=${server}" >> /mnt/hdd/raspiblitz.conf + + sudo sed -i '/nextcloudBackupUser=.*/d' /mnt/hdd/raspiblitz.conf + echo "nextcloudBackupUser=${user}" >> /mnt/hdd/raspiblitz.conf + + sudo sed -i '/nextcloudBackupPassword=.*/d' /mnt/hdd/raspiblitz.conf + echo "nextcloudBackupPassword=${password}" >> /mnt/hdd/raspiblitz.conf + else + echo "Please provide nextcloud server, username and password" + exit 1 + fi +} + +off() { + sudo sed -i '/nextcloudBackupServer=.*/d' /mnt/hdd/raspiblitz.conf + sudo sed -i '/nextcloudBackupUser=.*/d' /mnt/hdd/raspiblitz.conf + sudo sed -i '/nextcloudBackupPassword=.*/d' /mnt/hdd/raspiblitz.conf +} + +upload() { + local filepath="${1}" + + if [ -z "${filepath}" ]; then + echo "err='Missing argument: filepath'" + exit 1 + fi + + if [ -z "${nextcloudBackupServer}" ] || [ -z "${nextcloudBackupUser}" ] || [ -z "${nextcloudBackupPassword}" ]; then + echo "err='Nextcloud credentials are missing'" + exit 1 + fi + + local remoteDirUrl="$nextcloudBackupServer/remote.php/dav/files/$nextcloudBackupUser/raspiblitz/" + + # checking if remote directory exists + local response + response=$(curl "${remoteDirUrl}" \ + --user "${nextcloudBackupUser}:${nextcloudBackupPassword}" \ + --request PROPFIND \ + --silent) + + # if remote directory doesn't exist, we need to create it + if [[ "${response}" = *DAV\\Exception\\NotFound* ]]; then + curl "${remoteDirUrl}" \ + --user "${nextcloudBackupUser}:${nextcloudBackupPassword}" \ + --request MKCOL \ + --silent + fi + + if curl "${remoteDirUrl}" \ + --user "${nextcloudBackupUser}:${nextcloudBackupPassword}" \ + --upload-file "${filepath}" \ + --silent; + then + echo "File ${filepath} has been uploaded" + echo "upload=1" + else + echo "err='File upload failed'" + echo "upload=0" + exit 1 + fi +} + +case "${1}" in + on) on "${2}" "${3}" "${4}" ;; + off) off ;; + upload) upload "${2}" ;; + *) echo "err=Unknown action: ${1}" ; exit 1 ;; +esac \ No newline at end of file