docker_core 0.0.14 → 0.0.18

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.
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