Module: DockerCore::Shell

Defined in:
lib/docker_core.rb

Class Method Summary collapse

Class Method Details

.architectureObject



428
429
430
431
432
# File 'lib/docker_core.rb', line 428

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



460
461
462
463
464
# File 'lib/docker_core.rb', line 460

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



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

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



652
653
654
655
# File 'lib/docker_core.rb', line 652

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



615
616
617
618
619
620
621
622
# File 'lib/docker_core.rb', line 615

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



524
525
526
527
528
# File 'lib/docker_core.rb', line 524

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>



441
442
443
444
445
446
447
# File 'lib/docker_core.rb', line 441

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



658
659
660
661
662
663
# File 'lib/docker_core.rb', line 658

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



567
568
569
570
571
572
573
574
# File 'lib/docker_core.rb', line 567

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



435
436
437
# File 'lib/docker_core.rb', line 435

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


638
639
640
641
642
643
644
645
646
647
648
# File 'lib/docker_core.rb', line 638

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



468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
# File 'lib/docker_core.rb', line 468

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



499
500
501
502
# File 'lib/docker_core.rb', line 499

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

.remove_paths(*arguments) ⇒ Object



491
492
493
494
495
# File 'lib/docker_core.rb', line 491

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


506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
# File 'lib/docker_core.rb', line 506

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
    Error.maximum_redirect
  end

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

.tape_archive(path, echo: false) ⇒ Object



578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
# File 'lib/docker_core.rb', line 578

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



533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
# File 'lib/docker_core.rb', line 533

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



626
627
628
629
630
631
632
633
634
# File 'lib/docker_core.rb', line 626

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