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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bec0d396ad060e97b39fd9aacc9fa76948eef806038c50a94aa395db21197c6b
4
- data.tar.gz: cf6ad1d373e1c3d8bedb907e5a52f91b01e242012a13695a4732597a6b4af264
3
+ metadata.gz: 2e363218ad13dc15bae4ca2805c675482954cbd3724581998a2f9513de0f9e2a
4
+ data.tar.gz: 9f836dfb859155b57b6abfafcb9271a166841162ff46736cfab2e58c054354e9
5
5
  SHA512:
6
- metadata.gz: 40bb5e2819b78d8b1e5538c688fda22fe2be1d5146d94ede23656fbaaab9350ae16d695cd192c27d155e9e63ada3236d3381f3b1f2e62f919f75f9b3815195e4
7
- data.tar.gz: a30ac94f055fcc37a6ceab855e7a5c1a0d8d6418b47eaef11183b6fa644d4da72f02fdc5a9a83c389fd434f675d847fb83fb99f48f81756b54044ef53c5a5565
6
+ metadata.gz: 16218b552ae7d799207d8756dad08f2d013b438a8814f8850f15f8171c2bd9eeeb1b3c52c4a1d2b4d73b82d0f48cb0b217969ddfef91b0d20f331a1d6414cea1
7
+ data.tar.gz: 23c3b898ec59b05c06b1833faac058fa670d34217e6a43b973aaa20d69891e26c662d67a1658e17e3e67b3d5132f5dc959da5c4b3b158e31fa62990da23be4bc
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zfs_mgmt (0.2.4)
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
@@ -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 = ['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
@@ -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
- for i in 0..(deleteme.length - 1) do
260
- max = deleteme.length - 1 - i
261
- $logger.debug("attempting to remove snaps 0 through #{max} out of #{deleteme.length} snapshots")
262
- bigarg = "#{zfs}@#{deleteme[0..max].map { |s| s.split('@')[1] }.join(',')}"
263
- com = "#{com_base} #{bigarg}"
264
- $logger.debug("size of bigarg: #{bigarg.length} size of com: #{com.length}")
265
- if bigarg.length >= 131072 or com.length >= (2097152-10000)
266
- next
267
- end
268
- $logger.info(com)
269
- deleteme = deleteme - deleteme[0..max]
270
- system(com)
271
- break
272
- end
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
@@ -1,3 +1,3 @@
1
1
  module ZfsMgmt
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -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 << '/commits/'
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.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.4
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-03-02 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
@@ -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/commits/
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/commits/
135
- source_code_uri: https://github.com/aranc23/zfs_mgmt/commits/
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.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.