rrd_mbtemp.pl

admin, 11/28/2009 05:19 pm

Download (5.8 kB)

 
1
#!/usr/bin/perl
2
#
3
# Modified from Martin Pot's 2003 script at
4
# http://martybugs.net/linux/hddtemp.cgi
5
# 
6
# Graphs motherboard temperatures using mbmon
7
# rrd_mbtemp.pl
8
9
use RRDs;
10
11
# define location of rrdtool databases
12
my $rrd = '/var/lib/rrd';
13
# define location of images
14
my $img = '/data/srv/httpd/htdocs/rrd';
15
16
# process data for each temperature sensor (add/delete as required)
17
# run mbmon -r -c 1 to see what temps your mobo supports, then make
18
# an educated guess about which component corresponds to which temp
19
# Note TEMP0 = T 1, TEMP1 = T 2, TEMP2 = T 3
20
&ProcessHDD("mbtemp", "T 1", "Motherboard");
21
&ProcessHDD("cputemp", "T 2", "CPU");
22
&ProcessHDD("ambtemp", "T 3", "Case ambient");
23
24
sub ProcessHDD
25
{
26
# process HDD
27
# inputs: $_[0]: component being measured (used for graph filenames)
28
#          $_[1]: code (mbmon code)
29
#         $_[2]: description
30
31
        # get temp value from mbmon
32
        my $temp=`/usr/bin/mbmon -c 1 -$_[1]`;
33
        # remove eol chars and white space
34
        $temp =~ s/[\n ]//g;
35
        
36
        print "$_[2] temp: $temp degrees C\n";
37
38
        # if rrdtool database doesn't exist, create it
39
        if (! -e "$rrd/$_[0].rrd")
40
        {
41
                print "creating rrd database for $_[0]...\n";
42
                RRDs::create "$rrd/$_[0].rrd",
43
                        "-s 300",
44
                        "DS:temp:GAUGE:600:0:100",
45
                        "RRA:AVERAGE:0.5:1:576",
46
                        "RRA:AVERAGE:0.5:6:672",
47
                        "RRA:AVERAGE:0.5:24:732",
48
                        "RRA:AVERAGE:0.5:144:1460";
49
        }
50
51
        # insert value into rrd
52
        RRDs::update "$rrd/$_[0].rrd",
53
                "-t", "temp",
54
                "N:$temp";
55
56
        # create graphs
57
        &CreateGraph($_[0], "day", $_[2]);
58
        &CreateGraph($_[0], "week", $_[2]);
59
        &CreateGraph($_[0], "month", $_[2]);
60
        &CreateGraph($_[0], "year", $_[2]);
61
}
62
63
sub CreateGraph
64
{
65
# creates graph
66
# inputs: $_[0]: component being measured (used for graph filenames)
67
#         $_[1]: interval (ie, day, week, month, year)
68
#         $_[2]: description
69
70
        RRDs::graph "$img/$_[0]-$_[1].png",
71
                "--lazy",
72
                "-s -1$_[1]",
73
                "--color", "SHADEA#EAE9EE",
74
                "--color", "SHADEB#EAE9EE",
75
                "--color", "BACK#EAE9EE",
76
                "-t $_[2] Temperature - $_[1]",
77
                "-h", "100", "-w", "600",
78
                "-a", "PNG",
79
                "-v degrees C",
80
                "DEF:temp=$rrd/$_[0].rrd:temp:AVERAGE",
81
82
		# This CDEF section defines a variable for every 5 degree increment of temperature 
83
		# between 5 and 130 degrees. Undefined/unknown variables are set to zero.
84
		"CDEF:tempz=temp,130,LT,temp,130,IF",
85
		"CDEF:tempzNoUnk=temp,UN,0,tempz,IF",
86
		"CDEF:tempy=temp,125,LT,temp,125,IF",
87
		"CDEF:tempyNoUnk=temp,UN,0,tempy,IF",
88
		"CDEF:tempx=temp,120,LT,temp,120,IF",
89
		"CDEF:tempxNoUnk=temp,UN,0,tempx,IF",
90
		"CDEF:tempw=temp,115,LT,temp,115,IF",
91
		"CDEF:tempwNoUnk=temp,UN,0,tempw,IF",
92
		"CDEF:tempv=temp,110,LT,temp,110,IF",
93
		"CDEF:tempvNoUnk=temp,UN,0,tempv,IF",
94
		"CDEF:tempu=temp,105,LT,temp,105,IF",
95
		"CDEF:tempuNoUnk=temp,UN,0,tempu,IF",
96
		"CDEF:tempt=temp,100,LT,temp,100,IF",
97
		"CDEF:temptNoUnk=temp,UN,0,tempt,IF",
98
		"CDEF:temps=temp,95,LT,temp,95,IF",
99
		"CDEF:tempsNoUnk=temp,UN,0,temps,IF",
100
		"CDEF:tempr=temp,90,LT,temp,90,IF",
101
		"CDEF:temprNoUnk=temp,UN,0,tempr,IF",
102
		"CDEF:tempq=temp,85,LT,temp,85,IF",
103
		"CDEF:tempqNoUnk=temp,UN,0,tempq,IF",
104
		"CDEF:tempp=temp,80,LT,temp,80,IF",
105
		"CDEF:temppNoUnk=temp,UN,0,tempp,IF",
106
		"CDEF:tempo=temp,75,LT,temp,75,IF",
107
		"CDEF:tempoNoUnk=temp,UN,0,tempo,IF",
108
		"CDEF:tempn=temp,70,LT,temp,70,IF",
109
		"CDEF:tempnNoUnk=temp,UN,0,tempn,IF",
110
		"CDEF:tempm=temp,65,LT,temp,65,IF",
111
		"CDEF:tempmNoUnk=temp,UN,0,tempm,IF",
112
		"CDEF:templ=temp,60,LT,temp,60,IF",
113
		"CDEF:templNoUnk=temp,UN,0,templ,IF",
114
		"CDEF:tempk=temp,55,LT,temp,55,IF",
115
		"CDEF:tempkNoUnk=temp,UN,0,tempk,IF",
116
		"CDEF:tempj=temp,50,LT,temp,50,IF",
117
		"CDEF:tempjNoUnk=temp,UN,0,tempj,IF",
118
		"CDEF:tempi=temp,45,LT,temp,45,IF",
119
		"CDEF:tempiNoUnk=temp,UN,0,tempi,IF",
120
		"CDEF:temph=temp,40,LT,temp,40,IF",
121
		"CDEF:temphNoUnk=temp,UN,0,temph,IF",
122
		"CDEF:tempg=temp,35,LT,temp,35,IF",
123
		"CDEF:tempgNoUnk=temp,UN,0,tempg,IF",
124
		"CDEF:tempf=temp,30,LT,temp,30,IF",
125
		"CDEF:tempfNoUnk=temp,UN,0,tempf,IF",
126
		"CDEF:tempe=temp,25,LT,temp,25,IF",
127
		"CDEF:tempeNoUnk=temp,UN,0,tempe,IF",
128
		"CDEF:tempd=temp,20,LT,temp,20,IF",
129
		"CDEF:tempdNoUnk=temp,UN,0,tempd,IF",
130
		"CDEF:tempc=temp,15,LT,temp,15,IF",
131
		"CDEF:tempcNoUnk=temp,UN,0,tempc,IF",
132
		"CDEF:tempb=temp,10,LT,temp,10,IF",
133
		"CDEF:tempbNoUnk=temp,UN,0,tempb,IF",
134
		"CDEF:tempa=temp,5,LT,temp,5,IF",
135
		"CDEF:tempaNoUnk=temp,UN,0,tempa,IF",
136
137
		# This section defines a color gradient for displaying the temperature data
138
		"AREA:tempzNoUnk#ff0000",
139
		"AREA:tempyNoUnk#ff0000",
140
		"AREA:tempxNoUnk#ff0000",
141
		"AREA:tempwNoUnk#ff0000",
142
		"AREA:tempvNoUnk#ff1b00",
143
		"AREA:tempuNoUnk#ff4100",
144
		"AREA:temptNoUnk#ff6600",
145
		"AREA:tempsNoUnk#ff8e00",
146
		"AREA:temprNoUnk#ffb500",
147
		"AREA:tempqNoUnk#ffdb00",
148
		"AREA:temppNoUnk#fdff00",
149
		"AREA:tempoNoUnk#d7ff00",
150
		"AREA:tempnNoUnk#b0ff00",
151
		"AREA:tempmNoUnk#8aff00",
152
		"AREA:templNoUnk#65ff00",
153
		"AREA:tempkNoUnk#3eff00",
154
		"AREA:tempjNoUnk#17ff00",
155
		"AREA:tempiNoUnk#00ff10",
156
		"AREA:temphNoUnk#00ff36",
157
		"AREA:tempgNoUnk#00ff5c",
158
		"AREA:tempfNoUnk#00ff83",
159
		"AREA:tempeNoUnk#00ffa8",
160
		"AREA:tempdNoUnk#00ffd0",
161
		"AREA:tempcNoUnk#00fff4",
162
		"AREA:tempbNoUnk#00e4ff",
163
		"AREA:tempaNoUnk#00beff",
164
165
                # Line along the top of the gradient graph
166
		"LINE2:temp#0000FF:$_[2] ($_[0])",
167
168
                "GPRINT:temp:MIN:  Min\\: %2.lf",
169
                "GPRINT:temp:MAX: Max\\: %2.lf",
170
                "GPRINT:temp:AVERAGE: Avg\\: %4.1lf",
171
                "GPRINT:temp:LAST: Current\\: %2.lf degrees C\\n";
172
        if ($ERROR = RRDs::error) { print "$0: unable to generate $_[0] graph: $ERROR\n"; }
173
}
174