zfs_mgmt 0.4.0 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|