Skip to content

Commit

Permalink
Merge pull request #30 from mbaynton/remove-only
Browse files Browse the repository at this point in the history
--destroy-only switch, --{pre,post} fixes
  • Loading branch information
dajhorn committed Oct 14, 2014
2 parents 0be4466 + bfe4c91 commit a0df1eb
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 21 deletions.
28 changes: 20 additions & 8 deletions src/zfs-auto-snapshot.8
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,26 @@ Snapshot named filesystem and all descendants.
\fB\-v\fR, \fB\-\-verbose\fR
Print info messages.
.TP
\fB\-\-pre-snapshot\fR
Command to run before snapshotting. It is passed the
filesystem and snapshot name. If it returns non-zero,
snapshotting this filesystem is aborted.
.TP
\fB\-\-post-snapshot\fR
Command to run after snapshotting. It is passed the
filesystem and snapshot name.
\fB\-\-pre-snapshot\fR=\fICOMMAND\fR
Command to run before each dataset is snapshotted.
It is passed the dataset and snapshot name. If it
returns non-zero, snapshotting this dataset is
aborted.
.TP
\fB\-\-post-snapshot\fR=\fICOMMAND\fR
Command to run after each dataset is snapshotted.
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
name
Filesystem and volume names, or '//' for all ZFS datasets.
Expand Down
56 changes: 43 additions & 13 deletions src/zfs-auto-snapshot.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ opt_skip_scrub=''
opt_verbose=''
opt_pre_snapshot=''
opt_post_snapshot=''
opt_do_snapshots=1

# Global summary statistics.
DESTRUCTION_COUNT='0'
Expand Down Expand Up @@ -71,6 +72,7 @@ print_usage ()
-g, --syslog Write messages into the system log.
-r, --recursive Snapshot named filesystem and all descendants.
-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.
"
}
Expand Down Expand Up @@ -150,6 +152,7 @@ do_snapshots () # properties, flags, snapname, oldglob, [targets...]
local GLOB="$4"
local TARGETS="$5"
local KEEP=''
local RUNSNAP=1

# global DESTRUCTION_COUNT
# global SNAPSHOT_COUNT
Expand All @@ -158,15 +161,21 @@ do_snapshots () # properties, flags, snapname, oldglob, [targets...]

for ii in $TARGETS
do
do_run "$opt_pre_snapshot $ii $NAME"
if [ $? -eq 0 ] && do_run "zfs snapshot $PROPS $FLAGS '$ii@$NAME'"
if [ -n "$opt_do_snapshots" ]
then
do_run "$opt_post_snapshot $ii $NAME"
SNAPSHOT_COUNT=$(( $SNAPSHOT_COUNT + 1 ))
else
WARNING_COUNT=$(( $WARNING_COUNT + 1 ))
continue
fi
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 ))
else
WARNING_COUNT=$(( $WARNING_COUNT + 1 ))
continue
fi
fi

# Retain at most $opt_keep number of old snapshots of this filesystem,
# including the one that was just recently created.
Expand Down Expand Up @@ -202,7 +211,7 @@ GETOPT=$(getopt \
--longoptions=default-exclude,dry-run,fast,skip-scrub,recursive \
--longoptions=event:,keep:,label:,prefix:,sep: \
--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 \
-- "$@" ) \
|| exit 128
Expand Down Expand Up @@ -321,6 +330,10 @@ do
opt_post_snapshot="$2"
shift 2
;;
(--destroy-only)
opt_do_snapshots=''
shift 1
;;
(--)
shift 1
break
Expand Down Expand Up @@ -525,11 +538,28 @@ SNAPNAME="$opt_prefix${opt_label:+$opt_sep$opt_label}-$DATE"
# The expression for matching old snapshots. -YYYY-MM-DD-HHMM
SNAPGLOB="$opt_prefix${opt_label:+?$opt_label}????????????????"

test -n "$TARGETS_REGULAR" \
&& print_log info "Doing regular snapshots of $TARGETS_REGULAR"
if [ -n "$opt_do_snapshots" ]
then
test -n "$TARGETS_REGULAR" \
&& print_log info "Doing regular snapshots of $TARGETS_REGULAR"

test -n "$TARGETS_RECURSIVE" \
&& print_log info "Doing recursive snapshots of $TARGETS_RECURSIVE"
test -n "$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" \
&& print_log info "Doing a dry run. Not running these commands..."
Expand Down

0 comments on commit a0df1eb

Please sign in to comment.