zfs_mgmt 0.4.3 → 0.4.6

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: 14fbd30f0a3d93dff6442c011b7a613b9639fd5855a9efd635b3b9b14fa336c7
4
- data.tar.gz: 826699e0d0bca72bf87a779a87b14b9bcc01dffe34596eff471264b07b683d62
3
+ metadata.gz: 1022834076fa1482f627f9c5b7f8a476dd3e83d3358495d40f6695b23e842a88
4
+ data.tar.gz: ddc4f5f6e87c00f5cb0c0adbe2b4ddc47f78670c520b701d359b471b19c081c4
5
5
  SHA512:
6
- metadata.gz: fbe275a0b964b664d08346def641abff1c63467e70edb47b60accbd519a3e2df0bf81f2e000f09b28c7cf4db2cd71aa67580c8b570ffc5171835f818b3783d3c
7
- data.tar.gz: 4b326c73524719f3e103781532228d40fe09f0ebada718701d444d6296dfa5e310e2bd2a4035ad8cb6b08791ff5c8ddf7d0a1ecb6102d305957af853683ba356
6
+ metadata.gz: 06eab68af755becb316e438c5e027e78166952c7a37dc1c32343193f140e0a12463784b6a42ada068c0a90571641a11c7971143349d0dff6cc1a2581f34cbe9b
7
+ data.tar.gz: 9fa676ecf9837096a5e97649f01dfa398610898019f4abd0694fee241e75733767193898e26e618516c23cbf394dcdf1bdb8d9c4639a70a77d49db5b34c2ede4
data/Gemfile.lock CHANGED
@@ -1,36 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zfs_mgmt (0.4.3)
4
+ zfs_mgmt (0.4.6)
5
+ filesize (~> 0.2)
6
+ text-table (~> 1.2)
7
+ thor (~> 1.0)
5
8
 
6
9
  GEM
7
10
  remote: https://rubygems.org/
8
11
  specs:
9
- diff-lcs (1.3)
12
+ diff-lcs (1.5.0)
10
13
  filesize (0.2.0)
11
- json (2.3.0)
12
- rake (13.0.1)
13
- rspec (3.9.0)
14
- rspec-core (~> 3.9.0)
15
- rspec-expectations (~> 3.9.0)
16
- rspec-mocks (~> 3.9.0)
17
- rspec-core (3.9.1)
18
- rspec-support (~> 3.9.1)
19
- rspec-expectations (3.9.0)
14
+ json (2.6.2)
15
+ rake (13.0.6)
16
+ rspec (3.11.0)
17
+ rspec-core (~> 3.11.0)
18
+ rspec-expectations (~> 3.11.0)
19
+ rspec-mocks (~> 3.11.0)
20
+ rspec-core (3.11.0)
21
+ rspec-support (~> 3.11.0)
22
+ rspec-expectations (3.11.0)
20
23
  diff-lcs (>= 1.2.0, < 2.0)
21
- rspec-support (~> 3.9.0)
22
- rspec-mocks (3.9.1)
24
+ rspec-support (~> 3.11.0)
25
+ rspec-mocks (3.11.1)
23
26
  diff-lcs (>= 1.2.0, < 2.0)
24
- rspec-support (~> 3.9.0)
25
- rspec-support (3.9.2)
27
+ rspec-support (~> 3.11.0)
28
+ rspec-support (3.11.0)
26
29
  text-table (1.2.4)
27
- thor (1.0.1)
30
+ thor (1.2.1)
28
31
 
29
32
  PLATFORMS
30
- ruby
33
+ x86_64-linux
31
34
 
32
35
  DEPENDENCIES
33
- bundler (~> 1.16)
36
+ bundler (>= 2.2.33)
34
37
  filesize
35
38
  json
36
39
  rake (>= 12.3.3)
@@ -40,4 +43,4 @@ DEPENDENCIES
40
43
  zfs_mgmt!
41
44
 
42
45
  BUNDLED WITH
43
- 1.16.6
46
+ 2.3.21
data/bin/zfsmgr CHANGED
@@ -17,7 +17,7 @@ class ZfsMgr < Thor
17
17
  :enum => ['debug','error','fatal','info','warn'],
18
18
  :desc => 'set logging level to specified severity'
19
19
  desc "zfsget [ZFS]", "execute zfs get for the given properties and types and parse the output into a nested hash"
20
- method_option :properties, :type => :array, :default => ['name'], :desc => "List of properties passed to zfs get"
20
+ method_option :properties, :type => :string, :default => ['name'], :desc => "List of properties passed to zfs get", repeatable: true
21
21
  method_option :types, :type => :array, :default => ['filesystem','volume'], enum: ['filesystem','volume','snapshot'], :desc => "list of types"
22
22
  def zfsget(zfs)
23
23
  ZfsMgmt.set_log_level(options[:loglevel])
@@ -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.3"
2
+ VERSION = "0.4.6"
3
3
  end
@@ -25,8 +25,8 @@ class ZfsMgmt::ZfsMgr::Send < Thor
25
25
 
26
26
  method_option :noop, :aliases => :'-n', :desc => "pass -n (noop) option to zfs send", :type => :boolean
27
27
  method_option :unmount, :aliases => :'-u', :desc => "pass -u (unmount) option to zfs receive", :type => :boolean
28
- method_option :exclude, :aliases => :'-x', :desc => "passed to -x option of receive side", :type => :array
29
- method_option :option, :aliases => :'-o', :desc => "passed to -o option of receive side", :type => :array
28
+ method_option :exclude, :aliases => :'-x', :desc => "passed to -x option of receive side", :type => :string, repeatable: true
29
+ method_option :option, :aliases => :'-o', :desc => "passed to -o option of receive side", :type => :string, repeatable: true
30
30
  method_option :drop_holds, :desc => "pass the -h option to zfs recv, indicating holds should be ignored", :type => :boolean
31
31
 
32
32
  method_option :mbuffer, :desc => "insert mbuffer between send and recv", :default => true, :type => :boolean
@@ -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
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
@@ -422,8 +422,8 @@ module ZfsMgmt
422
422
  com = []
423
423
  source = sorted[0]
424
424
  if options[:initial_snapshot] == 'newest' or
425
- ( options.has_key?('replicate') and options['replicate'] == true ) or
426
- ( props.has_key?('zfsmgmt:send_replicate') and props['zfsmgmt:send_replicate'] == 'true' )
425
+ key_comp?(options, 'replicate') or
426
+ key_comp?(props, 'zfsmgmt:send_replicate')
427
427
  source = sorted[-1]
428
428
  end
429
429
  com += zfs_send_com(options,
@@ -445,7 +445,7 @@ module ZfsMgmt
445
445
  # should be resumable!
446
446
  com = [ ]
447
447
  com.push( ZfsMgmt.global_options[:zfs_binary], 'send', '-t', remote_zfs_state )
448
- com.push('-v','-P') if options[:verbose] and options[:verbose] == 'send'
448
+ com.push('-v','-P') if key_comp?(options, 'verbose', 'send')
449
449
  com.push('|')
450
450
  e = zfs_send_estimate(com) if options[:verbose] == 'pv'
451
451
  com += mbuffer_command(options) if options[:mbuffer]
@@ -498,7 +498,15 @@ module ZfsMgmt
498
498
  if snaps.has_key?(rsnap.sub(destination_path,zfs))
499
499
  $logger.debug("process #{rsnap} to #{sorted[-1]}")
500
500
  com = []
501
- 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])
502
510
  e = zfs_send_estimate(com) if options[:verbose] == 'pv'
503
511
  com += mbuffer_command(options) if options[:mbuffer]
504
512
  com += pv_command(options,e) if options[:verbose] == 'pv'
@@ -521,7 +529,7 @@ module ZfsMgmt
521
529
  end
522
530
  def self.zfs_send_com(options,props,extra_opts,target)
523
531
  zfs_send_com = [ ZfsMgmt.global_options[:zfs_binary], 'send' ]
524
- 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')
525
533
  send_opts = {
526
534
  'backup' => '-b',
527
535
  'compressed' => '-c',
@@ -533,10 +541,11 @@ module ZfsMgmt
533
541
  'replicate' => '-R',
534
542
  }
535
543
  send_opts.each do |p,o|
536
- if options.has_key?(p)
537
- zfs_send_com.push(o) if options[p] == true
538
- elsif props.has_key?("zfsmgmt:send_#{p}")
539
- 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)
540
549
  end
541
550
  end
542
551
  zfs_send_com + extra_opts + [dq(target),'|']
@@ -544,18 +553,21 @@ module ZfsMgmt
544
553
  def self.zfs_recv_com(options,extra_opts,props,target)
545
554
  zfs_recv_com = [ ZfsMgmt.global_options[:zfs_binary], 'recv', '-F', '-s' ]
546
555
  recv_opts = {
547
- 'noop' => '-n',
548
- 'drop_holds' => '-h',
549
- 'unmount' => '-u',
556
+ 'noop' => '-n',
557
+ 'drop_holds' => '-h',
558
+ 'unmount' => '-u',
559
+ #'discard_last' => '-e',
560
+ #'discard_first' => '-d',
550
561
  }
551
562
  recv_opts.each do |p,o|
552
- if options.has_key?(p)
553
- zfs_recv_com.push(o) if options[p] == true
554
- elsif props.has_key?("zfsmgmt:recv_#{p}")
555
- 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)
556
568
  end
557
569
  end
558
- 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'])
559
571
  if options[:exclude]
560
572
  options[:exclude].each do |x|
561
573
  zfs_recv_com.push('-x',x)
@@ -628,14 +640,13 @@ module ZfsMgmt
628
640
  return v.include?(h[p])
629
641
  elsif v.kind_of?(Hash)
630
642
  return v.keys.include?(h[p])
631
- elsif v.kind_of?(String)
632
- return h[p] == v
633
643
  elsif v.kind_of?(Method)
634
644
  return v.call(h[p])
635
645
  elsif v.kind_of?(Regexp)
636
646
  return v =~ h[p]
637
647
  else
638
- raise ArgumentError
648
+ # string, boolean, numbers?
649
+ return h[p] == v
639
650
  end
640
651
  end
641
652
  def self.set_log_level(sev)
@@ -652,4 +663,23 @@ module ZfsMgmt
652
663
  $logger.level = Logger::FATAL
653
664
  end
654
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
655
685
  end
data/zfs_mgmt.gemspec CHANGED
@@ -36,11 +36,11 @@ Gem::Specification.new do |spec|
36
36
  spec.executables = ['readsnaps','zfssendman','zfssnapman','zfsrecvman','zfs-list-snapshots','zfsmgr']
37
37
  spec.require_paths = ["lib"]
38
38
 
39
- spec.add_development_dependency "bundler", "~> 1.16"
39
+ spec.add_development_dependency "bundler", ">= 2.2.33"
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_runtime_dependency "thor", "~> 1.0"
43
+ spec.add_runtime_dependency "text-table", "~> 1.2"
44
+ spec.add_runtime_dependency "filesize", "~> 0.2"
45
45
 
46
46
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zfs_mgmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aran Cox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-11 00:00:00.000000000 Z
11
+ date: 2022-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: 2.2.33
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: 2.2.33
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,7 +59,7 @@ dependencies:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.0'
62
- type: :development
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
@@ -73,7 +73,7 @@ dependencies:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.2'
76
- type: :development
76
+ type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
@@ -87,14 +87,14 @@ dependencies:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0.2'
90
- type: :development
90
+ type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.2'
97
- description:
97
+ description:
98
98
  email:
99
99
  - arancox@gmail.com
100
100
  executables:
@@ -140,7 +140,7 @@ metadata:
140
140
  homepage_uri: https://github.com/aranc23/zfs_mgmt
141
141
  source_code_uri: https://github.com/aranc23/zfs_mgmt
142
142
  changelog_uri: https://github.com/aranc23/zfs_mgmt/commits/
143
- post_install_message:
143
+ post_install_message:
144
144
  rdoc_options: []
145
145
  require_paths:
146
146
  - lib
@@ -155,8 +155,8 @@ 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
159
- signing_key:
158
+ rubygems_version: 3.3.7
159
+ signing_key:
160
160
  specification_version: 4
161
161
  summary: Misc. helpers regarding snapshots and send/recv.
162
162
  test_files: []