From e6b7068fe53426a349c17f5617dbc4d5271eaf19 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 27 Nov 2024 21:16:36 +0000 Subject: [PATCH] Added following additions: Ability to send notifications to Discord webhook. Ability to disable NTFY and Discord notifications if not needed. BACKUP_FILE_LOCATION variable to change the location when the backup files are located on the Home Assistant server. --- V2/ha-backup.sh | 96 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 76 insertions(+), 20 deletions(-) diff --git a/V2/ha-backup.sh b/V2/ha-backup.sh index 6a3ff63..f3fecbe 100644 --- a/V2/ha-backup.sh +++ b/V2/ha-backup.sh @@ -1,32 +1,69 @@ #!/bin/bash -set -x +set -x +### Global Settings ### # Set your Home Assistant SSH credentials -HA_SSH_KEY="SSH_PRIVATE_KEY" # Replace with your SSH Private key for HomeAssistant -HA_SSH_USER="SSH_USER" # Replace with your HomeAssistant server username (Default is root) -HA_SSH_HOST="SSH_HOST_IP_OR_HOSTNAME" # Replace with your HomeAssistant server IP address -HA_SSH_PORT="SSH_PORT" # Replace with your HomeAssistant server port +HA_SSH_KEY="SSH_PRIVATE_KEY" # Replace with your SSH Private key for HomeAssistant +HA_SSH_USER="SSH_USER" # Replace with your HomeAssistant server username (Default is root) +HA_SSH_HOST="SSH_HOST_IP_OR_HOSTNAME" # Replace with your HomeAssistant server IP address +HA_SSH_PORT="SSH_PORT" # Replace with your HomeAssistant server port # Set the backup destination path -BACKUP_DEST="BACKUP_FILE_DESTINATION" # Replace with the location for the backup files +BACKUP_DEST="BACKUP_FILE_DESTINATION" # Replace with the location for the backup files -# Set your ntfy topic and URL +# ntfy settings +NTFY_ENABLED=false # Set to 'true' to enable ntfy notifications +NTFY_SERVER="NTFY_SERVER_FQDN_ADDRESS" # Replace with your ntfy server address NTFY_TOPIC="NTFY_TOPIC" # Replace with your ntfy topic -NTFY_SERVER="NTFY_SERVER_FQDN_ADDRESS" # Replace with your ntfy server address +# Discord webhook settings +DISCORD_ENABLED=false # Set to 'true' to enable Discord notifications +DISCORD_WEBHOOK_URL="DISCORD_WEBHOOK_URL" # Replace with your Discord webhook URL + +# Set clean up old backups (adjust the number of days to keep) +BACKUP_FILE_CLEANUP="90" # Set the number of days that backup files will be kept for (Default 90 days) + +# Set the location of the Home Assistant backups (Set to default location /backup) +# If you have a custom install, using the likes of Supervised +# this location should normally be /usr/share/hassio/backup +BACKUP_FILE_LOCATION="/backup" + +### Script ### + +### Function for sending notifications ### +send_ntfy_notification() { + local message=$1 + if [ "$NTFY_ENABLED" = true ]; then + curl -X POST -d "$message" $NTFY_URL + fi +} + +send_discord_notification() { + local message=$1 + if [ "$DISCORD_ENABLED" = true ]; then + curl -X POST -H "Content-Type: application/json" -d '{"content": "'"$message"'"}' $DISCORD_WEBHOOK_URL + fi +} + +# ntfy URL setup NTFY_URL="$NTFY_SERVER/$NTFY_TOPIC" # Timestamp variable for consistent naming TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S') +# Start the timer +START_TIME=$(date +%s) + # Send notification that backup has started -curl -X POST -d "Backup process started at $TIMESTAMP" $NTFY_URL +send_ntfy_notification "Backup process started at $TIMESTAMP" +send_discord_notification "Backup process started at $TIMESTAMP" # Create a backup on the Home Assistant server and extract the slug BACKUP_OUTPUT=$(ssh -i "$HA_SSH_KEY" -p "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST" "ha backup new --name=auto_backup_$TIMESTAMP") if [ $? -ne 0 ]; then # Send notification if backup creation fails - curl -X POST -d "Error: Failed to create backup on Home Assistant server." $NTFY_URL + send_ntfy_notification "Error: Failed to create backup on Home Assistant server." + send_discord_notification "Error: Failed to create backup on Home Assistant server." echo "Error: Failed to create backup on Home Assistant server." exit 1 fi @@ -35,43 +72,62 @@ fi BACKUP_SLUG=$(echo "$BACKUP_OUTPUT" | awk '/slug:/ {print $2}' | tr -d '\r') if [ -z "$BACKUP_SLUG" ]; then # Send notification if backup slug extraction fails - curl -X POST -d "Error: Failed to extract backup slug." $NTFY_URL + send_ntfy_notification "Error: Failed to extract backup slug." + send_discord_notification "Error: Failed to extract backup slug." echo "Error: Failed to extract backup slug." exit 1 fi # Send notification that backup was created -curl -X POST -d "Backup created successfully with slug: $BACKUP_SLUG" $NTFY_URL +send_ntfy_notification "Backup created successfully with slug: $BACKUP_SLUG" +send_discord_notification "Backup created successfully with slug: $BACKUP_SLUG" # Create a filename for the backup BACKUP_FILE="$BACKUP_DEST/${TIMESTAMP}_${BACKUP_SLUG}.tar" # Copy the backup file from Home Assistant to your local machine -scp -i "$HA_SSH_KEY" -P "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST:/usr/share/hassio/backup/${BACKUP_SLUG}.tar" "$BACKUP_FILE" +scp -i "$HA_SSH_KEY" -P "$HA_SSH_PORT" "$HA_SSH_USER@$HA_SSH_HOST:$BACKUP_FILE_LOCATION/${BACKUP_SLUG}.tar" "$BACKUP_FILE" if [ $? -ne 0 ]; then # Send notification if backup copy fails - curl -X POST -d "Error: Failed to copy backup to local machine." $NTFY_URL + send_ntfy_notification "Error: Failed to copy backup to local machine." + send_discord_notification "Error: Failed to copy backup to local machine." echo "Error: Failed to copy backup to local machine." exit 1 fi -# Send notification that backup file was copied successfully -curl -X POST -d "Backup file successfully copied to: $BACKUP_FILE" $NTFY_URL +# Get the size of the backup file +BACKUP_FILE_SIZE=$(stat -c %s "$BACKUP_FILE") +if [ $? -ne 0 ]; then + send_ntfy_notification "Error: Failed to get backup file size." + send_discord_notification "Error: Failed to get backup file size." + echo "Error: Failed to get backup file size." + exit 1 +fi + # Clean up old backups if needed (adjust the number of days to keep) find "$BACKUP_DEST" -name '*.tar' -mtime +90 -exec rm {} \; if [ $? -ne 0 ]; then # Send notification if cleanup fails - curl -X POST -d "Error: Failed to clean up old backups." $NTFY_URL + send_ntfy_notification "Error: Failed to clean up old backups." + send_discord_notification "Error: Failed to clean up old backups." echo "Error: Failed to clean up old backups." exit 1 fi # Send notification that the cleanup was successful -curl -X POST -d "Old backups cleaned up successfully." $NTFY_URL +send_ntfy_notification "Old backups cleaned up successfully." +send_discord_notification "Old backups cleaned up successfully." # Success message echo "Backup completed successfully: $BACKUP_FILE" -# Send notification that the backup was completed -curl -X POST -d "Backup completed successfully: $BACKUP_FILE" $NTFY_URL +send_ntfy_notification "Backup completed successfully: $BACKUP_FILE" +send_discord_notification "Backup completed successfully: $BACKUP_FILE" +# Get the total time taken by the script +END_TIME=$(date +%s) +RUNTIME=$((END_TIME - START_TIME)) + +# Send notification with backup file size and script runtime +send_ntfy_notification "Backup file size: $BACKUP_FILE_SIZE bytes. Script runtime: $RUNTIME seconds." +send_discord_notification "Backup file size: $BACKUP_FILE_SIZE bytes. Script runtime: $RUNTIME seconds."