docker_core 0.0.14 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docker_core.rb +289 -194
  3. metadata +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c701083c9a545230b1e4fac7502e31c418627da7dd0b0b90bd19bc14a9aec98
4
- data.tar.gz: f3b7b98b2a654d247b21b4015f3388a2b6578708803ad0a88bc92020588ae565
3
+ metadata.gz: 2f80afb4258260ec1da58951eca584f9321f0f21b13f0137865ca42c5852944f
4
+ data.tar.gz: 8d1c6a6d11b3365c23fb67f618e63d20087afe72bc11b09c9c005cf666daac4b
5
5
  SHA512:
6
- metadata.gz: fa4c150462533849c1760cfdbb27a780165ee079d652224e83ad84d4a9de081b0eedc148ea9c9799cfa224a4c3d99323ea15fa362b59405794427f41784e55da
7
- data.tar.gz: 77f9c1ce5f6b1b6b803c6097ee50c866c400beffee23c472f9c3a01fa60f4449eb4388703b5a9c2d5a468744e2e911cac5dcc94822a3555f86300568302aa620
6
+ metadata.gz: d79c07a8abea54822b90858b3a27e6894dc2d51dd509f37769e879a60c33ee66806fb663480aef403524e93243c4ca02fbfdb3cef23672f1acd132cc41cdf128
7
+ data.tar.gz: 2e497a18fc9afcefcadc97fc0b89fc364e7dc6c70d78100d426ce05e18db49fe99122f4075c68376eb4737862bfd6577ceafd2f51114cef4659e01449ab7734c
data/lib/docker_core.rb CHANGED
@@ -1,257 +1,352 @@
1
+ require('etc')
1
2
  require('fileutils')
2
3
  require('json')
3
4
  require('net/http')
4
5
  require('rubygems/package')
6
+ require('thor')
5
7
  require('zlib')
6
8
 
7
9
  module DockerCore
8
- COLOR_CODE = { error: 31, info: 32, warn: 33 }
9
- ARCH_SUFFIX = { x86: '386', x86_64: 'amd64', armhf: 'armv6', aarch64: 'arm64' }
10
-
11
- # @param [String] text
12
- # @param [Integer] code
13
- def self.color(text, code)
14
- escape = "\033"
15
- prefix = "#{escape}[#{code}m"
16
- suffix = "#{escape}[0m"
17
- return "#{prefix}#{text}#{suffix}"
18
- end
10
+ module Shell
11
+ # include(Thor::Shell)
19
12
 
20
- # @param [String] text
21
- # @param [Integer] code
22
- def self.echo(text, code: self::COLOR_CODE[:info])
23
- puts(self.color(text, code))
24
- end
13
+ USER = 'core'
14
+ GROUP = 'core'
25
15
 
26
- # @param [String] title
27
- # @param [Method] run
28
- # @param [Array] argumets
29
- def self.execute(title, run, *argumets)
30
- code = self::COLOR_CODE[:warn]
31
- self.echo("> #{title}", code: code)
32
- run.call(*argumets)
33
- self.echo("< #{title}", code: code)
34
- end
16
+ class Color < Thor::Shell::Color
17
+ end
18
+
19
+ module Paser
20
+ # @param [String] value
21
+ def self.boolean(value)
22
+ return %w[true yes on].include?("#{value}".strip.downcase)
23
+ end
24
+
25
+ # @param [String] text
26
+ def self.kebab(text)
27
+ return "#{text}".gsub(/_/, '-')
28
+ end
29
+
30
+ # @param [Hash] hash
31
+ def self.options(hash = {})
32
+ items = []
33
+
34
+ hash.each do |key, value|
35
+ name = '--' + self.kebab(key)
36
+ item = (true == value) ? name : %Q(#{name}="#{value}")
37
+ items << item
38
+ end
39
+
40
+ return items
41
+ end
42
+
43
+ def self.make(*arguments)
44
+ items = []
45
+
46
+ arguments.each do |item|
47
+ if item.is_a?(Array)
48
+ items.concat(item.map { |value| "#{value}" })
49
+ next
50
+ end
51
+
52
+ if item.is_a?(Hash)
53
+ items.concat(self.options(item))
54
+ next
55
+ end
35
56
 
36
- # @param [String] command
37
- # @param [Boolean] force
38
- def self.run(command, force: false)
39
- begin
40
- self.echo("+ #{command}")
41
- print(`#{command}`)
42
- rescue
43
- raise unless force
57
+ items << "#{item}"
58
+ next
59
+ end
60
+
61
+ return items
62
+ end
44
63
  end
45
- end
46
64
 
47
- # @param [String] command
48
- # @param [Boolean] force
49
- def self.suexec(command, force: false)
50
- command = "su-exec core #{command}"
51
- self.run(command, force: force)
52
- end
65
+ # @param [String] text
66
+ # @param [Array<String>] colors
67
+ def self.echo(text, *colors)
68
+ if 0 == colors.size
69
+ return puts(text)
70
+ end
53
71
 
54
- # @param [Integer] uid
55
- # @param [Integer] gid
56
- def self.update_user(uid: 500, gid: 500)
57
- uid = ENV.fetch('DOCKER_CORE_UID', uid)
58
- gid = ENV.fetch('DOCKER_CORE_GID', gid)
59
- self.run('deluser core', force: true)
60
- self.run('delgroup core', force: true)
61
- self.run("addgroup --system --gid=#{gid} core")
62
- self.run("adduser --system --disabled-password --no-create-home --ingroup=core --gecos=core --shell=/bin/bash --uid=#{uid} core")
63
- end
72
+ color = colors.map do |color|
73
+ if color.is_a?(Symbol)
74
+ next Color.const_get(color.to_s.upcase)
75
+ end
64
76
 
65
- # @param [Array<String>] arguments
66
- def self.path(*arguments)
67
- return Dir.glob(arguments.flatten, File::FNM_DOTMATCH).map { |item| File.path(item) }.uniq
68
- end
77
+ next "#{color}"
78
+ end.join
69
79
 
70
- # @param [Array<String>] arguments
71
- def self.chown(*arguments)
72
- self.path(*arguments).each do |path|
73
- FileUtils.chown_R('core', 'core', path, force: true)
80
+ return puts("#{color}#{text}#{Color::CLEAR}")
74
81
  end
75
- end
76
82
 
77
- # @param [Array<String>] arguments
78
- def self.chmod(mode, *arguments)
79
- self.path(*arguments).each do |path|
80
- FileUtils.chmod_R(mode, path, force: true)
83
+ def self.command(*arguments, substitute: false)
84
+ if substitute
85
+ arguments.unshift('su-exec', USER)
86
+ end
87
+
88
+ return Paser.make(*arguments).join(' ')
81
89
  end
82
- end
83
90
 
84
- # @param [Array<String>] arguments
85
- def self.mkdir(*arguments, mode: nil)
86
- stack = []
87
- paths = arguments.map { |path| File.path(path) }.uniq
91
+ # @param [Boolean] strip
92
+ def self.capture(*arguments, strip: true, verbose: false, substitute: false)
93
+ command = self.command(*arguments, substitute: substitute)
88
94
 
89
- paths.each do |path|
90
- until path == stack.last
91
- stack << path
92
- path = File.dirname(path)
95
+ if verbose
96
+ self.echo("+ #{command}", Color::GREEN)
93
97
  end
98
+
99
+ data = `#{command}`
100
+ return strip ? "#{data}".strip : data
94
101
  end
95
102
 
96
- stack.uniq.each do |path|
97
- if File.exist?(path) && false == File.directory?(path)
98
- File.delete(path)
103
+ # @param [Boolean] force
104
+ def self.run(*arguments, force: false, substitute: false)
105
+ begin
106
+ data = self.capture(*arguments, strip: false, verbose: true, substitute: substitute)
107
+ print(data)
108
+ rescue
109
+ raise unless force
99
110
  end
100
111
  end
101
112
 
102
- FileUtils.mkdir_p(paths, mode: mode)
103
- end
113
+ # @param [Boolean] force
114
+ # @param [String] user
115
+ def self.execute(*arguments, substitute: false)
116
+ command = self.command(*arguments, substitute: substitute)
117
+ self.echo("= #{command}", Color::CYAN)
118
+ exec(command)
119
+ end
104
120
 
105
- # @param [Array<String>] arguments
106
- def self.rm(*arguments)
107
- self.path(*arguments).each do |path|
108
- FileUtils.rm_rf(path)
121
+ # @param [String] title
122
+ # @param [Method] delegate
123
+ # @param [Array] arguments
124
+ def self.invoke(title, delegate, *arguments)
125
+ color = Color::YELLOW
126
+ self.echo("> #{title}", color)
127
+ delegate.call(*arguments)
128
+ self.echo("< #{title}", color)
109
129
  end
110
- end
111
130
 
112
- # @param [String] value
113
- def self.to_boolean(value)
114
- return %w[true yes on].include?("#{value}".strip.downcase)
115
- end
131
+ # @param [Array<String>] arguments
132
+ # @return [Array<String>]
133
+ def self.find_paths(*arguments)
134
+ return Dir.glob(arguments.flatten, File::FNM_DOTMATCH).map do |item|
135
+ next File.path(item)
136
+ end.filter do |item|
137
+ next false == %w[. ..].include?(File.basename(item))
138
+ end.uniq
139
+ end
116
140
 
117
- # @param [String] stdout
118
- # @param [String] stderr
119
- def self.link_log(stdout: '', stderr: '')
120
- if '' != stdout
121
- File.symlink('/dev/stdout', File.path(stdout))
141
+ # @param [Array<String>] arguments
142
+ # @param [String] user
143
+ # @param [String] group
144
+ def self.change_owner(*arguments, user: USER, group: GROUP)
145
+ self.find_paths(*arguments).each do |path|
146
+ FileUtils.chown_R(user, group, path, force: true)
147
+ end
122
148
  end
123
149
 
124
- if '' != stderr
125
- File.symlink('/dev/stderr', File.path(stderr))
150
+ # @param [Array<String>] arguments
151
+ def self.change_mode(mode, *arguments)
152
+ self.find_paths(*arguments).each do |path|
153
+ FileUtils.chmod_R(mode, path, force: true)
154
+ end
126
155
  end
127
- end
128
156
 
129
- # @param [Array<String>] arguments
130
- def self.clear_path(*arguments, mode: nil)
131
- self.rm(*arguments)
132
- self.mkdir(*arguments, mode: mode)
133
- end
157
+ # @param [Array<String>] arguments
158
+ def self.make_folders(*arguments, mode: nil)
159
+ stack = []
160
+ paths = arguments.map do |path|
161
+ next File.path(path)
162
+ end.uniq
163
+
164
+ paths.each do |path|
165
+ until path == stack.last
166
+ stack << path
167
+ path = File.dirname(path)
168
+ end
169
+ end
134
170
 
135
- def self.arch_suffix
136
- arch = "#{`apk --print-arch`}".strip
137
- return ARCH_SUFFIX.fetch(arch.to_sym, arch)
138
- end
171
+ stack.uniq.each do |path|
172
+ if File.exist?(path) && false == File.directory?(path)
173
+ File.delete(path)
174
+ end
175
+ end
139
176
 
140
- # @param [String] repository
141
- def self.github_latest_version(repository)
142
- uri = URI("https://api.github.com/repos/#{repository}/releases/latest")
143
- return JSON.parse(Net::HTTP.get(uri))['tag_name']
144
- end
177
+ FileUtils.mkdir_p(paths, mode: mode)
178
+ end
145
179
 
146
- # @param [String] uri
147
- # @param [Integer] max_redirect
148
- def self.uri_resolve(uri, max_redirect = 10)
149
- response = Net::HTTP.get_response(URI.parse(uri))
180
+ # @param [Array<String>] arguments
181
+ def self.remove_paths(*arguments)
182
+ self.find_paths(*arguments).each do |path|
183
+ FileUtils.rm_rf(path)
184
+ end
185
+ end
150
186
 
151
- if false == response.is_a?(Net::HTTPRedirection)
152
- return uri
187
+ # @param [String, Array<String>] source
188
+ # @param [String] target
189
+ def self.move_paths(source, target)
190
+ files = [source].flatten
191
+ FileUtils.mv(self.find_paths(*files), target)
153
192
  end
154
193
 
155
- max_redirect = max_redirect - 1
194
+ # @param [String] uri
195
+ # @param [Integer] max_redirect
196
+ def self.resolve_link(uri, max_redirect = 10)
197
+ response = Net::HTTP.get_response(URI.parse(uri))
156
198
 
157
- if 0 == max_redirect
158
- raise('maximum redirect reached')
159
- end
199
+ if false == response.is_a?(Net::HTTPRedirection)
200
+ return uri
201
+ end
160
202
 
161
- return self.uri_resolve(response['location'], max_redirect)
162
- end
203
+ max_redirect = max_redirect - 1
163
204
 
164
- # @param [String] uri
165
- # @param [String] file
166
- def self.download_file(uri, file)
167
- uri = self.uri_resolve(uri)
168
- content = Net::HTTP.get(URI(uri))
169
- return File.binwrite(file, content)
170
- end
205
+ if 0 == max_redirect
206
+ raise('maximum redirect reached')
207
+ end
171
208
 
172
- # @param [String] path
173
- # @param [Boolean] verbose
174
- def self.untar(io, path, verbose: false)
175
- # @type [Gem::Package::TarReader] reader
176
- Gem::Package::TarReader.new(io) do |reader|
177
- reader.rewind
178
- reader.each do |entry|
179
- # @type [Gem::Package::TarHeader] header
180
- header = entry.header
181
- mode = header.mode
182
- file = File.join(path, entry.full_name)
183
-
184
- if verbose
185
- self.echo(": #{file}")
186
- end
209
+ return self.resolve_link(response['location'], max_redirect)
210
+ end
187
211
 
188
- if entry.directory?
189
- self.mkdir(file, mode: mode)
190
- next
191
- end
212
+ # @param [String] uri
213
+ # @param [String] file
214
+ def self.download_file(uri, file)
215
+ uri = self.resolve_link(uri)
216
+ content = Net::HTTP.get(URI(uri))
217
+ return File.binwrite(file, content)
218
+ end
192
219
 
193
- if entry.file?
194
- self.mkdir(File.dirname(file))
195
- File.binwrite(file, entry.read)
196
- self.chmod(mode, file)
197
- next
220
+ # @param [String] path
221
+ # @param [Boolean] verbose
222
+ def self.untar(io, path, verbose: false)
223
+ Gem::Package::TarReader.new(io) do
224
+
225
+ # @type [Gem::Package::TarReader] reader
226
+ |reader|
227
+ reader.rewind
228
+ reader.each do |entry|
229
+ # @type [Gem::Package::TarHeader] header
230
+ header = entry.header
231
+ mode = header.mode
232
+ file = File.join(path, entry.full_name)
233
+
234
+ if verbose
235
+ self.echo(": #{file}", Color::GREEN)
236
+ end
237
+
238
+ if entry.directory?
239
+ self.make_folders(file, mode: mode)
240
+ next
241
+ end
242
+
243
+ if entry.file?
244
+ self.make_folders(File.dirname(file))
245
+ File.binwrite(file, entry.read)
246
+ self.change_mode(mode, file)
247
+ next
248
+ end
198
249
  end
199
250
  end
200
251
  end
201
- end
202
252
 
203
- # @param [String] file
204
- # @param [String] path
205
- # @param [Boolean] verbose
206
- def self.ungzip(file, path, verbose: false)
207
- # @type [Zlib::GzipReader] reader
208
- Zlib::GzipReader.open(file) do |reader|
209
- self.untar(reader, path, verbose: verbose)
253
+ # @param [String] file
254
+ # @param [String] path
255
+ # @param [Boolean] verbose
256
+ def self.ungzip(file, path, verbose: false)
257
+ Zlib::GzipReader.open(file) do
258
+
259
+ # @type [Zlib::GzipReader] reader
260
+ |reader|
261
+ self.untar(reader, path, verbose: verbose)
262
+ end
210
263
  end
211
- end
212
264
 
213
- # @param [String] path
214
- # @param [Boolean] verbose
215
- def self.tar(path, verbose: false)
216
- io = StringIO.new('')
217
- offset = path.size + 1
218
-
219
- # @type [Gem::Package::TarWriter] writer
220
- Gem::Package::TarWriter.new(io) do |writer|
221
- # @type [String] file
222
- self.path(File.join(path, '**/*')).each do |name|
223
- mode = File.stat(name).mode
224
- file = name.slice(offset ..)
225
-
226
- if verbose
227
- self.echo(": #{file}")
228
- end
265
+ # @param [String] path
266
+ # @param [Boolean] verbose
267
+ def self.tar(path, verbose: false)
268
+ io = StringIO.new('')
269
+ offset = path.size + 1
229
270
 
230
- if File.directory?(name)
231
- writer.mkdir(file, mode)
232
- next
233
- end
271
+ Gem::Package::TarWriter.new(io) do
272
+
273
+ # @type [Gem::Package::TarWriter] writer
274
+ |writer|
275
+ self.find_paths(File.join(path, '**/*')).each do |name|
276
+ mode = File.stat(name).mode
277
+ file = name.slice(offset ..)
234
278
 
235
- if File.file?(name)
236
- writer.add_file(file, mode) do |stream|
237
- stream.write(File.binread(name))
279
+ if verbose
280
+ self.echo(": #{file}", Color::GREEN)
281
+ end
282
+
283
+ if File.directory?(name)
284
+ writer.mkdir(file, mode)
285
+ next
286
+ end
287
+
288
+ if File.file?(name)
289
+ writer.add_file(file, mode) do |stream|
290
+ stream.write(File.binread(name))
291
+ end
292
+ next
238
293
  end
239
- next
240
294
  end
241
295
  end
296
+
297
+ io.rewind
298
+ return io.string
242
299
  end
243
300
 
244
- io.rewind
245
- return io.string
246
- end
301
+ # @param [String] file
302
+ # @param [String] path
303
+ # @param [Boolean] verbose
304
+ def self.gzip(file, path, verbose: false)
305
+ Zlib::GzipWriter.open(file, Zlib::BEST_COMPRESSION) do
306
+
307
+ # @type [Zlib::GzipWriter] writer
308
+ |writer|
309
+ writer.write(self.tar(path, verbose: verbose))
310
+ end
311
+ end
312
+
313
+ # @param [Integer] uid
314
+ # @param [Integer] gid
315
+ def self.update_user(uid: 500, gid: 500)
316
+ self.run('deluser', USER, force: true)
317
+ self.run('delgroup', GROUP, force: true)
318
+ self.run('addgroup', { system: true, gid: ENV.fetch('DOCKER_CORE_GID', gid) }, GROUP)
319
+ self.run('adduser', { system: true, 'disabled-password': true, 'no-create-home': true, ingroup: GROUP, gecos: USER, shell: '/bin/bash', uid: ENV.fetch('DOCKER_CORE_UID', uid) }, USER)
320
+ end
321
+
322
+ # @param [String] stdout
323
+ # @param [String] stderr
324
+ def self.link_logs(stdout: '', stderr: '')
325
+ if '' != stdout
326
+ File.symlink('/dev/stdout', File.path(stdout))
327
+ end
328
+
329
+ if '' != stderr
330
+ File.symlink('/dev/stderr', File.path(stderr))
331
+ end
332
+ end
333
+
334
+ # @param [Array<String>] arguments
335
+ def self.clear_folders(*arguments, mode: nil)
336
+ self.remove_paths(*arguments)
337
+ self.make_folders(*arguments, mode: mode)
338
+ end
339
+
340
+ def self.architecture
341
+ hash = { x86: '386', x86_64: 'amd64', armhf: 'armv6', armv7l: 'armv7', aarch64: 'arm64' }
342
+ machine = "#{Etc.uname[:machine]}"
343
+ return hash.fetch(machine.to_sym, machine)
344
+ end
247
345
 
248
- # @param [String] file
249
- # @param [String] path
250
- # @param [Boolean] verbose
251
- def self.gzip(file, path, verbose: false)
252
- # @type [Zlib::GzipWriter] writer
253
- Zlib::GzipWriter.open(file, Zlib::BEST_COMPRESSION) do |writer|
254
- writer.write(self.tar(path, verbose: verbose))
346
+ # @param [String] repository
347
+ def self.github_latest_version(repository)
348
+ uri = URI("https://api.github.com/repos/#{repository}/releases/latest")
349
+ return JSON.parse(Net::HTTP.get(uri))['tag_name']
255
350
  end
256
351
  end
257
352
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - agrozyme
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-13 00:00:00.000000000 Z
11
+ date: 2021-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fileutils
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: zlib
43
57
  requirement: !ruby/object:Gem::Requirement