zfs_mgmt 0.2.6 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5c67b730a6425cce0f548ebb67c1e17a8448ea12cdf276e54d4f182bb30a17e
4
- data.tar.gz: 4cbe541a5c8f12c57b0fbc5b3879d782debf596fb8afe85f0e702bda55d349e6
3
+ metadata.gz: 2d748c3781993440f81add0c6f609501457dfee0f66c39bd1ca6013534312608
4
+ data.tar.gz: 71349e6012f6ece929a66d0df3626c9adabff11cd520f10120639d7fb72a5380
5
5
  SHA512:
6
- metadata.gz: 66328802d68ac95c5ef12f9ed8a51705367adba6857a1f20fda7fc2237013d0abe76d7a2ef7d44e7056ddf72c30ce5922f4f5dd9df1757ce7eb80a9b34eb5a9e
7
- data.tar.gz: c6aa92723d903ea2d5192193350c8c41db116c307347308834895061e6eb7d2380e4501d663a2563c46d8869ebd60b832e49699f3dc38c57991818d07791a4a8
6
+ metadata.gz: e6de5cb8f68d59a336a4a295afa297a836007a457e944cd8bb80ade1aba8b9869144b7eddd71eeb9b536d85685050bd77c92cb5721ce2b49beffe9faf8ff6914
7
+ data.tar.gz: '02569c3d29effdc5be76672513ef6c2e338416b59dd7496025bd75a3f8fe751f57bfb27db56b136dd35879889cf9708000f760adaed61d9587f869b83c7e10cb'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zfs_mgmt (0.2.5)
4
+ zfs_mgmt (0.3.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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
@@ -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 = 'youngest'
121
- if props.has_key?('zfsmgmt:strategy') and props['zfsmgmt:strategy'] == 'oldest'
122
- strategy = 'oldest'
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
- if strategy == 'youngest'
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 an older snap")
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
@@ -179,6 +182,9 @@ module ZfsMgmt
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 = ['snap','creation','hourly','daily','weekly','monthly','yearly']
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
@@ -244,17 +250,21 @@ module ZfsMgmt
244
250
  (saved,saved_snaps,deleteme) = snapshot_destroy_policy(zfs,props,snaps)
245
251
 
246
252
  $logger.info("deleting #{deleteme.length} snapshots for #{zfs}")
253
+ deleteme.reverse! # oldest first for removal
254
+ deleteme.each do |snap_name|
255
+ $logger.debug("delete: #{snap_name} #{local_epoch_to_datetime(snaps[snap_name]['creation']).strftime('%F %T')}")
256
+ end
257
+
247
258
  com_base = "zfs destroy -p"
259
+ if deleteme.length > 0
260
+ com_base = "#{com_base}d"
261
+ end
248
262
  if noop
249
263
  com_base = "#{com_base}n"
250
264
  end
251
265
  if verbopt
252
266
  com_base = "#{com_base}v"
253
267
  end
254
- deleteme.reverse! # oldest first for removal
255
- deleteme.each do |snap_name|
256
- $logger.debug("delete: #{snap_name} #{local_epoch_to_datetime(snaps[snap_name]['creation']).strftime('%F %T')}")
257
- end
258
268
  while deleteme.length > 0
259
269
  for i in 0..(deleteme.length - 1) do
260
270
  max = deleteme.length - 1 - i
@@ -268,6 +278,9 @@ module ZfsMgmt
268
278
  $logger.info(com)
269
279
  deleteme = deleteme - deleteme[0..max]
270
280
  system(com)
281
+ if $?.exitstatus != 0
282
+ $logger.error("zfs exited with non-zero status: #{$?.exitstatus}")
283
+ end
271
284
  break
272
285
  end
273
286
  end
@@ -1,3 +1,3 @@
1
1
  module ZfsMgmt
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3.3"
3
3
  end
@@ -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.1"
43
- spec.add_development_dependency "text-table", "~> 1.2.4"
44
- spec.add_development_dependency "filesize", "~> 0.2.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"
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.2.6
4
+ version: 0.3.3
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-03-06 00:00:00.000000000 Z
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.1
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.1
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.4
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.4
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.0
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.0
96
+ version: '0.2'
97
97
  description:
98
98
  email:
99
99
  - arancox@gmail.com
@@ -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.0.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.