Samba Backup
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
#!/command/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
|
||||
declare SLUG
|
||||
declare SNAP_NAME
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Create a new backup (full or partial).
|
||||
# ------------------------------------------------------------------------------
|
||||
function create-backup {
|
||||
local args
|
||||
local addons
|
||||
local folders
|
||||
|
||||
SNAP_NAME=$(generate-backup-name)
|
||||
|
||||
args=()
|
||||
args+=("--name" "$SNAP_NAME")
|
||||
[ -n "$BACKUP_PWD" ] && args+=("--password" "$BACKUP_PWD")
|
||||
|
||||
# do we need a partial backup?
|
||||
if [[ -n "$EXCLUDE_ADDONS" || -n "$EXCLUDE_FOLDERS" ]]; then
|
||||
# include all installed addons that are not listed to be excluded
|
||||
addons=$(ha addons --raw-json | jq -rc '.data.addons[] | select (.installed != false) | .slug')
|
||||
for ad in ${addons}; do [[ ! $EXCLUDE_ADDONS =~ $ad ]] && args+=("-a" "$ad"); done
|
||||
|
||||
# include all folders that are not listed to be excluded
|
||||
folders=(homeassistant ssl share addons/local media)
|
||||
for fol in "${folders[@]}"; do [[ ! $EXCLUDE_FOLDERS =~ $fol ]] && args+=("-f" "$fol"); done
|
||||
fi
|
||||
|
||||
# run the command
|
||||
bashio::log.info "Creating backup \"${SNAP_NAME}\""
|
||||
SLUG="$(ha backups new "${args[@]}" --raw-json | jq -r .data.slug)"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copy the latest backup to the remote share.
|
||||
# ------------------------------------------------------------------------------
|
||||
function copy-backup {
|
||||
local store_name
|
||||
local input
|
||||
local count
|
||||
|
||||
if [ "$SLUG" = "null" ]; then
|
||||
bashio::log.error "Error occurred! Backup could not be created! Please try again"
|
||||
return 1
|
||||
fi
|
||||
|
||||
store_name=$(generate-filename "$SNAP_NAME")
|
||||
|
||||
# append number to filename if already existing
|
||||
input="$(eval "${SMB} -c 'cd \"${TARGET_DIR}\"; ls'")"
|
||||
count=$(echo "$input" | grep "\<$store_name.*\.tar\>" | wc -l)
|
||||
(( "$count" > 0 )) && store_name="${store_name}${count}.tar" || store_name="${store_name}.tar"
|
||||
|
||||
bashio::log.info "Copying backup ${SLUG} (${store_name}) to share"
|
||||
cd /backup || return 1
|
||||
|
||||
if ! run-and-log "${SMB} -c 'cd \"${TARGET_DIR}\"; put ${SLUG}.tar ${store_name}'"; then
|
||||
bashio::log.warning "Could not copy backup ${SLUG} to share. Trying again ..."
|
||||
sleep 5
|
||||
run-and-log "${SMB} -c 'cd \"${TARGET_DIR}\"; put ${SLUG}.tar ${store_name}'"
|
||||
fi
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Delete old local backups.
|
||||
# ------------------------------------------------------------------------------
|
||||
function cleanup-backups-local {
|
||||
local snaps
|
||||
local slug
|
||||
local name
|
||||
|
||||
[ "$KEEP_LOCAL" == "all" ] && return 0
|
||||
|
||||
snaps=$(ha backups --raw-json | jq -c '.data.backups[] | {date,slug,name}' | sort -r)
|
||||
bashio::log.debug "List of local backups:\n$snaps"
|
||||
|
||||
echo "$snaps" | tail -n +$((KEEP_LOCAL + 1)) | while read -r backup; do
|
||||
slug=$(echo "$backup" | jq -r .slug)
|
||||
name=$(echo "$backup" | jq -r .name)
|
||||
bashio::log.info "Deleting ${slug} (${name}) local"
|
||||
run-and-log "ha backups remove ${slug}"
|
||||
done
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Delete old backups on the share.
|
||||
# ------------------------------------------------------------------------------
|
||||
function cleanup-backups-remote {
|
||||
local input
|
||||
local snaps
|
||||
|
||||
[ "$KEEP_REMOTE" == "all" ] && return 0
|
||||
|
||||
# read all tar files that match the backup name pattern and sort them
|
||||
input="$(eval "${SMB} -c 'cd \"${TARGET_DIR}\"; ls'")"
|
||||
snaps="$(echo "$input" | grep -E '\<([0-9a-f]{8}|Samba_Backup_.*)\.tar\>' | while read -r name _ _ _ a b c d; do
|
||||
theDate=$(echo "$a $b $c $d" | xargs -i date +'%Y-%m-%d %H:%M' -d "{}")
|
||||
echo "$theDate $name"
|
||||
done | sort -r)"
|
||||
bashio::log.debug "List of remote backups:\n$snaps"
|
||||
|
||||
echo "$snaps" | tail -n +$((KEEP_REMOTE + 1)) | while read -r _ _ name; do
|
||||
bashio::log.info "Deleting ${name} on share"
|
||||
run-and-log "${SMB} -c 'cd \"${TARGET_DIR}\"; rm ${name}'"
|
||||
done
|
||||
}
|
||||
Reference in New Issue
Block a user