Class: Dodebui::Distribution

Inherits:
Object
  • Object
show all
Defined in:
lib/dodebui/distribution.rb

Overview

handle distribution releases

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, cli) ⇒ Distribution

Returns a new instance of Distribution.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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

Instance Attribute Details

#cliObject (readonly)

Returns the value of attribute cli.



25
26
27
# File 'lib/dodebui/distribution.rb', line 25

def cli
  @cli
end

#codenameObject (readonly)

Returns the value of attribute codename.



25
26
27
# File 'lib/dodebui/distribution.rb', line 25

def codename
  @codename
end

#osObject (readonly)

Returns the value of attribute os.



25
26
27
# File 'lib/dodebui/distribution.rb', line 25

def os
  @os
end

Instance Method Details

#apt_proxyObject



93
94
95
96
97
98
99
100
101
# 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_nameObject



179
180
181
# File 'lib/dodebui/distribution.rb', line 179

def base_image_name
  "#{@os}:#{@codename}"
end

#buildObject



171
172
173
# File 'lib/dodebui/distribution.rb', line 171

def build
  @build ||= Build.new self
end

#codename_intObject



50
51
52
# File 'lib/dodebui/distribution.rb', line 50

def codename_int
  DISTRIBUTIONS[os].index(codename) + 1
end

#codename_strObject



46
47
48
# File 'lib/dodebui/distribution.rb', line 46

def codename_str
  format('%02d', codename_int)
end

#create_imageObject



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# 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) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# 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) ⇒ Object



128
129
130
131
132
133
134
135
# 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_contentsObject



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 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_updatedObject



59
60
61
62
63
64
65
66
67
68
# 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) ⇒ Object



54
55
56
57
# 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_nameObject



183
184
185
# File 'lib/dodebui/distribution.rb', line 183

def image_name
  "#{repo_name}:#{@codename}"
end

#loggerObject



42
43
44
# File 'lib/dodebui/distribution.rb', line 42

def logger
  @cli.logger
end

#pbuilder_dirObject



89
90
91
# File 'lib/dodebui/distribution.rb', line 89

def pbuilder_dir
  '/usr/lib/pbuilder'
end

#pbuilder_filesObject



70
71
72
73
74
75
76
# File 'lib/dodebui/distribution.rb', line 70

def pbuilder_files
  [
    'pbuilder-satisfydepends-aptitude',
    'pbuilder-satisfydepends-checkparams',
    'pbuilder-satisfydepends-funcs'
  ]
end

#repo_nameObject



175
176
177
# File 'lib/dodebui/distribution.rb', line 175

def repo_name
  "dodebui_#{@os}"
end

#share_pathObject



78
79
80
81
82
83
84
85
86
87
# File 'lib/dodebui/distribution.rb', line 78

def share_path
  File.expand_path(
    File.join(
      File.expand_path(
        File.dirname(__FILE__)
      ),
      '../../share'
    )
  )
end