22c20ba775ee4ef07f4a8f6692aaf426838351ae
[clearscm.git] / clearadm / plotstorage.cgi
1 #!/usr/local/bin/perl
2
3 =pod
4
5 =head1 NAME $RCSfile: plotstorage.cgi,v $
6
7 Plot Clearcse Storage 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 plotstorage.cgi: tag=<tag> type=<vob|view> storage=<storage>
34                         [height=<height>] [width=<width>] [color=<color>]
35                         [scaling=<scaling>] [points=<points>] [tiny=<0|1>] 
36
37  Where:
38    <tag>:     Tag of the Clearcase object (vob or view)
39    <type>:    Designates whether <tag> is a vob of a view
40    <storage>: Name of the Clearcase storage pool 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 storage usage for the Clearcase object (vob|view).
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
55 <vob|view>details.cgi to draw tiny charts in the table. Setting tiny sets
56 a number of the other chart options to produce a standard, tiny chart.
57
58 =cut
59
60 use strict;
61 use warnings;
62
63 use FindBin;
64
65 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
66
67 use Clearadm;
68 use ClearadmWeb;
69 use Clearcase;
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 "Tag is required"     unless $opts{tag};
96 graphError "Type is required"    unless $opts{type};
97 graphError "Storage is required" unless $opts{storage};
98
99 graphError "Points not numeric (points: $opts{points})"
100   if $opts{points} and $opts{points} !~ /^\d+$/;
101   
102 my @storage = $clearadm->GetStorage (
103   $opts{type},
104   $opts{tag},
105   $opts{storage},
106   $opts{region},
107   $opts{start},
108   $opts{end},
109   $opts{points},
110   $opts{scaling}
111 );
112
113 graphError "No data found for $opts{type} $opts{tag} for storage pool $opts{storage}"
114   unless @storage;
115
116 my (@x, @y);
117
118 my $i = 0;
119
120 for (@storage) {
121   $i++;
122   my %storage = %{$_};
123   
124   if ($opts{tiny}) {
125     push @x, '';
126   } else {
127     push @x, $storage{timestamp};
128   } # if
129
130   push @y, $opts{meg} ? $storage{size} / (1024 * 1024) :
131                         $storage{size} / (1024 * 1024 * 12024);
132 } # for
133
134 my @data = ([@x], [@y]);
135
136 my $x_label_skip = @x > 1000 ? 200
137                  : @x > 100  ?  20
138                  : @x > 50   ?   2
139                  : @x > 10   ?   1
140                  : 0;
141                  
142 my $storageLabel = ucfirst $opts{storage};
143 my $x_label = $opts{tiny} ? '' : "$storageLabel Storage";
144 my $y_label = $opts{tiny} ? '' : 
145               $opts{msg}  ? 'Used (Meg)' : 'Used (Gig)';
146 my $title   = $opts{tiny} ? '' : "Storage usage for "
147                                . "$opts{type}:$opts{tag} $storageLabel";
148 my $labelY  = $opts{tiny} ? '' : '%.2f';
149
150 $graph->set (
151   x_label           => $x_label,
152   x_labels_vertical => 1,
153   x_label_skip      => $x_label_skip,
154   x_label_position  => .5,
155   y_label           => $y_label,
156   y_number_format   => $labelY,
157   title             => $title,
158   dclrs             => [$opts{color}],
159   bgclr             => 'white',
160   transparent       => 0,
161   long_ticks        => 1,
162   t_margin          => 5,
163   b_margin          => 5,
164   l_margin          => 5,
165   r_margin          => 5,  
166 ) or graphError $graph->error;
167
168 my $image = $graph->plot(\@data)
169   or croak $graph->error;
170
171 print "Content-type: image/png\n\n";
172 print $image->png;
173
174 =pod
175
176 =head1 CONFIGURATION AND ENVIRONMENT
177
178 DEBUG: If set then $debug is set to this level.
179
180 VERBOSE: If set then $verbose is set to this level.
181
182 TRACE: If set then $trace is set to this level.
183
184 =head1 DEPENDENCIES
185
186 =head2 Perl Modules
187
188 L<CGI>
189
190 L<FindBin>
191
192 L<Getopt::Long|Getopt::Long>
193
194 L<GD::Graph::area|GD::Graph::area>
195
196 =head2 ClearSCM Perl Modules
197
198 =begin man 
199
200  Clearadm
201  ClearadmWeb
202  Display
203
204 =end man
205
206 =begin html
207
208 <blockquote>
209 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
210 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
211 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
212 </blockquote>
213
214 =end html
215
216 =head1 BUGS AND LIMITATIONS
217
218 There are no known bugs in this script
219
220 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
221
222 =head1 LICENSE AND COPYRIGHT
223
224 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
225
226 =cut