Module: DockerCore::Shell

Defined in:
lib/docker_core.rb

Class Method Summary collapse

Class Method Details

.architectureObject



311
312
313
314
315
# File 'lib/docker_core.rb', line 311

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)


343
344
345
346
347
# File 'lib/docker_core.rb', line 343

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)


335
336
337
338
339
# File 'lib/docker_core.rb', line 335

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)


535
536
537
538
# File 'lib/docker_core.rb', line 535

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)


498
499
500
501
502
503
504
505
# File 'lib/docker_core.rb', line 498

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)


407
408
409
410
411
# File 'lib/docker_core.rb', line 407

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


324
325
326
327
328
329
330
# File 'lib/docker_core.rb', line 324

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)


541
542
543
544
545
546
# File 'lib/docker_core.rb', line 541

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)


450
451
452
453
454
455
456
457
# File 'lib/docker_core.rb', line 450

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

.is_active_unit(unit) ⇒ Object

Parameters:

  • unit (String)


318
319
320
# File 'lib/docker_core.rb', line 318

def self.is_active_unit(unit)
  return 'active' == Process.capture("systemctl is-active #{unit}").downcase
end

Parameters:

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


521
522
523
524
525
526
527
528
529
530
531
# File 'lib/docker_core.rb', line 521

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)


351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
# File 'lib/docker_core.rb', line 351

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)


382
383
384
385
# File 'lib/docker_core.rb', line 382

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


374
375
376
377
378
# File 'lib/docker_core.rb', line 374

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)


389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/docker_core.rb', line 389

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)


461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/docker_core.rb', line 461

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)


416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
# File 'lib/docker_core.rb', line 416

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)


509
510
511
512
513
514
515
516
517
# File 'lib/docker_core.rb', line 509

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