Changed cvs_man.php -> scm_man.php.
[clearscm.git] / clearadm / plot.cgi
1 #!/usr/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   foreach (keys %opts) {
62     $parms .= '&'
63       if $parms;
64     $parms .= "$_=$opts{$_}"
65   } # foreach
66
67   display '<center>';
68   
69   if ($opts{type} eq 'loadavg') {
70         unless ($opts{tiny}) {
71       display img {src => "plotloadavg.cgi?$parms", class => 'chart'};
72         } else {
73       display img {src => "plotloadavg.cgi?$parms", border => 0};
74         } # unless
75   } elsif ($opts{type} eq 'filesystem') {
76         unless ($opts{tiny}) {
77       display img {src => "plotfs.cgi?$parms", class => 'chart'};
78         } else {
79       display img {src => "plotfs.cgi?$parms", border => 0};
80         } # unless
81   } # if
82
83   display '</center>';
84   
85   return
86 } # displayGraph
87
88 sub displayFSInfo () {
89   if ($opts{filesystem}) {
90     display h3 {-align => 'center'}, 'Latest Filesystem Reading';
91   } else {
92         display p;
93         return;
94   } # if
95   
96   display start_table {width => '800px', cellspacing => 1};
97   
98   display start_Tr;
99     display th {class => 'labelCentered'}, 'Filesystem';
100     display th {class => 'labelCentered'}, 'Type';
101     display th {class => 'labelCentered'}, 'Mount';
102     display th {class => 'labelCentered'}, 'Size';
103     display th {class => 'labelCentered'}, 'Used';
104     display th {class => 'labelCentered'}, 'Free';
105     display th {class => 'labelCentered'}, 'Used %';
106     display th {class => 'labelCentered'}, 'History';
107     display th {class => 'labelCentered'}, 'Threshold';
108   display end_Tr;  
109   
110   my %filesystem = $clearadm->GetFilesystem (
111     $opts{system}, 
112     $opts{filesystem}
113   );
114   my %fs = $clearadm->GetLatestFS   (
115     $opts{system},
116     $opts{filesystem}
117   );
118   
119   my $size = autoScale $fs{size};
120   my $used = autoScale $fs{used};
121   my $free = autoScale $fs{free};    
122
123   display start_Tr;
124     display td {class => 'data'},         $filesystem{filesystem};
125     display td {class => 'dataCentered'}, $filesystem{fstype};
126     display td {class => 'data'},         $filesystem{mount};
127     display td {class => 'dataRight'},    $size;
128     display td {class => 'dataRight'},    $used;
129     display td {class => 'dataRight'},    $free;
130     # TODO: Note that this percentages does not agree with df output. I'm not 
131     # sure why.
132     display td {class => 'dataCentered'},
133       sprintf ('%.0f%%', (($fs{reserve} + $fs{used}) / $fs{size} * 100));
134     display td {class => 'dataCentered'}, $filesystem{filesystemHist};
135     display td {class => 'dataCentered'}, "$filesystem{threshold}%";
136   display end_Tr;
137   
138   display end_table;
139   
140   return;  
141 } # displayInfo
142
143 sub displayControls () {
144   my $class = $opts{type} =~ /loadavg/i 
145             ? 'controls'
146             : 'filesystemControls';
147   
148   display start_table {
149     align       => 'center',
150     class       => $class,
151     cellspacing => 0,
152     width       => '800px',
153   };
154   
155   my $systemLink = span {id => 'systemLink'}, a {
156     href => "systemdetails.cgi?system=$opts{system}",
157   }, 'System';
158
159   my $systemButtons = makeSystemDropdown (
160     $systemLink, 
161     $opts{system}, 
162     'updateFilesystems(this.value);updateSystemLink(this.value)'
163   );
164
165   my $startButtons = makeTimeDropdown (
166     $opts{type},
167     'startTimestamp',
168     $opts{system},
169     $opts{filesystem},
170     'Start',
171     $opts{start},
172     $opts{scaling},
173   );
174
175   my $endButtons = makeTimeDropdown (
176     $opts{type},
177     'endTimestamp',
178     $opts{system},
179     $opts{filesystem},
180     'End',
181     $opts{end},
182     $opts{scaling},
183   );
184
185   my $update = $opts{type} eq 'loadavg' 
186              ? "updateSystem('$opts{system}')"
187              : "updateFilesystem('$opts{system}','$opts{filesystem}')";
188              
189   my $intervalButtons = makeIntervalDropdown (
190     'Interval',
191     $opts{scaling},
192     $update
193   );
194   
195   display start_Tr;
196     display td $startButtons;
197     display td $intervalButtons;
198     display td $systemButtons;
199   display end_Tr;
200
201   display start_Tr;
202     display td $endButtons;
203     display td 'Points', 
204       input {
205         name      => 'points',
206         value     => $opts{points},
207         class     => 'inputfield',
208         size      => 7,
209         style     => 'text-align: right',
210         maxlength => 7,
211       };  
212
213   if ($opts{type} eq 'loadavg') {
214     display td input {
215       type  => 'submit',
216       value => 'Draw Graph',
217     };
218   } else {
219     my $filesystemButtons = makeFilesystemDropdown (
220       $opts{system}, 
221       'Filesystem',
222       undef,
223       "updateFilesystem('$opts{system}',this.value)",
224     );
225         
226     display td $filesystemButtons;
227     
228     display end_Tr;
229     display start_Tr;
230     display td {align => 'center', colspan => 3}, 
231       input {type => 'submit', value => 'Draw Graph'};
232   } # if
233   
234   display end_Tr;
235
236   display end_table;
237   
238   return;
239 } # displayControls
240
241 $clearadm = Clearadm->new;
242
243 my $title  = ucfirst ($opts{type}) . ': ' . ucfirst $opts{system};
244
245 $title .= ":$opts{filesystem}"
246   if $opts{filesystem};
247
248 heading $title;
249
250 display h1 {class => 'center'}, $title;
251
252 display start_form {
253   method => 'get', 
254   action => 'plot.cgi',
255 };
256
257 # Some hidden fields to pass along
258 display input {type => 'hidden', name => 'type', value => $opts{type}};
259
260 displayGraph;
261 displayFSInfo;
262 displayControls;
263
264 display end_form;   
265
266 footing;
267
268 =pod
269
270 =head1 CONFIGURATION AND ENVIRONMENT
271
272 DEBUG: If set then $debug is set to this level.
273
274 VERBOSE: If set then $verbose is set to this level.
275
276 TRACE: If set then $trace is set to this level.
277
278 =head1 DEPENDENCIES
279
280 =head2 Perl Modules
281
282 L<CGI>
283
284 L<CGI::Carp|CGI::Carp>
285
286 L<FindBin>
287
288 L<Getopt::Long|Getopt::Long>
289
290 =head2 ClearSCM Perl Modules
291
292 =begin man 
293
294  Clearadm
295  ClearadmWeb
296  Display
297
298 =end man
299
300 =begin html
301
302 <blockquote>
303 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
304 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
305 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
306 </blockquote>
307
308 =end html
309
310 =head1 BUGS AND LIMITATIONS
311
312 There are no known bugs in this script
313
314 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
315
316 =head1 LICENSE AND COPYRIGHT
317
318 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
319
320 =cut