class Dodebui::Distribution

handle distribution releases

Attributes

cli[R]
codename[R]
os[R]

Public Class Methods

new(name, cli) click to toggle source
# File lib/dodebui/distribution.rb, line 26
def initialize(name, cli)
  @cli = cli
  # convert string
  if name.is_a? String
    split = name.split(':')
    os = split[0].to_sym
    codename = split[1].to_sym
  end

  if (!DISTRIBUTIONS.key? os) || (!DISTRIBUTIONS[os].include? codename)
    fail "Operating system #{os} with codename #{codename} not found"
  end
  @os = os
  @codename = codename
end

Public Instance Methods

apt_proxy() click to toggle source
# File lib/dodebui/distribution.rb, line 93
def apt_proxy
  (
    'echo ' \
    '"Acquire::http::Proxy ' \
    '\"%s\";" ' \
    '> ' \
    '/etc/apt/apt.conf.d/01proxy'
  ) % @cli.apt_proxy
end
base_image_name() click to toggle source
# File lib/dodebui/distribution.rb, line 179
def base_image_name
  "#{@os}:#{@codename}"
end
build() click to toggle source
# File lib/dodebui/distribution.rb, line 171
def build
  @build ||= Build.new self
end
codename_int() click to toggle source
# File lib/dodebui/distribution.rb, line 50
def codename_int
  DISTRIBUTIONS[os].index(codename) + 1
end
codename_str() click to toggle source
# File lib/dodebui/distribution.rb, line 46
def codename_str
  format('%02d', codename_int)
end
create_image() click to toggle source
# File lib/dodebui/distribution.rb, line 153
def create_image
  logger.info("Start building a new image from #{base_image_name}")

  # build docker build directory
  Dir.mktmpdir do |dir|
    # Write docker file
    dockerfile_path = File.join(dir, 'Dockerfile')
    File.open(dockerfile_path, 'w') do |file|
      file.write(create_image_dockerfile_contents)
    end

    create_image_copy_dep_resolver(dir)

    # build image
    create_image_build(dir)
  end
end
create_image_build(dir) click to toggle source
# File lib/dodebui/distribution.rb, line 137
def create_image_build(dir)
  image = Docker::Image.build_from_dir(
    dir,
    nocache: true
  )

  logger.info(
    "Finished building a new image #{image_name} from #{base_image_name}"
  )
  image.tag(
    repo: repo_name,
    tag: @codename.to_s,
    force: true
  )
end
create_image_copy_dep_resolver(dir) click to toggle source
# File lib/dodebui/distribution.rb, line 128
def create_image_copy_dep_resolver(dir)
  pbuilder_files.each do |file|
    src = File.join(share_path, 'pbuilder', file)
    dest = File.join(dir, file)
    logger.debug("Copy file from #{src} to #{dest}")
    FileUtils.cp src, dest
  end
end
create_image_dockerfile_contents() click to toggle source
# File lib/dodebui/distribution.rb, line 103
def create_image_dockerfile_contents
  dockerfile = "FROM #{base_image_name}\n"

  # append proxy if needed
  dockerfile += "RUN #{apt_proxy}\n" unless @cli.apt_proxy.nil?

  dockerfile += (
    "ENV DEBIAN_FRONTEND=noninteractive\n" \
    "RUN apt-get update && \\ \n" \
    "    apt-get -y dist-upgrade && \\ \n" \
    "    apt-get -y install wget curl build-essential aptitude \n" \
    "RUN mkdir -p #{pbuilder_dir}\n"
  )

  # add pbuilder dep resolver
  pbuilder_files.each do |file|
    dockerfile += "ADD #{file} #{pbuilder_dir}/#{file}\n"
  end

  # make dep resolver executable
  dockerfile += 'RUN chmod +x '
  dockerfile += "#{pbuilder_dir}/pbuilder-satisfydepends-aptitude\n"
  dockerfile
end
ensure_image_updated() click to toggle source
# File lib/dodebui/distribution.rb, line 59
def ensure_image_updated
  # Test if image_name exists
  @image = Docker::Image.get(image_name)
  if image_age(@image) > MAX_IMAGE_AGE
    logger.info "Image #{image_name} is outdated renew it"
    @image = create_image
  end
rescue Docker::Error::NotFoundError
  @image = create_image
end
image_age(i) click to toggle source
# File lib/dodebui/distribution.rb, line 54
def image_age(i)
  age = DateTime.now - DateTime.parse(i.info['Created'])
  (age * 24 * 60 * 60).to_i
end
image_name() click to toggle source
# File lib/dodebui/distribution.rb, line 183
def image_name
  "#{repo_name}:#{@codename}"
end
logger() click to toggle source
# File lib/dodebui/distribution.rb, line 42
def logger
  @cli.logger
end
pbuilder_dir() click to toggle source
# File lib/dodebui/distribution.rb, line 89
def pbuilder_dir
  '/usr/lib/pbuilder'
end
pbuilder_files() click to toggle source
# File lib/dodebui/distribution.rb, line 70
def pbuilder_files
  [
    'pbuilder-satisfydepends-aptitude',
    'pbuilder-satisfydepends-checkparams',
    'pbuilder-satisfydepends-funcs'
  ]
end
repo_name() click to toggle source
# File lib/dodebui/distribution.rb, line 175
def repo_name
  "dodebui_#{@os}"
end
share_path() click to toggle source
# File lib/dodebui/distribution.rb, line 78
def share_path
  File.expand_path(
    File.join(
      File.expand_path(
        File.dirname(__FILE__)
      ),
      '../../share'
    )
  )
end