cookbooks/mu-tools/resources/disk.rb
property :mountpoint, String, name_property: true
property :device, String, required: true
property :delete_on_termination, :kind_of => [TrueClass, FalseClass], default: true
property :preserve_data, :kind_of => [TrueClass, FalseClass], :required => false, :default => false
property :reboot_after_create, :kind_of => [TrueClass, FalseClass], :required => false, :default => false
property :swap, :kind_of => [TrueClass, FalseClass], :required => false, :default => false
property :size, Integer, default: 8
actions :create # ~FC092
default_action :create
action :create do
devicepath = new_resource.device
path = new_resource.mountpoint
devicename = devicepath.dup
if set_gcp_cfg_params
devicename= devicename.gsub(/.*?\//, "")
devicepath = "/dev/disk/by-id/google-"+devicename
end
mu_tools_mommacat_request "create #{devicepath} for #{path}" do
request "add_volume"
passparams(
:dev => devicename,
:size => new_resource.size,
:delete_on_termination => new_resource.delete_on_termination
)
not_if { ::File.exist?(real_devicepath(devicepath)) }
end
reboot "Rebooting after adding #{path}" do
action :nothing
end
fstype = if new_resource.swap
"swap"
else
node['platform_version'].to_i == 6 ? "ext4" : "xfs"
end
path = "swap" if new_resource.swap
mkfs_cmd = case fstype
when "xfs"
"mkfs.xfs -i size=512"
when "ext4"
"mkfs.ext4 -F"
when "swap"
"mkswap"
end
have_fs_cmd = case fstype
when "xfs"
"xfs_admin -l"
when "ext4"
"tune2fs -l"
when "swap"
"blkid"
end
ruby_block "format #{path} by its real device name" do
block do
guard_cmd = have_fs_cmd+" "+real_devicepath(devicepath)+" 2>&1 > /dev/null"
format_cmd = mkfs_cmd+" "+real_devicepath(devicepath)
shell_out(guard_cmd)
if $?.exitstatus != 0
puts "\n"+format_cmd
shell_out(format_cmd)
end
end
not_if "grep ' #{path} ' /etc/mtab"
end
ruby_block "mount #{path} by its real device name" do # ~FC014
block do
def sort_fstab(a, b)
a_dev, a_path, a_fs, a_opts, a_dump, a_fsck = a.chomp.split(/[\t\s]+/)
b_dev, b_path, b_fs, b_opts, b_dump, b_fsck = b.chomp.split(/[\t\s]+/)
if a =~ /^\s*[#\n]/ or b =~ /^\s*[#\n]/ or !a_path or !b_path
0
elsif a_path =~ /^#{Regexp.quote(b_path)}\//
1
elsif b_path =~ /^#{Regexp.quote(a_path)}\//
-1
else
0
end
end
dev_pattern = Regexp.quote(real_devicepath(devicepath))
uuid_line = uuid_line(devicepath)
uuid_line = nil if uuid_line.empty?
if uuid_line
dev_pattern = "("+dev_pattern+"|"+Regexp.quote(uuid_line)+")"
end
have_mtab = false
::File.read("/etc/mtab").each_line { |l|
if l =~ /^#{dev_pattern}\s+#{path}\s+#{fstype}\s+/
have_mtab = true
break
end
}
if !have_mtab and new_resource.preserve_data and path != "swap"
backupname = path.gsub(/[^a-z0-9]/i, "_")
puts "\nPreserving data from #{path}"
shell_out(%Q{mkdir -p /mnt#{backupname}})
shell_out(%Q{mount #{real_devicepath(devicepath)} /mnt#{backupname}})
shell_out(%Q{( cd #{path} && tar -cpf - . | su -c 'cd /mnt#{backupname}/ && tar -xpf -' ) && find #{path}/ -type f -exec rm -f {} \\;})
shell_out(%Q{umount /mnt#{backupname}})
end
have_fstab = false
fstab_lines = []
::File.read("/etc/fstab").each_line { |l|
fstab_lines << l.chomp
if l =~ /^#{dev_pattern}\s+#{path}\s+#{fstype}\s+/
have_fstab = true
break
end
}
if !have_fstab
fstabline = "#{uuid_line ? uuid_line : real_devicepath(devicepath)} #{path} #{fstype} #{new_resource.swap ? "defaults" : "nodev" } 0 #{new_resource.swap ? "0" : "2"}"
fstab_lines << fstabline
puts "\nAppending to /etc/fstab: #{fstabline}"
::File.open("/etc/fstab", "w") { |f|
fstab_lines.sort { |a, b| sort_fstab(a,b) }.uniq.each { |l|
f.puts l
}
}
end
if !new_resource.reboot_after_create and !new_resource.swap
shell_out(%Q{mkdir -p #{path}})
shell_out(%Q{/bin/mount -a})
shell_out(%Q{/sbin/restorecon -R #{path}})
end
end
not_if "grep ' #{path} ' /etc/mtab && grep ' #{path} ' /etc/fstab"
if new_resource.reboot_after_create
notifies :request_reboot, "reboot[Rebooting after adding #{path}]", :delayed
end
end
if new_resource.swap
execute "/sbin/swapon -a"
elsif !new_resource.reboot_after_create
execute "/sbin/restorecon -R #{path}" do
only_if { ::File.exist?("/sbin/restorecon") }
end
end
end