Merge pull request #30 from mbaynton/remove-only

--destroy-only switch, --{pre,post} fixes
This commit is contained in:
Darik Horn
2014-10-13 20:39:40 -04:00
2 changed files with 62 additions and 20 deletions

View File

@ -64,14 +64,26 @@ Snapshot named filesystem and all descendants.
\fB\-v\fR, \fB\-\-verbose\fR \fB\-v\fR, \fB\-\-verbose\fR
Print info messages. Print info messages.
.TP .TP
\fB\-\-pre-snapshot\fR \fB\-\-pre-snapshot\fR=\fICOMMAND\fR
Command to run before snapshotting. It is passed the Command to run before each dataset is snapshotted.
filesystem and snapshot name. If it returns non-zero, It is passed the dataset and snapshot name. If it
snapshotting this filesystem is aborted. returns non-zero, snapshotting this dataset is
aborted.
.TP .TP
\fB\-\-post-snapshot\fR \fB\-\-post-snapshot\fR=\fICOMMAND\fR
Command to run after snapshotting. It is passed the Command to run after each dataset is snapshotted.
filesystem and snapshot name. It is passed the dataset and snapshot name.
.TP
\fB\-\-destroy-only\fR
Do not create new snapshots, but do destroy older
snapshots. Has no effect unless used with \fB\-k\fR.
.IP
A non-obvious use may be constructon of cron jobs or
scripts that run pre-snapshot command(s), then run
zfs-auto-snapshot (without \fB\-k\fR) to quickly
snapshot all datasets, then run post-snapshot
command(s) and clean up with zfs-auto-snapshot
\fB\-\-destroy-only\fR.
.TP .TP
name name
Filesystem and volume names, or '//' for all ZFS datasets. Filesystem and volume names, or '//' for all ZFS datasets.

View File

@ -41,6 +41,7 @@ opt_skip_scrub=''
opt_verbose='' opt_verbose=''
opt_pre_snapshot='' opt_pre_snapshot=''
opt_post_snapshot='' opt_post_snapshot=''
opt_do_snapshots=1
# Global summary statistics. # Global summary statistics.
DESTRUCTION_COUNT='0' DESTRUCTION_COUNT='0'
@ -71,6 +72,7 @@ print_usage ()
-g, --syslog Write messages into the system log. -g, --syslog Write messages into the system log.
-r, --recursive Snapshot named filesystem and all descendants. -r, --recursive Snapshot named filesystem and all descendants.
-v, --verbose Print info messages. -v, --verbose Print info messages.
--destroy-only Only destroy older snapshots, do not create new ones.
name Filesystem and volume names, or '//' for all ZFS datasets. name Filesystem and volume names, or '//' for all ZFS datasets.
" "
} }
@ -150,6 +152,7 @@ do_snapshots () # properties, flags, snapname, oldglob, [targets...]
local GLOB="$4" local GLOB="$4"
local TARGETS="$5" local TARGETS="$5"
local KEEP='' local KEEP=''
local RUNSNAP=1
# global DESTRUCTION_COUNT # global DESTRUCTION_COUNT
# global SNAPSHOT_COUNT # global SNAPSHOT_COUNT
@ -158,15 +161,21 @@ do_snapshots () # properties, flags, snapname, oldglob, [targets...]
for ii in $TARGETS for ii in $TARGETS
do do
do_run "$opt_pre_snapshot $ii $NAME" if [ -n "$opt_do_snapshots" ]
if [ $? -eq 0 ] && do_run "zfs snapshot $PROPS $FLAGS '$ii@$NAME'"
then then
do_run "$opt_post_snapshot $ii $NAME" if [ "$opt_pre_snapshot" != "" ]
then
do_run "$opt_pre_snapshot $ii $NAME" || RUNSNAP=0
fi
if [ $RUNSNAP -eq 1 ] && do_run "zfs snapshot $PROPS $FLAGS '$ii@$NAME'"
then
[ "$opt_post_snapshot" != "" ] && do_run "$opt_post_snapshot $ii $NAME"
SNAPSHOT_COUNT=$(( $SNAPSHOT_COUNT + 1 )) SNAPSHOT_COUNT=$(( $SNAPSHOT_COUNT + 1 ))
else else
WARNING_COUNT=$(( $WARNING_COUNT + 1 )) WARNING_COUNT=$(( $WARNING_COUNT + 1 ))
continue continue
fi fi
fi
# Retain at most $opt_keep number of old snapshots of this filesystem, # Retain at most $opt_keep number of old snapshots of this filesystem,
# including the one that was just recently created. # including the one that was just recently created.
@ -202,7 +211,7 @@ GETOPT=$(getopt \
--longoptions=default-exclude,dry-run,fast,skip-scrub,recursive \ --longoptions=default-exclude,dry-run,fast,skip-scrub,recursive \
--longoptions=event:,keep:,label:,prefix:,sep: \ --longoptions=event:,keep:,label:,prefix:,sep: \
--longoptions=debug,help,quiet,syslog,verbose \ --longoptions=debug,help,quiet,syslog,verbose \
--longoptions=pre-snapshot:,post-snapshot: \ --longoptions=pre-snapshot:,post-snapshot:,destroy-only \
--options=dnshe:l:k:p:rs:qgv \ --options=dnshe:l:k:p:rs:qgv \
-- "$@" ) \ -- "$@" ) \
|| exit 128 || exit 128
@ -321,6 +330,10 @@ do
opt_post_snapshot="$2" opt_post_snapshot="$2"
shift 2 shift 2
;; ;;
(--destroy-only)
opt_do_snapshots=''
shift 1
;;
(--) (--)
shift 1 shift 1
break break
@ -525,12 +538,29 @@ SNAPNAME="$opt_prefix${opt_label:+$opt_sep$opt_label}-$DATE"
# The expression for matching old snapshots. -YYYY-MM-DD-HHMM # The expression for matching old snapshots. -YYYY-MM-DD-HHMM
SNAPGLOB="$opt_prefix${opt_label:+?$opt_label}????????????????" SNAPGLOB="$opt_prefix${opt_label:+?$opt_label}????????????????"
test -n "$TARGETS_REGULAR" \ if [ -n "$opt_do_snapshots" ]
then
test -n "$TARGETS_REGULAR" \
&& print_log info "Doing regular snapshots of $TARGETS_REGULAR" && print_log info "Doing regular snapshots of $TARGETS_REGULAR"
test -n "$TARGETS_RECURSIVE" \ test -n "$TARGETS_RECURSIVE" \
&& print_log info "Doing recursive snapshots of $TARGETS_RECURSIVE" && print_log info "Doing recursive snapshots of $TARGETS_RECURSIVE"
if test -n "$opt_keep" && [ "$opt_keep" -ge "1" ]
then
print_log info "Destroying all but the newest $opt_keep snapshots of each dataset."
fi
elif test -n "$opt_keep" && [ "$opt_keep" -ge "1" ]
then
test -n "$TARGETS_REGULAR" \
&& print_log info "Destroying all but the newest $opt_keep snapshots of $TARGETS_REGULAR"
test -n "$TARGETS_RECURSIVE" \
&& print_log info "Recursively destroying all but the newest $opt_keep snapshots of $TARGETS_RECURSIVE"
else
print_log notice "Only destroying snapshots, but count of snapshots to preserve not given. Nothing to do."
fi
test -n "$opt_dry_run" \ test -n "$opt_dry_run" \
&& print_log info "Doing a dry run. Not running these commands..." && print_log info "Doing a dry run. Not running these commands..."