summaryrefslogtreecommitdiff
path: root/munin/munin-cpufreq
blob: c552d845996b7e9737e9fa27318040949313ab46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/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(", ")
		masters.push(h)
		affected.each{ |a| cpus.delete(a) }
	end
	masters
end

def config
	puts 'graph_title CPU frequency'
	puts 'graph_args --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'
	findmasters.each do |m|
		puts "#{m['fieldname']}.label #{m['label']}"
		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/scaling_cur_freq").to_i
		puts "#{m['fieldname']}.value #{value}"
	end
end

case ARGV[0]
	when "autoconf"
		autoconf
	when "config"
		config
	else
		report
end