load graph: fix unlocalized "minutes".
[people/pmueller/ipfire-2.x.git] / config / cfgroot / graphs.pl
1 #!/usr/bin/perl
2 # Generate Graphs exported from Makegraphs to minimize system load an only generate the Graphs when displayed
3 ###############################################################################
4 #                                                                             #
5 # IPFire.org - A linux based firewall                                         #
6 # Copyright (C) 2005-2010  IPFire Team                                        #
7 #                                                                             #
8 # This program is free software: you can redistribute it and/or modify        #
9 # it under the terms of the GNU General Public License as published by        #
10 # the Free Software Foundation, either version 3 of the License, or           #
11 # (at your option) any later version.                                         #
12 #                                                                             #
13 # This program is distributed in the hope that it will be useful,             #
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of              #
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
16 # GNU General Public License for more details.                                #
17 #                                                                             #
18 # You should have received a copy of the GNU General Public License           #
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
20 #                                                                             #
21 ###############################################################################
22
23 package Graphs;
24
25 use strict;
26 use RRDs;
27
28 require '/var/ipfire/general-functions.pl';
29 require "${General::swroot}/lang.pl";
30 require "${General::swroot}/header.pl";
31
32 my $ERROR;
33
34 # Read the global settings files to get the current theme and after this load
35 # colors for this theme
36
37 my %color = ();
38 my %mainsettings = ();
39 my %sensorsettings = ();
40 &General::readhash("${General::swroot}/main/settings", \%mainsettings);
41 &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
42
43 if ( $mainsettings{'RRDLOG'} eq "" ){
44         $mainsettings{'RRDLOG'}="/var/log/rrd";
45         &General::writehash("${General::swroot}/main/settings", \%mainsettings);
46 }
47
48 # If the collection deamon is working and collecting lm_sensors data there will be
49 # some data source named after a common scheme, with the sensorssettingsfile
50 # the user is able to deactivate some of this parameters, in case not to show
51 # false collected values may be disable. The user has the ability to enter
52 # custom graph names in order to change temp0 to cpu or motherboard
53
54 my $count = 0;
55 my @sensorsgraphs = ();
56 my @sensorsdir = `ls -dA $mainsettings{'RRDLOG'}/collectd/localhost/sensors-*/ 2>/dev/null`;
57 foreach (@sensorsdir){
58         chomp($_);chop($_);
59         foreach (`ls $_/*`){
60                 chomp($_);
61                 push(@sensorsgraphs,$_);
62                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
63                 my $label = $2.$3;$label=~ s/-//g;
64                 $sensorsettings{'LABEL-'.$label}="$label";
65                 $sensorsettings{'LINE-'.$label}="checked";
66         }
67 }
68
69 &General::readhash("${General::swroot}/sensors/settings", \%sensorsettings);
70
71 # Generate a nice box for selection of time range in graphs
72 # this will generate a nice iframe for the cgi every klick for
73 # the graph will be handled inside the iframe
74 # 0 is the cgi refering to
75 # 1 is the graph name
76 # 2 is the time range for the graph
77 # 3 if given is the height of the iframe default if nothing is given
78
79 sub makegraphbox {
80         my $height = 285;
81         my $width = 700;
82
83         if ( $_[3] ne "" ){ $height = $_[3]; }
84
85         print "<center>";
86         print "<a href='".$_[0]."?".$_[1]."?hour' target='".$_[1]."box'><b>".$Lang::tr{'hour'}."</b></a>";
87         print " - ";
88         print "<a href='".$_[0]."?".$_[1]."?day' target='".$_[1]."box'><b>".$Lang::tr{'day'}."</b></a>";
89         print " - ";
90         print "<a href='".$_[0]."?".$_[1]."?week' target='".$_[1]."box'><b>".$Lang::tr{'week'}."</b></a>";
91         print " - ";
92         print "<a href='".$_[0]."?".$_[1]."?month' target='".$_[1]."box'><b>".$Lang::tr{'month'}."</b></a>";
93         print " - ";
94         print "<a href='".$_[0]."?".$_[1]."?year' target='".$_[1]."box'><b>".$Lang::tr{'year'}."</b></a>";
95         print "<iframe src='".$_[0]."?".$_[1]."?".$_[2]."' width='".$width."' height='".$height."' scrolling='no' frameborder='no' marginheight='0' name='".$_[1]."box'></iframe>";
96         print "</center>";
97 }
98
99 # Generate the CPU Graph for the current period of time for values given by
100 # collectd we are now able to handle any kind of cpucount
101
102 sub updatecpugraph {
103         my $cpucount = `ls -dA $mainsettings{'RRDLOG'}/collectd/localhost/cpu-*/ 2>/dev/null | wc -l`;
104         my $period    = $_[0];
105         my @command = (
106                 "-",
107                 "--start",
108                 "-1".$period,
109                 "-aPNG",
110                 "-i",
111                 "-z",
112                 "-W www.ipfire.org",
113                 "--alt-y-grid",
114                 "-w 600",
115                 "-h 125",
116                 "-l 0",
117                 "-u 100",
118                 "-r",
119                 "-t ".$Lang::tr{'cpu usage per'}." ".$Lang::tr{$period},
120                 "-v ".$Lang::tr{'percentage'},
121                 "--color=SHADEA".$color{"color19"},
122                 "--color=SHADEB".$color{"color19"},
123                 "--color=BACK".$color{"color21"},
124                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
125                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
126                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
127                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
128                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
129         );
130         
131         my $nice = "CDEF:nice=";
132         my $interrupt = "CDEF:interrupt=";
133         my $steal = "CDEF:steal=";
134         my $user = "CDEF:user=";
135         my $system = "CDEF:system=";
136         my $idle = "CDEF:idle=";
137         my $iowait = "CDEF:iowait=";
138         my $irq = "CDEF:irq=";
139         my $addstring = "";
140         
141         for(my $i = 0; $i < $cpucount; $i++) {
142                 push(@command,"DEF:iowait".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-wait.rrd:value:AVERAGE"
143                                 ,"DEF:nice".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-nice.rrd:value:AVERAGE"
144                                 ,"DEF:interrupt".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-interrupt.rrd:value:AVERAGE"
145                                 ,"DEF:steal".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-steal.rrd:value:AVERAGE"
146                                 ,"DEF:user".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-user.rrd:value:AVERAGE"
147                                 ,"DEF:system".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-system.rrd:value:AVERAGE"
148                                 ,"DEF:idle".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-idle.rrd:value:AVERAGE"
149                                 ,"DEF:irq".$i."=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpu-".$i."/cpu-softirq.rrd:value:AVERAGE");
150
151                 $nice .= "nice".$i.",";
152                 $interrupt .= "interrupt".$i.",";
153                 $steal .= "steal".$i.",";
154                 $user .= "user".$i.",";
155                 $system .= "system".$i.",";
156                 $idle .= "idle".$i.",";
157                 $iowait .= "iowait".$i.",";
158                 $irq .= "irq".$i.",";
159         }
160         
161         for(my $i = 2; $i < $cpucount; $i++) {
162                 $addstring .= "+,";
163         }
164
165         if ( $cpucount > 1){
166                 $addstring .= "+";
167                 push(@command,$nice.$addstring
168                         ,$interrupt.$addstring
169                         ,$steal.$addstring
170                         ,$user.$addstring
171                         ,$system.$addstring
172                         ,$idle.$addstring
173                         ,$iowait.$addstring
174                         ,$irq.$addstring);
175         }else{
176                 chop($nice),chop($interrupt),chop($steal),chop($user),chop($system),chop($idle),chop($iowait),chop($irq);
177                 push(@command,$nice,$interrupt,$steal,$user,$system,$idle,$iowait,$irq);
178         }
179
180         push(@command,"CDEF:total=user,system,idle,iowait,irq,nice,interrupt,steal,+,+,+,+,+,+,+"
181                         ,"CDEF:userpct=100,user,total,/,*"
182                         ,"CDEF:nicepct=100,nice,total,/,*"
183                         ,"CDEF:interruptpct=100,interrupt,total,/,*"
184                         ,"CDEF:stealpct=100,steal,total,/,*"
185                         ,"CDEF:systempct=100,system,total,/,*"
186                         ,"CDEF:idlepct=100,idle,total,/,*"
187                         ,"CDEF:iowaitpct=100,iowait,total,/,*"
188                         ,"CDEF:irqpct=100,irq,total,/,*"
189                         ,"AREA:iowaitpct".$color{"color14"}.":".sprintf("%-25s",$Lang::tr{'cpu iowait usage'})
190                         ,"GPRINT:iowaitpct:MAX:%3.2lf%%"
191                         ,"GPRINT:iowaitpct:AVERAGE:%3.2lf%%"
192                         ,"GPRINT:iowaitpct:MIN:%3.2lf%%"
193                         ,"GPRINT:iowaitpct:LAST:%3.2lf%%\\j"
194                         ,"STACK:irqpct".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'cpu irq usage'})
195                         ,"GPRINT:irqpct:MAX:%3.2lf%%"
196                         ,"GPRINT:irqpct:AVERAGE:%3.2lf%%"
197                         ,"GPRINT:irqpct:MIN:%3.2lf%%"
198                         ,"GPRINT:irqpct:LAST:%3.2lf%%\\j"
199                         ,"STACK:nicepct".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'cpu nice usage'})
200                         ,"GPRINT:nicepct:MAX:%3.2lf%%"
201                         ,"GPRINT:nicepct:AVERAGE:%3.2lf%%"
202                         ,"GPRINT:nicepct:MIN:%3.2lf%%"
203                         ,"GPRINT:nicepct:LAST:%3.2lf%%\\j"
204                         ,"STACK:interruptpct".$color{"color15"}."A0:".sprintf("%-25s",$Lang::tr{'cpu interrupt usage'})
205                         ,"GPRINT:interruptpct:MAX:%3.2lf%%"
206                         ,"GPRINT:interruptpct:AVERAGE:%3.2lf%%"
207                         ,"GPRINT:interruptpct:MIN:%3.2lf%%"
208                         ,"GPRINT:interruptpct:LAST:%3.2lf%%\\j"
209                         ,"STACK:stealpct".$color{"color18"}."A0:".sprintf("%-25s",$Lang::tr{'cpu steal usage'})
210                         ,"GPRINT:stealpct:MAX:%3.2lf%%"
211                         ,"GPRINT:stealpct:AVERAGE:%3.2lf%%"
212                         ,"GPRINT:stealpct:MIN:%3.2lf%%"
213                         ,"GPRINT:stealpct:LAST:%3.2lf%%\\j"
214                         ,"STACK:userpct".$color{"color11"}."A0:".sprintf("%-25s",$Lang::tr{'cpu user usage'})
215                         ,"GPRINT:userpct:MAX:%3.2lf%%"
216                         ,"GPRINT:userpct:AVERAGE:%3.2lf%%"
217                         ,"GPRINT:userpct:MIN:%3.2lf%%"
218                         ,"GPRINT:userpct:LAST:%3.2lf%%\\j"
219                         ,"STACK:systempct".$color{"color13"}."A0:".sprintf("%-25s",$Lang::tr{'cpu system usage'})
220                         ,"GPRINT:systempct:MAX:%3.2lf%%"
221                         ,"GPRINT:systempct:AVERAGE:%3.2lf%%"
222                         ,"GPRINT:systempct:MIN:%3.2lf%%"
223                         ,"GPRINT:systempct:LAST:%3.2lf%%\\j"
224                         ,"STACK:idlepct".$color{"color12"}."A0:".sprintf("%-25s",$Lang::tr{'cpu idle usage'})
225                         ,"GPRINT:idlepct:MAX:%3.2lf%%"
226                         ,"GPRINT:idlepct:AVERAGE:%3.2lf%%"
227                         ,"GPRINT:idlepct:MIN:%3.2lf%%"
228                         ,"GPRINT:idlepct:LAST:%3.2lf%%\\j");
229
230         RRDs::graph (@command);
231         $ERROR = RRDs::error;
232         print "Error in RRD::graph for cpu: ".$ERROR."\n" if $ERROR;
233 }
234
235 # Generate the Load Graph for the current period of time for values given by collecd
236
237 sub updateloadgraph {
238         my $period    = $_[0];
239         RRDs::graph(
240                 "-",
241                 "--start",
242                 "-1".$period,
243                 "-aPNG",
244                 "-i",
245                 "-z",
246                 "-W www.ipfire.org",
247                 "--alt-y-grid",
248                 "-w 600",
249                 "-h 125",
250                 "-l 0",
251                 "-r",
252                 "-t Load Average ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
253                 "-v ".$Lang::tr{'processes'},
254                 "--color=SHADEA".$color{"color19"},
255                 "--color=SHADEB".$color{"color19"},
256                 "--color=BACK".$color{"color21"},
257                 "DEF:load1=".$mainsettings{'RRDLOG'}."/collectd/localhost/load/load.rrd:shortterm:AVERAGE",
258                 "DEF:load5=".$mainsettings{'RRDLOG'}."/collectd/localhost/load/load.rrd:midterm:AVERAGE",
259                 "DEF:load15=".$mainsettings{'RRDLOG'}."/collectd/localhost/load/load.rrd:longterm:AVERAGE",
260                 "AREA:load1".$color{"color13"}."A0:1 ".$Lang::tr{'minute'}.":",
261                 "GPRINT:load1:LAST:%5.2lf",
262                 "AREA:load5".$color{"color18"}."A0:5 ".$Lang::tr{'minutes'}.":",
263                 "GPRINT:load5:LAST:%5.2lf",
264                 "AREA:load15".$color{"color14"}."A0:15 ".$Lang::tr{'minutes'}.":",
265                 "GPRINT:load15:LAST:%5.2lf\\j",
266                 "LINE1:load5".$color{"color13"},
267                 "LINE1:load1".$color{"color18"},
268                 );
269                 $ERROR = RRDs::error;
270                 print "Error in RRD::graph for load: ".$ERROR."\n" if $ERROR;
271 }
272
273 # Generate the Memory Graph for the current period of time for values given by collecd
274
275 sub updatememorygraph {
276         my $period    = $_[0];
277         RRDs::graph(
278                 "-",
279                 "--start",
280                 "-1".$period,
281                 "-aPNG",
282                 "-i",
283                 "-z",
284                 "-W www.ipfire.org",
285                 "--alt-y-grid",
286                 "-w 600",
287                 "-h 125",
288                 "-l 0",
289                 "-u 100",
290                 "-r",
291                 "-t ".$Lang::tr{'memory usage per'}." ".$Lang::tr{$period},
292                 "-v ".$Lang::tr{'percentage'},
293                 "--color=SHADEA".$color{"color19"},
294                 "--color=SHADEB".$color{"color19"},
295                 "--color=BACK".$color{"color21"},
296                 "DEF:used=".$mainsettings{'RRDLOG'}."/collectd/localhost/memory/memory-used.rrd:value:AVERAGE",
297                 "DEF:free=".$mainsettings{'RRDLOG'}."/collectd/localhost/memory/memory-free.rrd:value:AVERAGE",
298                 "DEF:buffer=".$mainsettings{'RRDLOG'}."/collectd/localhost/memory/memory-buffered.rrd:value:AVERAGE",
299                 "DEF:cache=".$mainsettings{'RRDLOG'}."/collectd/localhost/memory/memory-cached.rrd:value:AVERAGE",
300                 "CDEF:total=used,free,cache,buffer,+,+,+",
301                 "CDEF:usedpct=used,total,/,100,*",
302                 "CDEF:bufferpct=buffer,total,/,100,*",
303                 "CDEF:cachepct=cache,total,/,100,*",
304                 "CDEF:freepct=free,total,/,100,*",
305                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
306                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
307                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
308                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
309                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
310                 "AREA:usedpct".$color{"color11"}."A0:".sprintf("%-25s",$Lang::tr{'used memory'}),
311                 "GPRINT:usedpct:MAX:%3.2lf%%",
312                 "GPRINT:usedpct:AVERAGE:%3.2lf%%",
313                 "GPRINT:usedpct:MIN:%3.2lf%%",
314                 "GPRINT:usedpct:LAST:%3.2lf%%\\j",
315                 "STACK:bufferpct".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'buffered memory'}),
316                 "GPRINT:bufferpct:MAX:%3.2lf%%",
317                 "GPRINT:bufferpct:AVERAGE:%3.2lf%%",
318                 "GPRINT:bufferpct:MIN:%3.2lf%%",
319                 "GPRINT:bufferpct:LAST:%3.2lf%%\\j",
320                 "STACK:cachepct".$color{"color14"}."A0:".sprintf("%-25s",$Lang::tr{'cached memory'}),
321                 "GPRINT:cachepct:MAX:%3.2lf%%",
322                 "GPRINT:cachepct:AVERAGE:%3.2lf%%",
323                 "GPRINT:cachepct:MIN:%3.2lf%%",
324                 "GPRINT:cachepct:LAST:%3.2lf%%\\j",
325                 "STACK:freepct".$color{"color12"}."A0:".sprintf("%-25s",$Lang::tr{'free memory'}),
326                 "GPRINT:freepct:MAX:%3.2lf%%",
327                 "GPRINT:freepct:AVERAGE:%3.2lf%%",
328                 "GPRINT:freepct:MIN:%3.2lf%%",
329                 "GPRINT:freepct:LAST:%3.2lf%%\\j",
330                 );
331                 $ERROR = RRDs::error;
332                 print "Error in RRD::graph for memory: ".$ERROR."\n" if $ERROR;
333 }
334
335 # Generate the Swap Graph for the current period of time for values given by collecd
336
337 sub updateswapgraph {
338         my $period    = $_[0];
339         RRDs::graph(
340                 "-",
341                 "--start",
342                 "-1".$period,
343                 "-aPNG",
344                 "-i",
345                 "-z",
346                 "-W www.ipfire.org",
347                 "--alt-y-grid",
348                 "-w 600",
349                 "-h 125",
350                 "-l 0",
351                 "-u 100",
352                 "-r",
353                 "-t ".$Lang::tr{'swap usage per'}." ".$Lang::tr{$period},
354                 "-v ".$Lang::tr{'percentage'},
355                 "--color=SHADEA".$color{"color19"},
356                 "--color=SHADEB".$color{"color19"},
357                 "--color=BACK".$color{"color21"},
358                 "DEF:free=".$mainsettings{'RRDLOG'}."/collectd/localhost/swap/swap-free.rrd:value:AVERAGE",
359                 "DEF:used=".$mainsettings{'RRDLOG'}."/collectd/localhost/swap/swap-used.rrd:value:AVERAGE",
360                 "DEF:cached=".$mainsettings{'RRDLOG'}."/collectd/localhost/swap/swap-cached.rrd:value:AVERAGE",
361                 "CDEF:total=used,free,cached,+,+",
362                 "CDEF:usedpct=100,used,total,/,*",
363                 "CDEF:freepct=100,free,total,/,*",
364                 "CDEF:cachedpct=100,cached,total,/,*",
365                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
366                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
367                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
368                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
369                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
370                 "AREA:usedpct".$color{"color11"}."A0:".sprintf("%-25s",$Lang::tr{'used swap'}),
371                 "GPRINT:usedpct:MAX:%3.2lf%%",
372                 "GPRINT:usedpct:AVERAGE:%3.2lf%%",
373                 "GPRINT:usedpct:MIN:%3.2lf%%",
374                 "GPRINT:usedpct:LAST:%3.2lf%%\\j",
375                 "STACK:cachedpct".$color{"color13"}."A0:".sprintf("%-25s",$Lang::tr{'cached swap'}),
376                 "GPRINT:cachedpct:MAX:%3.2lf%%",
377                 "GPRINT:cachedpct:AVERAGE:%3.2lf%%",
378                 "GPRINT:cachedpct:MIN:%3.2lf%%",
379                 "GPRINT:cachedpct:LAST:%3.2lf%%\\j",
380                 "STACK:freepct".$color{"color12"}."A0:".sprintf("%-25s",$Lang::tr{'free swap'}),
381                 "GPRINT:freepct:MAX:%3.2lf%%",
382                 "GPRINT:freepct:AVERAGE:%3.2lf%%",
383                 "GPRINT:freepct:MIN:%3.2lf%%",
384                 "GPRINT:freepct:LAST:%3.2lf%%\\j",
385                 );
386                 $ERROR = RRDs::error;
387                 print "Error in RRD::graph for memory: ".$ERROR."\n" if $ERROR;
388 }
389
390 # Generate the Process Cpu Graph for the current period of time for values given by collecd
391
392 sub updateprocessescpugraph {
393         my @processesgraph = getprocesses();
394         my $period    = $_[0];
395         my $count="0";
396
397         my @command = (
398                 "-",
399                 "--start",
400                 "-1".$period,
401                 "-aPNG",
402                 "-i",
403                 "-z",
404                 "-W www.ipfire.org",
405                 "--alt-y-grid",
406                 "-w 600",
407                 "-h 125",
408                 "-l 0",
409                 "-r",
410                 "-t ".$Lang::tr{'processes'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
411                 "--color=SHADEA".$color{"color19"},
412                 "--color=SHADEB".$color{"color19"},
413                 "--color=BACK".$color{"color21"}
414         );
415
416                 foreach(@processesgraph){
417                         chomp($_);my @name=split(/\-/,$_);chop($name[1]);
418                         push(@command,"DEF:".$name[1]."user=".$_."ps_cputime.rrd:user:AVERAGE");
419                         push(@command,"DEF:".$name[1]."system=".$_."ps_cputime.rrd:syst:AVERAGE");
420                         push(@command,"CDEF:".$name[1]."=".$name[1]."user,".$name[1]."system,+");
421                 }
422
423                 push(@command,"COMMENT:".$Lang::tr{'caption'}."\\j");
424
425                 foreach(@processesgraph){
426                         chomp($_);my @name=split(/\-/,$_);chop($name[1]);
427                         if ($count eq "0"){
428                                 push(@command,"AREA:".$name[1].random_hex_color(6)."A0:".$name[1]);
429                         }else{
430                                 push(@command,"STACK:".$name[1].random_hex_color(6)."A0:".$name[1]);
431                         }
432                         $count++;
433                 }
434
435                 RRDs::graph (@command);
436                 $ERROR = RRDs::error;
437                 print "Error in RRD::graph for processes: ".$ERROR."\n" if $ERROR;
438 }
439
440 # Generate the Process Memory Graph for the current period of time for values given by collecd
441
442 sub updateprocessesmemorygraph {
443         my @processesgraph = getprocesses();
444         my $period    = $_[0];
445         my $count="0";
446
447         my @command = (
448                 "-",
449                 "--start",
450                 "-1".$period,
451                 "-aPNG",
452                 "-i",
453                 "-z",
454                 "-W www.ipfire.org",
455                 "--alt-y-grid",
456                 "-w 600",
457                 "-h 125",
458                 "-l 0",
459                 "-r",
460                 "-t ".$Lang::tr{'processes'}." ".$Lang::tr{'memory'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
461                 "-v ".$Lang::tr{'bytes'},
462                 "--color=SHADEA".$color{"color19"},
463                 "--color=SHADEB".$color{"color19"},
464                 "--color=BACK".$color{"color21"}
465         );
466
467                 foreach(@processesgraph){
468                         chomp($_);my @name=split(/\-/,$_);chop($name[1]);
469                         push(@command,"DEF:".$name[1]."=".$_."ps_rss.rrd:value:AVERAGE");
470                 }
471
472                 push(@command,"COMMENT:".$Lang::tr{'caption'}."\\j");
473
474                 foreach(@processesgraph){
475                         chomp($_);my @name=split(/\-/,$_);chop($name[1]);
476                         if ($count eq "0"){
477                                 push(@command,"AREA:".$name[1].random_hex_color(6)."A0:".$name[1]);
478                         }else{
479                                 push(@command,"STACK:".$name[1].random_hex_color(6)."A0:".$name[1]);
480                         }
481                         $count++;
482                 }
483
484                 RRDs::graph (@command);
485                 $ERROR = RRDs::error;
486                 print "Error in RRD::graph for processesmemory: ".$ERROR."\n" if $ERROR;
487 }
488
489 # Generate the Disk Graph for the current period of time for values given by collecd
490
491 sub updatediskgraph {
492         my $disk    = $_[0];
493         my $period    = $_[1];
494         RRDs::graph(
495                 "-",
496                 "--start",
497                 "-1".$period,
498                 "-aPNG",
499                 "-i",
500                 "-z",
501                 "-W www.ipfire.org",
502                 "--alt-y-grid",
503                 "-w 600",
504                 "-h 125",
505                 "-r",
506                 "-t ".$disk." ".$Lang::tr{'disk access per'}." ".$Lang::tr{$period},
507                 "-v ".$Lang::tr{'bytes per second'},
508                 "--color=SHADEA".$color{"color19"},
509                 "--color=SHADEB".$color{"color19"},
510                 "--color=BACK".$color{"color21"},
511                 "DEF:read=".$mainsettings{'RRDLOG'}."/collectd/localhost/disk-$disk/disk_octets.rrd:read:AVERAGE",
512                 "DEF:write=".$mainsettings{'RRDLOG'}."/collectd/localhost/disk-$disk/disk_octets.rrd:write:AVERAGE",
513                 "CDEF:writen=write,-1,*",
514                 "DEF:standby=".$mainsettings{'RRDLOG'}."/hddshutdown-".$disk.".rrd:standby:AVERAGE",
515                 "CDEF:st=standby,INF,*",
516                 "CDEF:st1=standby,-INF,*",
517                 "COMMENT:".sprintf("%-25s",$Lang::tr{'caption'}),
518                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
519                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
520                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
521                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
522                 "AREA:st".$color{"color20"}."A0:",
523                 "AREA:st1".$color{"color20"}."A0:standby\\j",
524                 "AREA:read".$color{"color12"}."A0:".sprintf("%-25s",$Lang::tr{'read bytes'}),
525                 "GPRINT:read:MAX:%8.1lf %sBps",
526                 "GPRINT:read:AVERAGE:%8.1lf %sBps",
527                 "GPRINT:read:MIN:%8.1lf %sBps",
528                 "GPRINT:read:LAST:%8.1lf %sBps\\j",
529                 "AREA:writen".$color{"color13"}."A0:".sprintf("%-25s",$Lang::tr{'written bytes'}),
530                 "GPRINT:write:MAX:%8.1lf %sBps",
531                 "GPRINT:write:AVERAGE:%8.1lf %sBps",
532                 "GPRINT:write:MIN:%8.1lf %sBps",
533                 "GPRINT:write:LAST:%8.1lf %sBps\\j",
534                 );
535                 $ERROR = RRDs::error;
536                 print "Error in RRD::graph for ".$disk.": ".$ERROR."\n" if $ERROR;
537 }
538
539 # Generate the Interface Graph for the current period of time for values given by collecd
540
541 sub updateifgraph {
542         my $interface = $_[0];
543         my $period    = $_[1];
544         RRDs::graph(
545                 "-",
546                 "--start",
547                 "-1".$period,
548                 "-aPNG",
549                 "-i",
550                 "-z",
551                 "-W www.ipfire.org",
552                 "--alt-y-grid",
553                 "-w 600",
554                 "-h 125",
555                 "-r",
556                 "-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
557                 "-v ".$Lang::tr{'bytes per second'},
558                 "--color=SHADEA".$color{"color19"},
559                 "--color=SHADEB".$color{"color19"},
560                 "--color=BACK".$color{"color21"},
561                 "DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:rx:AVERAGE",
562                 "DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:tx:AVERAGE",
563                 "CDEF:outgoingn=outgoing,-1,*",
564                 "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
565                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
566                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
567                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
568                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
569                 "AREA:incoming".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
570                 "GPRINT:incoming:MAX:%8.1lf %sBps",
571                 "GPRINT:incoming:AVERAGE:%8.1lf %sBps",
572                 "GPRINT:incoming:MIN:%8.1lf %sBps",
573                 "GPRINT:incoming:LAST:%8.1lf %sBps\\j",
574                 "AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
575                 "GPRINT:outgoing:MAX:%8.1lf %sBps",
576                 "GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
577                 "GPRINT:outgoing:MIN:%8.1lf %sBps",
578                 "GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
579                 );
580                 $ERROR = RRDs::error;
581                 print "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
582 }
583
584 # Generate the Firewall Graph for the current period of time for values given by collecd
585
586 sub updatefwhitsgraph {
587         my $period    = $_[0];
588         RRDs::graph(
589                 "-",
590                 "--start",
591                 "-1".$period,
592                 "-aPNG",
593                 "-i",
594                 "-z",
595                 "-W www.ipfire.org",
596                 "--alt-y-grid",
597                 "-w 600",
598                 "-h 125",
599                 "-r",
600                 "-t ".$Lang::tr{'firewall hits per'}." ".$Lang::tr{$period},
601                 "-v ".$Lang::tr{'bytes per second'},
602                 "--color=SHADEA".$color{"color19"},
603                 "--color=SHADEB".$color{"color19"},
604                 "--color=BACK".$color{"color21"},
605                 "DEF:output=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-FORWARD/ipt_bytes-DROP_OUTPUT.rrd:value:AVERAGE",
606                 "DEF:input=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-INPUT/ipt_bytes-DROP_INPUT.rrd:value:AVERAGE",
607                 "DEF:newnotsyn=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-NEWNOTSYN/ipt_bytes-DROP_NEWNOTSYN.rrd:value:AVERAGE",
608                 "DEF:portscan=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-PSCAN/ipt_bytes-DROP_PScan.rrd:value:AVERAGE",
609                 "CDEF:amount=output,input,newnotsyn,+,+",
610                 "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
611                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
612                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
613                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
614                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
615                 "AREA:amount".$color{"color24"}."A0:".sprintf("%-20s",$Lang::tr{'firewallhits'}),
616                 "GPRINT:amount:MAX:%8.1lf %sBps",
617                 "GPRINT:amount:AVERAGE:%8.1lf %sBps",
618                 "GPRINT:amount:MIN:%8.1lf %sBps",
619                 "GPRINT:amount:LAST:%8.1lf %sBps\\j",
620                 "STACK:portscan".$color{"color25"}."A0:".sprintf("%-20s",$Lang::tr{'portscans'}),
621                 "GPRINT:portscan:MAX:%8.1lf %sBps",
622                 "GPRINT:portscan:MIN:%8.1lf %sBps",
623                 "GPRINT:portscan:AVERAGE:%8.1lf %sBps",
624                 "GPRINT:portscan:LAST:%8.1lf %sBps\\j",
625                 );
626                 $ERROR = RRDs::error;
627                 print "Error in RRD::graph for firewallhits: ".$ERROR."\n" if $ERROR;
628 }
629
630 # Generate the Line Quality Graph for the current period of time for values given by collecd
631
632 sub updatepinggraph {
633         my $period    = $_[1];
634         my $host    = $_[0];
635         RRDs::graph(
636                 "-",
637                 "--start",
638                 "-1".$period,
639                 "-aPNG",
640                 "-i",
641                 "-z",
642                 "-W www.ipfire.org",
643                 "--alt-y-grid",
644                 "-w 600",
645                 "-h 125",
646                 "-l 0",
647                 "-r",
648                 "-t ".$Lang::tr{'linkq'}." ".$host." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
649                 "-v ms",
650                 "--color=SHADEA".$color{"color19"},
651                 "--color=SHADEB".$color{"color19"},
652                 "--color=BACK".$color{"color21"},
653                 "DEF:roundtrip=".$mainsettings{'RRDLOG'}."/collectd/localhost/ping/ping-".$host.".rrd:ping:AVERAGE",
654                 "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'})."\\j",
655                 "CDEF:roundavg=roundtrip,PREV(roundtrip),+,2,/",
656                 "CDEF:r0=roundtrip,30,MIN",
657                 "CDEF:r1=roundtrip,70,MIN",
658                 "CDEF:r2=roundtrip,150,MIN",
659                 "CDEF:r3=roundtrip,300,MIN",
660                 "AREA:roundtrip".$color{"color25"}."A0:>300 ms",
661                 "AREA:r3".$color{"color18"}."A0:150-300 ms",
662                 "AREA:r2".$color{"color14"}."A0:70-150 ms",
663                 "AREA:r1".$color{"color17"}."A0:30-70 ms",
664                 "AREA:r0".$color{"color12"}."A0:<30 ms\\j",
665                 "COMMENT:$Lang::tr{'maximal'}",
666                 "COMMENT:$Lang::tr{'average'}",
667                 "COMMENT:$Lang::tr{'minimal'}","COMMENT:$Lang::tr{'current'}\\j",
668                 "LINE1:roundtrip#707070:",
669                 "GPRINT:roundtrip:MAX:%3.2lf ms",
670                 "GPRINT:roundtrip:AVERAGE:%3.2lf ms",
671                 "GPRINT:roundtrip:MIN:%3.2lf ms",
672                 "GPRINT:roundtrip:LAST:%3.2lf ms\\j",
673                 );
674                 $ERROR = RRDs::error;
675                 print "Error in RRD::graph for link quality: ".$ERROR."\n" if $ERROR;
676 }
677
678 sub updatewirelessgraph {
679         my $period    = $_[1];
680         my $interface    = $_[0];
681         RRDs::graph(
682                 "-",
683                 "--start",
684                 "-1".$period,
685                 "-aPNG",
686                 "-i",
687                 "-z",
688                 "-W www.ipfire.org",
689                 "--alt-y-grid",
690                 "-w 600",
691                 "-h 125",
692                 "-t Wireless ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
693                 "-v dBm",
694                 "--color=SHADEA".$color{"color19"},
695                 "--color=SHADEB".$color{"color19"},
696                 "--color=BACK".$color{"color21"},
697                 "DEF:noise=".$mainsettings{'RRDLOG'}."/collectd/localhost/wireless-".$interface."/signal_noise.rrd:value:AVERAGE",
698                 "DEF:power=".$mainsettings{'RRDLOG'}."/collectd/localhost/wireless-".$interface."/signal_power.rrd:value:AVERAGE",
699                 "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
700                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
701                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
702                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
703                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
704                 "LINE1:noise".$color{"color11"}."A0:".sprintf("%-20s","Signal Noise Ratio"),
705                 "GPRINT:noise:MAX:%5.1lf %sdBm",
706                 "GPRINT:noise:AVERAGE:%5.1lf %sdBm",
707                 "GPRINT:noise:MIN:%5.1lf %sdBm",
708                 "GPRINT:noise:LAST:%5.1lf %sdBm\\j",
709                 "LINE1:power".$color{"color12"}."A0:".sprintf("%-20s","Signal Power Ratio"),
710                 "GPRINT:power:MAX:%5.1lf %sdBm",
711                 "GPRINT:power:AVERAGE:%5.1lf %sdBm",
712                 "GPRINT:power:MIN:%5.1lf %sdBm",
713                 "GPRINT:power:LAST:%5.1lf %sdBm\\j",
714                 );
715                 $ERROR = RRDs::error;
716                 print "Error in RRD::graph for wireless: ".$ERROR."\n" if $ERROR;
717 }
718
719 # Generate the HDD Temp Graph for the current period of time for values given by collecd and lm_sensors
720
721 sub updatehddgraph {
722         my $disk = $_[0];
723         my $period = $_[1];
724         RRDs::graph(
725                 "-",
726                 "--start",
727                 "-1".$period,
728                 "-aPNG",
729                 "-i",
730                 "-z",
731                 "-W www.ipfire.org",
732                 "--alt-y-grid",
733                 "-w 600",
734                 "-h 125",
735                 "-r",
736                 "-t ".$disk." ".$Lang::tr{'harddisk temperature'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
737                 "-v Celsius",
738                 "--color=SHADEA".$color{"color19"},
739                 "--color=SHADEB".$color{"color19"},
740                 "--color=BACK".$color{"color21"},
741                 "DEF:temperature=".$mainsettings{'RRDLOG'}."/hddtemp-$disk.rrd:temperature:AVERAGE",
742                 "DEF:standby=".$mainsettings{'RRDLOG'}."/hddshutdown-$disk.rrd:standby:AVERAGE",
743                 "CDEF:st=standby,INF,*",
744                 "AREA:st".$color{"color20"}."A0:standby",
745                 "LINE3:temperature".$color{"color11"}."A0:$Lang::tr{'hdd temperature in'} C\\j",
746                 "COMMENT:$Lang::tr{'maximal'}",
747                 "COMMENT:$Lang::tr{'average'}",
748                 "COMMENT:$Lang::tr{'minimal'}",
749                 "COMMENT:$Lang::tr{'current'}\\j",
750                 "GPRINT:temperature:MAX:%3.0lf Grad C",
751                 "GPRINT:temperature:AVERAGE:%3.0lf Grad C",
752                 "GPRINT:temperature:MIN:%3.0lf Grad C",
753                 "GPRINT:temperature:LAST:%3.0lf Grad C\\j",
754                 );
755                 $ERROR = RRDs::error;
756                 print "Error in RRD::graph for hdd-".$disk.": ".$ERROR."\n" if $ERROR;
757 }
758
759 # Generate the Temp Graph for the current period of time for values given by collecd and lm_sensors
760
761 sub updatehwtempgraph {
762         my $period = $_[0];
763
764         my @command = (
765                 "-",
766                 "--start",
767                 "-1".$period,
768                 "-aPNG",
769                 "-i",
770                 "-z",
771                 "-W www.ipfire.org",
772                 "--alt-y-grid",
773                 "-w 600",
774                 "-h 125",
775                 "-r",
776                 "-t ".$Lang::tr{'mbmon temp'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
777                 "--color=SHADEA".$color{"color19"},
778                 "--color=SHADEB".$color{"color19"},
779                 "--color=BACK".$color{"color21"},
780                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
781                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
782                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
783                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
784                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
785         );
786
787                 foreach(@sensorsgraphs){
788                         chomp($_);
789                         if ( $_ =~ /temperature/ ) {
790                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
791                                 my $label = $2.$3;$label=~ s/-//g;
792                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
793                                 push(@command,"DEF:".$sensorsettings{'LABEL-'.$label}."=".$_.":value:AVERAGE");
794                         }
795                 }
796
797                 foreach(@sensorsgraphs){
798                         chomp($_);
799                         if ( $_ =~ /temperature/ ){
800                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
801                                 my $label = $2.$3;$label=~ s/-//g;
802                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
803                                 push(@command,"LINE3:".$sensorsettings{'LABEL-'.$label}.random_hex_color(6)."A0:".sprintf("%-25s",$sensorsettings{'LABEL-'.$label}),"GPRINT:".$sensorsettings{'LABEL-'.$label}.":MAX:%3.2lf C","GPRINT:".$sensorsettings{'LABEL-'.$label}.":AVERAGE:%3.2lf C","GPRINT:".$sensorsettings{'LABEL-'.$label}.":MIN:%3.2lf C","GPRINT:".$sensorsettings{'LABEL-'.$label}.":LAST:%3.2lf C\\j",);
804                         }
805                 }
806
807                 RRDs::graph (@command);
808                 $ERROR = RRDs::error;
809                 print "Error in RRD::graph for HDD Temp: ".$ERROR."\n" if $ERROR;
810 }
811
812 # Generate the Fan Graph for the current period of time for values given by collecd and lm_sensors
813
814 sub updatehwfangraph {
815         my $period = $_[0];
816
817         my @command = (
818                 "-",
819                 "--start",
820                 "-1".$period,
821                 "-aPNG",
822                 "-i",
823                 "-z",
824                 "-W www.ipfire.org",
825                 "--alt-y-grid",
826                 "-w 600",
827                 "-h 125",
828                 "-r",
829                 "-t ".$Lang::tr{'mbmon fan'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
830                 "--color=SHADEA".$color{"color19"},
831                 "--color=SHADEB".$color{"color19"},
832                 "--color=BACK".$color{"color21"},
833                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
834                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
835                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
836                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
837                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
838         );
839
840                 foreach(@sensorsgraphs){
841                         chomp($_);
842                         if ( $_ =~ /fanspeed/ ) {
843                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
844                                 my $label = $2.$3;$label=~ s/-//g;
845                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
846                                 push(@command,"DEF:".$sensorsettings{'LABEL-'.$label}."=".$_.":value:AVERAGE");
847                         }
848                 }
849
850                 foreach(@sensorsgraphs){
851                         chomp($_);
852                         if ( $_ =~ /fanspeed/ ){
853                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
854                                 my $label = $2.$3;$label=~ s/-//g;
855                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
856                                 push(@command,"LINE3:".$sensorsettings{'LABEL-'.$label}.random_hex_color(6)."A0:".sprintf("%-25s",$sensorsettings{'LABEL-'.$label}),"GPRINT:".$sensorsettings{'LABEL-'.$label}.":MAX:%3.2lf RPM","GPRINT:".$sensorsettings{'LABEL-'.$label}.":AVERAGE:%3.2lf RPM","GPRINT:".$sensorsettings{'LABEL-'.$label}.":MIN:%3.2lf RPM","GPRINT:".$sensorsettings{'LABEL-'.$label}.":LAST:%3.2lf RPM\\j",);
857                         }
858                 }
859
860                 RRDs::graph (@command);
861                 $ERROR = RRDs::error;
862                 print "Error in RRD::graph for Fan Speed: ".$ERROR."\n" if $ERROR;
863 }
864
865 # Generate the Voltage Graph for the current period of time for values given by collecd and lm_sensors
866
867 sub updatehwvoltgraph {
868         my $period = $_[0];
869
870         my @command = (
871                 "-",
872                 "--start",
873                 "-1".$period,
874                 "-aPNG",
875                 "-i",
876                 "-z",
877                 "-W www.ipfire.org",
878                 "--alt-y-grid",
879                 "-w 600",
880                 "-h 125",
881                 "-r",
882                 "-t ".$Lang::tr{'mbmon volt'}." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
883                 "--color=SHADEA".$color{"color19"},
884                 "--color=SHADEB".$color{"color19"},
885                 "--color=BACK".$color{"color21"},
886                 "COMMENT:".sprintf("%-29s",$Lang::tr{'caption'}),
887                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
888                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
889                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
890                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
891         );
892
893                 foreach(@sensorsgraphs){
894                         chomp($_);
895                         if ( $_ =~ /voltage/ ) {
896                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
897                                 my $label = $2.$3;$label=~ s/-//g;
898                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
899                                 push(@command,"DEF:".$sensorsettings{'LABEL-'.$label}."=".$_.":value:AVERAGE");
900                         }
901                 }
902
903                 foreach(@sensorsgraphs){
904                         chomp($_);
905                         if ( $_ =~ /voltage/ ){
906                                 $_ =~ /\/(.*)sensors-(.*)\/(.*)\.rrd/;
907                                 my $label = $2.$3;$label=~ s/-//g;
908                                 if ( $sensorsettings{'LINE-'.$label} eq "off" ){next;}
909                                 push(@command,"LINE3:".$sensorsettings{'LABEL-'.$label}.random_hex_color(6)."A0:".sprintf("%-25s",$sensorsettings{'LABEL-'.$label}),"GPRINT:".$sensorsettings{'LABEL-'.$label}.":MAX:%3.2lf V","GPRINT:".$sensorsettings{'LABEL-'.$label}.":AVERAGE:%3.2lf V","GPRINT:".$sensorsettings{'LABEL-'.$label}.":MIN:%3.2lf V","GPRINT:".$sensorsettings{'LABEL-'.$label}.":LAST:%3.2lf V\\j",);
910                         }
911                 }
912
913                 RRDs::graph (@command);
914                 $ERROR = RRDs::error;
915                 print "Error in RRD::graph for Voltage: ".$ERROR."\n" if $ERROR;
916 }
917
918
919 # Generate the QoS Graph for the current period of time
920
921 sub updateqosgraph {
922
923         my $period = $_[1];
924         my %qossettings = ();
925         &General::readhash("${General::swroot}/qos/settings", \%qossettings);
926
927         my $classentry = "";
928         my @classes = ();
929         my @classline = ();
930         my $classfile = "/var/ipfire/qos/classes";
931
932         $qossettings{'DEV'} = $_[0];
933         if ( $qossettings{'DEV'} eq $qossettings{'RED_DEV'} ) {
934                 $qossettings{'CLASSPRFX'} = '1';
935         } else {
936                 $qossettings{'CLASSPRFX'} = '2';
937         }
938
939         my $ERROR="";
940         my $count="1";
941         my $color="#000000";
942
943         my @command = (
944                 "-",
945                 "--start",
946                 "-1".$period,
947                 "-aPNG",
948                 "-i",
949                 "-z",
950                 "-W www.ipfire.org",
951                 "--alt-y-grid",
952                 "-w 600",
953                 "-h 125",
954                 "-r",
955                 "-t ".$Lang::tr{'Utilization on'}." (".$qossettings{'DEV'}.") ".$Lang::tr{'graph per'}." ".$Lang::tr{$period},
956                 "-v ".$Lang::tr{'bytes per second'},
957                 "--color=SHADEA".$color{"color19"},
958                 "--color=SHADEB".$color{"color19"},
959                 "--color=BACK".$color{"color21"},
960                 "COMMENT:".sprintf("%-28s",$Lang::tr{'caption'}),
961                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
962                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
963                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
964                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
965         );
966
967                 open( FILE, "< $classfile" ) or die "Unable to read $classfile";
968                 @classes = <FILE>;
969                 close FILE;
970
971                 foreach $classentry (sort @classes){
972                         @classline = split( /\;/, $classentry );
973                         if ( $classline[0] eq $qossettings{'DEV'} ){
974                                 $color=random_hex_color(6);
975                                 push(@command, "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
976
977                                 if ($count eq "1") {
978                                         push(@command, "AREA:$classline[1]$color:Klasse $classline[1] -".sprintf("%15s",$classline[8]));
979                                 } else {
980                                         push(@command, "STACK:$classline[1]$color:Klasse $classline[1] -".sprintf("%15s",$classline[8]));
981
982                                 }
983
984                                 push(@command, "GPRINT:$classline[1]:MAX:%8.1lf %sBps"
985                                                 , "GPRINT:$classline[1]:AVERAGE:%8.1lf %sBps"
986                                                 , "GPRINT:$classline[1]:MIN:%8.1lf %sBps"
987                                                 , "GPRINT:$classline[1]:LAST:%8.1lf %sBps\\j");
988                                 $count++;
989                         }
990                 }
991                 RRDs::graph (@command);
992                 $ERROR = RRDs::error;
993                 print "Error in RRD::graph for qos device ".$qossettings{'DEV'}.": ".$ERROR."\n" if $ERROR;
994 }
995
996 # Generate the CPU Frequency Graph for the current period of time for values given by collectd an lm_sensors
997
998 sub updatecpufreqgraph {
999         my $cpucount = `ls -dA $mainsettings{'RRDLOG'}/collectd/localhost/cpu-*/ 2>/dev/null | wc -l`;
1000         my $period    = $_[0];
1001         my @command = (
1002                 "-",
1003                 "--start",
1004                 "-1".$period,
1005                 "-aPNG",
1006                 "-i",
1007                 "-z",
1008                 "-W www.ipfire.org",
1009                 "--alt-y-grid",
1010                 "-w 600",
1011                 "-h 125",
1012                 "-l 0",
1013                 "-r",
1014                 "-t ".$Lang::tr{'cpu frequency per'}." ".$Lang::tr{$period},
1015                 "-v MHz",
1016                 "--color=SHADEA".$color{"color19"},
1017                 "--color=SHADEB".$color{"color19"},
1018                 "--color=BACK".$color{"color21"},
1019                 "COMMENT:".sprintf("%-10s",$Lang::tr{'caption'}),
1020                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
1021                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
1022                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
1023                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
1024         );
1025
1026         for(my $i = 0; $i < $cpucount; $i++) {
1027                 my $j=$i+1;
1028                 push(@command,"DEF:cpu".$i."_=".$mainsettings{'RRDLOG'}."/collectd/localhost/cpufreq/cpufreq-".$i.".rrd:value:AVERAGE"
1029                                 ,"CDEF:cpu".$i."=cpu".$i."_,1000000,/"
1030                                 ,"LINE1:cpu".$i.$color{"color1$j"}."A0:cpu ".$i." "
1031                                 ,"GPRINT:cpu".$i.":MAX:%3.0lf Mhz"
1032                                 ,"GPRINT:cpu".$i.":AVERAGE:%3.0lf Mhz"
1033                                 ,"GPRINT:cpu".$i.":MIN:%3.0lf Mhz"
1034                                 ,"GPRINT:cpu".$i.":LAST:%3.0lf Mhz\\j");
1035         }
1036
1037         RRDs::graph (@command);
1038         $ERROR = RRDs::error;
1039         print "Error in RRD::graph for cpu freq: ".$ERROR."\n" if $ERROR;
1040 }
1041
1042 # Generate the Thermal Zone Temp CPU Graph
1043
1044 sub updatethermaltempgraph {
1045         my $thermalcount = `ls -dA $mainsettings{'RRDLOG'}/collectd/localhost/thermal-thermal_zone* 2>/dev/null | wc -l`;
1046         my $period    = $_[0];
1047         my @command = (
1048                 "-",
1049                 "--start",
1050                 "-1".$period,
1051                 "-aPNG",
1052                 "-i",
1053                 "-z",
1054                 "-W www.ipfire.org",
1055                 "--alt-y-grid",
1056                 "-w 600",
1057                 "-h 125",
1058                 "-r",
1059                 "-t "."ACPI Thermal-Zone Temperature"." - ".$Lang::tr{$period},
1060                 "-v Grad Celsius",
1061                 "--color=SHADEA".$color{"color19"},
1062                 "--color=SHADEB".$color{"color19"},
1063                 "--color=BACK".$color{"color21"},
1064                 "COMMENT:".sprintf("%-10s",$Lang::tr{'caption'}),
1065                 "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
1066                 "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
1067                 "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
1068                 "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j"
1069         );
1070
1071         for(my $i = 0; $i < $thermalcount; $i++) {
1072                 my $j=$i+1;
1073                 push(@command,"DEF:temp".$i."_=".$mainsettings{'RRDLOG'}."/collectd/localhost/thermal-thermal_zone".$i."/temperature-temperature.rrd:value:AVERAGE"
1074                                 ,"CDEF:temp".$i."=temp".$i."_,1,/"
1075                                 ,"LINE3:temp".$i.$color{"color1$j"}."A0:Temp ".$i." "
1076                                 ,"GPRINT:temp".$i.":MAX:%3.0lf Grad C"
1077                                 ,"GPRINT:temp".$i.":AVERAGE:%3.0lf Grad C"
1078                                 ,"GPRINT:temp".$i.":MIN:%3.0lf Grad C"
1079                                 ,"GPRINT:temp".$i.":LAST:%3.0lf Grad C\\j");
1080         }
1081
1082         RRDs::graph (@command);
1083         $ERROR = RRDs::error;
1084         print "Error in RRD::graph for thermal temp: ".$ERROR."\n" if $ERROR;
1085 }
1086
1087
1088 # Generate a random color, used by Qos Graph to be independent from the amount of values
1089
1090 sub random_hex_color {
1091         my $size = shift;
1092         $size = 6 if $size !~ /^3|6$/;
1093         my @hex = ( 0 .. 9, 'a' .. 'f' );
1094         my @color;
1095         push @color, @hex[rand(@hex)] for 1 .. $size;
1096         return join('', '#', @color);
1097 }
1098
1099 sub getprocesses {
1100         my @processesgraph = `ls -dA $mainsettings{'RRDLOG'}/collectd/localhost/processes-*/ 2>/dev/null`;
1101         return @processesgraph;
1102 }