zfs_mgmt 0.2.4 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +12 -0
- data/lib/zfs_mgmt.rb +38 -26
- data/lib/zfs_mgmt/version.rb +1 -1
- data/zfs_mgmt.gemspec +4 -4
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e363218ad13dc15bae4ca2805c675482954cbd3724581998a2f9513de0f9e2a
|
4
|
+
data.tar.gz: 9f836dfb859155b57b6abfafcb9271a166841162ff46736cfab2e58c054354e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16218b552ae7d799207d8756dad08f2d013b438a8814f8850f15f8171c2bd9eeeb1b3c52c4a1d2b4d73b82d0f48cb0b217969ddfef91b0d20f331a1d6414cea1
|
7
|
+
data.tar.gz: 23c3b898ec59b05c06b1833faac058fa670d34217e6a43b973aaa20d69891e26c662d67a1658e17e3e67b3d5132f5dc959da5c4b3b158e31fa62990da23be4bc
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -165,6 +165,18 @@ to match the specified policy for the zfs, nor will they be deleted.
|
|
165
165
|
The intended use is match zfs send/recv snapshots or hand-created
|
166
166
|
snapshots, etc. ie: ^syncoid_
|
167
167
|
|
168
|
+
### zfsmgmt:prefersnaps
|
169
|
+
Prefer snapshots matching this regexp pattern. The oldest/youngest
|
170
|
+
snapshot matching this pattern will be used depending on strategy, but
|
171
|
+
if no snapshots are found matching this pattern use any snapshot as
|
172
|
+
constrained by the matchsnaps and ignoresnaps options (if set.)
|
173
|
+
|
174
|
+
### zfsmgmt:strategy (default: oldest)
|
175
|
+
Save the oldest snapshot fitting a given time frame as specificed by
|
176
|
+
the policy, unless this value is set to "youngest" in which case use
|
177
|
+
the most recent snapshot for any given time frame. The default is
|
178
|
+
oldest and unless the property is set to youngest oldest will be used.
|
179
|
+
|
168
180
|
### zfsmgmt:snapshot
|
169
181
|
If this property is 'true' then create a snapshot in the format of
|
170
182
|
zfsmgmt-%FT%T%z. If this property is 'recursive' then create a
|
data/lib/zfs_mgmt.rb
CHANGED
@@ -44,6 +44,7 @@ module ZfsMgmt
|
|
44
44
|
'minage',
|
45
45
|
'matchsnaps',
|
46
46
|
'ignoresnaps',
|
47
|
+
'prefersnaps',
|
47
48
|
'snapshot',
|
48
49
|
'snap_prefix',
|
49
50
|
'snap_timestamp',
|
@@ -117,13 +118,11 @@ module ZfsMgmt
|
|
117
118
|
if props.has_key?('zfsmgmt:minage')
|
118
119
|
minage = timespec_to_seconds(props['zfsmgmt:minage'])
|
119
120
|
end
|
120
|
-
strategy = '
|
121
|
-
if props.has_key?('zfsmgmt:strategy') and props['zfsmgmt:strategy'] == '
|
122
|
-
strategy = '
|
121
|
+
strategy = 'oldest'
|
122
|
+
if props.has_key?('zfsmgmt:strategy') and props['zfsmgmt:strategy'] == 'youngest'
|
123
|
+
strategy = 'youngest'
|
123
124
|
end
|
124
125
|
sorted = snaps.keys.sort { |a,b| snaps[b]['creation'] <=> snaps[a]['creation'] }
|
125
|
-
# never consider the latest snapshot for anything
|
126
|
-
newest_snapshot_name = sorted.shift
|
127
126
|
|
128
127
|
counters = policy_parser(props['zfsmgmt:policy'])
|
129
128
|
$logger.debug(counters)
|
@@ -147,12 +146,16 @@ module ZfsMgmt
|
|
147
146
|
$date_patterns.each do |d,p|
|
148
147
|
pat = snaptime.strftime(p)
|
149
148
|
if saved[d].has_key?(pat)
|
150
|
-
|
149
|
+
#pp props['zfsmgmt:prefersnaps'],snap_name.split('@')[1], saved[d][pat].split('@')[1]
|
150
|
+
if props.has_key?('zfsmgmt:prefersnaps') and /#{props['zfsmgmt:prefersnaps']}/ !~ saved[d][pat].split('@')[1] and /#{props['zfsmgmt:prefersnaps']}/ =~ snap_name.split('@')[1]
|
151
|
+
$logger.debug("updating the saved snapshot, we prefer this one: \"#{pat}\" to #{snap_name} at #{snaptime}")
|
152
|
+
saved[d][pat] = snap_name
|
153
|
+
elsif strategy == 'oldest' and ( not props.has_key?('zfsmgmt:prefersnaps') or /#{props['zfsmgmt:prefersnaps']}/ =~ snap_name.split('@')[1] )
|
151
154
|
# update the existing current save snapshot for this timeframe
|
152
155
|
$logger.debug("updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}")
|
153
156
|
saved[d][pat] = snap_name
|
154
157
|
else
|
155
|
-
$logger.debug("not updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}, we have
|
158
|
+
$logger.debug("not updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}, we have a younger snap")
|
156
159
|
end
|
157
160
|
elsif counters[d] > 0
|
158
161
|
# new pattern, and we want to save more snaps of this type
|
@@ -173,12 +176,15 @@ module ZfsMgmt
|
|
173
176
|
# delete everything not in the list of saved snapshots
|
174
177
|
deleteme = sorted - saved_snaps
|
175
178
|
deleteme = deleteme.select { |snap|
|
176
|
-
if props.has_key?('zfsmgmt:ignoresnaps') and /#{props['zfsmgmt:ignoresnaps']}/ =~ snap
|
179
|
+
if props.has_key?('zfsmgmt:ignoresnaps') and /#{props['zfsmgmt:ignoresnaps']}/ =~ snap.split('@')[1]
|
177
180
|
$logger.debug("skipping #{snap} because it matches ignoresnaps pattern: #{props['zfsmgmt:ignoresnaps']}")
|
178
181
|
false
|
179
182
|
elsif minage > 0 and Time.at(snaps[snap]['creation'] + minage) > Time.now()
|
180
183
|
$logger.debug("skipping due to minage: #{snap} #{local_epoch_to_datetime(snaps[snap]['creation']).strftime('%F %T')}")
|
181
184
|
false
|
185
|
+
elsif snap == sorted[0] # the very newest snap
|
186
|
+
$logger.debug("skipping due to newest: #{snap} #{local_epoch_to_datetime(snaps[snap]['creation']).strftime('%F %T')}")
|
187
|
+
false
|
182
188
|
else
|
183
189
|
true
|
184
190
|
end
|
@@ -224,10 +230,10 @@ module ZfsMgmt
|
|
224
230
|
end
|
225
231
|
# print a table of saved snapshots with the reasons it is being saved
|
226
232
|
table = Text::Table.new
|
227
|
-
table.head = [
|
233
|
+
table.head = [zfs,'creation','hourly','daily','weekly','monthly','yearly']
|
228
234
|
table.rows = []
|
229
235
|
saved_snaps.sort { |a,b| snaps[b]['creation'] <=> snaps[a]['creation'] }.each do |snap|
|
230
|
-
table.rows << [snap,local_epoch_to_datetime(snaps[snap]['creation'])] + find_saved_reason(saved,snap)
|
236
|
+
table.rows << [snap.split('@')[1],local_epoch_to_datetime(snaps[snap]['creation'])] + find_saved_reason(saved,snap)
|
231
237
|
end
|
232
238
|
print table.to_s
|
233
239
|
end
|
@@ -245,6 +251,9 @@ module ZfsMgmt
|
|
245
251
|
|
246
252
|
$logger.info("deleting #{deleteme.length} snapshots for #{zfs}")
|
247
253
|
com_base = "zfs destroy -p"
|
254
|
+
if deleteme.length > 0
|
255
|
+
com_base = "#{com_base}d"
|
256
|
+
end
|
248
257
|
if noop
|
249
258
|
com_base = "#{com_base}n"
|
250
259
|
end
|
@@ -254,23 +263,26 @@ module ZfsMgmt
|
|
254
263
|
deleteme.reverse! # oldest first for removal
|
255
264
|
deleteme.each do |snap_name|
|
256
265
|
$logger.debug("delete: #{snap_name} #{local_epoch_to_datetime(snaps[snap_name]['creation']).strftime('%F %T')}")
|
266
|
+
com = "#{com_base} #{snap_name}"
|
267
|
+
$logger.info(com)
|
268
|
+
system(com)
|
257
269
|
end
|
258
|
-
while deleteme.length > 0
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
end
|
270
|
+
# while deleteme.length > 0
|
271
|
+
# for i in 0..(deleteme.length - 1) do
|
272
|
+
# max = deleteme.length - 1 - i
|
273
|
+
# $logger.debug("attempting to remove snaps 0 through #{max} out of #{deleteme.length} snapshots")
|
274
|
+
# bigarg = "#{zfs}@#{deleteme[0..max].map { |s| s.split('@')[1] }.join(',')}"
|
275
|
+
# com = "#{com_base} #{bigarg}"
|
276
|
+
# $logger.debug("size of bigarg: #{bigarg.length} size of com: #{com.length}")
|
277
|
+
# if bigarg.length >= 131072 or com.length >= (2097152-10000)
|
278
|
+
# next
|
279
|
+
# end
|
280
|
+
# $logger.info(com)
|
281
|
+
# deleteme = deleteme - deleteme[0..max]
|
282
|
+
# system(com)
|
283
|
+
# break
|
284
|
+
# end
|
285
|
+
# end
|
274
286
|
end
|
275
287
|
end
|
276
288
|
# parse a policy string into a hash of integers
|
data/lib/zfs_mgmt/version.rb
CHANGED
data/zfs_mgmt.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.metadata["homepage_uri"] = spec.homepage
|
23
23
|
spec.metadata["source_code_uri"] = spec.homepage
|
24
|
-
spec.metadata["changelog_uri"] = spec.homepage
|
24
|
+
spec.metadata["changelog_uri"] = "#{spec.homepage}/commits/"
|
25
25
|
else
|
26
26
|
raise "RubyGems 2.0 or newer is required to protect against " \
|
27
27
|
"public gem pushes."
|
@@ -39,8 +39,8 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_development_dependency "bundler", "~> 1.16"
|
40
40
|
spec.add_development_dependency "rake", ">= 12.3.3"
|
41
41
|
spec.add_development_dependency "rspec", "~> 3.0"
|
42
|
-
spec.add_development_dependency "thor", "~> 1.0
|
43
|
-
spec.add_development_dependency "text-table", "~> 1.2
|
44
|
-
spec.add_development_dependency "filesize", "~> 0.2
|
42
|
+
spec.add_development_dependency "thor", "~> 1.0"
|
43
|
+
spec.add_development_dependency "text-table", "~> 1.2"
|
44
|
+
spec.add_development_dependency "filesize", "~> 0.2"
|
45
45
|
|
46
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zfs_mgmt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aran Cox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,42 +58,42 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0
|
61
|
+
version: '1.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.0
|
68
|
+
version: '1.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: text-table
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.2
|
75
|
+
version: '1.2'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.2
|
82
|
+
version: '1.2'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: filesize
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.2
|
89
|
+
version: '0.2'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.2
|
96
|
+
version: '0.2'
|
97
97
|
description:
|
98
98
|
email:
|
99
99
|
- arancox@gmail.com
|
@@ -127,12 +127,12 @@ files:
|
|
127
127
|
- lib/zfs_mgmt.rb
|
128
128
|
- lib/zfs_mgmt/version.rb
|
129
129
|
- zfs_mgmt.gemspec
|
130
|
-
homepage: https://github.com/aranc23/zfs_mgmt
|
130
|
+
homepage: https://github.com/aranc23/zfs_mgmt
|
131
131
|
licenses:
|
132
132
|
- GPL-3.0-or-later
|
133
133
|
metadata:
|
134
|
-
homepage_uri: https://github.com/aranc23/zfs_mgmt
|
135
|
-
source_code_uri: https://github.com/aranc23/zfs_mgmt
|
134
|
+
homepage_uri: https://github.com/aranc23/zfs_mgmt
|
135
|
+
source_code_uri: https://github.com/aranc23/zfs_mgmt
|
136
136
|
changelog_uri: https://github.com/aranc23/zfs_mgmt/commits/
|
137
137
|
post_install_message:
|
138
138
|
rdoc_options: []
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
- !ruby/object:Gem::Version
|
150
150
|
version: '0'
|
151
151
|
requirements: []
|
152
|
-
rubygems_version: 3.
|
152
|
+
rubygems_version: 3.1.2
|
153
153
|
signing_key:
|
154
154
|
specification_version: 4
|
155
155
|
summary: Misc. helpers regarding snapshots and send/recv.
|