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