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