memory.rb Support module for memory related facts
# File lib/facter/util/memory.rb, line 70 def self.mem_free(kernel = Facter.value(:kernel)) output = mem_free_info(kernel) scale_mem_free_value output, kernel end
# File lib/facter/util/memory.rb, line 75 def self.mem_free_info(kernel = Facter.value(:kernel)) case kernel when /OpenBSD/, /SunOS/, /Dragonfly/ vmstat_find_free_memory() when /FreeBSD/ vmstat_find_free_memory(["-H"]) when /Darwin/ vmstat_darwin_find_free_memory() end end
# File lib/facter/util/memory.rb, line 97 def self.mem_size(kernel = Facter.value(:kernel)) output = mem_size_info(kernel) scale_mem_size_value output, kernel end
# File lib/facter/util/memory.rb, line 102 def self.mem_size_info(kernel = Facter.value(:kernel)) case kernel when /OpenBSD/ Facter::Util::Resolution.exec("sysctl hw.physmem | cut -d'=' -f2") when /FreeBSD/ Facter::Util::Resolution.exec("sysctl -n hw.physmem") when /Darwin/ Facter::Util::Resolution.exec("sysctl -n hw.memsize") when /Dragonfly/ Facter::Util::Resolution.exec("sysctl -n hw.physmem") end end
# File lib/facter/util/memory.rb, line 6 def self.meminfo_number(tag) memsize = "" size = [0] File.readlines("/proc/meminfo").each do |l| size = $1.to_f if l =~ /^#{tag}:\s+(\d+)\s+\S+/ if tag == "MemFree" && l =~ /^(?:Buffers|Cached):\s+(\d+)\s+\S+/ size += $1.to_f end end size / 1024.0 end
# File lib/facter/util/memory.rb, line 149 def self.parse_swap (output, kernel = Facter.value(:kernel), size_or_free = :size) value_in_mb = 0.0 value = 0 is_size = size_or_free == :size unless output.nil? output.each_line do |line| value += parse_swap_line(line, kernel, is_size) end end value_in_mb = scale_swap_value(value, kernel) end
There is a lot of duplication here because of concern over being able to add new platforms in a reasonable manner. For all of these platforms the first regex corresponds to the swap size value and the second corresponds to the swap free value, but this may not always be the case. In Ruby 1.9.3 it is possible to give these names, but sadly 1.8.7 does not support this.
# File lib/facter/util/memory.rb, line 167 def self.parse_swap_line(line, kernel, is_size) case kernel when /AIX/ if line =~ /^\/\S+\s.*\s+(\S+)MB\s+(\S+)MB/ (is_size) ? $1.to_i : $2.to_i else 0 end when /OpenBSD/ if line =~ /^total: (\d+)k bytes allocated = \d+k used, (\d+)k available$/ (is_size) ? $1.to_i : $2.to_i else 0 end when /FreeBSD/ if line =~ /\S+\s+(\d+)\s+\d+\s+(\d+)\s+\d+%$/ (is_size) ? $1.to_i : $2.to_i else 0 end when /Darwin/ if line =~ /total\s=\s(\S+)M\s+used\s=\s\S+M\s+free\s=\s(\S+)M\s/ (is_size) ? $1.to_i : $2.to_i else 0 end when /SunOS/ if line =~ /^\/\S+\s.*\s+(\d+)\s+(\d+)$/ (is_size) ? $1.to_i : $2.to_i else 0 end end end
# File lib/facter/util/memory.rb, line 86 def self.scale_mem_free_value (value, kernel) case kernel when /OpenBSD/, /FreeBSD/, /SunOS/, /Dragonfly/ value.to_f / 1024.0 when /Darwin/ value.to_f / 1024.0 / 1024.0 else value.to_f end end
# File lib/facter/util/memory.rb, line 115 def self.scale_mem_size_value(value, kernel) case kernel when /OpenBSD/, /FreeBSD/, /Darwin/, /Dragonfly/ value.to_f / 1024.0 / 1024.0 else value.to_f end end
# File lib/facter/util/memory.rb, line 19 def self.scale_number(size, multiplier) suffixes = ['', 'kB', 'MB', 'GB', 'TB'] s = suffixes.shift while s != multiplier s = suffixes.shift end while size > 1024.0 size /= 1024.0 s = suffixes.shift end "%.2f %s" % [size, s] end
# File lib/facter/util/memory.rb, line 202 def self.scale_swap_value(value, kernel) case kernel when /OpenBSD/, /FreeBSD/ value.to_f / 1024.0 when /SunOS/ value.to_f / 2 / 1024.0 else value.to_f end end
# File lib/facter/util/memory.rb, line 129 def self.swap_free(kernel = Facter.value(:kernel)) output = swap_info(kernel) parse_swap output, kernel, :free if output end
# File lib/facter/util/memory.rb, line 134 def self.swap_info(kernel = Facter.value(:kernel)) case kernel when /AIX/ (Facter.value(:id) == "root") ? Facter::Util::Resolution.exec('swap -l') : nil when /OpenBSD/ Facter::Util::Resolution.exec('swapctl -s') when /FreeBSD/ Facter::Util::Resolution.exec('swapinfo -k') when /Darwin/ Facter::Util::Resolution.exec('sysctl vm.swapusage') when /SunOS/ Facter::Util::Resolution.exec('/usr/sbin/swap -l') end end
# File lib/facter/util/memory.rb, line 124 def self.swap_size(kernel = Facter.value(:kernel)) output = swap_info(kernel) parse_swap output, kernel, :size if output end
Darwin had to be different. It's generally opaque with how much RAM it is using, and this figure could be improved upon too I fear. Parses the output of "vm_stat", takes the pages free & pages speculative and multiples that by the page size (also given in output). Ties in with what activity monitor outputs for free memory.
# File lib/facter/util/memory.rb, line 49 def self.vmstat_darwin_find_free_memory() memfree = 0 pagesize = 0 memspecfree = 0 vmstats = Facter::Util::Resolution.exec('vm_stat') vmstats.each_line do |vmline| case when vmline =~ /page\ssize\sof\s(\d+)\sbytes/ pagesize = $1.to_i when vmline =~ /^Pages\sfree:\s+(\d+)\./ memfree = $1.to_i when vmline =~ /^Pages\sspeculative:\s+(\d+)\./ memspecfree = $1.to_i end end freemem = ( memfree + memspecfree ) * pagesize end
# File lib/facter/util/memory.rb, line 35 def self.vmstat_find_free_memory(args = []) cmd = 'vmstat' cmd += (' ' + args.join(' ')) unless args.empty? row = Facter::Util::Resolution.exec(cmd).split("\n")[-1] if row =~ /^\s*\d+\s*\d+\s*\d+\s*\d+\s*(\d+)/ memfree = $1 end end
Generated with the Darkfish Rdoc Generator 2.