Class BoxGrinder::EC2Plugin
In: lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb
lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb
Parent: BasePlugin

Methods

Public Instance methods

issues.jboss.org/browse/BGBUILD-110

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 200
200:     def add_ec2_user(guestfs)
201:       @log.debug "Adding ec2-user user..."
202:       guestfs.sh("useradd ec2-user")
203:       guestfs.sh("echo -e 'ec2-user\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers")
204:       @log.debug "User ec2-user added."
205:     end

issues.jboss.org/browse/BGBUILD-110

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 200
200:     def add_ec2_user(guestfs)
201:       @log.debug "Adding ec2-user user..."
202:       guestfs.sh("useradd ec2-user")
203:       guestfs.sh("echo -e 'ec2-user\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers")
204:       @log.debug "User ec2-user added."
205:     end

[Source]

    # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 25
25:     def after_init
26:       register_deliverable(:disk => "#{@appliance_config.name}.ec2")
27: 
28:       register_supported_os('fedora', ['13', '14', '15'])
29:       register_supported_os('centos', ['5'])
30:       register_supported_os('rhel', ['5', '6'])
31:     end

[Source]

    # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 25
25:     def after_init
26:       register_deliverable(:disk => "#{@appliance_config.name}.ec2")
27: 
28:       register_supported_os('fedora', ['13', '14', '15'])
29:       register_supported_os('centos', ['5'])
30:       register_supported_os('rhel', ['5', '6'])
31:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 227
227:     def change_configuration(guestfs_helper)
228:       guestfs_helper.augeas do
229:         # disable password authentication
230:         set("/etc/ssh/sshd_config", "PasswordAuthentication", "no")
231: 
232:         # disable root login
233:         set("/etc/ssh/sshd_config", "PermitRootLogin", "no")
234:       end
235:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 227
227:     def change_configuration(guestfs_helper)
228:       guestfs_helper.augeas do
229:         # disable password authentication
230:         set("/etc/ssh/sshd_config", "PasswordAuthentication", "no")
231: 
232:         # disable root login
233:         set("/etc/ssh/sshd_config", "PermitRootLogin", "no")
234:       end
235:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 136
136:     def create_devices(guestfs)
137:       return if guestfs.exists('/sbin/MAKEDEV') == 0
138: 
139:       @log.debug "Creating required devices..."
140:       guestfs.sh("/sbin/MAKEDEV -d /dev -x console")
141:       guestfs.sh("/sbin/MAKEDEV -d /dev -x null")
142:       guestfs.sh("/sbin/MAKEDEV -d /dev -x zero")
143:       @log.debug "Devices created."
144:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 136
136:     def create_devices(guestfs)
137:       return if guestfs.exists('/sbin/MAKEDEV') == 0
138: 
139:       @log.debug "Creating required devices..."
140:       guestfs.sh("/sbin/MAKEDEV -d /dev -x console")
141:       guestfs.sh("/sbin/MAKEDEV -d /dev -x null")
142:       guestfs.sh("/sbin/MAKEDEV -d /dev -x zero")
143:       @log.debug "Devices created."
144:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 108
108:     def create_ec2_disk
109:       begin
110:         # TODO using whole 10GB is fine?
111:         @image_helper.create_disk(@deliverables.disk, 10)
112:         @image_helper.create_filesystem(@deliverables.disk)
113:       rescue => e
114:         @log.error e
115:         raise "Error while preparing EC2 disk image. See logs for more info."
116:       end
117:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 108
108:     def create_ec2_disk
109:       begin
110:         # TODO using whole 10GB is fine?
111:         @image_helper.create_disk(@deliverables.disk, 10)
112:         @image_helper.create_filesystem(@deliverables.disk)
113:       rescue => e
114:         @log.error e
115:         raise "Error while preparing EC2 disk image. See logs for more info."
116:       end
117:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 146
146:     def disk_device_prefix
147:       disk = 'xv'
148:       disk = 's' if (@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5'
149: 
150:       disk
151:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 146
146:     def disk_device_prefix
147:       disk = 'xv'
148:       disk = 's' if (@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5'
149: 
150:       disk
151:     end

enable networking on default runlevels

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 208
208:     def enable_networking(guestfs)
209:       @log.debug "Enabling networking..."
210:       guestfs.sh("/sbin/chkconfig network on")
211:       guestfs.upload("#{File.dirname(__FILE__)}/src/ifcfg-eth0", "/etc/sysconfig/network-scripts/ifcfg-eth0")
212:       @log.debug "Networking enabled."
213:     end

enable networking on default runlevels

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 208
208:     def enable_networking(guestfs)
209:       @log.debug "Enabling networking..."
210:       guestfs.sh("/sbin/chkconfig network on")
211:       guestfs.upload("#{File.dirname(__FILE__)}/src/ifcfg-eth0", "/etc/sysconfig/network-scripts/ifcfg-eth0")
212:       @log.debug "Networking enabled."
213:     end

This fixes issues with Fedora 14 on EC2: bugzilla.redhat.com/show_bug.cgi?id=651861#c39

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 192
192:     def enable_nosegneg_flag(guestfs)
193:       @log.debug "Enabling nosegneg flag..."
194:       guestfs.sh("echo \"hwcap 1 nosegneg\" > /etc/ld.so.conf.d/libc6-xen.conf")
195:       guestfs.sh("/sbin/ldconfig")
196:       @log.debug "Nosegneg enabled."
197:     end

This fixes issues with Fedora 14 on EC2: bugzilla.redhat.com/show_bug.cgi?id=651861#c39

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 192
192:     def enable_nosegneg_flag(guestfs)
193:       @log.debug "Enabling nosegneg flag..."
194:       guestfs.sh("echo \"hwcap 1 nosegneg\" > /etc/ld.so.conf.d/libc6-xen.conf")
195:       guestfs.sh("/sbin/ldconfig")
196:       @log.debug "Nosegneg enabled."
197:     end

[Source]

    # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 33
33:     def execute
34:       @linux_helper = LinuxHelper.new(:log => @log)
35: 
36:       @log.info "Converting #{@appliance_config.name} appliance image to EC2 format..."
37: 
38:       create_ec2_disk
39:       sync_files
40: 
41:       @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper|
42:         if (@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5'
43:           # Not sure why it's messed but this prevents booting on AWS
44:           recreate_journal(guestfs)
45: 
46:           # Remove normal kernel
47:           guestfs.sh("yum -y remove kernel")
48:           # because we need to install kernel-xen package
49:           guestfs.sh("yum -y install kernel-xen")
50:           # and add require modules
51:           @linux_helper.recreate_kernel_image(guestfs, ['xenblk', 'xennet'])
52:         end
53: 
54:         # TODO is this really needed?
55:         @log.debug "Uploading '/etc/resolv.conf'..."
56:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
57:         @log.debug "'/etc/resolv.conf' uploaded."
58: 
59:         create_devices(guestfs)
60: 
61:         guestfs.mkdir("/data") if @appliance_config.is64bit?
62: 
63:         upload_fstab(guestfs)
64:         enable_networking(guestfs)
65:         upload_rc_local(guestfs)
66:         add_ec2_user(guestfs)
67:         change_configuration(guestfs_helper)
68:         install_menu_lst(guestfs)
69: 
70:         enable_nosegneg_flag(guestfs) if @appliance_config.os.name == 'fedora'
71: 
72:         execute_post(guestfs_helper)
73:       end
74: 
75:       @log.info "Image converted to EC2 format."
76:     end

[Source]

    # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 33
33:     def execute
34:       @linux_helper = LinuxHelper.new(:log => @log)
35: 
36:       @log.info "Converting #{@appliance_config.name} appliance image to EC2 format..."
37: 
38:       create_ec2_disk
39:       sync_files
40: 
41:       @image_helper.customize(@deliverables.disk) do |guestfs, guestfs_helper|
42:         if (@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5'
43:           # Not sure why it's messed but this prevents booting on AWS
44:           recreate_journal(guestfs)
45: 
46:           # Remove normal kernel
47:           guestfs.sh("yum -y remove kernel")
48:           # because we need to install kernel-xen package
49:           guestfs.sh("yum -y install kernel-xen")
50:           # and add require modules
51:           @linux_helper.recreate_kernel_image(guestfs, ['xenblk', 'xennet'])
52:         end
53: 
54:         # TODO is this really needed?
55:         @log.debug "Uploading '/etc/resolv.conf'..."
56:         guestfs.upload("/etc/resolv.conf", "/etc/resolv.conf")
57:         @log.debug "'/etc/resolv.conf' uploaded."
58: 
59:         create_devices(guestfs)
60: 
61:         guestfs.mkdir("/data") if @appliance_config.is64bit?
62: 
63:         upload_fstab(guestfs)
64:         enable_networking(guestfs)
65:         upload_rc_local(guestfs)
66:         add_ec2_user(guestfs)
67:         change_configuration(guestfs_helper)
68:         install_menu_lst(guestfs)
69: 
70:         enable_nosegneg_flag(guestfs) if @appliance_config.os.name == 'fedora'
71: 
72:         execute_post(guestfs_helper)
73:       end
74: 
75:       @log.info "Image converted to EC2 format."
76:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 119
119:     def execute_post(guestfs_helper)
120:       unless @appliance_config.post['ec2'].nil?
121:         @appliance_config.post['ec2'].each do |cmd|
122:           guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
123:         end
124:         @log.debug "Post commands from appliance definition file executed."
125:       else
126:         @log.debug "No commands specified, skipping."
127:       end
128:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 119
119:     def execute_post(guestfs_helper)
120:       unless @appliance_config.post['ec2'].nil?
121:         @appliance_config.post['ec2'].each do |cmd|
122:           guestfs_helper.sh(cmd, :arch => @appliance_config.hardware.arch)
123:         end
124:         @log.debug "Post commands from appliance definition file executed."
125:       else
126:         @log.debug "No commands specified, skipping."
127:       end
128:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 173
173:     def install_menu_lst(guestfs)
174:       @log.debug "Uploading '/boot/grub/menu.lst' file..."
175:       menu_lst_data = File.open("#{File.dirname(__FILE__)}/src/menu.lst").read
176: 
177:       menu_lst_data.gsub!(/#TITLE#/, @appliance_config.name)
178:       menu_lst_data.gsub!(/#KERNEL_VERSION#/, @linux_helper.kernel_version(guestfs))
179:       menu_lst_data.gsub!(/#KERNEL_IMAGE_NAME#/, @linux_helper.kernel_image_name(guestfs))
180: 
181:       menu_lst = Tempfile.new('menu_lst')
182:       menu_lst << menu_lst_data
183:       menu_lst.flush
184: 
185:       guestfs.upload(menu_lst.path, "/boot/grub/menu.lst")
186: 
187:       menu_lst.close
188:       @log.debug "'/boot/grub/menu.lst' file uploaded."
189:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 173
173:     def install_menu_lst(guestfs)
174:       @log.debug "Uploading '/boot/grub/menu.lst' file..."
175:       menu_lst_data = File.open("#{File.dirname(__FILE__)}/src/menu.lst").read
176: 
177:       menu_lst_data.gsub!(/#TITLE#/, @appliance_config.name)
178:       menu_lst_data.gsub!(/#KERNEL_VERSION#/, @linux_helper.kernel_version(guestfs))
179:       menu_lst_data.gsub!(/#KERNEL_IMAGE_NAME#/, @linux_helper.kernel_image_name(guestfs))
180: 
181:       menu_lst = Tempfile.new('menu_lst')
182:       menu_lst << menu_lst_data
183:       menu_lst.flush
184: 
185:       guestfs.upload(menu_lst.path, "/boot/grub/menu.lst")
186: 
187:       menu_lst.close
188:       @log.debug "'/boot/grub/menu.lst' file uploaded."
189:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 130
130:     def recreate_journal(guestfs)
131:       @log.debug "Recreating EXT3 journal on root partition."
132:       guestfs.sh("tune2fs -j #{guestfs.list_devices.first}")
133:       @log.debug "Journal recreated."
134:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 130
130:     def recreate_journal(guestfs)
131:       @log.debug "Recreating EXT3 journal on root partition."
132:       guestfs.sh("tune2fs -j #{guestfs.list_devices.first}")
133:       @log.debug "Journal recreated."
134:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 78
 78:     def sync_files
 79:       ec2_disk_mount_dir = "#{@dir.tmp}/ec2-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 80:       raw_disk_mount_dir = "#{@dir.tmp}/raw-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 81: 
 82:       tmp_disk = "#{@dir.tmp}/#{@appliance_config.name}.raw"
 83: 
 84:       @log.debug "Conveting disk to RAW format..."
 85:       @image_helper.convert_disk(@previous_deliverables.disk, 'raw', tmp_disk)
 86: 
 87:       begin
 88:         ec2_mounts = @image_helper.mount_image(@deliverables.disk, ec2_disk_mount_dir)
 89:         raw_mounts = @image_helper.mount_image(tmp_disk, raw_disk_mount_dir)
 90:       rescue => e
 91:         @log.error e
 92:         @log.error "Mouting failed, trying to clean up."
 93: 
 94:         @image_helper.umount_image(tmp_disk, raw_disk_mount_dir, raw_mounts) unless raw_mounts.nil?
 95:         @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts) unless ec2_mounts.nil?
 96: 
 97:         raise "Error while mounting image. See logs for more info."
 98:       end
 99: 
100:       @image_helper.sync_files(raw_disk_mount_dir, ec2_disk_mount_dir)
101: 
102:       @image_helper.umount_image(tmp_disk, raw_disk_mount_dir, raw_mounts)
103:       @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts)
104: 
105:       FileUtils.rm_rf tmp_disk
106:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 78
 78:     def sync_files
 79:       ec2_disk_mount_dir = "#{@dir.tmp}/ec2-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 80:       raw_disk_mount_dir = "#{@dir.tmp}/raw-#{rand(9999999999).to_s.center(10, rand(9).to_s)}"
 81: 
 82:       tmp_disk = "#{@dir.tmp}/#{@appliance_config.name}.raw"
 83: 
 84:       @log.debug "Conveting disk to RAW format..."
 85:       @image_helper.convert_disk(@previous_deliverables.disk, 'raw', tmp_disk)
 86: 
 87:       begin
 88:         ec2_mounts = @image_helper.mount_image(@deliverables.disk, ec2_disk_mount_dir)
 89:         raw_mounts = @image_helper.mount_image(tmp_disk, raw_disk_mount_dir)
 90:       rescue => e
 91:         @log.error e
 92:         @log.error "Mouting failed, trying to clean up."
 93: 
 94:         @image_helper.umount_image(tmp_disk, raw_disk_mount_dir, raw_mounts) unless raw_mounts.nil?
 95:         @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts) unless ec2_mounts.nil?
 96: 
 97:         raise "Error while mounting image. See logs for more info."
 98:       end
 99: 
100:       @image_helper.sync_files(raw_disk_mount_dir, ec2_disk_mount_dir)
101: 
102:       @image_helper.umount_image(tmp_disk, raw_disk_mount_dir, raw_mounts)
103:       @image_helper.umount_image(@deliverables.disk, ec2_disk_mount_dir, ec2_mounts)
104: 
105:       FileUtils.rm_rf tmp_disk
106:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 153
153:     def upload_fstab(guestfs)
154:       @log.debug "Uploading '/etc/fstab' file..."
155: 
156:       fstab_file = @appliance_config.is64bit? ? "#{File.dirname(__FILE__)}/src/fstab_64bit" : "#{File.dirname(__FILE__)}/src/fstab_32bit"
157: 
158:       fstab_data = File.open(fstab_file).read
159:       fstab_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
160:       fstab_data.gsub!(/#FILESYSTEM_TYPE#/, @appliance_config.hardware.partitions['/']['type'])
161: 
162:       fstab = Tempfile.new('fstab')
163:       fstab << fstab_data
164:       fstab.flush
165: 
166:       guestfs.upload(fstab.path, "/etc/fstab")
167: 
168:       fstab.close
169: 
170:       @log.debug "'/etc/fstab' file uploaded."
171:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 153
153:     def upload_fstab(guestfs)
154:       @log.debug "Uploading '/etc/fstab' file..."
155: 
156:       fstab_file = @appliance_config.is64bit? ? "#{File.dirname(__FILE__)}/src/fstab_64bit" : "#{File.dirname(__FILE__)}/src/fstab_32bit"
157: 
158:       fstab_data = File.open(fstab_file).read
159:       fstab_data.gsub!(/#DISK_DEVICE_PREFIX#/, disk_device_prefix)
160:       fstab_data.gsub!(/#FILESYSTEM_TYPE#/, @appliance_config.hardware.partitions['/']['type'])
161: 
162:       fstab = Tempfile.new('fstab')
163:       fstab << fstab_data
164:       fstab.flush
165: 
166:       guestfs.upload(fstab.path, "/etc/fstab")
167: 
168:       fstab.close
169: 
170:       @log.debug "'/etc/fstab' file uploaded."
171:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 215
215:     def upload_rc_local(guestfs)
216:       @log.debug "Uploading '/etc/rc.local' file..."
217:       rc_local = Tempfile.new('rc_local')
218:       rc_local << guestfs.read_file("/etc/rc.local") + File.read("#{File.dirname(__FILE__)}/src/rc_local")
219:       rc_local.flush
220: 
221:       guestfs.upload(rc_local.path, "/etc/rc.local")
222: 
223:       rc_local.close
224:       @log.debug "'/etc/rc.local' file uploaded."
225:     end

[Source]

     # File lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb, line 215
215:     def upload_rc_local(guestfs)
216:       @log.debug "Uploading '/etc/rc.local' file..."
217:       rc_local = Tempfile.new('rc_local')
218:       rc_local << guestfs.read_file("/etc/rc.local") + File.read("#{File.dirname(__FILE__)}/src/rc_local")
219:       rc_local.flush
220: 
221:       guestfs.upload(rc_local.path, "/etc/rc.local")
222: 
223:       rc_local.close
224:       @log.debug "'/etc/rc.local' file uploaded."
225:     end

[Validate]