From acbf5daa431f534257c34b09ea3cb3c7635cea31 Mon Sep 17 00:00:00 2001 From: kennypm Date: Sat, 22 Feb 2025 12:05:59 -0500 Subject: [PATCH 1/2] custom name prefix without breaking getsnaps() custom datestamp format no name reordering yet as getsnaps() expects leading prefix and trailing snap type --- sanoid | 13 +++++++------ sanoid.defaults.conf | 5 +++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sanoid b/sanoid index c3242a1..244569f 100755 --- a/sanoid +++ b/sanoid @@ -16,6 +16,7 @@ use Getopt::Long qw(:config auto_version auto_help); use Pod::Usage; # pod2usage use Time::Local; # to parse dates in reverse use Capture::Tiny ':all'; +use POSIX 'strftime'; my %args = ( "configdir" => "/etc/sanoid", @@ -605,7 +606,8 @@ sub take_snapshots { my @snapshots; foreach my $type (@types) { - my $snapname = "autosnap_$datestamp{'sortable'}_$type"; + my $sortable = strftime($config{$dataset}{'datestamp_format'}, localtime($datestamp{'unix_time'})); + my $snapname = "$config{$dataset}{'prefix'}_${sortable}_$type"; push(@snapshots, $snapname); } @@ -892,7 +894,7 @@ sub getsnaps { # avoid pissing off use warnings if (defined $snapname) { my ($snaptype) = ($snapname =~ m/.*_(\w*ly)/); - if ($snapname =~ /^autosnap/) { + if ($snapname =~ /^$config{$fs}{'prefix'}/) { $snaps{$fs}{$snapname}{'ctime'}=$snapdate; $snaps{$fs}{$snapname}{'type'}=$snaptype; } @@ -1125,16 +1127,15 @@ sub init { sub get_date { my %datestamp; - ($datestamp{'sec'},$datestamp{'min'},$datestamp{'hour'},$datestamp{'mday'},$datestamp{'mon'},$datestamp{'year'},$datestamp{'wday'},$datestamp{'yday'},$datestamp{'isdst'}) = localtime(time); + $datestamp{'unix_time'} = time(); + ($datestamp{'sec'},$datestamp{'min'},$datestamp{'hour'},$datestamp{'mday'},$datestamp{'mon'},$datestamp{'year'},$datestamp{'wday'},$datestamp{'yday'},$datestamp{'isdst'}) = localtime($datestamp{'unix_time'}); + $datestamp{'year'} += 1900; - $datestamp{'unix_time'} = (((((((($datestamp{'year'} - 1971) * 365) + $datestamp{'yday'}) * 24) + $datestamp{'hour'}) * 60) + $datestamp{'min'}) * 60) + $datestamp{'sec'}; $datestamp{'sec'} = sprintf ("%02u", $datestamp{'sec'}); $datestamp{'min'} = sprintf ("%02u", $datestamp{'min'}); $datestamp{'hour'} = sprintf ("%02u", $datestamp{'hour'}); $datestamp{'mday'} = sprintf ("%02u", $datestamp{'mday'}); $datestamp{'mon'} = sprintf ("%02u", ($datestamp{'mon'} + 1)); - $datestamp{'noseconds'} = "$datestamp{'year'}-$datestamp{'mon'}-$datestamp{'mday'}_$datestamp{'hour'}:$datestamp{'min'}"; - $datestamp{'sortable'} = "$datestamp{'noseconds'}:$datestamp{'sec'}"; return %datestamp; } diff --git a/sanoid.defaults.conf b/sanoid.defaults.conf index 0e46699..706b0e0 100644 --- a/sanoid.defaults.conf +++ b/sanoid.defaults.conf @@ -113,3 +113,8 @@ yearly_crit = 0 # for overriding these values one needs to specify them in a root pool section! ([tank]\n ...) capacity_warn = 80 capacity_crit = 95 + +# snapshot name formats can be overridden to some extent +prefix = autosnap +# strftime-style format string +datestamp_format = %Y-%m-%d_%H:%M:%S From b50e55c17a4138f717c2b53adad774cdb2ca9586 Mon Sep 17 00:00:00 2001 From: kennypm Date: Sat, 22 Feb 2025 12:15:52 -0500 Subject: [PATCH 2/2] full flexibility for naming template --- sanoid | 12 ++++++++---- sanoid.defaults.conf | 5 +++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sanoid b/sanoid index 244569f..6d9fb0a 100755 --- a/sanoid +++ b/sanoid @@ -607,7 +607,10 @@ sub take_snapshots { foreach my $type (@types) { my $sortable = strftime($config{$dataset}{'datestamp_format'}, localtime($datestamp{'unix_time'})); - my $snapname = "$config{$dataset}{'prefix'}_${sortable}_$type"; + my $snapname = $config{$dataset}{'snapname_format'}; + $snapname =~ s/IDENTIFIER/$config{$dataset}{'identifier'}/g; + $snapname =~ s/DATE/$sortable/g; + $snapname =~ s/TYPE/$type/g; push(@snapshots, $snapname); } @@ -889,12 +892,13 @@ sub getsnaps { } foreach my $snap (@rawsnaps) { - my ($fs,$snapname,$snapdate) = ($snap =~ m/(.*)\@(.*ly)\t*creation\t*(\d*)/); + my ($fs,$snapname,$snapdate) = ($snap =~ m/(.*)\@(.*?)\t*creation\t*(\d*)/); # avoid pissing off use warnings if (defined $snapname) { - my ($snaptype) = ($snapname =~ m/.*_(\w*ly)/); - if ($snapname =~ /^$config{$fs}{'prefix'}/) { + if ($snapname =~ /$config{$fs}{'identifier'}/) { + my @types = qw(yearly monthly weekly daily hourly frequently); + my ($snaptype) = grep { $snapname =~ /$_/ } @types; $snaps{$fs}{$snapname}{'ctime'}=$snapdate; $snaps{$fs}{$snapname}{'type'}=$snaptype; } diff --git a/sanoid.defaults.conf b/sanoid.defaults.conf index 706b0e0..105a2e5 100644 --- a/sanoid.defaults.conf +++ b/sanoid.defaults.conf @@ -114,7 +114,8 @@ yearly_crit = 0 capacity_warn = 80 capacity_crit = 95 -# snapshot name formats can be overridden to some extent -prefix = autosnap +# snapshot name formats can be overridden +identifier = autosnap # strftime-style format string datestamp_format = %Y-%m-%d_%H:%M:%S +snapname_format = IDENTIFIER_DATE_TYPE