zfs_mgmt 0.4.0 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96ec8b7a9e8ba4111f9a8e5d58d347de8a62d00c3d5a681f427abcb21e3560a5
4
- data.tar.gz: 2b11bd3aaa99cc664a3a4308ad33e40a640db631c86490ebb2e571718aa5e5c5
3
+ metadata.gz: fac87cc44c07a79f517498916f2e542113eda412cee4696803bf333b31754b15
4
+ data.tar.gz: aedb919ad2cbab314a21b5a7fd4847cd96ef1f68607c839a274fa5fc62f2a7b6
5
5
  SHA512:
6
- metadata.gz: 0dd229c996513d93439e82e08cfeeefc712202c3af28e72df3256c0a58254f8c525c47e4b1457dc0c50a8d3f3a871cebe9e3c5d9a34974c03adec921e8ed870c
7
- data.tar.gz: 1a659593c4efa623cb41a8d1586e5d3f34516f960527a1829635b26baad33fcfe8a988585d0be78749692b4b5d6c05cb23dbc4c30be160de8a1c303ed975c13c
6
+ metadata.gz: fbdcedb2cb08b6babbde7a72002a1afdf7d4be1ab2584de266fdff300777dd0bcd54ad9e1b21883f58d19fe2d32f378d732e8255202ca994ac7d4c4273415bf8
7
+ data.tar.gz: 7284a85c909b18606f2efffd68aa329f72d7ed003c3ff8ac8a7accf271065e2aa72bedee53ca26f79a2d9262524519c71a6b5087ea5fbe9d09bd0ee67696adda
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zfs_mgmt (0.4.0)
4
+ zfs_mgmt (0.4.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/lib/zfs_mgmt.rb CHANGED
@@ -238,7 +238,7 @@ module ZfsMgmt
238
238
  }
239
239
  return saved,saved_snaps,deleteme
240
240
  end
241
- def self.zfs_managed_list(filter: '.+', properties: ['all'], property_match: { 'zfsmgmt:manage' => 'true' } )
241
+ def self.zfs_managed_list(filter: '.+', properties: ['all'], property_match: { 'zfsmgmt:manage' => method(:prop_on?) } )
242
242
  zfss = [] # array of arrays
243
243
  zfsget(properties: properties).each do |zfs,props|
244
244
  unless /#{filter}/ =~ zfs
@@ -246,7 +246,7 @@ module ZfsMgmt
246
246
  end
247
247
  managed = true
248
248
  property_match.each do |k,v|
249
- unless props.has_key?(k) and props[k] == v
249
+ unless key_comp?(props,k,v)
250
250
  managed = false
251
251
  break
252
252
  end
@@ -311,7 +311,7 @@ module ZfsMgmt
311
311
  $logger.debug("delete: #{snap_name} #{local_epoch_to_datetime(snaps[snap_name]['creation']).strftime('%F %T')}")
312
312
  end
313
313
 
314
- com_base = ['zfs', 'destroy']
314
+ com_base = [ZfsMgmt.global_options[:zfs_binary], 'destroy']
315
315
  com_base.push('-d') if deleteme.length > 0 # why?
316
316
  com_base.push('-n') if noop
317
317
  com_base.push('-v') if verbose
@@ -349,11 +349,11 @@ module ZfsMgmt
349
349
  res
350
350
  end
351
351
  # snapshot all filesystems configured for snapshotting
352
- def self.snapshot_create(noop: false, verbose: false, filter: '.+')
352
+ def self.snapshot_create(noop: false, filter: '.+')
353
353
  dt = DateTime.now
354
354
  zfsget.select { |zfs,props|
355
355
  # must match filter
356
- match_filter?(zfs: zfs, filter: filter) and
356
+ match_filter?(zfs, filter) and
357
357
  # snapshot must be on or true
358
358
  (
359
359
  key_comp?(props,'zfsmgmt:snapshot') or
@@ -367,7 +367,6 @@ module ZfsMgmt
367
367
  if key_comp?(props,'zfsmgmt:snapshot','recursive') and key_comp?(props,'zfsmgmt:snapshot@source',['local','received'])
368
368
  com.push('-r')
369
369
  end
370
- com.push('-v') if verbose
371
370
  com.push("#{zfs}@#{[prefix,dt.strftime(ts)].join('-')}")
372
371
  system_com(com,noop)
373
372
  end
@@ -423,8 +422,8 @@ module ZfsMgmt
423
422
  com = []
424
423
  source = sorted[0]
425
424
  if options[:initial_snapshot] == 'newest' or
426
- ( options.has_key?('replicate') and options['replicate'] == true ) or
427
- ( props.has_key?('zfsmgmt:send_replicate') and props['zfsmgmt:send_replicate'] == 'true' )
425
+ key_comp?(options, 'replicate') or
426
+ key_comp?(props, 'zfsmgmt:send_replcate')
428
427
  source = sorted[-1]
429
428
  end
430
429
  com += zfs_send_com(options,
@@ -446,7 +445,7 @@ module ZfsMgmt
446
445
  # should be resumable!
447
446
  com = [ ]
448
447
  com.push( ZfsMgmt.global_options[:zfs_binary], 'send', '-t', remote_zfs_state )
449
- com.push('-v','-P') if options[:verbose] and options[:verbose] == 'send'
448
+ com.push('-v','-P') if key_comp?(options, 'verbose', 'send')
450
449
  com.push('|')
451
450
  e = zfs_send_estimate(com) if options[:verbose] == 'pv'
452
451
  com += mbuffer_command(options) if options[:mbuffer]
@@ -499,7 +498,15 @@ module ZfsMgmt
499
498
  if snaps.has_key?(rsnap.sub(destination_path,zfs))
500
499
  $logger.debug("process #{rsnap} to #{sorted[-1]}")
501
500
  com = []
502
- com += zfs_send_com(options,props,[(options[:intermediary] ? '-I' : '-i'),dq(rsnap.split('@')[1])],sorted[-1])
501
+ i_opt = '-i'
502
+ # allow the command line option for intermediary to override the property
503
+ if key_comp?(options,'intermediary',[true,false])
504
+ i_opt = '-I' if key_comp?(options, 'intermediary', true)
505
+ elsif key_comp?(props, 'zfsmgmt:send_intermediary')
506
+ i_opt = '-I'
507
+ end
508
+
509
+ com += zfs_send_com(options,props,[i_opt, dq('@' + rsnap.split('@')[1])], sorted[-1])
503
510
  e = zfs_send_estimate(com) if options[:verbose] == 'pv'
504
511
  com += mbuffer_command(options) if options[:mbuffer]
505
512
  com += pv_command(options,e) if options[:verbose] == 'pv'
@@ -522,7 +529,7 @@ module ZfsMgmt
522
529
  end
523
530
  def self.zfs_send_com(options,props,extra_opts,target)
524
531
  zfs_send_com = [ ZfsMgmt.global_options[:zfs_binary], 'send' ]
525
- zfs_send_com.push('-v','-P') if options[:verbose] and options[:verbose] == 'send'
532
+ zfs_send_com.push('-v','-P') if key_comp?(options,'verbose','send')
526
533
  send_opts = {
527
534
  'backup' => '-b',
528
535
  'compressed' => '-c',
@@ -534,10 +541,11 @@ module ZfsMgmt
534
541
  'replicate' => '-R',
535
542
  }
536
543
  send_opts.each do |p,o|
537
- if options.has_key?(p)
538
- zfs_send_com.push(o) if options[p] == true
539
- elsif props.has_key?("zfsmgmt:send_#{p}")
540
- zfs_send_com.push(o) if props["zfsmgmt:send_#{p}"] == 'true'
544
+ # allow the command line options to override the properties value
545
+ if key_comp?(options,p,[true,false])
546
+ zfs_send_com.push(o) if key_comp?(options,p,true)
547
+ elsif key_comp?(props,"zfsmgmt:send_#{p}")
548
+ zfs_send_com.push(o)
541
549
  end
542
550
  end
543
551
  zfs_send_com + extra_opts + [dq(target),'|']
@@ -545,18 +553,21 @@ module ZfsMgmt
545
553
  def self.zfs_recv_com(options,extra_opts,props,target)
546
554
  zfs_recv_com = [ ZfsMgmt.global_options[:zfs_binary], 'recv', '-F', '-s' ]
547
555
  recv_opts = {
548
- 'noop' => '-n',
549
- 'drop_holds' => '-h',
550
- 'unmount' => '-u',
556
+ 'noop' => '-n',
557
+ 'drop_holds' => '-h',
558
+ 'unmount' => '-u',
559
+ #'discard_last' => '-e',
560
+ #'discard_first' => '-d',
551
561
  }
552
562
  recv_opts.each do |p,o|
553
- if options.has_key?(p)
554
- zfs_recv_com.push(o) if options[p] == true
555
- elsif props.has_key?("zfsmgmt:recv_#{p}")
556
- zfs_recv_com.push(o) if props["zfsmgmt:recv_#{p}"] == 'true'
563
+ # allow the command line options to override the properties value
564
+ if key_comp?(options,p,[true,false])
565
+ zfs_recv_com.push(o) if key_comp?(options,p,true)
566
+ elsif key_comp?(props,"zfsmgmt:recv_#{p}")
567
+ zfs_recv_com.push(o)
557
568
  end
558
569
  end
559
- zfs_recv_com.push('-v') if options[:verbose] and ( options[:verbose] == 'receive' or options[:verbose] == 'recv' )
570
+ zfs_recv_com.push('-v') if key_comp?(options, 'verbose', ['receive', 'recv'])
560
571
  if options[:exclude]
561
572
  options[:exclude].each do |x|
562
573
  zfs_recv_com.push('-x',x)
@@ -619,7 +630,7 @@ module ZfsMgmt
619
630
  def self.prop_on?(v)
620
631
  ['true','on'].include?(v)
621
632
  end
622
- def self.match_filter?(zfs:, filter:)
633
+ def self.match_filter?(zfs, filter)
623
634
  /#{filter}/ =~ zfs
624
635
  end
625
636
  def self.key_comp?(h,p,v = method(:prop_on?))
@@ -629,14 +640,13 @@ module ZfsMgmt
629
640
  return v.include?(h[p])
630
641
  elsif v.kind_of?(Hash)
631
642
  return v.keys.include?(h[p])
632
- elsif v.kind_of?(String)
633
- return h[p] == v
634
643
  elsif v.kind_of?(Method)
635
644
  return v.call(h[p])
636
645
  elsif v.kind_of?(Regexp)
637
646
  return v =~ h[p]
638
647
  else
639
- raise ArgumentError
648
+ # string, boolean, numbers?
649
+ return h[p] == v
640
650
  end
641
651
  end
642
652
  def self.set_log_level(sev)
@@ -653,4 +663,23 @@ module ZfsMgmt
653
663
  $logger.level = Logger::FATAL
654
664
  end
655
665
  end
666
+ def self.zfs_send_all(options)
667
+ zfs_managed_list(filter: options[:filter],
668
+ property_match: { 'zfsmgmt:send' => method(:prop_on?) }).each do |zfs,props,snaps|
669
+
670
+ if props['zfsmgmt:send@source'] == 'received'
671
+ $logger.debug("skipping received filesystem: #{zfs}")
672
+ next
673
+ end
674
+ if key_comp?(props,'zfsmgmt:send_replicate') and props['zfsmgmt:send_replicate@source'] != 'local'
675
+ $logger.debug("skipping descendant of replicated filesystems: #{zfs}")
676
+ next
677
+ end
678
+ unless props['zfsmgmt:destination']
679
+ $logger.error("#{zfs}: you must specify a destination zfs path via the user property zfsmgmt:destination, even if using --destination on the command line, skipping")
680
+ next
681
+ end
682
+ zfs_send(options,zfs,props,snaps)
683
+ end
684
+ end
656
685
  end
@@ -70,7 +70,7 @@ module ZfsMgmt::Restic
70
70
  'zfsmgmt:restic_repository',
71
71
  'userrefs',
72
72
  ],
73
- property_match: { 'zfsmgmt:restic_backup' => 'true' }).each do |blob|
73
+ property_match: { 'zfsmgmt:restic_backup' => ['on','true'] }).each do |blob|
74
74
  zfs,props,zfs_snapshots = blob
75
75
  last_zfs_snapshot = zfs_snapshots.keys.sort { |a,b| zfs_snapshots[a]['creation'] <=> zfs_snapshots[b]['creation'] }.last
76
76
  zfs_snap_time = Time.at(zfs_snapshots[last_zfs_snapshot]['creation'])
@@ -1,3 +1,3 @@
1
1
  module ZfsMgmt
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.5"
3
3
  end
@@ -13,7 +13,7 @@ class ZfsMgmt::ZfsMgr::List < Thor
13
13
  table = Text::Table.new
14
14
  table.head = ['zfs','snapshot','age']
15
15
  table.rows = []
16
- ZfsMgmt.zfs_managed_list(filter: options[:filter]).each do |zfs,props,snap|
16
+ ZfsMgmt.zfs_managed_list(filter: options[:filter]).each do |zfs,props,snaps|
17
17
  last = snaps.keys.sort { |a,b| snaps[a]['creation'] <=> snaps[b]['creation'] }.last
18
18
  snap_time = Time.at(snaps[last]['creation'])
19
19
  if snap_time < cutoff
@@ -35,29 +35,6 @@ class ZfsMgmt::ZfsMgr::Send < Thor
35
35
  ZfsMgmt.set_log_level(options[:loglevel])
36
36
  ZfsMgmt.global_options = options
37
37
 
38
- [
39
- { 'zfsmgmt:send' => 'true' },
40
- # {
41
- # 'zfsmgmt:send' => 'replicate',
42
- # 'zfsmgmt:send@source' => 'local'
43
- # },
44
- ].each do |match|
45
- ZfsMgmt.zfs_managed_list(filter: options[:filter],
46
- property_match: match).each do |zfs,props,snaps|
47
- if props['zfsmgmt:send@source'] == 'received'
48
- $logger.debug("skipping received filesystem: #{zfs}")
49
- next
50
- end
51
- if props.has_key?('zfsmgmt:send_replicate') and props['zfsmgmt:send_replicate'] == 'true' and props['zfsmgmt:send_replicate@source'] != 'local'
52
- $logger.debug("skipping descendant of replicated filesystems: #{zfs}")
53
- next
54
- end
55
- unless props['zfsmgmt:destination']
56
- $logger.error("#{zfs}: you must specify a destination zfs path via the user property zfsmgmt:destination, even if using --destination on the command line, skipping")
57
- next
58
- end
59
- ZfsMgmt.zfs_send(options,zfs,props,snaps)
60
- end
61
- end
38
+ ZfsMgmt.zfs_send_all(options)
62
39
  end
63
40
  end
@@ -22,11 +22,9 @@ class ZfsMgmt::ZfsMgr::Snapshot < Thor
22
22
  desc "create", "execute zfs snapshot based on zfs properties"
23
23
  method_option :noop, :type => :boolean, :default => false,
24
24
  :desc => 'log snapshot commands without running zfs snapshot'
25
- method_option :verbose, :type => :boolean, :default => false,
26
- :desc => 'pass -v option to zfs commands'
27
25
  def create()
28
26
  ZfsMgmt.set_log_level(options[:loglevel])
29
27
  ZfsMgmt.global_options = options
30
- ZfsMgmt.snapshot_create(noop: options[:noop], verbose: options[:verbose], filter: options[:filter])
28
+ ZfsMgmt.snapshot_create(noop: options[:noop], filter: options[:filter])
31
29
  end
32
30
  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.0
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aran Cox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-11 00:00:00.000000000 Z
11
+ date: 2021-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
157
  requirements: []
158
- rubygems_version: 3.1.2
158
+ rubygems_version: 3.1.4
159
159
  signing_key:
160
160
  specification_version: 4
161
161
  summary: Misc. helpers regarding snapshots and send/recv.