From bca260021014ef44dd995bde1a119602093d5938 Mon Sep 17 00:00:00 2001 From: Vladimir Sharshov Date: Fri, 18 Oct 2013 16:44:02 +0400 Subject: [PATCH] More stronger way to detect physical data storage devices Change-Id: I2cc09f3b2766edd9351c0df1c6d7a41385db5bbc --- bin/agent | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/bin/agent b/bin/agent index 4ebc796c34..9b7c49d4ce 100755 --- a/bin/agent +++ b/bin/agent @@ -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