Big update of Clearadm
[clearscm.git] / clearadm / plot.cgi
1 #!/usr/local/bin/perl
2
3 =pod
4
5 =head1 NAME $RCSfile: plot.cgi,v $
6
7 Plot statistics
8
9 =head1 VERSION
10
11 =over
12
13 =item Author
14
15 Andrew DeFaria <Andrew@ClearSCM.com>
16
17 =item Revision
18
19 $Revision: 1.14 $
20
21 =item Created:
22
23 Mon Oct 25 11:10:47 PDT 2008
24
25 =item Modified:
26
27 $Date: 2011/01/28 21:30:45 $
28
29 =back
30
31 =head1 DESCRIPTION
32
33 Display a graph of either Loadavg or Filesystem data and provide controls for
34 the user to manipulate the chart.
35
36 =cut
37
38 use strict;
39 use warnings;
40
41 use FindBin;
42 use CGI qw (:standard :cgi-lib start_table end_table start_Tr end_Tr);
43 use GD::Graph::area;
44
45 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
46
47 use Clearadm;
48 use ClearadmWeb;
49 use Display;
50
51 my $VERSION  = '$Revision: 1.14 $';
52   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
53   
54 my %opts = Vars;
55
56 my $clearadm;
57
58 sub displayGraph () {
59   my $parms;
60
61   for (keys %opts) {
62     $parms .= '&' if $parms;
63     $parms .= "$_=$opts{$_}"
64   } # for
65
66   display '<center>';
67   
68   if ($opts{type} eq 'loadavg') {
69     unless ($opts{tiny}) {
70       display img {src => "plotloadavg.cgi?$parms", class => 'chart'};
71     } else {
72       display img {src => "plotloadavg.cgi?$parms", border => 0};
73     } # unless
74   } elsif ($opts{type} eq 'filesystem') {
75     unless ($opts{tiny}) {
76       display img {src => "plotfs.cgi?$parms", class => 'chart'};
77     } else {
78       display img {src => "plotfs.cgi?$parms", border => 0};
79     } # unless
80   } elsif ($opts{type} eq 'vob' or $opts{type} eq 'view') {
81     unless ($opts{tiny}) {
82       display img {src => "plotstorage.cgi?$parms", class => 'chart'};
83     } else {
84       display img {src => "plotstorage.cgi?$parms", border => 0};
85     } # unless
86   } # if
87
88   display '</center>';
89   
90   return
91 } # displayGraph
92
93 sub displayFSInfo () {
94   if ($opts{filesystem}) {
95     display h3 {-align => 'center'}, 'Latest Filesystem Reading';
96   } else {
97         display p;
98         return;
99   } # if
100   
101   display start_table {width => '800px', cellspacing => 1};
102   
103   display start_Tr;
104     display th {class => 'labelCentered'}, 'Filesystem';
105     display th {class => 'labelCentered'}, 'Type';
106     display th {class => 'labelCentered'}, 'Mount';
107     display th {class => 'labelCentered'}, 'Size';
108     display th {class => 'labelCentered'}, 'Used';
109     display th {class => 'labelCentered'}, 'Free';
110     display th {class => 'labelCentered'}, 'Used %';
111     display th {class => 'labelCentered'}, 'History';
112     display th {class => 'labelCentered'}, 'Threshold';
113   display end_Tr;  
114   
115   my %filesystem = $clearadm->GetFilesystem (
116     $opts{system}, 
117     $opts{filesystem}
118   );
119   my %fs = $clearadm->GetLatestFS   (
120     $opts{system},
121     $opts{filesystem}
122   );
123   
124   my $size = autoScale $fs{size};
125   my $used = autoScale $fs{used};
126   my $free = autoScale $fs{free};    
127
128   display start_Tr;
129     display td {class => 'data'},         $filesystem{filesystem};
130     display td {class => 'dataCentered'}, $filesystem{fstype};
131     display td {class => 'data'},         $filesystem{mount};
132     display td {class => 'dataRight'},    $size;
133     display td {class => 'dataRight'},    $used;
134     display td {class => 'dataRight'},    $free;
135     # TODO: Note that this percentages does not agree with df output. I'm not 
136     # sure why.
137     display td {class => 'dataCentered'},
138       sprintf ('%.0f%%', (($fs{reserve} + $fs{used}) / $fs{size} * 100));
139     display td {class => 'dataCentered'}, $filesystem{filesystemHist};
140     display td {class => 'dataCentered'}, "$filesystem{threshold}%";
141   display end_Tr;
142   
143   display end_table;
144   
145   return;  
146 } # displayInfo
147
148 sub displayControls() {
149   my $class = $opts{type} =~ /loadavg/i 
150             ? 'controls'
151             : 'filesystemControls';
152   
153   display start_table {
154     align       => 'center',
155     class       => $class,
156     cellspacing => 0,
157     width       => '800px',
158   };
159   
160   my $tagsButtons;
161   my ($systemLink, $systemButtons);
162
163   if ($opts{type} =~ /(vob|view)/i) {
164     $tagsButtons = makeTagsDropdown ($opts{type}, $opts{tag});
165   } else {
166     $systemLink = span {id => 'systemLink'}, a {
167       href => "systemdetails.cgi?system=$opts{system}",
168     }, 'System';
169
170     $systemButtons = makeSystemDropdown (
171       $systemLink, 
172       $opts{system}, 
173       'updateFilesystems(this.value);updateSystemLink(this.value)'
174     );
175   } # if
176
177   my $startButtons = makeTimeDropdown (
178     $opts{type},
179     'startTimestamp',
180     $opts{system},
181     $opts{filesystem},
182     'Start',
183     $opts{start},
184     $opts{scaling},
185   );
186
187   my $endButtons = makeTimeDropdown (
188     $opts{type},
189     'endTimestamp',
190     $opts{system},
191     $opts{filesystem},
192     'End',
193     $opts{end},
194     $opts{scaling},
195   );
196
197   my $update;
198
199   if ($opts{type} eq 'loadavg') {
200     $update = "updateSystem('$opts{system}')";
201   } elsif ($opts{type} eq 'filsystem') {
202     $update = "updateFilesystem('$opts{system}','$opts{filesystem}')";
203   } else {
204     $update = ''; # TODO do I need something here?
205   } # if
206              
207   my $intervalButtons = makeIntervalDropdown (
208     'Interval',
209     $opts{scaling},
210     $update
211   );
212   
213   display start_Tr;
214     display td $startButtons;
215     display td $intervalButtons;
216     display td $opts{type} =~ /(vob|view)/i ? $tagsButtons : $systemButtons;
217   display end_Tr;
218
219   display start_Tr;
220     display td $endButtons;
221     display td 'Points', 
222       input {
223         name      => 'points',
224         value     => $opts{points},
225         class     => 'inputfield',
226         size      => 7,
227         style     => 'text-align: right',
228         maxlength => 7,
229       };  
230
231   if ($opts{type} eq 'loadavg') {
232     display td input {
233       type  => 'submit',
234       value => 'Draw Graph',
235     };
236   } else {
237     if ($opts{type} eq 'filesystem') {
238       my $filesystemButtons = makeFilesystemDropdown (
239         $opts{system}, 
240         'Filesystem',
241         undef,
242         "updateFilesystem('$opts{system}',this.value)",
243       );
244         
245       display td $filesystemButtons;
246     } else {
247       my $storagePoolButtons = makeStoragePoolDropdown ($opts{type}, $opts{tag});
248
249       display td $storagePoolButtons;
250     } # if
251     
252     display end_Tr;
253     display start_Tr;
254     display td {align => 'center', colspan => 3}, 
255       input {type => 'submit', value => 'Draw Graph'};
256   } # if
257   
258   display end_Tr;
259
260   display end_table;
261   
262   return;
263 } # displayControls
264
265 $clearadm = Clearadm->new;
266
267 my $title  = ucfirst ($opts{type}) . ': ';
268
269 $title .= ucfirst $opts{system}           if $opts{system};
270 $title .= ":$opts{filesystem}"            if $opts{filesystem};
271 $title .= $opts{tag}                      if $opts{tag};
272 $title .= " Storage pool: $opts{storage}" if $opts{storage};
273
274 heading $title;
275
276 display h1 {class => 'center'}, $title;
277
278 display start_form {
279   method => 'get', 
280   action => 'plot.cgi',
281 };
282
283 # Some hidden fields to pass along
284 display input {type => 'hidden', name => 'type', value => $opts{type}};
285
286 displayGraph;
287 displayFSInfo;
288 displayControls;
289
290 display end_form;   
291
292 footing;
293
294 =pod
295
296 =head1 CONFIGURATION AND ENVIRONMENT
297
298 DEBUG: If set then $debug is set to this level.
299
300 VERBOSE: If set then $verbose is set to this level.
301
302 TRACE: If set then $trace is set to this level.
303
304 =head1 DEPENDENCIES
305
306 =head2 Perl Modules
307
308 L<CGI>
309
310 L<CGI::Carp|CGI::Carp>
311
312 L<FindBin>
313
314 L<Getopt::Long|Getopt::Long>
315
316 =head2 ClearSCM Perl Modules
317
318 =begin man 
319
320  Clearadm
321  ClearadmWeb
322  Display
323
324 =end man
325
326 =begin html
327
328 <blockquote>
329 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
330 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
331 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
332 </blockquote>
333
334 =end html
335
336 =head1 BUGS AND LIMITATIONS
337
338 There are no known bugs in this script
339
340 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
341
342 =head1 LICENSE AND COPYRIGHT
343
344 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
345
346 =cut