dsnap-sync: update btrfs type handling

* adapt dry-run output
* differenciate handling for btrfs-snapshot, btrfs-clone and btrfs-archive

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
This commit is contained in:
2018-07-22 14:03:31 +02:00
parent 9b39792fb9
commit b910ca6086

View File

@@ -946,8 +946,25 @@ run_config_preparation () {
# get latest successfully finished snapshot # get latest successfully finished snapshot
# verify source # verify source
# WIP: metadata from last snapshot!
case $snapper_config_type in
btrfs-snapshot)
get_snapper_last_sync_id "snapper_config=${selected_config}" "snapper_description=${snap_description_synced}" \ get_snapper_last_sync_id "snapper_config=${selected_config}" "snapper_description=${snap_description_synced}" \
"snapper_uuid=${selected_uuid}" "snapper_subvolid=${selected_subvol}" "remote=" "snapper_uuid=${selected_uuid}" "snapper_subvolid=${selected_subvol}" "remote="
;;
btrfs-clone)
if [ $verbose -ge 2 ]; then
printf "{RED}TODO:{NO_COLOR} config_type '%s'?\n" "$snapper_config_type"
fi
get_snapper_last_sync_id "snapper_config=${selected_config}" "snapper_description=${snap_description_synced}" \
"snapper_uuid=" "snapper_subvolid=" "remote="
;;
*)
if [ $verbose -ge 2 ]; then
printf "{RED}TODO:{NO_COLOR} what is needed for config_type '%s'?\n" "$snapper_config_type"
fi
;;
esac
snapper_source_sync_id=$snapper_sync_id snapper_source_sync_id=$snapper_sync_id
if [ $snapper_sync_id -eq 0 ]; then if [ $snapper_sync_id -eq 0 ]; then
@@ -989,6 +1006,8 @@ run_config_preparation () {
fi fi
fi fi
backup_root=$selected_target/$backupdir/$snapper_target_config
#snapper_target_sync_id=$snapper_source_sync_id
else else
# get backupdir from snapper target # get backupdir from snapper target
get_snapper_target_backupdir $backupdir get_snapper_target_backupdir $backupdir
@@ -1079,13 +1098,21 @@ run_backup () {
snapper_source_sync_id=$(eval echo \$snapper_source_sync_id_$i) snapper_source_sync_id=$(eval echo \$snapper_source_sync_id_$i)
snapper_source_sync_snapshot=$(eval echo \$snapper_source_sync_snapshot_$i) snapper_source_sync_snapshot=$(eval echo \$snapper_source_sync_snapshot_$i)
snapper_target_sync_id=$(eval echo \$snapper_target_sync_id_$i) snapper_target_sync_id=$(eval echo \$snapper_target_sync_id_$i)
backup_dir=$(eval echo \$backup_dir_$i) backup_dir=$(eval echo \$backupdir_$i)
backup_root=$(eval echo \$backup_root_$i) backup_root=$(eval echo \$backup_root_$i)
case $snapper_config_type in case $snapper_config_type in
btrfs-snapshot|btrfs-clone) btrfs-snapshot)
create_snapshot create_snapshot
;; ;;
btrfs-clone)
if [ $verbose -ge 2 ]; then
printf "{RED}TODO:{NO_COLOR} config_type '%s'?\n" "$snapper_config_type"
fi
snapper_source_id=$snapper_source_sync_id
snapper_source_snapshot=$SUBVOLUME/.snapshots/$snapper_source_sync_id/snapshot
snapper_source_info=$SUBVOLUME/.snapshots/$snapper_source_sync_id/info.xml
;;
*) *)
if [ $verbose -ge 2 ]; then if [ $verbose -ge 2 ]; then
printf "{RED}TODO:{NO_COLOR} what is needed for config_type '%s'?\n" "$snapper_config_type" printf "{RED}TODO:{NO_COLOR} what is needed for config_type '%s'?\n" "$snapper_config_type"
@@ -1123,14 +1150,14 @@ run_backup () {
cmd_pv='' cmd_pv=''
fi fi
cmd="btrfs send $verbose_flag $snapper_source_snapshot 2>$BTRFS_PIPE | $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>$BTRFS_PIPE"
if [ ! "$dryrun" ]; then
if [ "$snapper_source_sync_id" -eq 0 ] || [ "$snapper_target_sync_id" -eq 0 ]; then if [ "$snapper_source_sync_id" -eq 0 ] || [ "$snapper_target_sync_id" -eq 0 ]; then
# target never received any snapshot before # target never received any snapshot before
cmd="btrfs send $verbose_flag $snapper_source_snapshot 2>$BTRFS_PIPE | $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>$BTRFS_PIPE"
if [ $verbose -ge 1 ]; then if [ $verbose -ge 1 ]; then
printf "${MAGENTA}Sending ${GREEN}first snapshot${NO_COLOR} for snapper config ${GREEN}'%s' ${MAGENTA}(id='%s', size='%s')${NO_COLOR} ...\n" \ printf "${MAGENTA}Sending ${GREEN}first snapshot${NO_COLOR} for snapper config ${GREEN}'%s' ${MAGENTA}(id='%s', size='%s')${NO_COLOR} ...\n" \
"$selected_config" "$snapper_source_id" "$snapper_source_snapshot_size" "$selected_config" "$snapper_source_id" "$snapper_source_snapshot_size"
fi fi
if [ ! "$dryrun" ]; then
# the actual data sync to the target # the actual data sync to the target
# this may take a while, depending on datasize and line-speed # this may take a while, depending on datasize and line-speed
if [ $verbose -ge 2 ]; then if [ $verbose -ge 2 ]; then
@@ -1141,9 +1168,6 @@ run_backup () {
printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)" printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)"
die "btrfs pipe error." die "btrfs pipe error."
fi fi
else
printf "dryrun: %s\n" "$cmd"
fi
else else
# source holds synced snapshots # source holds synced snapshots
if [ $verbose -ge 1 ]; then if [ $verbose -ge 1 ]; then
@@ -1164,13 +1188,14 @@ run_backup () {
if [ $snapper_target_sync_id -ne $snapper_source_sync_id ]; then if [ $snapper_target_sync_id -ne $snapper_source_sync_id ]; then
if [ $snapper_target_sync_id -lt $snapper_source_sync_id ]; then if [ $snapper_target_sync_id -lt $snapper_source_sync_id ]; then
# select commen sync id # select commen sync id
ret=get_snapper_sync_id "snapper_config=${snapper_source_config}" "snapper_sync_id=$snapper_target_sync_id" "remote=" ret=$(eval get_snapper_sync_id "snapper_config=${snapper_source_config}" "snapper_sync_id=$snapper_target_sync_id" "remote=")
if [ $ret ]; then if [ $ret ]; then
snapper_source_sync_snapshot=$SUBVOLUME/.snapshots/$snapper_sync_id/snapshot snapper_source_sync_snapshot=$SUBVOLUME/.snapshots/$snapper_sync_id/snapshot
else else
printf "no commen sync id.\n" printf "no commen sync id.\n"
fi fi
fi fi
fi fi
cmd="$ssh stat --format %i $backup_root/$snapper_snapshots/$snapper_source_sync_id 2>/dev/null" cmd="$ssh stat --format %i $backup_root/$snapper_snapshots/$snapper_source_sync_id 2>/dev/null"
@@ -1182,7 +1207,6 @@ run_backup () {
# location where it can get its data. This helps speed up the transfer. # location where it can get its data. This helps speed up the transfer.
cmd="btrfs send $verbose_flag -c $snapper_source_sync_snapshot $snapper_source_snapshot 2>$BTRFS_PIPE \ cmd="btrfs send $verbose_flag -c $snapper_source_sync_snapshot $snapper_source_snapshot 2>$BTRFS_PIPE \
| $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>$BTRFS_PIPE" | $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>$BTRFS_PIPE"
if [ ! "$dryrun" ]; then
if [ $verbose -ge 2 ]; then if [ $verbose -ge 2 ]; then
printf "${GREEN}btrfs send${NO_COLOR} is using snapshot ${GREEN}'%s'${NO_COLOR} from ${GREEN}target${NO_COLOR} to sync metadata for new snapshot ${GREEN}'%s'${NO_COLOR} ...\n" \ printf "${GREEN}btrfs send${NO_COLOR} is using snapshot ${GREEN}'%s'${NO_COLOR} from ${GREEN}target${NO_COLOR} to sync metadata for new snapshot ${GREEN}'%s'${NO_COLOR} ...\n" \
"$snapper_source_sync_snapshot" "$snapper_source_snapshot" "$snapper_source_sync_snapshot" "$snapper_source_snapshot"
@@ -1193,15 +1217,10 @@ run_backup () {
printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)" printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)"
die "btrfs pipe error." die "btrfs pipe error."
fi fi
else
printf "dryrun: '%s'" "$cmd"
printf "dryrun: snapper --config %s delete %s\n" "$selected_config" "$snapper_source_sync_id"
fi
else else
# need to use source snapshot to provide metadata for target # need to use source snapshot to provide metadata for target
cmd="btrfs send $verbose_flag -p $snapper_source_sync_snapshot $snapper_source_snapshot 2>$BTRFS_PIPE \ cmd="btrfs send $verbose_flag -p $snapper_source_sync_snapshot $snapper_source_snapshot 2>$BTRFS_PIPE \
| $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>BTRFS_PIPE" | $cmd_pv $ssh btrfs receive $verbose_flag $snapper_target_snapshot 2>BTRFS_PIPE"
if [ ! "$dryrun" ]; then
if [ $verbose -ge 2 ]; then if [ $verbose -ge 2 ]; then
printf "${GREEN}btrfs send${NO_COLOR} is using snapshot ${GREEN}'%s'${NO_COLOR} from ${GREEN}source${NO_COLOR} to sync metadata ...\n" \ printf "${GREEN}btrfs send${NO_COLOR} is using snapshot ${GREEN}'%s'${NO_COLOR} from ${GREEN}source${NO_COLOR} to sync metadata ...\n" \
"$snapper_source_sync_snapshot" "$snapper_source_sync_snapshot"
@@ -1212,35 +1231,28 @@ run_backup () {
printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)" printf "${RED}BTRFS_PIPE: %s${NO_COLOR}\n" "$(eval cat $BTRFS_PIPE)"
die "btrfs pipe error." die "btrfs pipe error."
fi fi
fi
fi
else else
printf "dryrun: '%s'" "$cmd" printf "dryrun: Would run btrfs send / btrfs receive pipe\n"
fi #printf "dryrun: '%s'\n" "$cmd"
fi
fi fi
# finally: send the snapper info metadata # finally: send the snapper info metadata
if [ ! $dryrun ]; then
if [ -z "$remote" ]; then if [ -z "$remote" ]; then
if [ ! "$dryrun" ]; then cmd="cp $snapper_source_info $snapper_target_snapshot"
cp "$snapper_source_info" "$snapper_target_snapshot" cp "$snapper_source_info" "$snapper_target_snapshot"
else else
cmd="cp $snapper_source_info $snapper_target_snapshot"
printf "dryrun: %s\n" "$cmd"
fi
else
if [ ! "$dryrun" ]; then
if [ -n "$port" ]; then if [ -n "$port" ]; then
rsync -avzq -e "ssh -p $port" "$snapper_source_info" "$remote:$snapper_target_snapshot" rsync -avzq -e "ssh -p $port" "$snapper_source_info" "$remote:$snapper_target_snapshot"
else else
rsync -avzq "$snapper_source_info" "$remote":"$snapper_target_snapshot" rsync -avzq "$snapper_source_info" "$remote":"$snapper_target_snapshot"
fi fi
else
if [ -n "$port" ]; then
cmd="rsync -avzq -e \"ssh -p $port\" $snapper_source_info $remote:$snapper_target_snapshot"
else
cmd="rsync -avzq $snapper_source_info $remote:$snapper_target_snapshot"
fi
printf "dryrun: %s\n" "$cmd"
fi fi
else
printf "dryrun: Would copy info metadate '%s' to target.\n" \
"$snapper_source_info"
fi fi
# Save config specific values in pseudo Array # Save config specific values in pseudo Array
@@ -1308,6 +1320,7 @@ run_finalize () {
snapper_source_config=$(eval echo \$snapper_source_config_$i) snapper_source_config=$(eval echo \$snapper_source_config_$i)
backupdir=$(eval echo \$backupdir_$i) backupdir=$(eval echo \$backupdir_$i)
backup_root=$(eval echo \$backup_root_$i) backup_root=$(eval echo \$backup_root_$i)
snapper_config_type=$(eval echo \$snapper_config_type_$i)
snapper_source_sync_id=$(eval echo \$snapper_source_sync_id_$i) snapper_source_sync_id=$(eval echo \$snapper_source_sync_id_$i)
snapper_target_sync_id=$(eval echo \$snapper_target_sync_id_$i) snapper_target_sync_id=$(eval echo \$snapper_target_sync_id_$i)
snapper_source_sync_snapshot=$(eval echo \$snapper_source_sync_snapshot_$i) snapper_source_sync_snapshot=$(eval echo \$snapper_source_sync_snapshot_$i)
@@ -1355,9 +1368,22 @@ run_finalize () {
fi fi
# construct snapper match command # construct snapper match command
case $snapper_config_type in
btrfs-archive)
# archive btrfs-snapshot to non btrfs-filesystem on target (e.g tape, ext4)
return 0
;;
btrfs-clone)
# no tagging needed
return 0
;;
btrfs-snapshot)
# create btrfs-snapshot on target
cmd="$ssh snapper --verbose --config \"$snapper_target_config\" list --type single \ cmd="$ssh snapper --verbose --config \"$snapper_target_config\" list --type single \
| awk ' /'\"$snap_description_running\"'/ ' \ | awk ' /'\"$snap_description_running\"'/ ' \
| awk -F '|' ' \$1 == $snapper_target_sync_id {print \$1} ' " | awk -F '|' ' \$1 == $snapper_target_sync_id {print \$1} ' "
;;
esac
while [ "$ii" -le "$ii_max" ]; do while [ "$ii" -le "$ii_max" ]; do
if [ $verbose -ge 2 ]; then if [ $verbose -ge 2 ]; then
@@ -1937,8 +1963,16 @@ verify_snapper_structure () {
printf "${MAGENTA}Create new BTRFS subvolume ${GREEN}'%s'${NO_COLOR} using template ${GREEN}'%s'${NO_COLOR}\n" \ printf "${MAGENTA}Create new BTRFS subvolume ${GREEN}'%s'${NO_COLOR} using template ${GREEN}'%s'${NO_COLOR}\n" \
$snapper_config $snapper_subvolume_template $snapper_config $snapper_subvolume_template
fi fi
$(eval $cmd) || die "Creation of snapper capable config %s on %s failed.\n" \ $(eval $cmd)
if [ $? -ne 0 ]; then
if [ $remote ]; then
die "Creation of snapper capable config %s on %s failed.\n" \
"$backup_root" "$remote_host" "$backup_root" "$remote_host"
else
die "Creation of snapper capable config %s failed.\n" \
"$backup_root"
fi
fi
else else
# WIP: # WIP:
# snapper_config exist, now verify if SUBVOLUME needs to be updated # snapper_config exist, now verify if SUBVOLUME needs to be updated