Added caching to clearadm
[clearscm.git] / clearadm / plotfs.cgi
1 #!/usr/local/bin/perl
2
3 =pod
4
5 =head1 NAME $RCSfile: plotfs.cgi,v $
6
7 Plot Filesystem usage
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.13 $
20
21 =item Created:
22
23 Mon Dec 13 09:13:27 EST 2010
24
25 =item Modified:
26
27 $Date: 2011/01/14 16:37:04 $
28
29 =back
30
31 =head1 SYNOPSIS
32
33  Usage plotfs.cgi: system=<system> filesytem=<filesystem> 
34                    [height=<height>] [width=<width>] [color=<color>]
35                    [scaling=<scaling>] [points=<points>] [tiny=<0|1>] 
36
37  Where:
38    <system>:     Name of the system defined in the Clearadm database to
39                  retrieve filesystem snapshots for.
40    <filesystem>: Name of the filesytem to plot information for
41    <height>:     Height of chart (Default: 480px - tiny: 40)
42    <width>:      Width of chart (Default: 800px - tiny: 150)
43    <color>:      A GD::Color color value (Default: lblue)
44    <scaling>:    Currently one of Minute, Hour, Day or Month. Specifies how
45                  Clearadm::GetFS will scale the data returned (Default: Minute 
46                  - tiny: Day)
47    <points>:     Number of points to plot (Default: all points - tiny: 7)
48    
49 =head1 DESCRIPTION
50
51 Draws a chart of the filesystem usage for the system and filesystem passed in.
52 Parameters such as height, width, color, scaling and points can be set 
53 individually though more often the user will just use the web controls to set 
54 them. Defaults produce a nice chart. Tiny mode is used by systemdetails.cgi to
55 draw tiny charts in the table. Setting tiny sets a number of the other chart
56 options to produce a standard, tiny chart.
57
58 =cut
59
60 use strict;
61 use warnings;
62
63 use FindBin;
64 use Convert::Base64;
65
66 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
67
68 use Clearadm;
69 use ClearadmWeb;
70 use Display;
71
72 use CGI qw (:standard :cgi-lib);
73 use GD::Graph::area;
74
75 my %opts = Vars;
76
77 my $VERSION  = '$Revision: 1.13 $';
78   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
79
80 $opts{color}  ||= 'lblue';
81 $opts{height} ||= 350;
82 $opts{width}  ||= 800;
83
84 if ($opts{tiny}) {
85   $opts{height}  = 40;
86   $opts{width}   = 150;
87   $opts{points}  = 7;
88   $opts{scaling} = 'Day';
89 } # if
90
91 my $clearadm = Clearadm->new;
92
93 my $graph = GD::Graph::area->new ($opts{width}, $opts{height});
94
95 graphError "System is required"
96   unless $opts{system};
97   
98 graphError "Filesystem is required"
99   unless $opts{filesystem};
100
101 graphError "Points not numeric (points: $opts{points})"
102   if $opts{points} and $opts{points} !~ /^\d+$/;
103   
104 my @fs = $clearadm->GetFS (
105   $opts{system},
106   $opts{filesystem},
107   $opts{start},
108   $opts{end},
109   $opts{points},
110   $opts{scaling}
111 );
112
113 graphError "No data found for $opts{system}:$opts{filesystem}"
114   unless @fs;
115
116 my (@x, @y);
117
118 my $i = 0;
119
120 foreach (@fs) {
121   $i++;
122   my %fs = %{$_};
123   
124   if ($opts{tiny}) {
125     push @x, '';
126   } else {
127     push @x, $fs{timestamp};
128   } # if
129
130   push @y, $opts{meg} ? $fs{used} / (1024 * 1024) :
131                         $fs{used} / (1024 * 1024 * 12024);
132 }
133 my @data = ([@x], [@y]);
134
135 my $x_label_skip = @x > 1000 ? 200
136                  : @x > 100  ?  20
137                  : @x > 50   ?   2
138                  : @x > 10   ?   1
139                  : 0;
140                  
141 my $x_label = $opts{tiny} ? '' : 'Filesystem Usage';
142 my $y_label = $opts{tiny} ? '' : 
143               $opts{msg}  ? 'Used (Meg)' : 'Used (Gig)';
144 my $title   = $opts{tiny} ? '' : "Filesystem usage for "
145                                . "$opts{system}:$opts{filesystem}";
146 my $labelY  = $opts{tiny} ? '' : '%.2f';
147
148 $graph->set (
149   x_label           =>$x_label,
150   x_labels_vertical => 1,
151   x_label_skip      => $x_label_skip,
152   x_label_position  => .5,
153   y_label           => $y_label,
154   y_number_format   => $labelY,
155   title             => $title,
156   dclrs             => [$opts{color}],
157   bgclr             => 'white',
158   transparent       => 0,
159   long_ticks        => 1,
160   t_margin          => 5,
161   b_margin          => 5,
162   l_margin          => 5,
163   r_margin          => 5,  
164 ) or graphError $graph->error;
165
166 my $image = $graph->plot(\@data)
167   or croak $graph->error;
168
169 unless ($opts{generate}) {
170   print "Content-type: image/png\n\n";
171   print $image->png;
172 } else {
173   print encode_base64 $image->png;
174 } # unless
175
176 =pod
177
178 =head1 CONFIGURATION AND ENVIRONMENT
179
180 DEBUG: If set then $debug is set to this level.
181
182 VERBOSE: If set then $verbose is set to this level.
183
184 TRACE: If set then $trace is set to this level.
185
186 =head1 DEPENDENCIES
187
188 =head2 Perl Modules
189
190 L<CGI>
191
192 L<FindBin>
193
194 L<Getopt::Long|Getopt::Long>
195
196 L<GD::Graph::area|GD::Graph::area>
197
198 =head2 ClearSCM Perl Modules
199
200 =begin man 
201
202  Clearadm
203  ClearadmWeb
204  Display
205
206 =end man
207
208 =begin html
209
210 <blockquote>
211 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
212 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
213 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
214 </blockquote>
215
216 =end html
217
218 =head1 BUGS AND LIMITATIONS
219
220 There are no known bugs in this script
221
222 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
223
224 =head1 LICENSE AND COPYRIGHT
225
226 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
227
228 =cut