Class BoxGrinder::RPMBasedOSPlugin
In: lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb
lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb
Parent: BasePlugin

Methods

Public Instance methods

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 27
27:     def after_init
28:       set_default_config_value('format', 'raw')
29: 
30:       register_deliverable(
31:           :disk => "#{@appliance_config.name}-sda.#{@plugin_config['format']}",
32:           :descriptor => "#{@appliance_config.name}.xml"
33:       )
34: 
35:       @linux_helper = LinuxHelper.new(:log => @log)
36:     end

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 27
27:     def after_init
28:       set_default_config_value('format', 'raw')
29: 
30:       register_deliverable(
31:           :disk => "#{@appliance_config.name}-sda.#{@plugin_config['format']}",
32:           :descriptor => "#{@appliance_config.name}.xml"
33:       )
34: 
35:       @linux_helper = LinuxHelper.new(:log => @log)
36:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 193
193:     def apply_root_password(guestfs)
194:       @log.debug "Applying root password..."
195:       guestfs.sh("/usr/bin/passwd -d root")
196:       guestfs.sh("/usr/sbin/usermod -p '#{@appliance_config.os.password.crypt((0...8).map { 65.+(rand(25)).chr }.join)}' root")
197:       @log.debug "Password applied."
198:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 193
193:     def apply_root_password(guestfs)
194:       @log.debug "Applying root password..."
195:       guestfs.sh("/usr/bin/passwd -d root")
196:       guestfs.sh("/usr/sbin/usermod -p '#{@appliance_config.os.password.crypt((0...8).map { 65.+(rand(25)).chr }.join)}' root")
197:       @log.debug "Password applied."
198:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 67
 67:     def build_with_appliance_creator(appliance_definition_file, repos = {})
 68:       if File.extname(appliance_definition_file).eql?('.ks')
 69:         kickstart_file = appliance_definition_file
 70:       else
 71:         kickstart_file = Kickstart.new(@config, @appliance_config, repos, @dir, :log => @log).create
 72:       end
 73: 
 74:       RPMDependencyValidator.new(@config, @appliance_config, @dir, kickstart_file, @options).resolve_packages
 75: 
 76:       @log.info "Building #{@appliance_config.name} appliance..."
 77: 
 78:       execute_appliance_creator(kickstart_file)
 79: 
 80:       FileUtils.mv(Dir.glob("#{@dir.tmp}/#{@appliance_config.name}/*"), @dir.tmp)
 81:       FileUtils.rm_rf("#{@dir.tmp}/#{@appliance_config.name}/")
 82: 
 83:       @image_helper.customize([@deliverables.disk]) do |guestfs, guestfs_helper|
 84:         # TODO is this really needed?
 85:         @log.debug "Uploading '/etc/resolv.conf'..."
 86:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
 87:         @log.debug "'/etc/resolv.conf' uploaded."
 88: 
 89:         change_configuration(guestfs_helper)
 90:         # TODO check if this is still required
 91:         apply_root_password(guestfs)
 92:         use_labels_for_partitions(guestfs)
 93:         disable_firewall(guestfs)
 94:         set_motd(guestfs)
 95:         install_repos(guestfs)
 96: 
 97:         guestfs.sh("chkconfig firstboot off") if guestfs.exists('/etc/init.d/firstboot') != 0
 98: 
 99:         @log.info "Executing post operations after build..."
100: 
101:         unless @appliance_config.post['base'].nil?
102:           @appliance_config.post['base'].each do |cmd|
103:             guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
104:           end
105:           @log.debug "Post commands from appliance definition file executed."
106:         else
107:           @log.debug "No commands specified, skipping."
108:         end
109: 
110:         yield guestfs, guestfs_helper if block_given?
111: 
112:         @log.info "Post operations executed."
113:       end
114: 
115:       @log.info "Base image for #{@appliance_config.name} appliance was built successfully."
116:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 67
 67:     def build_with_appliance_creator(appliance_definition_file, repos = {})
 68:       if File.extname(appliance_definition_file).eql?('.ks')
 69:         kickstart_file = appliance_definition_file
 70:       else
 71:         kickstart_file = Kickstart.new(@config, @appliance_config, repos, @dir, :log => @log).create
 72:       end
 73: 
 74:       RPMDependencyValidator.new(@config, @appliance_config, @dir, kickstart_file, @options).resolve_packages
 75: 
 76:       @log.info "Building #{@appliance_config.name} appliance..."
 77: 
 78:       execute_appliance_creator(kickstart_file)
 79: 
 80:       FileUtils.mv(Dir.glob("#{@dir.tmp}/#{@appliance_config.name}/*"), @dir.tmp)
 81:       FileUtils.rm_rf("#{@dir.tmp}/#{@appliance_config.name}/")
 82: 
 83:       @image_helper.customize([@deliverables.disk]) do |guestfs, guestfs_helper|
 84:         # TODO is this really needed?
 85:         @log.debug "Uploading '/etc/resolv.conf'..."
 86:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
 87:         @log.debug "'/etc/resolv.conf' uploaded."
 88: 
 89:         change_configuration(guestfs_helper)
 90:         # TODO check if this is still required
 91:         apply_root_password(guestfs)
 92:         use_labels_for_partitions(guestfs)
 93:         disable_firewall(guestfs)
 94:         set_motd(guestfs)
 95:         install_repos(guestfs)
 96: 
 97:         guestfs.sh("chkconfig firstboot off") if guestfs.exists('/etc/init.d/firstboot') != 0
 98: 
 99:         @log.info "Executing post operations after build..."
100: 
101:         unless @appliance_config.post['base'].nil?
102:           @appliance_config.post['base'].each do |cmd|
103:             guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
104:           end
105:           @log.debug "Post commands from appliance definition file executed."
106:         else
107:           @log.debug "No commands specified, skipping."
108:         end
109: 
110:         yield guestfs, guestfs_helper if block_given?
111: 
112:         @log.info "Post operations executed."
113:       end
114: 
115:       @log.info "Base image for #{@appliance_config.name} appliance was built successfully."
116:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 200
200:     def change_configuration(guestfs_helper)
201:       guestfs_helper.augeas do
202:         set('/etc/ssh/sshd_config', 'UseDNS', 'no')
203:         set('/etc/sysconfig/selinux', 'SELINUX', 'permissive')
204:       end
205:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 200
200:     def change_configuration(guestfs_helper)
201:       guestfs_helper.augeas do
202:         set('/etc/ssh/sshd_config', 'UseDNS', 'no')
203:         set('/etc/sysconfig/selinux', 'SELINUX', 'permissive')
204:       end
205:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 127
127:     def cleanup_after_appliance_creator(pid)
128:       @log.debug "Sending TERM signal to process '#{pid}'..."
129:       Process.kill("TERM", pid)
130: 
131:       @log.debug "Waiting for process to be terminated..."
132:       Process.wait(pid)
133: 
134:       @log.debug "Cleaning appliance-creator mount points..."
135: 
136:       Dir["#{@dir.tmp}/imgcreate-*"].each do |dir|
137:         dev_mapper = @exec_helper.execute "mount | grep #{dir} | awk '{print $1}'"
138: 
139:         mappings = {}
140: 
141:         dev_mapper.each do |mapping|
142:           if mapping =~ /(loop\d+)p(\d+)/
143:             mappings[$1] = [] if mappings[$1].nil?
144:             mappings[$1] << $2 unless mappings[$1].include?($2)
145:           end
146:         end
147: 
148:         (['/var/cache/yum', '/dev/shm', '/dev/pts', '/proc', '/sys'] + @appliance_config.hardware.partitions.keys.reverse).each do |mount_point|
149:           @log.trace "Unmounting '#{mount_point}'..."
150:           @exec_helper.execute "umount -d #{dir}/install_root#{mount_point}"
151:         end
152: 
153:         mappings.each do |loop, partitions|
154:           @log.trace "Removing mappings from loop device #{loop}..."
155:           @exec_helper.execute "/sbin/kpartx -d /dev/#{loop}"
156:           @exec_helper.execute "losetup -d /dev/#{loop}"
157: 
158:           partitions.each do |part|
159:             @log.trace "Removing mapping for partition #{part} from loop device #{loop}..."
160:             @exec_helper.execute "rm /dev/#{loop}#{part}"
161:           end
162:         end
163:       end
164: 
165:       @log.debug "Cleaned up after appliance-creator."
166:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 127
127:     def cleanup_after_appliance_creator(pid)
128:       @log.debug "Sending TERM signal to process '#{pid}'..."
129:       Process.kill("TERM", pid)
130: 
131:       @log.debug "Waiting for process to be terminated..."
132:       Process.wait(pid)
133: 
134:       @log.debug "Cleaning appliance-creator mount points..."
135: 
136:       Dir["#{@dir.tmp}/imgcreate-*"].each do |dir|
137:         dev_mapper = @exec_helper.execute "mount | grep #{dir} | awk '{print $1}'"
138: 
139:         mappings = {}
140: 
141:         dev_mapper.each do |mapping|
142:           if mapping =~ /(loop\d+)p(\d+)/
143:             mappings[$1] = [] if mappings[$1].nil?
144:             mappings[$1] << $2 unless mappings[$1].include?($2)
145:           end
146:         end
147: 
148:         (['/var/cache/yum', '/dev/shm', '/dev/pts', '/proc', '/sys'] + @appliance_config.hardware.partitions.keys.reverse).each do |mount_point|
149:           @log.trace "Unmounting '#{mount_point}'..."
150:           @exec_helper.execute "umount -d #{dir}/install_root#{mount_point}"
151:         end
152: 
153:         mappings.each do |loop, partitions|
154:           @log.trace "Removing mappings from loop device #{loop}..."
155:           @exec_helper.execute "/sbin/kpartx -d /dev/#{loop}"
156:           @exec_helper.execute "losetup -d /dev/#{loop}"
157: 
158:           partitions.each do |part|
159:             @log.trace "Removing mapping for partition #{part} from loop device #{loop}..."
160:             @exec_helper.execute "rm /dev/#{loop}#{part}"
161:           end
162:         end
163:       end
164: 
165:       @log.debug "Cleaned up after appliance-creator."
166:     end

issues.jboss.org/browse/BGBUILD-177

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 169
169:     def disable_firewall(guestfs)
170:       @log.debug "Disabling firewall..."
171:       guestfs.sh("lokkit -q --disabled")
172:       @log.debug "Firewall disabled."
173:     end

issues.jboss.org/browse/BGBUILD-177

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 169
169:     def disable_firewall(guestfs)
170:       @log.debug "Disabling firewall..."
171:       guestfs.sh("lokkit -q --disabled")
172:       @log.debug "Firewall disabled."
173:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 118
118:     def execute_appliance_creator(kickstart_file)
119:       begin
120:         @exec_helper.execute "appliance-creator -d -v -t '#{@dir.tmp}' --cache=#{@config.dir.cache}/rpms-cache/#{@appliance_config.path.main} --config '#{kickstart_file}' -o '#{@dir.tmp}' --name '#{@appliance_config.name}' --vmem #{@appliance_config.hardware.memory} --vcpu #{@appliance_config.hardware.cpus} --format #{@plugin_config['format']}"
121:       rescue InterruptionError => e
122:         cleanup_after_appliance_creator(e.pid)
123:         abort
124:       end
125:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 118
118:     def execute_appliance_creator(kickstart_file)
119:       begin
120:         @exec_helper.execute "appliance-creator -d -v -t '#{@dir.tmp}' --cache=#{@config.dir.cache}/rpms-cache/#{@appliance_config.path.main} --config '#{kickstart_file}' -o '#{@dir.tmp}' --name '#{@appliance_config.name}' --vmem #{@appliance_config.hardware.memory} --vcpu #{@appliance_config.hardware.cpus} --format #{@plugin_config['format']}"
121:       rescue InterruptionError => e
122:         cleanup_after_appliance_creator(e.pid)
123:         abort
124:       end
125:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 224
224:     def install_repos(guestfs)
225:       @log.debug "Installing repositories from appliance definition file..."
226:       @appliance_config.repos.each do |repo|
227:         if repo['ephemeral']
228:           @log.debug "Repository '#{repo['name']}' is an ephemeral repo. It'll not be installed in the appliance."
229:           next
230:         end
231: 
232:         @log.debug "Installing #{repo['name']} repo..."
233:         repo_file = File.read("#{File.dirname(__FILE__)}/src/base.repo").gsub(/#NAME#/, repo['name'])
234: 
235:         ['baseurl', 'mirrorlist'].each do |type|
236:           repo_file << ("#{type}=#{repo[type]}\n") unless repo[type].nil?
237:         end
238: 
239:         guestfs.write_file("/etc/yum.repos.d/#{repo['name']}.repo", repo_file, 0)
240:       end
241:       @log.debug "Repositories installed."
242:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 224
224:     def install_repos(guestfs)
225:       @log.debug "Installing repositories from appliance definition file..."
226:       @appliance_config.repos.each do |repo|
227:         if repo['ephemeral']
228:           @log.debug "Repository '#{repo['name']}' is an ephemeral repo. It'll not be installed in the appliance."
229:           next
230:         end
231: 
232:         @log.debug "Installing #{repo['name']} repo..."
233:         repo_file = File.read("#{File.dirname(__FILE__)}/src/base.repo").gsub(/#NAME#/, repo['name'])
234: 
235:         ['baseurl', 'mirrorlist'].each do |type|
236:           repo_file << ("#{type}=#{repo[type]}\n") unless repo[type].nil?
237:         end
238: 
239:         guestfs.write_file("/etc/yum.repos.d/#{repo['name']}.repo", repo_file, 0)
240:       end
241:       @log.debug "Repositories installed."
242:     end

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 38
38:     def read_file(file)
39:       read_kickstart(file) if File.extname(file).eql?('.ks')
40:     end

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 38
38:     def read_file(file)
39:       read_kickstart(file) if File.extname(file).eql?('.ks')
40:     end

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 42
42:     def read_kickstart(file)
43:       appliance_config = ApplianceConfig.new
44: 
45:       appliance_config.name = File.basename(file, '.ks')
46: 
47:       name = nil
48:       version = nil
49: 
50:       File.read(file).each do |line|
51:         n = line.scan(/^# bg_os_name: (.*)/).flatten.first
52:         v = line.scan(/^# bg_os_version: (.*)/).flatten.first
53: 
54:         name = n unless n.nil?
55:         version = v unless v.nil?
56:       end
57: 
58:       raise "No operating system name specified, please add comment to you kickstrt file like this: # bg_os_name: fedora" if name.nil?
59:       raise "No operating system version specified, please add comment to you kickstrt file like this: # bg_os_version: 14" if version.nil?
60: 
61:       appliance_config.os.name = name
62:       appliance_config.os.version = version
63: 
64:       appliance_config
65:     end

[Source]

    # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 42
42:     def read_kickstart(file)
43:       appliance_config = ApplianceConfig.new
44: 
45:       appliance_config.name = File.basename(file, '.ks')
46: 
47:       name = nil
48:       version = nil
49: 
50:       File.read(file).each do |line|
51:         n = line.scan(/^# bg_os_name: (.*)/).flatten.first
52:         v = line.scan(/^# bg_os_version: (.*)/).flatten.first
53: 
54:         name = n unless n.nil?
55:         version = v unless v.nil?
56:       end
57: 
58:       raise "No operating system name specified, please add comment to you kickstrt file like this: # bg_os_name: fedora" if name.nil?
59:       raise "No operating system version specified, please add comment to you kickstrt file like this: # bg_os_version: 14" if version.nil?
60: 
61:       appliance_config.os.name = name
62:       appliance_config.os.version = version
63: 
64:       appliance_config
65:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 189
189:     def read_label(guestfs, partition)
190:       (guestfs.respond_to?(:vfs_label) ? guestfs.vfs_label(partition) : guestfs.sh("/sbin/e2label #{partition}").chomp.strip).gsub('_', '')
191:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 189
189:     def read_label(guestfs, partition)
190:       (guestfs.respond_to?(:vfs_label) ? guestfs.vfs_label(partition) : guestfs.sh("/sbin/e2label #{partition}").chomp.strip).gsub('_', '')
191:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 220
220:     def recreate_kernel_image(guestfs, modules = [])
221:       @linux_helper.recreate_kernel_image(guestfs, modules)
222:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 220
220:     def recreate_kernel_image(guestfs, modules = [])
221:       @linux_helper.recreate_kernel_image(guestfs, modules)
222:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 207
207:     def set_motd(guestfs)
208:       @log.debug "Setting up '/etc/motd'..."
209:       # set nice banner for SSH
210:       motd_file = "/etc/init.d/motd"
211:       guestfs.upload("#{File.dirname(__FILE__)}/src/motd.init", motd_file)
212:       guestfs.sh("sed -i s/#VERSION#/'#{@appliance_config.version}.#{@appliance_config.release}'/ #{motd_file}")
213:       guestfs.sh("sed -i s/#APPLIANCE#/'#{@appliance_config.name} appliance'/ #{motd_file}")
214: 
215:       guestfs.sh("/bin/chmod +x #{motd_file}")
216:       guestfs.sh("/sbin/chkconfig --add motd")
217:       @log.debug "'/etc/motd' is nice now."
218:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 207
207:     def set_motd(guestfs)
208:       @log.debug "Setting up '/etc/motd'..."
209:       # set nice banner for SSH
210:       motd_file = "/etc/init.d/motd"
211:       guestfs.upload("#{File.dirname(__FILE__)}/src/motd.init", motd_file)
212:       guestfs.sh("sed -i s/#VERSION#/'#{@appliance_config.version}.#{@appliance_config.release}'/ #{motd_file}")
213:       guestfs.sh("sed -i s/#APPLIANCE#/'#{@appliance_config.name} appliance'/ #{motd_file}")
214: 
215:       guestfs.sh("/bin/chmod +x #{motd_file}")
216:       guestfs.sh("/sbin/chkconfig --add motd")
217:       @log.debug "'/etc/motd' is nice now."
218:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 175
175:     def use_labels_for_partitions(guestfs)
176:       device = guestfs.list_devices.first
177: 
178:       # /etc/fstab
179:       if fstab = guestfs.read_file('/etc/fstab').gsub!(/^(\/dev\/sda.)/) { |path| "LABEL=#{read_label(guestfs, path.gsub('/dev/sda', device))}" }
180:         guestfs.write_file('/etc/fstab', fstab, 0)
181:       end
182: 
183:       # /boot/grub/grub.conf
184:       if grub = guestfs.read_file('/boot/grub/grub.conf').gsub!(/(\/dev\/sda.)/) { |path| "LABEL=#{read_label(guestfs, path.gsub('/dev/sda', device))}" }
185:         guestfs.write_file('/boot/grub/grub.conf', grub, 0)
186:       end
187:     end

[Source]

     # File lib/boxgrinder-build/plugins/os/rpm-based/rpm-based-os-plugin.rb, line 175
175:     def use_labels_for_partitions(guestfs)
176:       device = guestfs.list_devices.first
177: 
178:       # /etc/fstab
179:       if fstab = guestfs.read_file('/etc/fstab').gsub!(/^(\/dev\/sda.)/) { |path| "LABEL=#{read_label(guestfs, path.gsub('/dev/sda', device))}" }
180:         guestfs.write_file('/etc/fstab', fstab, 0)
181:       end
182: 
183:       # /boot/grub/grub.conf
184:       if grub = guestfs.read_file('/boot/grub/grub.conf').gsub!(/(\/dev\/sda.)/) { |path| "LABEL=#{read_label(guestfs, path.gsub('/dev/sda', device))}" }
185:         guestfs.write_file('/boot/grub/grub.conf', grub, 0)
186:       end
187:     end

[Validate]