From 44f7cae115e5e16d593d771bb6997dffb66f1212 Mon Sep 17 00:00:00 2001 From: Christoph Klaffl Date: Thu, 13 Feb 2020 01:01:09 +0100 Subject: [PATCH] implemented pre pruning script hook --- sanoid | 21 +++++++++++++++++++-- sanoid.conf | 2 ++ sanoid.defaults.conf | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/sanoid b/sanoid index c280d46..f9dfe33 100755 --- a/sanoid +++ b/sanoid @@ -316,6 +316,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"; } @@ -323,8 +342,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 6bd5c62..6d982bc 100644 --- a/sanoid.conf +++ b/sanoid.conf @@ -97,6 +97,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 a9ca382..d65601c 100644 --- a/sanoid.defaults.conf +++ b/sanoid.defaults.conf @@ -21,6 +21,7 @@ skip_children = pre_snapshot_script = post_snapshot_script = +pre_pruning_script = pruning_script = script_timeout = 5 no_inconsistent_snapshot =