More stronger way to detect physical data storage devices

Change-Id: I2cc09f3b2766edd9351c0df1c6d7a41385db5bbc
This commit is contained in:
Vladimir Sharshov 2013-10-18 16:44:02 +04:00
parent afe704e3ba
commit bca2600210
1 changed files with 27 additions and 1 deletions

View File

@ -224,7 +224,7 @@ class NodeAgent
begin
(@os[:block_device] or {} rescue {}).each do |bname, binfo|
if /^(sd|vd|hd|cciss|xvd).+$/ =~ bname and binfo
if physical_data_storage_devices.include?(bname) && binfo
dname = bname.gsub(/!/, '/')
# 512 bytes is the size of one sector by default
block_size = 512
@ -252,6 +252,32 @@ class NodeAgent
basepath.split("/")[2..-1].join("/") if basepath
end
def physical_data_storage_devices
@blocks ||= []
return @blocks unless @blocks.empty?
raise "Path /sys/block does not exist" unless File.exists?("/sys/block")
Dir["/sys/block/*"].each do |block_device_dir|
basename_dir = File.basename(block_device_dir)
properties = `udevadm info --query=property --export --name=#{basename_dir}`.inject({}) do |result, raw_propety|
key, value = raw_propety.split(/\=/)
result.update(key.strip => value.strip.chomp("'").reverse.chomp("'").reverse)
end
if File.exists?("/sys/block/#{basename_dir}/removable")
removable = File.open("/sys/block/#{basename_dir}/removable"){ |f| f.read_nonblock(1024).strip }
end
# look at https://github.com/torvalds/linux/blob/master/Documentation/devices.txt
if [3, 8, 202, 252].include?(properties['MAJOR'].to_i) && removable =~ /^0$/
# Ubuntu set major for lvm volumes(dm-*) as 252 (CentOS - 263). Use additional check.
@blocks << basename_dir unless properties['DEVPATH'].include?('virtual')
end
end
@blocks
end
def _is_virtualbox
@os[:dmi][:system][:product_name] == "VirtualBox" rescue false
end