restic-service 0.2.2 → 0.3.0
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/restic/service/auto_update.rb +55 -14
- data/lib/restic/service/cli.rb +22 -15
- data/lib/restic/service/conf.rb +18 -9
- data/lib/restic/service/targets/rclone_b2.rb +3 -0
- data/lib/restic/service/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: fc0cdefcecb418357241e0acc940dc84572263d8
|
4
|
+
data.tar.gz: 9b3bf2bc152405e6fd8d4ffd4e950f8176b34a7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58013743c7a6ebf256b6eddc6ade110c43245513fa78242cb151698538307388af6a95e3c36b46fc381d19219780cec4c1c8543d571757429a3f81671083ae00
|
7
|
+
data.tar.gz: bd65807a2ca4f8314b39cf4f4c1fd571693c9148bb6f70db19c75d2965526bc0b69a28c4449e468a77b7ddcfd733a26650275a0138553f205cc6f8776a27e69b
|
@@ -12,6 +12,14 @@ module Restic
|
|
12
12
|
"https://github.com/restic/restic/releases/download/v#{RESTIC_RELEASE_VERSION}/restic_#{RESTIC_RELEASE_VERSION}_#{platform}.bz2"
|
13
13
|
end
|
14
14
|
|
15
|
+
RCLONE_RELEASE_VERSION = "1.41"
|
16
|
+
|
17
|
+
def self.rclone_release_url(platform)
|
18
|
+
basename = "rclone-v#{RCLONE_RELEASE_VERSION}-#{platform}"
|
19
|
+
url = "https://github.com/ncw/rclone/releases/download/v#{RCLONE_RELEASE_VERSION}/#{basename}.zip"
|
20
|
+
[basename, url]
|
21
|
+
end
|
22
|
+
|
15
23
|
|
16
24
|
def initialize(binary_path)
|
17
25
|
@root = File.dirname(File.dirname(binary_path))
|
@@ -61,39 +69,72 @@ module Restic
|
|
61
69
|
reader.close if reader && !reader.closed?
|
62
70
|
end
|
63
71
|
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
while !release_binary
|
69
|
-
response = Net::HTTP.get_response(URI(release_url))
|
72
|
+
def download_file(temp_path, url)
|
73
|
+
binary = nil
|
74
|
+
while !binary
|
75
|
+
response = Net::HTTP.get_response(URI(url))
|
70
76
|
case response
|
71
77
|
when Net::HTTPSuccess
|
72
|
-
|
78
|
+
binary = response.body
|
73
79
|
when Net::HTTPRedirection
|
74
|
-
|
80
|
+
url = response['location']
|
75
81
|
else
|
76
|
-
raise FailedUpdate, "failed to fetch
|
82
|
+
raise FailedUpdate, "failed to fetch #{url}: #{response}"
|
77
83
|
end
|
78
84
|
end
|
79
85
|
|
86
|
+
File.open(temp_path, 'w') do |io|
|
87
|
+
io.write binary
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def update_release_if_needed(target_path, temp_path)
|
92
|
+
if File.file?(target_path)
|
93
|
+
current = File.read(target_path)
|
94
|
+
new = File.read(temp_path)
|
95
|
+
return false if current == new
|
96
|
+
end
|
97
|
+
|
98
|
+
FileUtils.mv temp_path, target_path
|
99
|
+
FileUtils.chmod 0755, target_path
|
100
|
+
true
|
101
|
+
end
|
102
|
+
|
103
|
+
def update_restic(platform, target_path)
|
104
|
+
release_url = self.class.restic_release_url(platform)
|
105
|
+
|
80
106
|
tmpdir = Dir.mktmpdir
|
81
107
|
restic_path = File.join(tmpdir, "restic")
|
82
|
-
|
83
|
-
io.write release_binary
|
84
|
-
end
|
108
|
+
download_file("#{restic_path}.bz2", release_url)
|
85
109
|
|
86
110
|
if !system("bzip2", "-d", "#{restic_path}.bz2")
|
87
111
|
raise FailedUpdate, "failed to uncompress the restic release file"
|
88
112
|
end
|
113
|
+
update_release_if_needed(target_path, restic_path)
|
114
|
+
|
115
|
+
ensure
|
116
|
+
FileUtils.rm_rf tmpdir if tmpdir
|
117
|
+
end
|
118
|
+
|
119
|
+
def update_rclone(platform, target_path)
|
120
|
+
basename, release_url = self.class.rclone_release_url(platform)
|
121
|
+
|
122
|
+
tmpdir = Dir.mktmpdir
|
123
|
+
tmppath = File.join(tmpdir, "rclone.zip")
|
124
|
+
download_file(tmppath, release_url)
|
125
|
+
|
126
|
+
if !system("unzip", tmppath, chdir: tmpdir, out: '/dev/null')
|
127
|
+
raise FailedUpdate, "failed to uncompress the rclone release file"
|
128
|
+
end
|
89
129
|
|
130
|
+
rclone_path = File.join(tmpdir, basename, 'rclone')
|
90
131
|
if File.file?(target_path)
|
91
132
|
current = File.read(target_path)
|
92
|
-
new = File.read(
|
133
|
+
new = File.read(rclone_path)
|
93
134
|
return if current == new
|
94
135
|
end
|
95
136
|
|
96
|
-
FileUtils.mv
|
137
|
+
FileUtils.mv rclone_path, target_path
|
97
138
|
FileUtils.chmod 0755, target_path
|
98
139
|
true
|
99
140
|
|
data/lib/restic/service/cli.rb
CHANGED
@@ -67,6 +67,22 @@ module Restic
|
|
67
67
|
target.forget
|
68
68
|
end
|
69
69
|
end
|
70
|
+
|
71
|
+
def auto_update_tool(conf, updater, name, version)
|
72
|
+
begin
|
73
|
+
path = conf.tool_path(name, only_if_present: false)
|
74
|
+
rescue ArgumentError
|
75
|
+
puts "cannot auto-update #{name}, provide an explicit path in the 'tools' section of the configuration first"
|
76
|
+
return
|
77
|
+
end
|
78
|
+
|
79
|
+
puts "attempting to auto-update #{name}"
|
80
|
+
if updater.send("update_#{name}", conf.send("#{name}_platform"), path)
|
81
|
+
puts "updated #{name} to version #{version}"
|
82
|
+
else
|
83
|
+
puts "restic was already up-to-date"
|
84
|
+
end
|
85
|
+
end
|
70
86
|
end
|
71
87
|
|
72
88
|
desc 'whereami', 'finds the available backup targets'
|
@@ -104,25 +120,16 @@ module Restic
|
|
104
120
|
puts "updating restic-service disabled in configuration"
|
105
121
|
end
|
106
122
|
|
107
|
-
|
108
|
-
|
109
|
-
begin
|
110
|
-
restic_path = conf.tool_path('restic')
|
111
|
-
rescue ArgumentError
|
112
|
-
puts "cannot auto-update restic, provide an explicit path in the 'tools' section of the configuration first"
|
113
|
-
update_restic = false
|
114
|
-
end
|
123
|
+
if conf.auto_update_restic?
|
124
|
+
auto_update_tool(conf, updater, 'restic', AutoUpdate::RESTIC_RELEASE_VERSION)
|
115
125
|
else
|
116
126
|
puts "updating restic disabled in configuration"
|
117
127
|
end
|
118
128
|
|
119
|
-
if
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
else
|
124
|
-
puts "restic was already up-to-date"
|
125
|
-
end
|
129
|
+
if conf.auto_update_rclone?
|
130
|
+
auto_update_tool(conf, updater, 'rclone', AutoUpdate::RCLONE_RELEASE_VERSION)
|
131
|
+
else
|
132
|
+
puts "updating rclone disabled in configuration"
|
126
133
|
end
|
127
134
|
end
|
128
135
|
|
data/lib/restic/service/conf.rb
CHANGED
@@ -202,16 +202,17 @@ module Restic
|
|
202
202
|
# @param [String]
|
203
203
|
# @return [Boolean]
|
204
204
|
def tool_available?(tool_name)
|
205
|
-
@tools
|
205
|
+
_, available = @tools[tool_name]
|
206
|
+
available
|
206
207
|
end
|
207
208
|
|
208
209
|
# The full path of a given tool
|
209
210
|
#
|
210
211
|
# @param [String]
|
211
212
|
# @return [Pathname]
|
212
|
-
def tool_path(tool_name)
|
213
|
+
def tool_path(tool_name, only_if_present: true)
|
213
214
|
if tool = @tools[tool_name]
|
214
|
-
tool
|
215
|
+
tool[0] if tool[1] || !only_if_present
|
215
216
|
else
|
216
217
|
raise ArgumentError, "cound not find '#{tool_name}'"
|
217
218
|
end
|
@@ -229,6 +230,14 @@ module Restic
|
|
229
230
|
@auto_update_restic
|
230
231
|
end
|
231
232
|
|
233
|
+
def auto_update_rclone?
|
234
|
+
@auto_update_rclone
|
235
|
+
end
|
236
|
+
|
237
|
+
def rclone_platform
|
238
|
+
@auto_update_rclone
|
239
|
+
end
|
240
|
+
|
232
241
|
# Add the information stored in a YAML-like hash into this
|
233
242
|
# configuration
|
234
243
|
#
|
@@ -247,6 +256,8 @@ module Restic
|
|
247
256
|
@auto_update_restic_service = do_update
|
248
257
|
elsif update_target == 'restic'
|
249
258
|
@auto_update_restic = do_update
|
259
|
+
elsif update_target == 'rclone'
|
260
|
+
@auto_update_rclone = do_update
|
250
261
|
end
|
251
262
|
end
|
252
263
|
|
@@ -268,12 +279,10 @@ module Restic
|
|
268
279
|
if tool_path.relative?
|
269
280
|
tool_path = find_in_path(tool_path)
|
270
281
|
end
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
@tools.delete(tool_name)
|
276
|
-
end
|
282
|
+
|
283
|
+
exists = tool_path.file?
|
284
|
+
STDERR.puts "#{tool_path} does not exist" unless exists
|
285
|
+
@tools[tool_name] = [tool_path, exists]
|
277
286
|
end
|
278
287
|
end
|
279
288
|
end
|
@@ -18,6 +18,7 @@ module Restic
|
|
18
18
|
super
|
19
19
|
@rclone_path = conf.tool_path('rclone')
|
20
20
|
@src = yaml['src']
|
21
|
+
@filter = yaml['filter'] || []
|
21
22
|
@conf_path = conf.conf_path
|
22
23
|
end
|
23
24
|
|
@@ -39,6 +40,8 @@ EOCONF
|
|
39
40
|
system(@rclone_path.to_path,
|
40
41
|
'--transfers', '16',
|
41
42
|
'--config', io.path,
|
43
|
+
'--delete-during',
|
44
|
+
*@filter.flat_map { |p| ['--filter', p] },
|
42
45
|
*extra_args,
|
43
46
|
'sync', @src, "restic-service:#{@bucket}/#{@path}", in: :close)
|
44
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restic-service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Joyeux
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|