]> git.openstreetmap.org Git - chef.git/blobdiff - cookbooks/hardware/recipes/default.rb
Don't try and monitor spun down hot spare disks
[chef.git] / cookbooks / hardware / recipes / default.rb
index a0ee58485bc0406d6c1f79d73d991af3852784e5..914ff6d73e183c73bb958d5d41d92f2e27f626ae 100644 (file)
@@ -204,13 +204,13 @@ node[:kernel][:modules].each_key do |modname|
 end
 
 node[:block_device].each do |name, attributes|
-  if attributes[:vendor] == "HP" && attributes[:model] == "LOGICAL VOLUME"
-    if name =~ /^cciss!(c[0-9]+)d[0-9]+$/
-      status_packages["cciss-vol-status"] |= ["cciss/#{Regexp.last_match[1]}d0"]
-    else
-      Dir.glob("/sys/block/#{name}/device/scsi_generic/*").each do |sg|
-        status_packages["cciss-vol-status"] |= [File.basename(sg)]
-      end
+  next unless attributes[:vendor] == "HP" && attributes[:model] == "LOGICAL VOLUME"
+
+  if name =~ /^cciss!(c[0-9]+)d[0-9]+$/
+    status_packages["cciss-vol-status"] |= ["cciss/#{Regexp.last_match[1]}d0"]
+  else
+    Dir.glob("/sys/block/#{name}/device/scsi_generic/*").each do |sg|
+      status_packages["cciss-vol-status"] |= [File.basename(sg)]
     end
   end
 end
@@ -253,6 +253,84 @@ end
   end
 end
 
+disks = []
+
+node[:block_device].each do |name, attributes|
+  disks << { :device => name } if attributes[:vendor] == "ATA"
+end
+
+if status_packages["cciss-vol-status"]
+  status_packages["cciss-vol-status"].each do |device|
+    IO.popen(["cciss_vol_status", "-V", "/dev/#{device}"]).each do |line|
+      disks << { :device => device, :driver => "cciss", :id => Regexp.last_match[1].to_i - 1 } if line =~ / bay ([0-9]+) +HP /
+    end
+  end
+end
+
+if status_packages["megaclisas-status"]
+  controller = 0
+
+  Dir.glob("/sys/class/scsi_host/host*") do |host|
+    driver = File.new("#{host}/proc_name").read.chomp
+
+    next unless driver == "megaraid_sas"
+
+    bus = host.sub("/sys/class/scsi_host/host", "")
+    device = File.basename(Dir.glob("/sys/bus/scsi/devices/#{bus}:*/scsi_generic/*").first)
+
+    IO.popen(["megacli", "-PDList", "-a#{controller}", "-NoLog"]).each do |line|
+      disks << { :device => device, :driver => "megaraid",  :id => Regexp.last_match[1] } if line =~ /^Device Id: ([0-9]+)$/
+
+      disks.pop if line =~ /^Firmware state: Hotspare, Spun down$/
+    end
+
+    controller += 1
+  end
+end
+
+if status_packages["sas2ircu-status"]
+  Dir.glob("/sys/class/scsi_host/host*") do |host|
+    driver = File.new("#{host}/proc_name").read.chomp
+
+    next unless driver == "mpt2sas"
+
+    bus = host.sub("/sys/class/scsi_host/host", "")
+
+    Dir.glob("/sys/bus/scsi/devices/#{bus}:0:*/scsi_generic/*").each do |sg|
+      disks << { :device => File.basename(sg) }
+    end
+  end
+end
+
+if disks.count > 0
+  package "smartmontools"
+
+  template "/etc/smartd.conf" do
+    source "smartd.conf.erb"
+    owner "root"
+    group "root"
+    mode 0644
+    variables :disks => disks
+    notifies :reload, "service[smartmontools]"
+  end
+
+  template "/etc/default/smartmontools" do
+    source "smartmontools.erb"
+    owner "root"
+    group "root"
+    mode 0644
+    notifies :restart, "service[smartmontools]"
+  end
+
+  service "smartmontools" do
+    action [:enable, :start]
+  end
+else
+  service "smartmontools" do
+    action [:stop, :disable]
+  end
+end
+
 if File.exist?("/etc/mdadm/mdadm.conf")
   mdadm_conf = edit_file "/etc/mdadm/mdadm.conf" do |line|
     line.gsub!(/^MAILADDR .*$/, "MAILADDR admins@openstreetmap.org")