snapsync 0.1.3 → 0.1.4
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/lib/snapsync/auto_sync.rb +30 -1
- data/lib/snapsync/cli.rb +85 -8
- data/lib/snapsync/partitions_monitor.rb +22 -0
- data/lib/snapsync/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5da01c8d37c1e84fd79ba60d9264727e5a2823b
|
4
|
+
data.tar.gz: 7f6aa1843176471539fb080f2f151ab3d6d33375
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c934f77289b0ba709ee164c5bc21cb67cf5afd1cc6f7a4c7463fbcd5a3938aab1c30b5740ae7921d010ba8c8eb4d31b3b158f93a3b63241578ca410971fde90f
|
7
|
+
data.tar.gz: 44060ce27c293a7ac4ceda651beeaec24a53ee7411438377d4907d489bd53cd139b4bdaf6792174e9d76e09e8cd9bb133e67625914167b1111d6b734d6b94ea1
|
data/lib/snapsync/auto_sync.rb
CHANGED
@@ -5,7 +5,7 @@ module Snapsync
|
|
5
5
|
# partition availability, and will run sync-all on each (declared) targets
|
6
6
|
# when they are available, optionally auto-mounting them
|
7
7
|
class AutoSync
|
8
|
-
AutoSyncTarget = Struct.new :partition_uuid, :path, :automount
|
8
|
+
AutoSyncTarget = Struct.new :partition_uuid, :path, :automount, :name
|
9
9
|
|
10
10
|
attr_reader :config_dir
|
11
11
|
attr_reader :targets
|
@@ -26,16 +26,45 @@ module Snapsync
|
|
26
26
|
conf.each do |hash|
|
27
27
|
target = AutoSyncTarget.new
|
28
28
|
hash.each { |k, v| target[k] = v }
|
29
|
+
target.path = Pathname.new(target.path)
|
29
30
|
add(target)
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
34
|
+
def write_config(path)
|
35
|
+
data = each_target.map do |target|
|
36
|
+
Hash['partition_uuid' => target.partition_uuid,
|
37
|
+
'path' => target.path.to_s,
|
38
|
+
'automount' => !!target.automount,
|
39
|
+
'name' => target.name]
|
40
|
+
end
|
41
|
+
File.open(path, 'w') do |io|
|
42
|
+
YAML.dump(data, io)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def each_target
|
47
|
+
return enum_for(__method__) if !block_given?
|
48
|
+
targets.each_value do |targets|
|
49
|
+
targets.each { |t| yield(t) }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
33
53
|
def add(target)
|
34
54
|
targets[target.partition_uuid] ||= Array.new
|
35
55
|
targets[target.partition_uuid] << target
|
36
56
|
partitions.monitor_for(target.partition_uuid)
|
37
57
|
end
|
38
58
|
|
59
|
+
def remove(**matcher)
|
60
|
+
targets.delete_if do |uuid, list|
|
61
|
+
list.delete_if do |t|
|
62
|
+
matcher.all? { |k, v| t[k] == v }
|
63
|
+
end
|
64
|
+
list.empty?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
39
68
|
def run(period: 60)
|
40
69
|
while true
|
41
70
|
partitions.poll
|
data/lib/snapsync/cli.rb
CHANGED
@@ -57,19 +57,96 @@ module Snapsync
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
desc 'init DIR', 'creates a synchronization target
|
61
|
-
|
60
|
+
desc 'init NAME DIR [POLICY]', 'creates a synchronization target, optionally specifying the synchronization and cleanup policy'
|
61
|
+
long_desc <<-EOD
|
62
|
+
By default, the default policy is used. To change this, provide additional
|
63
|
+
arguments as would be expected by the policy subcommand. Run snapsync help
|
64
|
+
policy for more information
|
65
|
+
EOD
|
66
|
+
option :all, type: :boolean, default: true,
|
67
|
+
desc: "if true (the default), create one snapsync target per snapper configuration under DIR, otherwise, initialize only one target directly in DIR"
|
68
|
+
option :auto, type: :boolean, default: true,
|
69
|
+
desc: "if true (the default), add the newly created target to auto-sync"
|
70
|
+
option :automount, type: :boolean, default: true,
|
71
|
+
desc: 'whether the supporting partition should be auto-mounted by snapsync when needed or not (the default is yes). Only useful if --no-auto has not been provided on the command line.'
|
72
|
+
def init(name, dir, *policy)
|
62
73
|
dir = Pathname.new(dir)
|
63
|
-
|
64
|
-
|
74
|
+
|
75
|
+
if policy.empty?
|
76
|
+
policy = ['default', Array.new]
|
77
|
+
elsif policy.size == 1
|
78
|
+
policy << Array.new
|
65
79
|
end
|
66
80
|
|
67
|
-
|
68
|
-
|
69
|
-
|
81
|
+
dirs = Array.new
|
82
|
+
if options[:all]
|
83
|
+
SnapperConfig.each_in_dir do |config|
|
84
|
+
dirs << dir + config.name
|
85
|
+
end
|
86
|
+
else
|
87
|
+
dirs << dir
|
88
|
+
end
|
89
|
+
|
90
|
+
dirs.each do |path|
|
91
|
+
begin
|
92
|
+
LocalTarget.new(path, create_if_needed: false)
|
93
|
+
Snapsync.info "#{path} was already initialized"
|
94
|
+
rescue ArgumentError, LocalTarget::NoUUIDError
|
95
|
+
path.mkpath
|
96
|
+
target = LocalTarget.new(path)
|
97
|
+
target.change_policy(*policy)
|
98
|
+
target.write_config
|
99
|
+
Snapsync.info "initialized #{path} as a snapsync target"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if options[:auto]
|
104
|
+
if !options[:all]
|
105
|
+
Snapsync.warn "cannot use --auto without --all"
|
106
|
+
else
|
107
|
+
auto_add(name, dir)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
desc 'auto-add NAME DIR', "add DIR to the set of targets for auto-sync"
|
113
|
+
option :automount, type: :boolean, default: true,
|
114
|
+
desc: 'whether the supporting partition should be auto-mounted by snapsync when needed or not (the default is yes)'
|
115
|
+
def auto_add(name, dir)
|
116
|
+
partitions = PartitionsMonitor.new
|
117
|
+
uuid, relative = partitions.partition_of(Pathname.new(dir))
|
118
|
+
|
119
|
+
conf_path = Pathname.new('/etc/snapsync.conf')
|
120
|
+
|
121
|
+
autosync = AutoSync.new
|
122
|
+
autosync.load_config(conf_path)
|
123
|
+
exists = autosync.each_target.find do |t|
|
124
|
+
t.partition_uuid == uuid && t.path.cleanpath == relative.cleanpath
|
125
|
+
end
|
126
|
+
if exists
|
127
|
+
if exists.automount == options[:automount]
|
128
|
+
Snapsync.info "already exists under the name #{exists.name}"
|
129
|
+
else
|
130
|
+
Snapsync.info "already exists under the name #{exists.name} but with a different automount flag, changing"
|
131
|
+
exists.automount = options[:automount]
|
132
|
+
end
|
133
|
+
exists.name ||= name
|
134
|
+
else
|
135
|
+
autosync.add AutoSync::AutoSyncTarget.new(uuid, relative, options[:automount], name)
|
136
|
+
end
|
137
|
+
autosync.write_config(conf_path)
|
138
|
+
end
|
139
|
+
|
140
|
+
desc 'auto-remove NAME', "remove a target from auto-sync by name"
|
141
|
+
def auto_remove(name)
|
142
|
+
conf_path = Pathname.new('/etc/snapsync.conf')
|
143
|
+
autosync = AutoSync.new
|
144
|
+
autosync.load_config(conf_path)
|
145
|
+
autosync.remove(name: name)
|
146
|
+
autosync.write_config(conf_path)
|
70
147
|
end
|
71
148
|
|
72
|
-
desc 'policy DIR TYPE [OPTIONS]', 'sets the synchronization and cleanup policy for the given target'
|
149
|
+
desc 'policy DIR TYPE [OPTIONS]', 'sets the synchronization and cleanup policy for the given target or targets'
|
73
150
|
long_desc <<-EOD
|
74
151
|
This command sets the policy used to decide which snapshots to synchronize to
|
75
152
|
the target, and which to not synchronize.
|
@@ -28,6 +28,28 @@ module Snapsync
|
|
28
28
|
monitored_partitions << partition_uuid.to_str
|
29
29
|
end
|
30
30
|
|
31
|
+
def partition_of(dir)
|
32
|
+
rel = Pathname.new("")
|
33
|
+
while !dir.mountpoint?
|
34
|
+
rel = dir.basename + rel
|
35
|
+
dir = dir.dirname
|
36
|
+
end
|
37
|
+
|
38
|
+
each_partition_with_filesystem do |name, dev|
|
39
|
+
partition = dev['org.freedesktop.UDisks2.Block']
|
40
|
+
uuid = partition['IdUUID']
|
41
|
+
|
42
|
+
fs = dev['org.freedesktop.UDisks2.Filesystem']
|
43
|
+
mount_points = fs['MountPoints'].map do |str|
|
44
|
+
str[0..-2].pack("U*")
|
45
|
+
end
|
46
|
+
if mount_points.include?(dir.to_s)
|
47
|
+
return uuid, rel
|
48
|
+
end
|
49
|
+
end
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
31
53
|
def dirty!
|
32
54
|
dirty.set
|
33
55
|
end
|
data/lib/snapsync/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snapsync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Joyeux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logging
|