diff --git a/sanoid b/sanoid index 13ea085..e5cee02 100755 --- a/sanoid +++ b/sanoid @@ -319,6 +319,25 @@ sub prune_snapshots { if (checklock('sanoid_pruning')) { writelock('sanoid_pruning'); foreach my $snap( @prunesnaps ){ + my $dataset = (split '@', $snap)[0]; + my $snapname = (split '@', $snap)[1]; + + if (! $args{'readonly'} && $config{$dataset}{'pre_pruning_script'}) { + $ENV{'SANOID_TARGET'} = $dataset; + $ENV{'SANOID_SNAPNAME'} = $snapname; + if ($args{'verbose'}) { print "executing pre_pruning_script '".$config{$dataset}{'pre_pruning_script'}."' on dataset '$dataset'\n"; } + my $ret = runscript('pre_pruning_script', $dataset); + + delete $ENV{'SANOID_TARGET'}; + delete $ENV{'SANOID_SNAPNAME'}; + + if ($ret != 0) { + # warning was already thrown by runscript function + # skip pruning if pre snapshot script returns non zero exit code + next; + } + } + if ($args{'verbose'}) { print "INFO: pruning $snap ... \n"; } if (!$args{'force-prune'} && iszfsbusy($path)) { if ($args{'verbose'}) { print "INFO: deferring pruning of $snap - $path is currently in zfs send or receive.\n"; } @@ -326,8 +345,6 @@ sub prune_snapshots { if (! $args{'readonly'}) { if (system($zfs, "destroy", $snap) == 0) { $pruned{$snap} = 1; - my $dataset = (split '@', $snap)[0]; - my $snapname = (split '@', $snap)[1]; if ($config{$dataset}{'pruning_script'}) { $ENV{'SANOID_TARGET'} = $dataset; $ENV{'SANOID_SNAPNAME'} = $snapname; diff --git a/sanoid.conf b/sanoid.conf index 8504b93..c082bac 100644 --- a/sanoid.conf +++ b/sanoid.conf @@ -102,6 +102,8 @@ pre_snapshot_script = /path/to/script.sh ### run script after snapshot post_snapshot_script = /path/to/script.sh + ### run script before pruning snapshot + pre_pruning_script = /path/to/script.sh ### run script after pruning snapshot pruning_script = /path/to/script.sh ### don't take an inconsistent snapshot (skip if pre script fails) diff --git a/sanoid.defaults.conf b/sanoid.defaults.conf index 2eb6c55..0e46699 100644 --- a/sanoid.defaults.conf +++ b/sanoid.defaults.conf @@ -22,6 +22,7 @@ skip_children = # See "Sanoid script hooks" in README.md for information about scripts. pre_snapshot_script = post_snapshot_script = +pre_pruning_script = pruning_script = script_timeout = 5 no_inconsistent_snapshot =