#!/bin/bash # # sync a removable volume with system backups. # # Parameters. BASENAME="`basename $0`" VOLUME="$1" MEDIA="/media/$VOLUME" BWLIMIT=${BWLIMIT:=32000} IMAGES="/var/data/crypt/" RSYNC="ionice -c 3 nice -n 19 rsync -avH --delete --bwlimit=$BWLIMIT" CP="ionice -c 3 nice -n 19 cp" WHOAMI="`whoami`" # Sync backups for a node. function sync_backups_node { if [ ! -z "$NODE" ]; then # Get full node hostname. NODE_HOSTNAME="`$SUDO cat /var/vservers/$NODE/etc/hostname`" if [ -z "$NODE_HOSTNAME" ]; then NODE_HOSTNAME="$NODE" fi # Sync local encrypted backup. echo "Syncing /var/vservers/$NODE/var/backups/duplicity/..." $SUDO mkdir -p /$MEDIA/$NODE_HOSTNAME/duplicity $SUDO $RSYNC /var/vservers/$NODE/var/backups/duplicity/ /$MEDIA/$NODE_HOSTNAME/duplicity/ # Sync remote backups. for node in `$SUDO ls /var/vservers/$NODE/var/backups/remote/`; do echo "Syncing /var/vservers/$NODE/var/backups/remote/$node/..." $SUDO mkdir -p /$MEDIA/$NODE_HOSTNAME/remote/$node $SUDO $RSYNC /var/vservers/$NODE/var/backups/remote/$node/ /$MEDIA/$NODE_HOSTNAME/remote/$node/ done else # Sync local encrypted backup. echo "Syncing /var/backups/duplicity/..." $SUDO mkdir -p /$MEDIA/$HOSTNAME/duplicity $SUDO $RSYNC /var/backups/duplicity/ /$MEDIA/$HOSTNAME/duplicity/ # Sync remote backups. for node in `$SUDO ls /var/backups/remote/`; do echo "Syncing /var/backups/remote/$node/..." $SUDO mkdir -p /$MEDIA/$HOSTNAME/remote/$node/ $SUDO $RSYNC /var/backups/remote/$node/ /$MEDIA/$HOSTNAME/remote/$node/ done # Copy encrypted images. if [ -d "$IMAGES" ]; then for image in `find $IMAGES -name '*.img' -type f`; do echo "Copying image to /$MEDIA/$HOSTNAME/images/`dirname $image`" $SUDO mkdir -p /$MEDIA/$HOSTNAME/images/`dirname $image` $SUDO $CP $image /$MEDIA/$HOSTNAME/images/`dirname $image` done fi fi } # Parsing if [ -z "$VOLUME" ]; then echo "usage: $BASENAME [nodes]" exit 1 #elif [ "$WHOAMI" != 'root' ]; then # echo "Please run this command as the root user" # exit 1 else shift fi # Set sudo config if [ "$WHOAMI" != 'root' ]; then SUDO="sudo" fi # Check volume name if [ "$VOLUME" == "`hostname -f`" ]; then echo "volume is the hostname, cannot sync to myself" exit 1 fi # Check if it is mounted if ! mount | grep -q $MEDIA; then echo "volume $MEDIA is not mounted" exit 1 fi # Detect if removable media is a system or a regular storage volume if [ -d "$MEDIA/var/backups/remote" ]; then MEDIA="$MEDIA/var/backups/remote" fi # Sync backups for each node. if [ ! -z "$*" ]; then for NODE in $*; do sync_backups_node done else sync_backups_node fi