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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/zfs_mgmt.rb +56 -27
- data/lib/zfs_mgmt/restic.rb +1 -1
- data/lib/zfs_mgmt/version.rb +1 -1
- data/lib/zfs_mgmt/zfs_mgr/list.rb +1 -1
- data/lib/zfs_mgmt/zfs_mgr/send.rb +1 -24
- data/lib/zfs_mgmt/zfs_mgr/snapshot.rb +1 -3
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fac87cc44c07a79f517498916f2e542113eda412cee4696803bf333b31754b15
|
|
4
|
+
data.tar.gz: aedb919ad2cbab314a21b5a7fd4847cd96ef1f68607c839a274fa5fc62f2a7b6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fbdcedb2cb08b6babbde7a72002a1afdf7d4be1ab2584de266fdff300777dd0bcd54ad9e1b21883f58d19fe2d32f378d732e8255202ca994ac7d4c4273415bf8
|
|
7
|
+
data.tar.gz: 7284a85c909b18606f2efffd68aa329f72d7ed003c3ff8ac8a7accf271065e2aa72bedee53ca26f79a2d9262524519c71a6b5087ea5fbe9d09bd0ee67696adda
|
data/Gemfile.lock
CHANGED
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' =>
|
|
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
|
|
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 = [
|
|
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,
|
|
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
|
|
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
|
-
(
|
|
427
|
-
(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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'
|
|
549
|
-
'drop_holds'
|
|
550
|
-
'unmount'
|
|
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
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
data/lib/zfs_mgmt/restic.rb
CHANGED
|
@@ -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'])
|
data/lib/zfs_mgmt/version.rb
CHANGED
|
@@ -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,
|
|
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],
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|