Class BoxGrinder::ImageHelper
In: lib/boxgrinder-build/helpers/image-helper.rb
lib/boxgrinder-build/helpers/image-helper.rb
Parent: Object

Methods

Public Class methods

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 25
25:     def initialize(config, appliance_config, options = {})
26:       @config = config
27:       @appliance_config = appliance_config
28: 
29:       @log = options[:log] || LogHelper.new
30:       @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
31:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 25
25:     def initialize(config, appliance_config, options = {})
26:       @config = config
27:       @appliance_config = appliance_config
28: 
29:       @log = options[:log] || LogHelper.new
30:       @exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
31:     end

Public Instance methods

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 113
113:     def calculate_disk_offsets(disk)
114:       @log.debug "Calculating offsets for '#{File.basename(disk)}' disk..."
115:       loop_device = get_loop_device
116: 
117:       @exec_helper.execute("losetup #{loop_device} '#{disk}'")
118:       offsets = @exec_helper.execute("parted #{loop_device} 'unit B print' | grep -e '^ [0-9]' | awk '{ print $2 }'").scan(/\d+/)
119:       # wait one secont before freeing loop device
120:       sleep 1
121:       @exec_helper.execute("losetup -d #{loop_device}")
122: 
123:       @log.trace "Offsets:\n#{offsets}"
124: 
125:       offsets
126:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 113
113:     def calculate_disk_offsets(disk)
114:       @log.debug "Calculating offsets for '#{File.basename(disk)}' disk..."
115:       loop_device = get_loop_device
116: 
117:       @exec_helper.execute("losetup #{loop_device} '#{disk}'")
118:       offsets = @exec_helper.execute("parted #{loop_device} 'unit B print' | grep -e '^ [0-9]' | awk '{ print $2 }'").scan(/\d+/)
119:       # wait one secont before freeing loop device
120:       sleep 1
121:       @exec_helper.execute("losetup -d #{loop_device}")
122: 
123:       @log.trace "Offsets:\n#{offsets}"
124: 
125:       offsets
126:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 80
 80:     def convert_disk(disk, format, destination)
 81:       @log.debug "Conveting '#{disk}' disk to #{format} format and moving it to '#{destination}'..."
 82: 
 83:       unless File.exists?(destination)
 84:         info = disk_info(disk)
 85: 
 86:         if info['file format'] == format.to_s
 87:           @exec_helper.execute "cp '#{disk}' '#{destination}'"
 88:         else
 89: 
 90:           format_with_options = format.to_s
 91: 
 92:           if format == :vmdk
 93:             format_with_options += (`qemu-img --help | grep '\\-6'`.strip.chomp.empty? ? ' -o compat6' : ' -6')
 94:           end
 95: 
 96:           @exec_helper.execute "qemu-img convert -f #{info['file format']} -O #{format_with_options} '#{disk}' '#{destination}'"
 97:         end
 98:       else
 99:         @log.debug "Destination already exists, skipping disk conversion."
100:       end
101:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 80
 80:     def convert_disk(disk, format, destination)
 81:       @log.debug "Conveting '#{disk}' disk to #{format} format and moving it to '#{destination}'..."
 82: 
 83:       unless File.exists?(destination)
 84:         info = disk_info(disk)
 85: 
 86:         if info['file format'] == format.to_s
 87:           @exec_helper.execute "cp '#{disk}' '#{destination}'"
 88:         else
 89: 
 90:           format_with_options = format.to_s
 91: 
 92:           if format == :vmdk
 93:             format_with_options += (`qemu-img --help | grep '\\-6'`.strip.chomp.empty? ? ' -o compat6' : ' -6')
 94:           end
 95: 
 96:           @exec_helper.execute "qemu-img convert -f #{info['file format']} -O #{format_with_options} '#{disk}' '#{destination}'"
 97:         end
 98:       else
 99:         @log.debug "Destination already exists, skipping disk conversion."
100:       end
101:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 128
128:     def create_disk(disk, size)
129:       @log.trace "Preparing disk..."
130:       @exec_helper.execute "dd if=/dev/zero of='#{disk}' bs=1 count=0 seek=#{size * 1024}M"
131:       @log.trace "Disk prepared"
132:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 128
128:     def create_disk(disk, size)
129:       @log.trace "Preparing disk..."
130:       @exec_helper.execute "dd if=/dev/zero of='#{disk}' bs=1 count=0 seek=#{size * 1024}M"
131:       @log.trace "Disk prepared"
132:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 134
134:     def create_filesystem(loop_device, options = {})
135:       options = {
136:           :type => @appliance_config.hardware.partitions['/']['type'],
137:           :label => '/'
138:       }.merge(options)
139: 
140:       @log.trace "Creating filesystem..."
141: 
142:       case options[:type]
143:         when 'ext3', 'ext4'
144:           @exec_helper.execute "mke2fs -T #{options[:type]} -L '#{options[:label]}' -F #{loop_device}"
145:         else
146:           raise "Unsupported filesystem specified: #{options[:type]}"
147:       end
148: 
149:       @log.trace "Filesystem created"
150:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 134
134:     def create_filesystem(loop_device, options = {})
135:       options = {
136:           :type => @appliance_config.hardware.partitions['/']['type'],
137:           :label => '/'
138:       }.merge(options)
139: 
140:       @log.trace "Creating filesystem..."
141: 
142:       case options[:type]
143:         when 'ext3', 'ext4'
144:           @exec_helper.execute "mke2fs -T #{options[:type]} -L '#{options[:label]}' -F #{loop_device}"
145:         else
146:           raise "Unsupported filesystem specified: #{options[:type]}"
147:       end
148: 
149:       @log.trace "Filesystem created"
150:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 158
158:     def customize(disk_path)
159:       GuestFSHelper.new(disk_path, :log => @log).customize(:ide_disk => ((@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5') ? true : false) do |guestfs, guestfs_helper|
160:         yield guestfs, guestfs_helper
161:       end
162:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 158
158:     def customize(disk_path)
159:       GuestFSHelper.new(disk_path, :log => @log).customize(:ide_disk => ((@appliance_config.os.name == 'rhel' or @appliance_config.os.name == 'centos') and @appliance_config.os.version == '5') ? true : false) do |guestfs, guestfs_helper|
160:         yield guestfs, guestfs_helper
161:       end
162:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 76
76:     def disk_info(disk)
77:       YAML.load(@exec_helper.execute("qemu-img info '#{disk}'"))
78:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 76
76:     def disk_info(disk)
77:       YAML.load(@exec_helper.execute("qemu-img info '#{disk}'"))
78:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 103
103:     def get_loop_device
104:       begin
105:         loop_device = @exec_helper.execute("losetup -f 2>&1").strip
106:       rescue
107:         raise "No free loop devices available, please free at least one. See 'losetup -d' command."
108:       end
109: 
110:       loop_device
111:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 103
103:     def get_loop_device
104:       begin
105:         loop_device = @exec_helper.execute("losetup -f 2>&1").strip
106:       rescue
107:         raise "No free loop devices available, please free at least one. See 'losetup -d' command."
108:       end
109: 
110:       loop_device
111:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 33
33:     def mount_image(disk, mount_dir)
34:       offsets = calculate_disk_offsets(disk)
35: 
36:       @log.debug "Mounting image #{File.basename(disk)} in #{mount_dir}..."
37:       FileUtils.mkdir_p(mount_dir)
38: 
39:       mounts = {}
40: 
41:       offsets.each do |offset|
42:         loop_device = get_loop_device
43:         @exec_helper.execute("losetup -o #{offset.to_s} #{loop_device} '#{disk}'")
44:         label = @exec_helper.execute("e2label #{loop_device}").strip.chomp.gsub('_', '')
45:         label = '/' if label == ''
46:         mounts[label] = loop_device
47:       end
48: 
49:       @exec_helper.execute("mount #{mounts['/']} '#{mount_dir}'")
50: 
51:       mounts.reject { |key, value| key == '/' }.each do |mount_point, loop_device|
52:         @exec_helper.execute("mount #{loop_device} '#{mount_dir}#{mount_point}'")
53:       end
54: 
55:       # Give some time to mount the images
56:       sleep 2
57: 
58:       @log.trace "Mounts:\n#{mounts}"
59: 
60:       mounts
61:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 33
33:     def mount_image(disk, mount_dir)
34:       offsets = calculate_disk_offsets(disk)
35: 
36:       @log.debug "Mounting image #{File.basename(disk)} in #{mount_dir}..."
37:       FileUtils.mkdir_p(mount_dir)
38: 
39:       mounts = {}
40: 
41:       offsets.each do |offset|
42:         loop_device = get_loop_device
43:         @exec_helper.execute("losetup -o #{offset.to_s} #{loop_device} '#{disk}'")
44:         label = @exec_helper.execute("e2label #{loop_device}").strip.chomp.gsub('_', '')
45:         label = '/' if label == ''
46:         mounts[label] = loop_device
47:       end
48: 
49:       @exec_helper.execute("mount #{mounts['/']} '#{mount_dir}'")
50: 
51:       mounts.reject { |key, value| key == '/' }.each do |mount_point, loop_device|
52:         @exec_helper.execute("mount #{loop_device} '#{mount_dir}#{mount_point}'")
53:       end
54: 
55:       # Give some time to mount the images
56:       sleep 2
57: 
58:       @log.trace "Mounts:\n#{mounts}"
59: 
60:       mounts
61:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 152
152:     def sync_files(from_dir, to_dir)
153:       @log.debug "Syncing files between #{from_dir} and #{to_dir}..."
154:       @exec_helper.execute "rsync -Xura #{from_dir.gsub(' ', '\ ')}/* '#{to_dir}'"
155:       @log.debug "Sync finished."
156:     end

[Source]

     # File lib/boxgrinder-build/helpers/image-helper.rb, line 152
152:     def sync_files(from_dir, to_dir)
153:       @log.debug "Syncing files between #{from_dir} and #{to_dir}..."
154:       @exec_helper.execute "rsync -Xura #{from_dir.gsub(' ', '\ ')}/* '#{to_dir}'"
155:       @log.debug "Sync finished."
156:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 63
63:     def umount_image(disk, mount_dir, mounts)
64:       @log.debug "Unmounting image '#{File.basename(disk)}'..."
65: 
66:       mounts.each { |mount_point, loop_device| @exec_helper.execute("umount -d #{loop_device}") unless mount_point == '/' }
67: 
68:       @exec_helper.execute("umount -d #{mounts['/']}")
69: 
70:       # Give some time to umount the image
71:       sleep 2
72: 
73:       FileUtils.rm_rf(mount_dir)
74:     end

[Source]

    # File lib/boxgrinder-build/helpers/image-helper.rb, line 63
63:     def umount_image(disk, mount_dir, mounts)
64:       @log.debug "Unmounting image '#{File.basename(disk)}'..."
65: 
66:       mounts.each { |mount_point, loop_device| @exec_helper.execute("umount -d #{loop_device}") unless mount_point == '/' }
67: 
68:       @exec_helper.execute("umount -d #{mounts['/']}")
69: 
70:       # Give some time to umount the image
71:       sleep 2
72: 
73:       FileUtils.rm_rf(mount_dir)
74:     end

[Validate]