Removed /usr/local from CDPATH
[clearscm.git] / clearadm / updateccfs.pl
1 #!/usr/local/bin/perl
2
3 =pod
4
5 =head1 NAME $RCSfile: updateccstorage.pl,v $
6
7 Update Filesystem
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.29 $
20
21 =item Created:
22
23 Mon Dec 13 09:13:27 EST 2010
24
25 =item Modified:
26
27 $Date: 2011/06/16 15:12:50 $
28
29 =back
30
31 =head1 SYNOPSIS
32
33  Usage updateccstorage.pl: [-u|sage] [-ve|rbose] [-deb|ug]
34                            [-view [<tag>|all]| -vob [<tag>|all]]
35
36  Where:
37    -u|sage:     Displays usage
38  
39    -ve|rbose:   Be verbose
40    -deb|ug:     Output debug messages
41    
42    -view [<tag>|all]      Update view storage (Default: all)
43    -vob  [<tag>|all]      Update vob storage (Default: all)
44    -region [<region>|all] Update region (Default: all)
45
46 =head1 DESCRIPTION
47
48 This script will record the state of Clearcase storage
49
50 =cut
51
52 use strict;
53 use warnings;
54
55 use FindBin;
56 use Getopt::Long;
57
58 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
59
60 use Clearadm;
61 use Clearexec;
62 use Clearcase::Views;
63 use Clearcase::View;
64 use Clearcase::Vobs;
65 use Clearcase::Vob;
66 use DateUtils;
67 use Display;
68 use Utils;
69 use TimeUtils;
70
71 my $VERSION  = '$Revision: 1.29 $';
72   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
73
74 my $clearadm = Clearadm->new;
75
76 my %total;
77
78 # Given a view tag, snapshot the storage sizes
79 sub snapshotViewStorage($$) {
80   my ($tag, $region) = @_;
81
82   my %viewstorage = (
83     tag    => $tag,
84     region => $region,
85   );
86
87   my $view = Clearcase::View->new($tag, $region);
88   
89   $viewstorage{private} = $view->viewPrivateStorage;
90   $viewstorage{db}      = $view->viewDatabase;
91   $viewstorage{admin}   = $view->viewAdmin;
92   $viewstorage{total}   = $view->viewSpace;
93
94   my ($err, $msg) = $clearadm->AddViewStorage(%viewstorage);
95
96   error $msg, $err if $err;
97
98   $total{'Views snapshotted'}++;
99
100   updateView($tag, $region);
101
102   return;
103 } # snapshotVobStorage
104
105 # Given a vob tag, snapshot the storage sizes
106 sub snapshotVobStorage($$) {
107   my ($tag, $region) = @_;
108
109   my %vobstorage = (
110     tag    => $tag,
111     region => $region,
112   );
113
114   my $vob = Clearcase::Vob->new($tag, $region);
115
116   $vobstorage{admin}      = $vob->admsize;
117   $vobstorage{db}         = $vob->dbsize;
118   $vobstorage{cleartext}  = $vob->ctsize;
119   $vobstorage{derivedobj} = $vob->dosize;
120   $vobstorage{source}     = $vob->srcsize;
121   $vobstorage{total}      = $vob->size;
122
123   my ($err, $msg) = $clearadm->AddVobStorage(%vobstorage);
124
125   error $msg, $err, if $err;
126
127   $total{'VOBs snapshotted'}++;
128
129   updateVob($tag, $region);
130
131   return;
132 } # snapshotVobStorage
133
134 sub updateVob($$) {
135   my ($tag, $region) = @_;
136
137   my ($err, $msg, $error, @output, $graph);
138
139   my %vob = $clearadm->GetVob($tag, $region);
140
141   for my $graphType (qw(admin cleartext db derivedobj source total)) {
142   #for my $graphType (qw(derivedobj)) {
143     # Windows vob tags begin with "\", which is problematic. The solution is to
144     # escape the "\"
145     my $vobtag = $tag;
146     $vobtag =~ s/^\\/\\\\/;
147
148     my $cmd = "plotstorage.cgi generate=1 type=vob storage=$graphType region=$region scaling=Day points=7 tag=$vobtag";
149
150     $graph = "${graphType}small";
151
152     verbose "Generating $graph for VOB $tag (Region: $region)";
153
154     ($error, @output) = Execute("$cmd tiny=1 2>&1");
155
156     error "Unable to generate $graph" . join("\n", @output), $error if $error;
157
158     $vob{$graph} = join '', @output;
159     $total{'VOB Graphs generated'}++;
160
161     $graph = "${graphType}large";
162
163     verbose "Generating $graph for VOB $tag (Region: $region)";
164
165     ($error, @output) = Execute("$cmd 2>&1");
166
167     error "Unable to generate $graph" . join("\n", @output), $error if $error;
168
169     $vob{$graph} = join '', @output;
170     $total{'VOB Graphs generated'}++;
171   } # for
172
173   if ($vob{tag}) {
174     ($err, $msg) = $clearadm->UpdateVob(%vob);
175
176     error "Unable to update VOB $tag (Region: $region) - $msg", $err if $err;
177
178     $total{'VOBs updated'}++;
179   } else {
180     $vob{tag}    = $tag;
181     $vob{region} = $region;
182
183     ($err, $msg) = $clearadm->AddVob(%vob);
184
185     error "Unable to add VOB $tag (Region: $region) - $msg", $err if $err;
186
187     $total{'VOBs added'}++;
188   } # if
189
190   return;
191 } # updateVob
192
193 sub updateView($$) {
194   my ($tag, $region) = @_;
195
196   my ($err, $msg, $error, @output, $graph);
197
198   my %view = $clearadm->GetView($tag, $region);
199
200   for my $graphType (qw(private db admin total)) {
201     my $cmd = "plotstorage.cgi generate=1 type=view storage=$graphType region=$region scaling=Day points=7 tag=$tag";
202
203     $graph = "${graphType}small";
204
205     verbose "Generating $graph for View $tag (Region: $region)";
206
207     ($error, @output) = Execute("$cmd tiny=1 2>&1");
208
209     error "Unable to generate $graph" . join("\n", @output), $error if $error;
210
211     $total{'View Graphs generated'}++;
212
213     $view{$graph} = join '', @output;
214
215     $graph = "${graphType}large";
216
217     verbose "Generating $graph for View $tag (Region: $region)";
218
219     ($error, @output) = Execute("$cmd 2>&1");
220
221     error "Unable to generate $graph" . join("\n", @output), $error if $error;
222
223     $total{'View Graphs generated'}++;
224
225     $view{$graph} = join '', @output;
226   } # for
227
228   if ($view{tag}) {
229     ($err, $msg) = $clearadm->UpdateView(%view);
230
231     error "Unable to update View $tag (Region: $region) - $msg", $err if $err;
232
233     $total{'Views updated'}++;
234   } else {
235     $view{tag}    = $tag;
236     $view{region} = $region;
237
238     ($err, $msg) = $clearadm->AddView(%view);
239
240     error "Unable to add VOB $tag (Region: $region) - $msg", $err if $err;
241
242     $total{'Views added'}++;
243   } # if
244
245   return;
246 } # updateView
247
248 my %opts;
249
250 # Main
251 my $startTime = time;
252
253 GetOptions(
254   \%opts,
255   'usage'   => sub { Usage },
256   'verbose' => sub { set_verbose },
257   'debug'   => sub { set_debug },
258   'view=s',
259   'vob=s',
260   'region=s',
261 ) or Usage "Invalid parameter";
262
263 Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
264
265 unless ($opts{view} or $opts{vob}) {
266   $opts{view} = 'all';
267   $opts{vob}  = 'all';
268 } # unless
269
270 $opts{region} ||= 'all';
271
272 # Announce ourselves
273 verbose "$FindBin::Script V$VERSION";
274
275 if ($opts{view} and $opts{view} =~ /all/i) {
276   if ($opts{region} =~ /all/i) {
277     for my $region ($Clearcase::CC->regions) {
278       my $views = Clearcase::Views->new($region);
279
280       for my $view ($views->views) {
281         verbose "Snapshotting view $view in region $region";
282
283         snapshotViewStorage $view, $region;
284       } # for
285     } # for
286   } else {
287     my $views = Clearcase::Views->new($opts{region});
288
289     for my $view ($views->views) {
290       verbose "Snapshotting view $view in region $opts{region}";
291
292       snapshotViewStorage $view, $opts{region};
293     } # for
294   } # if
295 } elsif ($opts{view}) {
296   if ($opts{region} =~ /all/i) {
297     for my $region ($Clearcase::CC->regions) {
298       verbose "Snapshotting view $opts{view} in region $region";
299
300       snapshotViewStorage $opts{view}, $region;
301     } # for
302   } else {
303     verbose "Snapshotting view $opts{view} in region $opts{region}";
304
305     snapshotViewStorage $opts{view}, $opts{region};
306   } # if
307 } # if
308
309 if ($opts{vob} and $opts{vob} =~ /all/i) {
310   if ($opts{region} =~ /all/i) {
311     for my $region ($Clearcase::CC->regions) {
312       my $vobs = Clearcase::Vobs->new(undef, $region);
313
314       for my $vob ($vobs->vobs) {
315         verbose "Snapshotting vob $vob in region $region";
316
317         snapshotVobStorage $vob, $region;
318       } # for
319     } # for
320   } else {
321     my $vobs = Clearcase::Vobs->new(undef, $opts{region});
322
323     for my $vob ($vobs->vobs) {
324       verbose "Snapshotting vob $vob in region $opts{region}";
325       
326       snapshotVobStorage $vob, $opts{region};
327     } # for
328   } # if
329 } elsif ($opts{vob}) {
330   if ($opts{region} =~ /all/i) {
331     for my $region ($Clearcase::CC->regions) {
332       verbose "Snapshotting vob $opts{vob} in region $region";
333
334       snapshotVobStorage $opts{vob}, $region;
335     } # for
336   } else {
337     verbose "Snapshotting vob $opts{vob} in region $opts{region}";
338
339     snapshotVobStorage $opts{vob}, $opts{region};
340   } # if
341 } # if
342
343 if (get_verbose) {
344   Stats \%total;
345   display_duration $startTime;
346 } # if
347
348 =pod
349
350 =head1 CONFIGURATION AND ENVIRONMENT
351
352 DEBUG: If set then $debug is set to this level.
353
354 VERBOSE: If set then $verbose is set to this level.
355
356 TRACE: If set then $trace is set to this level.
357
358 =head1 DEPENDENCIES
359
360 =head2 Perl Modules
361
362 L<FindBin>
363
364 L<Getopt::Long|Getopt::Long>
365
366 L<Net::Domain|Net::Domain>
367
368 =head2 ClearSCM Perl Modules
369
370 =begin man 
371
372  Clearadm
373  Clearexec
374  DateUtils
375  Display
376  Utils
377
378 =end man
379
380 =begin html
381
382 <blockquote>
383 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
384 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearcase/Vobs.pm">Clearcase::Vobs</a><br>
385 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearcase/Vobs.pm">Clearcase::Vob</a><br>
386 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearcase/Views.pm">Clearcase::Views</a><br>
387 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearcase/View.pm">Clearcase::View</a><br>
388 <a href="http://clearscm.com/php/scm_man.php?file=lib/DateUtils.pm">DateUtils</a><br>
389 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
390 <a href="http://clearscm.com/php/scm_man.php?file=lib/Utils.pm">Utils</a><br>
391 </blockquote>
392
393 =end html
394
395 =head1 BUGS AND LIMITATIONS
396
397 There are no known bugs in this script
398
399 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
400
401 =head1 LICENSE AND COPYRIGHT
402
403 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
404
405 =cut