Module: DockerCore::Shell

Defined in:
lib/docker_core.rb

Class Method Summary collapse

Class Method Details

.architectureObject



197
198
199
200
201
# File 'lib/docker_core.rb', line 197

def self.architecture
  hash = { x86: '386', x86_64: 'amd64', armhf: 'armv6', armv7l: 'armv7', aarch64: 'arm64' }
  machine = "#{Etc.uname[:machine]}"
  return hash.fetch(machine.to_sym, machine)
end

.change_mode(mode, *arguments) ⇒ Object

Parameters:

  • arguments (Array<String>)
  • mode (String, Integer)


224
225
226
227
228
# File 'lib/docker_core.rb', line 224

def self.change_mode(mode, *arguments)
  self.find_paths(*arguments).each do |path|
    FileUtils.chmod_R(mode, path, force: true)
  end
end

.change_owner(*arguments, user: USER, group: GROUP) ⇒ Object

Parameters:

  • arguments (Array<String>)
  • user (String) (defaults to: USER)
  • group (String) (defaults to: GROUP)


216
217
218
219
220
# File 'lib/docker_core.rb', line 216

def self.change_owner(*arguments, user: USER, group: GROUP)
  self.find_paths(*arguments).each do |path|
    FileUtils.chown_R(user, group, path, force: true)
  end
end

.clear_folders(*arguments, mode: nil) ⇒ Object

Parameters:

  • arguments (Array<String>)
  • mode (Integer, nil) (defaults to: nil)


416
417
418
419
# File 'lib/docker_core.rb', line 416

def self.clear_folders(*arguments, mode: nil)
  self.remove_paths(*arguments)
  self.make_folders(*arguments, mode: mode)
end

.deflate_file(file, path, echo: false) ⇒ Object

Parameters:

  • file (String)
  • path (String)
  • echo (Boolean) (defaults to: false)


379
380
381
382
383
384
385
386
# File 'lib/docker_core.rb', line 379

def self.deflate_file(file, path, echo: false)
  Zlib::GzipWriter.open(file, Zlib::BEST_COMPRESSION) do

    # @type [Zlib::GzipWriter] writer
  |writer|
    writer.write(self.tape_archive(path, echo: echo))
  end
end

.download_file(uri, file) ⇒ Object

Parameters:

  • uri (String)
  • file (String)


288
289
290
291
292
# File 'lib/docker_core.rb', line 288

def self.download_file(uri, file)
  uri = self.resolve_link(uri)
  content = Net::HTTP.get(URI(uri))
  return File.binwrite(file, content)
end

.find_paths(*arguments) ⇒ Array<String>

Parameters:

  • arguments (Array<String>)

Returns:

  • (Array<String>)


205
206
207
208
209
210
211
# File 'lib/docker_core.rb', line 205

def self.find_paths(*arguments)
  return Dir.glob(arguments.flatten, File::FNM_DOTMATCH).map do |item|
    next File.path(item)
  end.filter do |item|
    next false == %w[. ..].include?(File.basename(item))
  end.uniq
end

.github_latest_version(repository) ⇒ Object

Parameters:

  • repository (String)


422
423
424
425
426
# File 'lib/docker_core.rb', line 422

def self.github_latest_version(repository)
  uri = URI("https://api.github.com/repos/#{repository}/releases/latest")
  data = JSON.parse(Net::HTTP.get(uri))['tag_name']
  return "#{data}"
end

.inflate_file(file, path, echo: false) ⇒ Object

Parameters:

  • file (String)
  • path (String)
  • echo (Boolean) (defaults to: false)


331
332
333
334
335
336
337
338
# File 'lib/docker_core.rb', line 331

def self.inflate_file(file, path, echo: false)
  Zlib::GzipReader.open(file) do

    # @type [Zlib::GzipReader] reader
  |reader|
    self.unpack_archive(reader, path, echo: echo)
  end
end

Parameters:

  • stdout (String) (defaults to: '')
  • stderr (String) (defaults to: '')


402
403
404
405
406
407
408
409
410
411
412
# File 'lib/docker_core.rb', line 402

def self.link_logs(stdout: '', stderr: '')
  if '' != stdout
    File.symlink('/dev/stdout', File.path(stdout))
  end

  if '' != stderr
    File.symlink('/dev/stderr', File.path(stderr))
  end

  return
end

.make_folders(*arguments, mode: nil) ⇒ Object

Parameters:

  • arguments (Array<String>)
  • mode (Integer, nil) (defaults to: nil)


232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/docker_core.rb', line 232

def self.make_folders(*arguments, mode: nil)
  stack = []
  paths = arguments.map do |path|
    next File.path(path)
  end.uniq

  paths.each do |path|
    until path == stack.last
      stack << path
      path = File.dirname(path)
    end
  end

  stack.uniq.each do |path|
    if File.exist?(path) && false == File.directory?(path)
      File.delete(path)
    end
  end

  FileUtils.mkdir_p(paths, mode: mode)
end

.move_paths(source, target) ⇒ Object

Parameters:

  • source (String, Array<String>)
  • target (String)


263
264
265
266
# File 'lib/docker_core.rb', line 263

def self.move_paths(source, target)
  paths = [source].flatten
  FileUtils.mv(self.find_paths(*paths), target)
end

.remove_paths(*arguments) ⇒ Object

Parameters:

  • arguments (Array<String>)


255
256
257
258
259
# File 'lib/docker_core.rb', line 255

def self.remove_paths(*arguments)
  self.find_paths(*arguments).each do |path|
    FileUtils.rm_rf(path)
  end
end

Parameters:

  • uri (String)
  • max_redirect (Integer) (defaults to: 10)


270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'lib/docker_core.rb', line 270

def self.resolve_link(uri, max_redirect = 10)
  response = Net::HTTP.get_response(URI.parse(uri))

  if false == response.is_a?(Net::HTTPRedirection)
    return uri
  end

  max_redirect = max_redirect - 1

  if 0 == max_redirect
    raise('maximum redirect reached')
  end

  return self.resolve_link(response['location'], max_redirect)
end

.tape_archive(path, echo: false) ⇒ Object

Parameters:

  • path (String)
  • echo (Boolean) (defaults to: false)


342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'lib/docker_core.rb', line 342

def self.tape_archive(path, echo: false)
  io = StringIO.new('')
  offset = path.size + 1

  Gem::Package::TarWriter.new(io) do

    # @type [Gem::Package::TarWriter] writer
  |writer|
    self.find_paths(File.join(path, '**/*')).each do |name|
      mode = File.stat(name).mode
      file = name.slice(offset ..)

      if echo
        Color.echo(": #{file}", Color::GREEN)
      end

      if File.directory?(name)
        writer.mkdir(file, mode)
        next
      end

      if File.file?(name)
        writer.add_file(file, mode) do |stream|
          stream.write(File.binread(name))
        end
        next
      end
    end
  end

  io.rewind
  return io.string
end

.unpack_archive(io, path, echo: false) ⇒ Object

Parameters:

  • io (Object)
  • path (String)
  • echo (Boolean) (defaults to: false)


297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
# File 'lib/docker_core.rb', line 297

def self.unpack_archive(io, path, echo: false)
  Gem::Package::TarReader.new(io) do

    # @type [Gem::Package::TarReader] reader
  |reader|
    reader.rewind
    reader.each do |entry|
      # @type [Gem::Package::TarHeader] header
      header = entry.header
      mode = header.mode
      file = File.join(path, entry.full_name)

      if echo
        Color.echo(": #{file}", Color::GREEN)
      end

      if entry.directory?
        self.make_folders(file, mode: mode)
        next
      end

      if entry.file?
        self.make_folders(File.dirname(file))
        File.binwrite(file, entry.read)
        self.change_mode(mode, file)
        next
      end
    end
  end
end

.update_user(uid: 500, gid: 500) ⇒ Object

Parameters:

  • uid (Integer) (defaults to: 500)
  • gid (Integer) (defaults to: 500)


390
391
392
393
394
395
396
397
398
# File 'lib/docker_core.rb', line 390

def self.update_user(uid: 500, gid: 500)
  uid = ENV.fetch('DOCKER_CORE_UID', uid)
  gid = ENV.fetch('DOCKER_CORE_GID', gid)

  Process.run('deluser', USER, throw: false)
  Process.run('delgroup', GROUP, throw: false)
  Process.run('addgroup', { system: true, gid: gid }, GROUP)
  Process.run('adduser', { system: true, 'disabled-password': true, 'no-create-home': true, ingroup: GROUP, gecos: USER, shell: '/bin/bash', uid: uid }, USER)
end