#!/usr/bin/ruby # Copyright (c) 2006 Peter Palfrader # #%# family=auto #%# capabilities=autoconf def bail_out(m) STDERR.puts "#{$0}: #{m}" exit 1 end def autoconf if FileTest.directory? "/sys/devices/system/cpu/cpu0/cpufreq/" puts "yes" else puts "no (no /sys/devices/system/cpu/cpu0/cpufreq/)" end end def findmasters cpudirs = Dir.glob("/sys/devices/system/cpu/cpu*/").map{ |b| File.basename b } cpus = cpudirs.map{ |d| /^cpu([0-9]+)$/.match(d)[1].to_i }.sort{|a,b| a<=>b } masters = [] cpus.each do |cpunum| affected = IO.read("/sys/devices/system/cpu/cpu#{cpunum}/cpufreq/affected_cpus").split.map{|s| s.to_i}.sort{|a,b| a<=>b } bail_out "huh? /sys/devices/system/cpu/cpu#{cpunum}/cpufreq/affected_cpus says it does not affect #{cpunum}!?" unless affected.include? cpunum h = {} h['cpunum'] = affected[0] h['fieldname'] = "cpu#{affected[0]}" h['label'] = affected.map{|c| "cpu#{c}"}.join(", ") h['max'] = IO.read("/sys/devices/system/cpu/cpu#{cpunum}/cpufreq/cpuinfo_max_freq").to_i masters.push(h) affected.each{ |a| cpus.delete(a) } end masters end def config m = findmasters max = m.map{ |i| i['max'] }.max puts 'graph_title CPU frequency' puts "graph_args -l 0 -u #{max} --base 1000" puts 'graph_vlabel Hz' puts 'graph_category system' puts 'graph_period second' puts 'graph_info Shows the CPU frequency of all installed CPUs' m.each do |m| puts "#{m['fieldname']}.label #{m['label']}" puts "#{m['fieldname']}.cdef #{m['fieldname']},1000,*" puts "#{m['fieldname']}.info Hz" puts "#{m['fieldname']}.type GAUGE" end end def report m = findmasters sleep(5) # we are interested how it does without us poking it, # so maybe sleeping a bit will help m.each do |m| value = IO.read("/sys/devices/system/cpu/cpu#{m['cpunum']}/cpufreq/cpuinfo_cur_freq").to_i puts "#{m['fieldname']}.value #{value}" end end case ARGV[0] when "autoconf" autoconf when "config" config else report end