+ def find_md_arrays(devices)
+ File.new("/proc/mdstat", "r").each do |line|
+ next unless line =~ /^(md\d+) : active raid(\d+)((?: [a-z]+\d+\[\d+\](?:\([A-Z]\))*)+)$/
+
+ array = {
+ :id => devices[:arrays].count,
+ :device => "/dev/#{Regexp.last_match(1)}",
+ :raid_level => Regexp.last_match(2),
+ :disks => []
+ }
+
+ Regexp.last_match(3).scan(/ ([a-z]+)\d+\[\d+\](?:\([A-Z]\))*/).flatten.each do |device|
+ if disk = devices[:disks].find { |d| d[:device] == "/dev/#{device}" }
+ disk[:arrays] << array[:id]
+ array[:disks] << disk[:id]
+ end
+ end
+
+ devices[:arrays] << array
+ end
+ end
+