From f4a93f70044c213b2e3d97d61af972ab1bba19a2 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Sun, 13 Sep 2015 10:04:36 +0200 Subject: backup.sh: Rwrite the script Signed-off-by: Florian Pritz --- backup.sh | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 115 insertions(+), 16 deletions(-) (limited to 'backup.sh') diff --git a/backup.sh b/backup.sh index d32d982..74d855d 100755 --- a/backup.sh +++ b/backup.sh @@ -5,30 +5,76 @@ # # Important steps: # - define a host "backup" in root's .ssh/config -# - create the globbing filters or remove the argument to backup() # - read the script and adjust to your needs -if [[ $UID != 0 ]]; then - echo "Error: need root, restarting with sudo" >&2 - exec sudo "$0" "$@" -fi +set -e -export HOME=/root +main() { + if [[ $UID != 0 ]]; then + exec sudo "$0" "$@" + fi -# if you want to encrypt the backups remove --no-encryption in the duplicity call -# and uncomment the lines that contain PASSPHRASE -#PASSPHRASE="randomstringhere" + TMPDIR="$(mktemp -d "/tmp/${0##*/}.XXXXXX")" + trap "rm -rf '${TMPDIR}'" EXIT TERM + + # ensure duplicity keeps its cache at a central location + export HOME=/root + + # if you want to encrypt the backups remove --no-encryption in the duplicity call + # and uncomment the lines that contain PASSPHRASE + #PASSPHRASE="randomstringhere" + + # these mountpoints will be excluded + excludeMountpoints=( + /tmp/ + /sys/ + /dev/ + /proc/ + /run/ + /mnt/levant/nfs/ + /media/ + ) + + # first line that matches wins + IFS='' read -r -d '' excludeList < "$backupDataDir/fdisk" + vgdisplay > "$backupDataDir/vgdisplay" + pvdisplay > "$backupDataDir/pvdisplay" + lvdisplay > "$backupDataDir/lvdisplay" + lvdisplay > "$backupDataDir/lvdisplay" + df -a > "$backupDataDir/df" + findmnt -l > "$backupDataDir/findmnt" + + # this does not ignore /proc and network mounts so it's not that useful :( + #find / | gzip > /root/full-file-list.txt.gz + + backup / sftp://backup/$HOSTNAME-backup/full-backup/ --exclude-filelist <(echo "$excludeList") +} backup() { - src=$1 - dest=$2 + local src=$1 + local dest=$2 shift 2 #export PASSPHRASE duplicity \ - --exclude-other-filesystems \ -v2 \ - --volsize 50 \ + --numeric-owner \ + --volsize 150 \ --allow-source-mismatch \ --asynchronous-upload \ --full-if-older-than 30D \ @@ -39,6 +85,59 @@ backup() { #export PASSPHRASE="" } -backup / pexpect+sftp://backup/$HOSTNAME-backup/root/ --exclude-globbing-filelist /root/duplicity_root_filter -backup /home/ pexpect+sftp://backup/$HOSTNAME-backup/home/ --exclude-globbing-filelist /root/duplicity_home_filter -backup /boot/ pexpect+sftp://backup/$HOSTNAME-backup/boot/ +### support functions below ### + +## +# usage : in_array( $needle, $haystack ) +# return : 0 - found +# 1 - not found +## +in_array() { + local needle=$1; shift + local item + for item in "$@"; do + [[ $item = "$needle" ]] && return 0 # Found + done + return 1 # Not Found +} + +# same as in_array except 0 is returned if any item in haystack starts with needle +in_array_startswith() { + local needle=$1; shift + local item + for item in "$@"; do + [[ "$needle" == "$item"* ]] && return 0 # Found + done + return 1 # Not Found +} + +exclude_mountpoints() { + local error=0 + + for fs in "${excludeMountpoints[@]}"; do + if [[ $fs != */ ]]; then + error=1 + echo "Error: excludeMountpoints entry doesn't end with /: $fs" >&2 + fi + excludeList+="- $fs*"$'\n' + done + + while read line; do + local mountpoint=$(echo "$line" | cut -d\ -f2 | sed 's#\040# #g;') + type=$(echo "$line" | cut -d\ -f3) + + if in_array $type fuse.sshfs tmpfs cifs nfs fuseblk; then + if ! in_array_startswith "$mountpoint/" "${excludeMountpoints[@]}"; then + error=1 + echo "Warning: mountpoint not excluded: $mountpoint" >&2 + fi + fi + done