#!/bin/bash set -e set -x # create a new ZFS filesystem for the target # look for all the rnspashots and sort by date # from oldest, rsync it into the ZFS and then snapshot it with a name that matches its old date and tag it matching old name if [ -z "$1" ] then echo usage: $0 fqdn [zpool] exit 1 fi which bc >/dev/null || ( echo "Could not find bc command"; exit 1 ) function ensurezpool() { if [ -n "$1" ] then echo $1 else ( for z in $(zpool list -H -oname) do zfs list -H -p -oavail,name $z done ) | sort -nr | head -1 | cut -f2 fi } function ensurelv() { LV=$(lvs -o lv_path --noheadings -S "lv_name=$1" | head -1 |sed 's/ *//') if [ -z "$LV" ] then echo Cannot find LV for $SN exit 2 fi echo $LV } function mount_lv() { mkdir -p /rsnapshots/$2 mount $LV /rsnapshots/$2 2>/dev/null || echo already mounted } function umount_lv() { HN=$1 make -f /usr/local/rsnapshots/Makefile ${HN}-umount || umount -l /rsnapshots/$HN } function ensure_zfs() { ZPOOL=$1 HN=$2 QUOTA=$3 ZFS=$(zfs list -H -d1 -oname | grep $HN) if [ -n "$ZFS" ] then >&2 echo ZFS $ZFS already exists, using that else ZFS=$ZPOOL/$HN zfs create $ZFS zfs create $ZFS/zfs-rsnap fi zfs set quota=$QUOTA $ZFS echo $ZFS } function get_quota() { SIZE=$(lvs --no-headings -osize --units=b $1 | sed 's/ *//' | sed 's/B$//') printf "%.0f\n" $(echo $SIZE*1.1 | bc) } function sync_backups() { HN=$1 ZFS=$2 TARGETDIR=$ZFS/zfs-rsnap SOURCEDIR=/rsnapshots/$HN for incremental in $(ls -tr $SOURCEDIR | grep -v 'lost+found') do TIME=$(stat -c "%Y" $SOURCEDIR/$incremental) if ! zfs list -t snapshot ${TARGETDIR}@${TIME} >/dev/null then rsync -aq --delete $SOURCEDIR/$incremental/ /$TARGETDIR TAG=$(echo $incremental | sed 's/\.[0-9]//') zfs snapshot ${TARGETDIR}@${TIME} zfs hold $TAG ${TARGETDIR}@${TIME} else echo Already synced ${TARGETDIR}@${TIME} fi done } ZPOOL=$(ensurezpool $2) HN=$1 SN=$(echo $HN | sed 's/\..*$//') LV=$(ensurelv $SN) QUOTA=$(get_quota $LV) mount_lv $LV $HN ZFS=$(ensure_zfs $ZPOOL $HN $QUOTA) sync_backups $HN $ZFS echo $HN $SN $ZPOOL $LV $ZFS $QUOTA umount_lv $HN if [ -f /etc/rsnapshot.conf.d/$HN ] then /usr/lib/chem-zfs-backup-server/new-backup-rsnapshot $HN mv /etc/rsnapshot.conf.d/$HN /etc/rsnapshot.conf.d/attic fi rmdir /rsnapshots/${HN}