From: R.I.Pienaar <[email protected]>
Signed-off-by: R.I.Pienaar <[email protected]> --- lib/facter/diskdrives.rb | 40 ++++++++ lib/facter/util/diskdrives.rb | 214 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+), 0 deletions(-) create mode 100644 lib/facter/diskdrives.rb create mode 100644 lib/facter/util/diskdrives.rb diff --git a/lib/facter/diskdrives.rb b/lib/facter/diskdrives.rb new file mode 100644 index 0000000..90f66b4 --- /dev/null +++ b/lib/facter/diskdrives.rb @@ -0,0 +1,40 @@ +# diskdrives.rb +# Try to get additional Facts about the machine's disk drives + +require 'facter/util/diskdrives' + +Facter.add(:diskdrives) do + setcode do + Facter::Util::DiskDrives.get_drive_list.join(",") + end +end + +Facter::Util::DiskDrives.get_drive_sizes.each do |drive| + drive.each do |d, size| + Facter.add("disksize_#{d}") do + setcode do + size + end + end + end +end + +Facter::Util::DiskDrives.get_drive_types.each do |drive| + drive.each do |drive, type| + Facter.add("disktype_#{drive}") do + setcode do + type + end + end + end +end + +Facter::Util::DiskDrives.get_drive_models.each do |drive| + drive.each do |drive, model| + Facter.add("diskmodel_#{drive}") do + setcode do + model + end + end + end +end diff --git a/lib/facter/util/diskdrives.rb b/lib/facter/util/diskdrives.rb new file mode 100644 index 0000000..ba546aa --- /dev/null +++ b/lib/facter/util/diskdrives.rb @@ -0,0 +1,214 @@ +# A base module for collecting Disk Drive-related +# information from all kinds of platforms. +module Facter::Util::DiskDrives + # All the types of drives we know about + DRIVETYPES = ["xvd", "ide", "scsi"] + + # platforms we work on + def self.supported_platforms + [:linux] + end + + # fetch all known drive types and return a nice array + def self.get_drive_list + drivelist = [] + + DRIVETYPES.each do |t| + eval("drivelist << self.get_#{t}_list") + end + + drivelist.compact.flatten.sort + end + + # finds out the sizes for all known drives + def self.get_drive_sizes + sizes = [] + + DRIVETYPES.each do |t| + eval("sizes << self.get_#{t}_sizes") + end + + sizes.compact.flatten + end + + # finds out what type of drive each known drive is + def self.get_drive_types + drivetypes = [] + + DRIVETYPES.each do |t| + drivelist = [] + eval("drivelist << self.get_#{t}_list") + + drivelist.compact.flatten.each do |d| + drivetypes << {d, t} if d != nil + end + end + + drivetypes + end + + # find out the manufacturer/modelof each known drive + def self.get_drive_models + models = [] + DRIVETYPES.each do |t| + eval("models << self.get_#{t}_models") + end + + models.compact.flatten + end + + # returns 'Xen Virtual Disk' for each xen disk + def self.get_xvd_models + case Facter.value(:kernel) + when 'Linux' + models = [] + drives = self.get_xvd_list + + if drives + drives.each do |d| + models << {d, "Xen Virtual Disk"} + end + end + + models + end + end + + # returns the drive make for each SCSI disk + def self.get_scsi_models + case Facter.value(:kernel) + when 'Linux' + models = [] + drives = self.get_scsi_list + + if drives + self.get_scsi_list.each do |d| + sfile = "/sys/block/#{d}/device/model" + + model = %x{/bin/cat #{sfile}}.chomp if File.exists?(sfile) + + models << {d => model} if models + end + end + + models + end + end + + # returns the drive make for each IDE disk + def self.get_ide_models + case Facter.value(:kernel) + when 'Linux' + models = [] + drives = self.get_ide_list + + if drives + drives.each do |d| + sfile = "/proc/ide/#{d}/model" + + model = %x{/bin/cat #{sfile}}.chomp if File.exists?(sfile) + + models << {d => model} if models + end + end + + models + end + end + + # returns the size of each known Xen Virtual Disk + def self.get_xvd_sizes + case Facter.value(:kernel) + when 'Linux' + self.get_linux_block_sizes(self.get_xvd_list) + end + end + + # returns the size of each known SCSI Disk + def self.get_scsi_sizes + self.get_linux_block_sizes(self.get_scsi_list) + end + + # returns the size of each known IDE Disk + def self.get_ide_sizes + case Facter.value(:kernel) + when 'Linux' + drives = self.get_ide_list + sizes = [] + + if drives + drives.each do |d| + sfile = "/sys/block/#{d}/size" + + # this fails when running puppet as a daemon, unknown reason! + # size = File.open(sfile).gets.chomp if File.exists?(sfile) + size = %x{/bin/cat #{sfile}}.chomp if File.exists?(sfile) + + sizes << {d => size} if size + end + end + + sizes.size > 0 ? sizes : nil + end + end + + # reads size of all linux block devices passed as an argument + def self.get_linux_block_sizes(drives) + sizes = [] + + if drives + drives.each do |d| + sfile = "/sys/block/#{d}/size" + + # this fails when running puppet as a daemon, unknown reason! + # size = File.open(sfile).gets.chomp if File.exists?(sfile) + size = %x{/bin/cat #{sfile}}.chomp if File.exists?(sfile) + + sizes << {d => size} if size + end + end + + sizes.size > 0 ? sizes : nil + end + + # returns a list of Xen Virtual Disks drives + def self.get_xvd_list + drives = [] + + case Facter.value(:kernel) + when 'Linux' + sdir = "/sys/block" + drives = Dir.open(sdir).entries.grep(/^xv/) if File.exist?(sdir) + end + + drives.size > 0 ? drives : nil + end + + # returns a list of SCSI drives + def self.get_scsi_list + drives = [] + + case Facter.value(:kernel) + when 'Linux' + sdir = "/sys/block" + drives = Dir.open(sdir).entries.grep(/^s/) if File.exist?(sdir) + end + + drives.size > 0 ? drives : nil + end + + # returns a list of IDE drives + def self.get_ide_list + drives = [] + + case Facter.value(:kernel) + when 'Linux' + sdir = "/proc/ide" + drives = Dir.open(sdir).entries.grep(/^hd/) if File.exist?(sdir) + end + + drives.size > 0 ? drives : nil + end +end + +# vi:tabstop=4:expandtab:ai -- 1.5.5.6 --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en -~----------~----~----~----~------~----~------~--~---
