Last batch of updates
authorAndrew DeFaria <Andrew@DeFaria.com>
Fri, 1 Mar 2019 00:06:24 +0000 (17:06 -0700)
committerAndrew DeFaria <Andrew@DeFaria.com>
Fri, 1 Mar 2019 00:06:24 +0000 (17:06 -0700)
31 files changed:
clearadm/clearadmscrub.pl
clearadm/clearagent.pl
clearadm/clearexec.pl
clearadm/cleartasks.pl
clearadm/discovery.pl
clearadm/index.cgi
clearadm/lib/Clearadm.pm
clearadm/lib/ClearadmWeb.pm
clearadm/lib/Clearexec.pm
clearadm/lib/clearadm.sql
clearadm/plot.cgi
clearadm/plotfs.cgi
clearadm/plotloadavg.cgi
clearadm/plotstorage.cgi
clearadm/processrunning.pl
clearadm/readme.cgi
clearadm/setup.pl
clearadm/systems.cgi
clearadm/test.pl
clearadm/updateccfs.pl
clearadm/updatefs.pl
clearadm/updatela.pl
clearadm/updatesystem.pl
clearadm/viewager.cgi [changed mode: 0755->0644]
clearadm/viewdetails.cgi
clearadm/viewservers.cgi
clearadm/vobdetails.cgi
clearadm/vobservers.cgi
lib/Clearcase/View.pm
lib/Clearcase/Vob.pm
lib/DateUtils.pm

index c88ddac..1b8a6a4 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env perl
+#!/usr/local/bin/perl
 
 =pod
 
@@ -49,6 +49,7 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
+use Sys::Hostname;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -65,52 +66,92 @@ my $clearadm  = Clearadm->new;
 
 my ($host, $fs);
 
+my %opts = (
+  scrubdays => $Clearadm::CLEAROPTS{CLEARADM_SCRUBDAYS}
+);
+
 # Main
-GetOptions (
-  'usage'   => sub { Usage },
-  'verbose' => sub { set_verbose },
-  'debug'   => sub { set_debug },
+GetOptions(
+  \%opts,
+  'usage'    => sub { Usage },
+  'verbose'  => sub { set_verbose },
+  'debug'    => sub { set_debug },
+  "scrubdays=i",
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 # Announce ourselves
 verbose "$FindBin::Script V$VERSION";
 
 my ($err, $msg);
 
-foreach my $system ($clearadm->FindSystem ($host)) {
-  ($err, $msg) = $clearadm->TrimLoadavg ($$system{name});
+for my $system ($clearadm->FindSystem($host)) {
+  ($err, $msg) = $clearadm->TrimLoadavg($system->{name});
   
   if ($msg eq 'Records deleted' or $msg eq '') {
-    verbose "Scrub loadavg $$system{name}: $err $msg:";
+    verbose "Scrub loadavg $system->{name}: $err $msg:";
   } else {
     error "#$err: $msg";
   } # if
   
-  foreach my $filesystem ($clearadm->FindFilesystem ($$system{name}, $fs)) {
-    ($err, $msg) = $clearadm->TrimFS ($$system{name}, $$filesystem{filesystem});
+  for my $filesystem ($clearadm->FindFilesystem($system->{name}, $fs)) {
+    ($err, $msg) = $clearadm->TrimFS($system->{name}, $filesystem->{filesystem});
     
     if ($msg eq 'Records deleted' or $msg eq '') {
-      verbose "Scrub filesystem $$system{name}:$$filesystem{filesystem}: $err $msg";
+      verbose "Scrub filesystem $system->{name}:$filesystem->{filesystem}: $err $msg";
     } else {
       error "#$err: $msg";
     } # if
-  } # foreach
-} # foreach
+  } # for
+} # for
 
-# TODO: These should be configurable
-my $sixMonthsAgo = SubtractDays (Today2SQLDatetime, 180);
+my $scrubdate = SubtractDays(Today2SQLDatetime, $opts{scrubdays});
 
 my %runlog = (
   task    => 'Scrub',
   started => Today2SQLDatetime,
+  system  => hostname(),
 );
 
+# Scrub view and vob storage records
+for ($clearadm->FindVob) {
+  ($err, $msg) = $clearadm->TrimStorage('vob', $_->{tag}, $_->{region});
+
+  if ($msg eq 'Records deleted' or $msg eq '') {
+    verbose "Scub VOB $_->{tag} $err $msg";
+  } else {
+    error "#$err: $msg";
+  } # if
+} # for
+
+for ($clearadm->FindView) {
+  ($err, $msg) = $clearadm->TrimStorage('view', $_->{tag}, $_->{region});
+
+  if ($msg eq 'Records deleted' or $msg eq '') {
+    verbose "Scub View $_->{tag} $err $msg";
+  } else {
+    error "#$err: $msg";
+  } # if
+} # for
+
+# Make sure the Clearcase objects we have in Clearadm are still valid
+my ($views, $vobs) = $clearadm->ValidateCCObjects;
+
+if ($vobs !~ /^\d+/) {
+  error "Unable to validate Clearcase objects: $vobs", $views;
+} else {
+  $runlog{status} = 0;
+
+  $runlog{message}  = "Deleted $views views\n" if $views;
+  $runlog{message} .= "Deleted $vobs vobs"     if $vobs;
+
+  $clearadm->AddRunlog(%runlog);
+} # if
+
 # Scrub old alertlogs
 ($runlog{status}, $runlog{message}) = 
-  $clearadm->DeleteAlertlog ("timestamp<='$sixMonthsAgo'");
+  $clearadm->DeleteAlertlog ("timestamp<='$scrubdate'");
 
 verbose "$runlog{task} alertlog: $runlog{status} $runlog{message}";
 
@@ -120,11 +161,11 @@ $runlog{started} = Today2SQLDatetime;
 
 # Scrub old runlogs
 ($runlog{status}, $runlog{message}) = 
-  $clearadm->DeleteRunlog ("started<='$sixMonthsAgo'");
+  $clearadm->DeleteRunlog ("started<='$scrubdate'");
   
 verbose "$runlog{task} runlog: $runlog{status} $runlog{message}";
 
-$clearadm->AddRunlog (%runlog);
+$clearadm->AddRunlog(%runlog);
 
 =pod
 
index fae4519..95b0571 100755 (executable)
@@ -80,7 +80,7 @@ my $clearexec;
 my $multithreaded = $Clearexec::CLEAROPTS{CLEAREXEC_MULTITHREADED};
 my $daemon        = 1;
 
-GetOptions (
+GetOptions(
   'usage'           => sub { Usage },
   'verbose'         => sub { set_verbose },
   'debug'           => sub { set_debug },
@@ -94,14 +94,13 @@ Usage 'Extraneous options: ' . join ' ', @ARGV
 
 $clearexec = Clearexec->new;
 
-$clearexec->setMultithreaded ($multithreaded);
+$clearexec->setMultithreaded($multithreaded);
 
 my $logfile  = "$Clearexec::CLEAROPTS{CLEAREXEC_LOGDIR}/$FindBin::Script";
    $logfile =~ s/\.pl$//;
    $logfile .= '.' . hostname() . '.log';
 
-EnterDaemonMode $logfile, $logfile, $pidfile
-  if $daemon;
+EnterDaemonMode $logfile, $logfile, $pidfile if $daemon;
   
 display "$FindBin::Script V$VERSION started at " . localtime;
 
index cd593e5..057caab 100755 (executable)
@@ -55,7 +55,7 @@ use warnings;
 
 use Getopt::Long;
 use FindBin;
-use Term::ANSIColor qw (color);
+use Term::ANSIColor qw(color);
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -77,18 +77,18 @@ my $port = $Clearexec::CLEAROPTS{CLEAREXEC_PORT};
 
 my $clearexec;
 
-sub CmdLoop () {
+sub CmdLoop() {
   my ($line, $result);
 
-  my $prompt = color ('BOLD YELLOW') . "$me->$host:" . color ('RESET');
+  my $prompt = color('BOLD YELLOW') . "$me->$host:" . color('RESET');
   
-  $CmdLine::cmdline->set_prompt ($prompt);
+  $CmdLine::cmdline->set_prompt($prompt);
     
-  while (($line, $result) = $CmdLine::cmdline->get ()) {
+  while (($line, $result) = $CmdLine::cmdline->get()) {
     last unless defined $line;
     last if $line =~ /exit|quit/i;
     
-    my ($status, @output) = $clearexec->execute ($line);
+    my ($status, @output) = $clearexec->execute($line);
     
     last if $line =~ /stopserver/i;
     
@@ -105,7 +105,7 @@ sub CmdLoop () {
 } # CmdLoop
 
 # Main
-GetOptions (
+GetOptions(
   'usage'   => sub { Usage },
   'verbose' => sub { set_verbose },
   'debug'   => sub { set_debug },
@@ -117,20 +117,19 @@ my $cmd = join ' ', @ARGV;
 
 verbose "$FindBin::Script V$VERSION";
 
-$clearexec =Clearexec->new;
+$clearexec = Clearexec->new;
 
 my ($status, @output);
 
-$status = $clearexec->connectToServer ($host, $port);
+$status = $clearexec->connectToServer($host, $port);
 
-error "Unable to connect to $host:$port", 1
-  unless $status;
+error "Unable to connect to $host:$port", 1 unless $status;
 
 if ($cmd ne '') {
-  ($status, @output) = $clearexec->execute ($cmd);
+  ($status, @output) = $clearexec->execute($cmd);
 
   if ($status) {
-    error "Unable to execute $cmd (Status: $status)\n" . join ("\n", @output), 1;
+    error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), 1;
   } else {
     display join "\n", @output;
     display "Status: $status";
index 25a297b..7e36b82 100755 (executable)
@@ -95,7 +95,7 @@ sub ToggleVerbose() {
 
 $SIG{USR1} = \&ToggleVerbose;
 
-sub HandleSystemNotCheckingIn (%) {
+sub HandleSystemNotCheckingIn(%) {
   my (%system) = @_;
    
   my $startTime = time;
@@ -110,7 +110,7 @@ sub HandleSystemNotCheckingIn (%) {
     system   => $system{name},
   );
 
-  my ($err, $msg, $lastid) = $clearadm->AddRunlog (%runlog);
+  my ($err, $msg, $lastid) = $clearadm->AddRunlog(%runlog);
   
   $clearadm->Error ("Unable to add to runlog (Status: $err)\n$msg") if $err;
    
@@ -123,8 +123,8 @@ sub HandleSystemNotCheckingIn (%) {
      $systemLink     .= "/systemdetails.cgi?system=$system{name}";
   my $runlogLink      = $Clearadm::CLEAROPTS{CLEARADM_WEBBASE};
      $runlogLink     .= "/runlog.cgi?id=$lastid";
-   my $subject         = "System is not responding (Is clearagent running?)";
-     $message = <<"END";      
+  my $subject         = "System is not responding (Is clearagent running?)";
+     $message         = <<"END";      
 <center>
 <h1><font color="red">Alert</font> System not responding!</h1>
 </center>
@@ -134,7 +134,7 @@ href="$runlogLink">not responding</a> to clearagent requests. This can happen if
 clearagent is not setup and running on the system.</p> 
 END
      
-  $clearadm->Notify (
+  $clearadm->Notify(
     $notification{name},
     $subject,
     $message,
@@ -149,7 +149,7 @@ END
   return;
 } # HandleSystemNotCheckingIn
 
-sub SystemsCheckin () {
+sub SystemsCheckin() {
   for ($clearadm->FindSystem) {
     my %system = %$_;
     
@@ -159,10 +159,7 @@ sub SystemsCheckin () {
     
     my $startTime = time;
     
-    my $status = $clearexec->connectToServer (
-      $system{name},
-      $system{port}
-    );
+    my $status = $clearexec->connectToServer($system{name}, $system{port});
     
     unless ($status) {
       HandleSystemNotCheckingIn %system;
@@ -175,10 +172,7 @@ sub SystemsCheckin () {
           . "$system{name}:$system{port}";
     
     display __FILE__ . " DEBUG: System undefined 1" unless $system{name};
-    $clearadm->UpdateSystem (
-      $system{name},
-      (lastheardfrom => Today2SQLDatetime)
-    );
+    $clearadm->UpdateSystem($system{name}, (lastheardfrom => Today2SQLDatetime));
   
     $clearadm->ClearNotifications ($system{name})
       if $system{notification} and $system{notification} eq 'Heartbeat';
@@ -187,7 +181,7 @@ sub SystemsCheckin () {
   return;
 } # SystemsCheckin
 
-sub UpdateRunlog ($$$$) {
+sub UpdateRunlog($$$$) {
   my ($status, $startTime, $task, $output) = @_;
   
   my %runlog = (
@@ -215,28 +209,28 @@ sub UpdateRunlog ($$$$) {
     } # if
   } # if
     
-  my ($err, $msg, $lastid) = $clearadm->AddRunlog (%runlog);
+  my ($err, $msg, $lastid) = $clearadm->AddRunlog(%runlog);
     
-  $clearadm->Error ($msg, $err) if $err;
+  $clearadm->Error($msg, $err) if $err;
 
   return $lastid;
 } # UpdateRunlog
 
-sub MakeSystemLink ($) {
+sub MakeSystemLink($) {
   my ($system) = @_;
   
   return "$Clearadm::CLEAROPTS{CLEARADM_WEBBASE}/systemdetails.cgi?system="
        . $system;
 } # MakeSystemLink
 
-sub MakeLoadavgLink ($) {
+sub MakeLoadavgLink($) {
   my ($system) = @_;
 
   return "$Clearadm::CLEAROPTS{CLEARADM_WEBBASE}/plot.cgi?type=loadavg&system="
        . "$system&scaling=Hour&points=24";
 } # MakeLoadavgLink
 
-sub ProcessLoadavgErrors ($$$$@) {
+sub ProcessLoadavgErrors($$$$@) {
   # TODO: Also need to handle the case where the error was something other
   # than "Load average over threshold". Perhaps by having different return
   # status. Also, runlog entry #22169 never reported!
@@ -290,12 +284,12 @@ END
 END
       $message .= join "\n", @output;
       $message .= "</pre>";
-      $clearadm->Error ($message, -1);
+      $clearadm->Error($message, -1);
       
       last;
     } # if
 
-    $clearadm->Notify (
+    $clearadm->Notify(
       $notification,
       $subject,
       $message,
@@ -309,7 +303,7 @@ END
   return;
 } # ProcessLoadAvgErrors
 
-sub ProcessFilesystemErrors ($$$$@) {
+sub ProcessFilesystemErrors($$$$@) {
   # TODO: Also need to handle the case where the error was something other
   # than "Filesystem over threshold". Perhaps by having different return
   # status.
@@ -347,7 +341,7 @@ sub ProcessFilesystemErrors ($$$$@) {
        push @fsinfo, @{$system{$systemName}};
     } # if
 
-    my $systemLink = MakeSystemLink ($systemName);
+    my $systemLink = MakeSystemLink($systemName);
     my $subject    = 'Filesystem has exceeded threshold';
     my $message = <<"END";      
 <center>
@@ -372,7 +366,7 @@ END
       
     $message .= "</ul>";
     
-    $clearadm->Notify (
+    $clearadm->Notify(
       $notification,
       $subject,
       $message,
@@ -386,7 +380,7 @@ END
   return;
 } # ProcessFilesystemErrors
 
-sub NonZeroReturn ($$$$$$) {
+sub NonZeroReturn($$$$$$) {
   my ($system, $notification, $status, $lastid, $output, $task) = @_;
 
   my @output = @{$output};
@@ -424,7 +418,7 @@ END
 
   $message .= "</pre></blockquote>";
   
-  $clearadm->Notify (
+  $clearadm->Notify(
     $notification,
     $subject,
     $message,
@@ -437,7 +431,7 @@ END
   return;   
 } # NonZeroReturn
 
-sub ExecuteTask ($%) {
+sub ExecuteTask($%) {
   my ($sleep, %task) = @_;
   
   my ($status, @output, %system, $subject, $message);
@@ -466,7 +460,7 @@ sub ExecuteTask ($%) {
                  . "execute $task{command}";
       $status = -1;
     } else {
-      ($status, @output) = $clearexec->execute ($task{command});
+      ($status, @output) = $clearexec->execute($task{command});
       
       $output[0] = "Unable to exec $task{command} on $system{name}"
         if $status == -1;
@@ -480,7 +474,7 @@ sub ExecuteTask ($%) {
   if ($status != 0) {
     if ($notification{cond}
       and $notification{cond} =~ /non zero return/i) {
-      NonZeroReturn (
+      NonZeroReturn(
         $system{name},
         $notification{name},
         $status,
@@ -489,20 +483,20 @@ sub ExecuteTask ($%) {
         \%task
       );
     } elsif ($notification{cond} =~ /loadavg over threshold/i) {
-      ProcessLoadavgErrors ($notification{name}, $task{name}, $system{name}, $lastid, @output);
+      ProcessLoadavgErrors($notification{name}, $task{name}, $system{name}, $lastid, @output);
     } elsif ($notification{cond} =~ /filesystem over threshold/i) {
-      ProcessFilesystemErrors ($notification{name}, $task{name}, $system{name}, $lastid, @output);
+      ProcessFilesystemErrors($notification{name}, $task{name}, $system{name}, $lastid, @output);
     } # if
   } else {
-    $clearadm->ClearNotifications ($task{system});
+    $clearadm->ClearNotifications($task{system});
   } # if
         
-  my ($err, $msg) = $clearadm->UpdateSchedule (
+  my ($err, $msg) = $clearadm->UpdateSchedule(
     $task{schedulename},
     ( 'lastrunid' => $lastid ),
   );
     
-  $clearadm->Error ($msg, $err) if $err;  
+  $clearadm->Error($msg, $err) if $err;
   
   $sleep -= time - $startTime;
   
@@ -510,7 +504,7 @@ sub ExecuteTask ($%) {
 } # ExecuteTask
 
 # Main
-GetOptions (
+GetOptions(
   'usage'     => sub { Usage },
   'verbose'   => sub { set_verbose },
   'debug'     => sub { set_debug },
@@ -518,11 +512,9 @@ GetOptions (
   'pidfile=s' => \$pidfile,
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
-EnterDaemonMode $logfile, $logfile, $pidfile
-  if $daemon;
+EnterDaemonMode $logfile, $logfile, $pidfile if $daemon;
 
 display "$FindBin::Script V$VERSION started at " . localtime;
 
index 49b4b3f..d765363 100755 (executable)
@@ -72,7 +72,7 @@ my $clearadm = Clearadm->new;
 
 my $broadcastTime = 10;
 
-sub discover ($) {
+sub discover($) {
   my ($broadcast) = @_;
   
   my $startTime = time;
@@ -96,8 +96,7 @@ sub discover ($) {
       } # unless
     } # if
   
-    last
-      if (time () - $startTime) > $broadcastTime;
+    last if (time() - $startTime) > $broadcastTime;
   } # while
 
   verbose "$broadcastTime seconds has elapsed - discovery complete";
@@ -106,9 +105,9 @@ sub discover ($) {
 } # discover
 
 # Main
-my $broadcastAddress = inet_ntoa (INADDR_BROADCAST);
+my $broadcastAddress = inet_ntoa(INADDR_BROADCAST);
 
-GetOptions (
+GetOptions(
   usage             => sub { Usage },
   verbose           => sub { set_verbose },
   debug             => sub { set_debug },
@@ -116,8 +115,7 @@ GetOptions (
   'broadcastAddr=s' => \$broadcastAddress,  
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 # Announce ourselves
 verbose "$FindBin::Script V$VERSION";
@@ -147,17 +145,15 @@ verbose_nolf "Found $nbrHosts host";
 verbose_nolf 's' if $nbrHosts != 1;
 verbose      " on subnet $broadcastAddress";
 
-foreach (sort values %hosts) {
-  my $verbose = get_verbose () ? '-verbose' : '';
+for (sort values %hosts) {
+  my $verbose = get_verbose() ? '-verbose' : '';
   
   my ($status, @output) = Execute "updatesystem.pl -host $_ $verbose";
 
-  error "Unable to update host $_ (Status: $status)\n"
-      . join ("\n", @output), 1
-    if $status;
+  error "Unable to update host $_ (Status: $status)\n" . join ("\n", @output), 1 if $status;
     
   verbose join "\n", @output;
-} # foreach
+} # for
 
 =pod
 
index 4fc9cec..df9a74a 100755 (executable)
@@ -42,8 +42,9 @@ use warnings;
 use FindBin;
 use Getopt::Long;
 
-use CGI qw (:standard *table start_Tr end_Tr);
+use CGI qw(:standard *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
+use Convert::Base64;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -57,7 +58,7 @@ use Utils;
 my $clearadm = Clearadm->new;
 
 # Main
-GetOptions (
+GetOptions(
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
   'debug'        => sub { set_debug },
@@ -94,7 +95,7 @@ my @systems = $clearadm->FindSystem;
 
 $perRow = @systems if @systems < $perRow;
 
-foreach (@systems) {
+for (@systems) {
   my %system = %{$_};
   
   if ($i++ % $perRow == 0) {
@@ -106,8 +107,7 @@ foreach (@systems) {
 
   my $data;
   
-  $data = '<strike>'
-    if $system{active} eq 'false';
+  $data = '<strike>' if $system{active} eq 'false';
     
   $data .= a {
     href => "systemdetails.cgi?system=$system{name}"
@@ -115,7 +115,7 @@ foreach (@systems) {
   
   if ($system{notification}) {
     $data .= '&nbsp;' . a {
-      href => "alertlog.cgi?system=$system{name}"}, img {
+      href   => "alertlog.cgi?system=$system{name}"}, img {
       src    => 'alert.png',
       border => 0,
       alt    => 'Alert!',
@@ -123,22 +123,25 @@ foreach (@systems) {
     };
   } # if
   
+  my $image = $system{loadavgsmall}
+    ? "data:image/png;base64,$system{loadavgsmall}"
+    : "plotloadavg.cgi?system=$system{name}&tiny=1";
+
   $data .=  '<br>' .  
     a {href => 
       "plot.cgi?type=loadavg&system=$system{name}&scaling=Hour&points=24"
      }, img {
-       src    => "plotloadavg.cgi?system=$system{name}&tiny=1",
+       src    => $image,
        border => 0,
      };
    
-  $data .= '</strike>'
-    if $system{active} eq 'false';
+  $data .= '</strike>' if $system{active} eq 'false';
     
   $load{uptime} ||= 'Unknown';
 
   display td {class => 'dataCentered'}, "$data ",
     font {class => 'dim' }, "<br>Up: $load{uptime}";
-} # foreach
+} # for
 
 while ($i % $perRow != 0) {
    $i++;
index 4205e44..1f74aaf 100644 (file)
@@ -38,7 +38,7 @@ specifics about the method you are envoking.
  my $clearadm = new Clearadm;
 
  # Add a new system
- my %system = (
+ my %system =(
   name          => 'jupiter',
   alias         => 'defaria.com',
   admin         => 'Andrew DeFaria',
@@ -47,13 +47,13 @@ specifics about the method you are envoking.
   description   => 'Home server',
  );
 
- my ($err, $msg) = $clearadm->AddSystem (%system);
+ my ($err, $msg) = $clearadm->AddSystem(%system);
 
  # Find systems matching 'jup'
- my @systems = $clearadm->FindSystem ('jup');
+ my @systems = $clearadm->FindSystem('jup');
 
  # Get a system by name
- my %system = $clearadm->GetSystem ('jupiter');
+ my %system = $clearadm->GetSystem('jupiter');
 
  # Update system
  my %update = (
@@ -64,7 +64,7 @@ specifics about the method you are envoking.
 
  # Delete system (Warning: will delete all related records regarding this
  # system).
- my ($err, $msg) = $clearadm->DeleteSystem ('jupiter');
+ my ($err, $msg) = $clearadm->DeleteSystem('jupiter');
 
 =head1 DESCRIPTION
 
@@ -98,6 +98,8 @@ use DateUtils;
 use Display;
 use GetConfig;
 use Mail;
+use Clearcase::Vob;
+use Clearcase::View;
 
 my $conf = dirname(__FILE__) . '/../etc/clearadm.conf';
 
@@ -155,8 +157,7 @@ sub _formatValues(@) {
   my @returnValues;
 
   # Quote data values
-  push @returnValues, $_ eq '' ? 'null' : $self->{db}->quote($_)
-    for (@values);
+  push @returnValues, $_ eq '' ? 'null' : $self->{db}->quote($_) for (@values);
 
   return @returnValues;
 } # _formatValues
@@ -166,8 +167,7 @@ sub _formatNameValues(%) {
 
   my @nameValueStrs;
 
-  push @nameValueStrs, "$_=" . $self->{db}->quote($rec{$_})
-    for (keys %rec);
+  push @nameValueStrs, "$_=" . $self->{db}->quote($rec{$_}) for (keys %rec);
 
   return @nameValueStrs;
 } # _formatNameValues
@@ -194,8 +194,7 @@ sub _deleteRecord($;$) {
   my $count;
 
   my $statement  = "select count(*) from $table ";
-     $statement .= "where $condition"
-      if $condition;
+     $statement .= "where $condition" if $condition;
 
   my $sth = $self->{db}->prepare($statement)
     or return $self->_dberror('Unable to prepare statement', $statement);
@@ -213,12 +212,10 @@ sub _deleteRecord($;$) {
     $count = 0;
   } # if
 
-  return ($count, 'Records deleted')
-    if $count == 0;
+  return ($count, 'Records deleted') if $count == 0;
 
   $statement  = "delete from $table ";
-  $statement .= "where $condition"
-    if $condition;
+  $statement .= "where $condition" if $condition;
 
   $self->{db}->do($statement);
 
@@ -234,8 +231,7 @@ sub _updateRecord($$%) {
 
   my $statement  = "update $table set ";
      $statement .= join ',', $self->_formatNameValues(%rec);
-     $statement .= " where $condition"
-       if $condition;
+     $statement .= " where $condition" if $condition;
 
   $self->{db}->do($statement);
 
@@ -255,8 +251,7 @@ sub _checkRequiredFields($$) {
       } # if
     } # for
 
-    return "$fieldname is required"
-      unless $found;
+    return "$fieldname is required" unless $found;
   } # for
 
   return;
@@ -337,7 +332,7 @@ sub _aliasSystem($) {
   if ($system{name}) {
     return $system{name};
   } else {
-       return;
+    return;
   } # if
 } # _aliasSystem
 
@@ -444,8 +439,7 @@ sub AddSystem(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%system;
 
-  return -1, "AddSystem: $result"
-    if $result;
+  return -1, "AddSystem: $result" if $result;
 
   $system{loadavgHist} ||= $defaultLoadavgHist;
 
@@ -467,8 +461,7 @@ sub UpdateSystem ($%) {
 sub GetSystem($) {
   my ($self, $system) = @_;
 
-  return
-    unless $system;
+  return unless $system;
 
   my @records = $self->_getRecords(
     'system',
@@ -478,7 +471,7 @@ sub GetSystem($) {
   if ($records[0]) {
     return %{$records[0]};
   } else {
-       return;
+    return;
   } # if
 } # GetSystem
 
@@ -511,8 +504,7 @@ sub AddPackage(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%package;
 
-  return -1, "AddPackage: $result"
-    if $result;
+  return -1, "AddPackage: $result" if $result;
 
   return $self->_addRecord('package', %package);
 } # AddPackage
@@ -530,8 +522,7 @@ sub UpdatePackage($$%) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   return $self->_updateRecord('package', "system='$system'", %update);
 } # UpdatePackage
@@ -541,11 +532,8 @@ sub GetPackage($$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
-
-  return
-    unless $name;
+  return unless $system;
+  return unless $name;
 
   my @records = $self->_getRecords(
     'package',
@@ -555,7 +543,7 @@ sub GetPackage($$) {
   if ($records[0]) {
     return %{$records[0]};
   } else {
-       return;
+    return;
   } # if
 } # GetPackage
 
@@ -566,8 +554,7 @@ sub FindPackage($;$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   my $condition = "system='$system' and name like '%$name%'";
 
@@ -585,8 +572,7 @@ sub AddFilesystem(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%filesystem;
 
-  return -1, "AddFilesystem: $result"
-    if $result;
+  return -1, "AddFilesystem: $result" if $result;
 
   # Default filesystem threshold
   $filesystem{threshold} ||= $defaultFilesystemThreshold;
@@ -599,8 +585,7 @@ sub DeleteFilesystem($$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   return $self->_deleteRecord(
     'filesystem',
@@ -613,8 +598,7 @@ sub UpdateFilesystem($$%) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   return $self->_updateRecord(
     'filesystem',
@@ -628,11 +612,8 @@ sub GetFilesystem($$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
-
-  return
-    unless $filesystem;
+  return unless $system;
+  return unless $filesystem;
 
   my @records = $self->_getRecords(
     'filesystem',
@@ -653,8 +634,7 @@ sub FindFilesystem($;$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   my $condition = "system='$system' and filesystem like '%$filesystem%'";
 
@@ -665,71 +645,112 @@ sub AddVob(%) {
   my ($self, %vob) = @_;
 
   my @requiredFields = (
-    'system',
     'tag',
+    'region',
   );
 
   my $result = _checkRequiredFields \@requiredFields, \%vob;
 
-  return -1, "AddVob: $result"
-    if $result;
+  return -1, "AddVob: $result" if $result;
 
   return $self->_addRecord('vob', %vob);
 } # AddVob
 
-sub DeleteVob($) {
-  my ($self, $tag) = @_;
+sub DeleteVob($$) {
+  my ($self, $tag, $region) = @_;
 
-  return $self->_deleteRecord('vob', "tag='$tag'");
+  return $self->_deleteRecord('vob', "tag='$tag' and region='$region'");
 } # DeleteVob
 
-sub GetVob($) {
-  my ($self, $tag) = @_;
+sub GetVob($$) {
+  my ($self, $tag, $region) = @_;
 
-  return
-    unless $tag;
+  return unless $tag;
 
-  my @records = $self->_getRecords('vob', "tag='$tag'");
+  # Windows vob tags begin with "\", which is problematic. The solution is to
+  # escape the "\"
+  $tag =~ s/^\\/\\\\/;
+
+  my @records = $self->_getRecords('vob', "tag='$tag' and region='$region'");
 
   if ($records[0]) {
     return %{$records[0]};
   } else {
-       return;
+    return;
   } # if
 } # GetVob
 
-sub FindVob($) {
-  my ($self, $tag) = @_;
+sub FindVobStorage(;$$) {
+  my ($self, $tag, $region) = @_;
+
+  $tag    ||= '';
+  $region ||= '';
+
+  # Windows vob tags begin with "\", which is problematic. The solution is to
+  # escape the "\"
+  $tag =~ s/^\\/\\\\/;
 
-  return $self->_getRecords('vob', "tag like '%$tag%'");
+  my $condition = "tag like '%$tag%'";
+  
+  $condition .= " and region='$region'" if $region;
+
+  return $self->_getRecords('vobstorage', $condition);
+} # FindVobStorage
+
+sub FindVob(;$$) {
+  my ($self, $tag, $region) = @_;
+
+  $tag    ||= '';
+  $region ||= '';
+
+  # Windows vob tags begin with "\", which is problematic. The solution is to
+  # escape the "\"
+  $tag =~ s/^\\/\\\\/;
+
+  my $condition = "tag like '%$tag%'";
+  
+  $condition .= " and region='$region'" if $region;
+
+  return $self->_getRecords('vob', $condition);
 } # FindVob
 
+sub UpdateVob(%) {
+  my ($self, %vob) = @_;
+
+  # Windows vob tags begin with "\", which is problematic. The solution is to
+  # escape the "\"
+  my $vobtag = $vob{tag};
+
+  $vobtag =~ s/^\\/\\\\/;
+
+  return $self->_updateRecord('vob', "tag='$vobtag' and region='$vob{region}'", %vob);
+} # UpdateVob
+
 sub AddView(%) {
   my ($self, %view) = @_;
 
   my @requiredFields = (
-    'system',
     'tag',
+    'region'
   );
 
   my $result = _checkRequiredFields \@requiredFields, \%view;
 
-  return -1, "AddView: $result"
-    if $result;
+  return -1, "AddView: $result" if $result;
 
   return $self->_addRecord('view', %view);
 } # AddView
 
-sub DeleteView($) {
-  my ($self, $tag) = @_;
+sub DeleteView($$) {
+  my ($self, $tag, $region) = @_;
 
-  return $self->_deleteRecord('vob', "tag='$tag'");
+  return $self->_deleteRecord('vob', "tag='$tag' and region='$region'");
 } # DeleteView
 
-sub UpdateView($$) {
-  my ($self, $tag, $region, %viewRec) = @_;
+sub UpdateView(%) {
+  my ($self, %view) = @_;
 
-  return $self->_updateRecord('view', "tag='$tag' and region='$region'", %viewRec);
+  return $self->_updateRecord('view', "tag='$view{tag}' and region='$view{region}'", %view);
 } # UpdateView
 
 sub GetView($$) {
@@ -747,22 +768,16 @@ sub GetView($$) {
 } # GetView
 
 sub FindView(;$$$$) {
-  my ($self, $system, $region, $tag, $ownerName) = @_;
-
-  $system    ||= '';
-  $region    ||= '';
-  $tag       ||= '';
-  $ownerName ||= '';
+  my ($self, $tag, $region, $ownerName) = @_;
 
   my $condition;
+  my @conditions;
 
-  $condition  = "system like '%$system%'";
-  $condition .= ' and ';
-  $condition  = "region like '%$region%'";
-  $condition .= ' and ';
-  $condition .= "tag like '%$tag'";
-  $condition .= ' and ';
-  $condition .= "ownerName like '%$ownerName'";
+  push @conditions, "tag like '%$tag%'"           if $tag;
+  push @conditions, "region = '$region'"          if $region;
+  push @conditions, "ownerName like '$ownerName'" if $ownerName;
+
+  $condition = join " and ", @conditions if @conditions;
 
   return $self->_getRecords('view', $condition);
 } # FindView
@@ -791,8 +806,7 @@ sub TrimFS($$) {
 
   my %filesystem = $self->GetFilesystem($system, $filesystem);
 
-  return
-    unless %filesystem;
+  return unless %filesystem;
 
   my %task = $self->GetTask('scrub');
 
@@ -817,8 +831,7 @@ sub TrimFS($$) {
   );
 
   if ($dbmsg eq 'Records deleted') {
-    return (0, $dbmsg)
-      if $dberr == 0;
+    return (0, $dbmsg) if $dberr == 0;
 
     my %runlog;
 
@@ -841,8 +854,7 @@ sub TrimLoadavg($) {
 
   my %system = $self->GetSystem($system);
 
-  return
-    unless %system;
+  return unless %system;
 
   my %task = $self->GetTask('loadavg');
 
@@ -867,8 +879,7 @@ sub TrimLoadavg($) {
   );
 
   if ($dbmsg eq 'Records deleted') {
-    return (0, $dbmsg)
-      if $dberr == 0;
+    return (0, $dbmsg) if $dberr == 0;
 
     my %runlog;
 
@@ -886,16 +897,111 @@ sub TrimLoadavg($) {
   return ($dberr, $dbmsg);
 } # TrimLoadavg
 
+sub TrimStorage($$$) {
+  my ($self, $type, $tag, $region) = @_;
+
+  my $today = Today2SQLDatetime;
+
+  my $oldage = SubtractDays $today, $Clearadm::CLEAROPTS{CLEARADM_SCRUBDAYS};
+
+  my $table = $type =~ /vob/i
+            ? 'vobstorage'
+           : 'viewstorage';
+
+  my ($dberr, $dbmsg) = $self->_deleteRecord(
+    $table,
+    "tag='$tag' and region='$region' and timestamp<='$oldage'"
+  );
+
+  if ($dbmsg eq 'Records deleted') {
+    return (0, $dbmsg) if $dberr == 0;
+
+    my %runlog;
+
+    $runlog{task}    = 'Scrub';
+    $runlog{started} = $today;
+    $runlog{status}  = 0;
+    $runlog{message} =
+      "Scrubbed $dberr ${type}storage records";
+
+    my ($err, $msg) = $self->AddRunlog(%runlog);
+
+    $self->Error("Unable to add runload (Error: $err)\n$msg") if $err;
+  } # if
+
+  return ($dberr, $dbmsg);
+} # TrimStorage
+
+sub ValidateCCObjects() {
+  my ($self) = @_;
+
+  my $vobRecordsDeleted  = 0;
+  my $viewRecordsDeleted = 0;
+
+  for my $region ($Clearcase::CC->regions) {
+    for my $type (qw(vob view)) {
+      my @ccobjs;
+      verbose "Processing ${type}s in $region";
+
+      if ($type eq 'vob') {
+        verbose "Finding all vobs in region $region";
+       @ccobjs = $self->FindVob(undef, $region);
+       verbose 'Found ' . scalar @ccobjs . ' vobs to process';
+      } elsif ($type eq 'view') {
+        verbose "Finding all views in region $region";
+       @ccobjs = $self->FindView(undef, $region);
+       verbose 'Found ' . scalar @ccobjs . ' views to process';
+      } # if
+
+      for my $object (@ccobjs) {
+        my %ccobjrec = %$object;
+
+       verbose "Processing $ccobjrec{tag}:$ccobjrec{region}";
+
+       my $ccobj;
+
+       if ($type eq 'vob') {
+         $ccobj = Clearcase::Vob->new($ccobjrec{tag}, $ccobjrec{region});
+       } else {
+         $ccobj = Clearcase::View->new($ccobjrec{tag}, $ccobjrec{region});
+       } # if 
+
+       verbose_nolf 'Checking if ' . $ccobj->{tag} . ':' . $ccobj->{region} . ' exists anymore...';
+
+       if ($ccobj->exists) {
+         verbose ' it does! Skipping...';
+         next;
+       } else {
+         verbose ' it doesn\'t!';
+       } # if
+
+       #next if $ccobj->exists;
+
+       verbose "Deleting $type $ccobjrec{tag}:$ccobjrec{region}";
+
+       my ($recordsDeleted, $msg) = $self->_deleteRecord($type, 
+         "tag='$ccobjrec{tag}' and region='$ccobjrec{region}'");
+
+       if ($msg ne 'Records deleted') {
+         return ($recordsDeleted, $msg);
+       } else {
+         $viewRecordsDeleted += $recordsDeleted if $type eq 'view';
+         $vobRecordsDeleted  += $recordsDeleted if $type eq 'vob';
+       } # if
+      } # for
+    } # for
+  } # for
+
+  return ($viewRecordsDeleted, $vobRecordsDeleted);
+} # ValidateCCObjects
+
 sub GetFS($$;$$$$) {
   my ($self, $system, $filesystem, $start, $end, $count, $interval) = @_;
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
-
-  return
-    unless $filesystem;
+  return unless $system;
+  return unless $filesystem;
 
   $interval ||= 'Minute';
 
@@ -979,11 +1085,8 @@ sub GetLatestFS($$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
-
-  return
-    unless $filesystem;
+  return unless $system;
+  return unless $filesystem;
 
   my @records = $self->_getRecords(
     'fs',
@@ -992,9 +1095,9 @@ sub GetLatestFS($$) {
   );
 
   if ($records[0]) {
-       return %{$records[0]};
+    return %{$records[0]};
   } else {
-       return;
+    return;
   } # if
 } # GetLatestFS
 
@@ -1007,8 +1110,7 @@ sub AddLoadavg() {
 
   my $result = _checkRequiredFields \@requiredFields, \%loadavg;
 
-  return -1, "AddLoadavg: $result"
-    if $result;
+  return -1, "AddLoadavg: $result" if $result;
 
   # Timestamp record
   $loadavg{timestamp} = Today2SQLDatetime;
@@ -1021,8 +1123,7 @@ sub GetLoadavg($;$$$$) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   $interval ||= 'Minute';
 
@@ -1055,8 +1156,7 @@ sub GetLoadavg($;$$$$) {
     my $offset  = $nbrRecs - $count;
 
     # Offsets of < 0 are not allowed.
-    $offset = 0
-      if $offset < 0;
+    $offset = 0 if $offset < 0;
 
     $condition .= " limit $offset, $count";
   } # if
@@ -1105,8 +1205,7 @@ sub GetLatestLoadavg($) {
 
   $system = $self->_aliasSystem($system);
 
-  return
-    unless $system;
+  return unless $system;
 
   my @records = $self->_getRecords(
     'loadavg',
@@ -1121,7 +1220,7 @@ sub GetLatestLoadavg($) {
   } # if
 } # GetLatestLoadavg
 
-sub GetStorage($$$;$$$$$) {
+sub GetStoragePool($$$;$$$$$) {
   my ($self, $type, $tag, $storage, $region, $start, $end, $count, $interval) = @_;
 
   $interval ||= 'Day';
@@ -1140,6 +1239,10 @@ sub GetStorage($$$;$$$$$) {
   undef $start if $start and $start =~ /earliest/i;
   undef $end   if $end   and $end   =~ /latest/i;
 
+  # Windows vob tags begin with "\", which is problematic. The solution is to
+  # escape the "\"
+  $tag =~ s/^\\/\\\\/;
+
   my $condition;
   my $table = $type eq 'vob' ? 'vobstorage' : 'viewstorage';
 
@@ -1200,7 +1303,7 @@ END
   } # while
 
   return @records;
-} # GetStorage
+} # GetStoragePool
 
 sub AddTask(%) {
   my ($self, %task) = @_;
@@ -1212,8 +1315,7 @@ sub AddTask(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%task;
 
-  return -1, "AddTask: $result"
-    if $result;
+  return -1, "AddTask: $result" if $result;
 
   return $self->_addRecord('task', %task);
 } # AddTask
@@ -1237,8 +1339,7 @@ sub FindTask($) {
 sub GetTask($) {
   my ($self, $name) = @_;
 
-  return
-    unless $name;
+  return unless $name;
 
   my @records = $self->_getRecords('task', "name='$name'");
 
@@ -1264,8 +1365,7 @@ sub AddSchedule(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%schedule;
 
-  return -1, "AddSchedule: $result"
-    if $result;
+  return -1, "AddSchedule: $result" if $result;
 
   return $self->_addRecord('schedule', %schedule);
 } # AddSchedule
@@ -1280,7 +1380,7 @@ sub FindSchedule(;$$) {
   my ($self, $name, $task) = @_;
 
   $name ||= '';
-  $task||= '';
+  $task ||= '';
 
   my $condition  = "name like '%$name%'";
      $condition .= ' and ';
@@ -1316,8 +1416,7 @@ sub AddRunlog(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%runlog;
 
-  return -1, "AddRunlog: $result"
-    if $result;
+  return -1, "AddRunlog: $result" if $result;
 
   $runlog{ended} = Today2SQLDatetime;
 
@@ -1379,8 +1478,7 @@ sub FindRunlog(;$$$$$$) {
 sub GetRunlog($) {
   my ($self, $id) = @_;
 
-  return
-    unless $id;
+  return unless $id;
 
   my @records = $self->_getRecords('runlog', "id=$id");
 
@@ -1603,8 +1701,7 @@ sub AddAlert(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%alert;
 
-  return -1, "AddAlert: $result"
-    if $result;
+  return -1, "AddAlert: $result" if $result;
 
   return $self->_addRecord('alert', %alert);
 } # AddAlert
@@ -1852,8 +1949,7 @@ sub Notify($$$$$$) {
     # If you want to fake an alert in the debugger just change $diff accordingly
     my $diff = Compare($today, $lastnotified);
 
-    return
-      if $diff <= 0;
+    return if $diff <= 0;
   } # if
 
   my $when       = Today2SQLDatetime;
@@ -1936,8 +2032,7 @@ sub ClearNotifications($$;$) {
 
     my %system = $self->GetSystem($system);
 
-    return
-      unless $system;
+    return unless $system;
 
     if ($system{notification}                 and
         $system{notification} eq 'Filesystem' and
@@ -1963,13 +2058,11 @@ sub SystemAlive(%) {
   # If we've never heard from this system then we will assume that the system
   # has not been set up to run clearagent and has never checked in. In any event
   # we cannot say the system died because we've never known it to be alive!
-  return 1
-    unless $system{lastheardfrom};
+  return 1 unless $system{lastheardfrom};
 
   # If a system is not active (may have been temporarily been deactivated) then
   # we don't want to turn on the bells and whistles alerting people it's down.
-  return 1
-    if $system{active} eq 'false';
+  return 1 if $system{active} eq 'false';
 
   my $today         = Today2SQLDatetime;
   my $lastheardfrom = $system{lastheardfrom};
@@ -2018,8 +2111,7 @@ sub AddAlertlog(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%alertlog;
 
-  return -1, "AddAlertlog: $result"
-    if $result;
+  return -1, "AddAlertlog: $result" if $result;
 
   # Timestamp record
   $alertlog{timestamp} = Today2SQLDatetime;
@@ -2054,10 +2146,10 @@ sub FindAlertlog(;$$$$$) {
      $condition .= "notification like '%$notification%'";
      $condition .= " order by timestamp desc";
 
-     if (defined $start) {
-       $page ||= 10;
-       $condition .= " limit $start, $page";
-     } # unless
+  if (defined $start) {
+    $page ||= 10;
+    $condition .= " limit $start, $page";
+  } # unless
 
   return $self->_getRecords('alertlog', $condition);
 } # FindAlertLog
@@ -2065,8 +2157,7 @@ sub FindAlertlog(;$$$$$) {
 sub GetAlertlog($) {
   my ($self, $alert) = @_;
 
-  return
-    unless $alert;
+  return unless $alert;
 
   my @records = $self->_getRecords('alertlog', "alert='$alert'");
 
@@ -2098,8 +2189,7 @@ sub AddNotification(%) {
 
   my $result = _checkRequiredFields \@requiredFields, \%notification;
 
-  return -1, "AddNotification: $result"
-    if $result;
+  return -1, "AddNotification: $result" if $result;
 
   return $self->_addRecord('notification', %notification);
 } # AddNotification
@@ -2125,8 +2215,7 @@ sub FindNotification(;$$) {
 sub GetNotification($) {
   my ($self, $name) = @_;
 
-  return
-    unless $name;
+  return unless $name;
 
   my @records = $self->_getRecords('notification', "name='$name'");
 
index 54f164e..e5848b0 100644 (file)
@@ -47,7 +47,7 @@ use strict;
 
 use base 'Exporter';
 
-use CGI qw (
+use CGI qw(
   :standard
    start_a
    end_a
@@ -85,7 +85,7 @@ our $APPNAME= 'Clearadm';
 our $VERSION  = '$Revision: 1.46 $';
    ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
-our @EXPORT = qw (
+our @EXPORT = qw(
   autoScale
   displayError
   displayAlert
@@ -165,7 +165,7 @@ our @PREDEFINED_MULTIPLIERS = (
   'Days',
 );
 
-sub dbug ($) {
+sub dbug($) {
   my ($msg) = @_;
 
   display font ({-class => 'error'}, '<br>DEBUG: '). $msg;
@@ -173,7 +173,7 @@ sub dbug ($) {
   return;
 } # dbug
 
-sub displayError ($) {
+sub displayError($) {
   my ($msg) = @_;
 
   display font ({-class => 'error'}, 'Error: ') . $msg;
@@ -181,7 +181,7 @@ sub displayError ($) {
   return
 } # displayError;
 
-sub setField ($;$) {
+sub setField($;$) {
   my ($field, $label) = @_;
 
   $label ||= 'Unknown';
@@ -191,7 +191,7 @@ sub setField ($;$) {
   return defined $field ? $field : $undef;
 } # setField
 
-sub setFields ($%) {
+sub setFields($%) {
   my ($label, %rec) = @_;
 
   $rec{$_} = setField ($rec{$_}, $label)
@@ -200,7 +200,7 @@ sub setFields ($%) {
   return %rec;
 } # setFields;
 
-sub dumpVars (%) {
+sub dumpVars(%) {
   my (%vars) = @_;
 
   for (keys %vars) {
@@ -210,7 +210,7 @@ sub dumpVars (%) {
   return;
 } # dumpVars
 
-sub graphError ($) {
+sub graphError($) {
   my ($msg) = @_;
 
   use GD;
@@ -240,7 +240,7 @@ sub graphError ($) {
   exit;
 } # graphError
 
-sub autoScale ($) {
+sub autoScale($) {
   my ($amount) = @_;
 
   my $kbyte = 1024;
@@ -256,7 +256,7 @@ sub autoScale ($) {
   return $size;
 } # autoScale
 
-sub _makeAlertlogSelection ($$) {
+sub _makeAlertlogSelection($$) {
   my ($name, $default) = @_;
 
   $default ||= 'All';
@@ -278,7 +278,7 @@ sub _makeAlertlogSelection ($$) {
   return $dropdown;
 } # _makeAlertlogSelection
 
-sub _makeRunlogSelection ($$) {
+sub _makeRunlogSelection($$) {
   my ($name, $default) = @_;
 
   $default ||= 'All';
@@ -308,7 +308,7 @@ sub _makeRunlogSelection ($$) {
   return $dropdown;
 } # _makeRunlogSelection
 
-sub _makeRunlogSelectionNumeric ($$) {
+sub _makeRunlogSelectionNumeric($$) {
   my ($name, $default) = @_;
 
   $default ||= 'All';
@@ -327,15 +327,14 @@ sub _makeRunlogSelectionNumeric ($$) {
   return $dropdown;
 } # _makeRunlogSelection
 
-sub makeAlertDropdown (;$$) {
+sub makeAlertDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
 
   my @values;
 
-  push @values, $$_{name}
-    for ($clearadm->FindAlert);
+  push @values, $$_{name} for ($clearadm->FindAlert);
 
   my $dropdown  = "$label ";
      $dropdown .= popup_menu {
@@ -348,7 +347,7 @@ sub makeAlertDropdown (;$$) {
   return $dropdown;
 } # makeAlertDropdown
 
-sub makeMultiplierDropdown (;$$) {
+sub makeMultiplierDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
@@ -364,7 +363,7 @@ sub makeMultiplierDropdown (;$$) {
   return $dropdown;
 } # makeMultiplierDropdown
 
-sub makeNoMoreThanDropdown (;$$) {
+sub makeNoMoreThanDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
@@ -413,7 +412,7 @@ sub makeStoragePoolDropdown($$) {
 
   my @values;
 
-  my $dropdown = 'Storage pool ';
+  my $dropdown = 'Storage pool  ';
     
   if ($type eq 'vob') {
     push @values, qw(admin db cleartext derivedobj source total);
@@ -431,7 +430,7 @@ sub makeStoragePoolDropdown($$) {
   return span {id => $type}, $dropdown;
 } # makeStoragePoolsDropdown
     
-sub makeFilesystemDropdown ($;$$$) {
+sub makeFilesystemDropdown($;$$$) {
   my ($system, $label, $default, $onchange) = @_;
 
   $label ||= '';
@@ -459,7 +458,7 @@ sub makeFilesystemDropdown ($;$$$) {
   return span {id => 'filesystems'}, $dropdown;
 } # makeFilesystemDropdown
 
-sub makeIntervalDropdown (;$$$) {
+sub makeIntervalDropdown(;$$$) {
   my ($label, $default, $onchange) = @_;
 
   $label ||= '';
@@ -471,8 +470,7 @@ sub makeIntervalDropdown (;$$$) {
     'Month',
   );
 
-  $default = ucfirst lc $default
-    if $default;
+  $default = ucfirst lc $default if $default;
 
   my $dropdown  = "$label ";
      $dropdown .= popup_menu {
@@ -487,7 +485,7 @@ sub makeIntervalDropdown (;$$$) {
    return span {id => 'scaling'}, $dropdown;
 } # makeIntervalDropdown;
 
-sub makeNotificationDropdown (;$$) {
+sub makeNotificationDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
@@ -508,7 +506,7 @@ sub makeNotificationDropdown (;$$) {
   return $dropdown;
 } # makeNotificationDropdown
 
-sub makeRestartableDropdown (;$$) {
+sub makeRestartableDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
@@ -529,7 +527,7 @@ sub makeRestartableDropdown (;$$) {
   return $dropdown;
 } # makeRestartableDropdown
 
-sub makeSystemDropdown (;$$$%) {
+sub makeSystemDropdown(;$$$%) {
   my ($label, $default, $onchange, %systems) = @_;
 
   $label ||= '';
@@ -556,7 +554,7 @@ sub makeSystemDropdown (;$$$%) {
   return span {id => 'systems'}, $systemDropdown;
 } # makeSystemDropdown
 
-sub makeTaskDropdown (;$$) {
+sub makeTaskDropdown(;$$) {
   my ($label, $default) = @_;
 
   $label ||= '';
@@ -577,7 +575,7 @@ sub makeTaskDropdown (;$$) {
   return $taskDropdown;
 } # makeTaskDropdown
 
-sub makeTimeDropdown ($$$;$$$$$) {
+sub makeTimeDropdown($$$;$$$$$) {
   my (
     $table,
     $elementID,
@@ -622,7 +620,7 @@ sub makeTimeDropdown ($$$;$$$$$) {
   return $timeDropdown;
 } # makeTimeDropdown
 
-sub heading (;$$) {
+sub heading(;$$) {
   my ($title, $type) = @_;
 
   if ($title) {
@@ -633,17 +631,17 @@ sub heading (;$$) {
 
   display header;
   display start_html {
-       -title  => $title,
-       -author => 'Andrew DeFaria <Andrew@ClearSCM.com>',
-       -meta   => {
-         keywords  => 'ClearSCM Clearadm',
+    -title  => $title,
+    -author => 'Andrew DeFaria <Andrew@ClearSCM.com>',
+    -meta   => {
+      keywords  => 'ClearSCM Clearadm',
       copyright => 'Copyright (c) ClearSCM, Inc. 2010, All rights reserved',
-       },
-       -script => [{
-         -language => 'JavaScript',
-         -src      => 'clearadm.js',
-       }],
-       -style   => ['clearadm.css', 'clearmenu.css'],
+  },
+    -script => [{
+      -language => 'JavaScript',
+      -src      => 'clearadm.js',
+    }],
+    -style   => ['clearadm.css', 'clearmenu.css'],
   }, $title;
 
   return if $type;
@@ -762,7 +760,7 @@ sub heading (;$$) {
   return;
 } # heading
 
-sub displayAlert (;$) {
+sub displayAlert(;$) {
   my ($alert) = @_;
 
   display start_table {cellspacing => 1};
@@ -862,7 +860,7 @@ sub displayAlert (;$) {
   return;
 } # DisplayAlerts
 
-sub displayAlertlog (%) {
+sub displayAlertlog(%) {
   my (%opts) = @_;
 
   my $optsChanged;
@@ -1085,7 +1083,7 @@ sub displayAlertlog (%) {
   return;
 } # displayAlertlog
 
-sub displayFilesystem ($) {
+sub displayFilesystem($) {
   my ($systemName) = @_;
 
   display start_table {cellspacing => 1, width => '98%'};
@@ -1213,13 +1211,17 @@ sub displayFilesystem ($) {
         display td {class => $classRightTop}, "$used ($usedPct%)<br>",
           font {class => 'unknown'}, "$fs{timestamp}";
         display td {class => $classRightTop}, "$filesystem{threshold}%";
+
+       my $image = $filesystem{fssmall}
+         ? "data:image/png;base64,$filesystem{fssmall}"
+         : "plotfs.cgi?system=$system{name}&filesystem=$filesystem{filesystem}&tiny=1";
+
         display td {class => $class},
           a {href =>
             "plot.cgi?type=filesystem&system=$system{name}"
           . "&filesystem=$filesystem{filesystem}&scaling=Day&points=7"
           }, img {
-            src    => "plotfs.cgi?system=$system{name}"
-                    . "&filesystem=$filesystem{filesystem}&tiny=1",
+            src    => $image,
             border => 0,
           };
       display end_Tr;
@@ -1231,7 +1233,7 @@ sub displayFilesystem ($) {
   return;
 } # displayFilesystem
 
-sub displayNotification (;$) {
+sub displayNotification(;$) {
   my ($notification) = @_;
 
   display start_table {cellspacing => 1};
@@ -1331,7 +1333,7 @@ sub displayNotification (;$) {
   return;
 } # displayNotification
 
-sub displayRunlog (%) {
+sub displayRunlog(%) {
   my (%opts) = @_;
 
   my $optsChanged;
@@ -1563,7 +1565,7 @@ sub displayRunlog (%) {
   return;
 } # displayRunlog
 
-sub displaySchedule () {
+sub displaySchedule() {
   display start_table {cellspacing => 1};
 
   display start_Tr;
@@ -1668,7 +1670,7 @@ sub displaySchedule () {
   return;
 } # displaySchedule
 
-sub displaySystem ($) {
+sub displaySystem($) {
   my ($systemName) = @_;
 
   my %system = $clearadm->GetSystem ($systemName);
@@ -1785,7 +1787,7 @@ sub displaySystem ($) {
       a {href =>
         "plot.cgi?type=loadavg&system=$system{name}&scaling=Hour&points=24"
         }, img {
-          src    => "plotloadavg.cgi?system=$system{name}&tiny=1",
+          src    => "data:image/png;base64,$system{loadavgsmall}",
           border => 0,
       };
 
@@ -1850,58 +1852,59 @@ sub displaySystem ($) {
     my $classRight    = $class . 'Right';
 
     display start_Tr;
-        display start_td {class => 'data'};
+      display start_td {class => 'data'};
 
-        my $areYouSure = 'Are you sure you want to delete '
-                       . "$system{name}:$filesystem{filesystem}?" . '\n'
-                       . 'Doing so will remove all records related to this\n'
-                       . 'filesystem and its history.';
+      my $areYouSure = 'Are you sure you want to delete '
+                     . "$system{name}:$filesystem{filesystem}?" . '\n'
+                     . 'Doing so will remove all records related to this\n'
+                     . 'filesystem and its history.';
 
-        display start_form {
-          method => 'post',
-          action => 'processfilesystem.cgi',
-        };
+      display start_form {
+        method => 'post',
+        action => 'processfilesystem.cgi',
+      };
 
-        display input {
-          type  => 'hidden',
-          name  => 'system',
-          value => $system{name},
-        };
-        display input {
-          type  => 'hidden',
-          name  => 'filesystem',
-          value => $filesystem{filesystem},
-        };
+      display input {
+        type  => 'hidden',
+        name  => 'system',
+        value => $system{name},
+      };
+      display input {
+        type  => 'hidden',
+        name  => 'filesystem',
+        value => $filesystem{filesystem},
+      };
 
-        display input {
-          name    => 'delete',
-          type    => 'image',
-          src     => 'delete.png',
-          alt     => 'Delete',
-          value   => 'Delete',
-          title   => 'Delete',
-          onclick => "return AreYouSure ('$areYouSure');"
-        };
-        display input {
-          name    => 'edit',
-          type    => 'image',
-          src     => 'edit.png',
-          alt     => 'Edit',
-          value   => 'Edit',
-          title   => 'Edit',
+      display input {
+        name    => 'delete',
+        type    => 'image',
+        src     => 'delete.png',
+        alt     => 'Delete',
+        value   => 'Delete',
+        title   => 'Delete',
+        onclick => "return AreYouSure ('$areYouSure');"
+      };
+      display input {
+        name    => 'edit',
+        type    => 'image',
+        src     => 'edit.png',
+        alt     => 'Edit',
+        value   => 'Edit',
+        title   => 'Edit',
+      };
+
+      if ($filesystem{notification}) {
+        display a {
+          href => "alertlog.cgi?system=$filesystem{system}"}, img {
+          src    => 'alert.png',
+          border => 0,
+          alt    => 'Alert!',
+          title  => 'This filesystem has alerts',
         };
+      } # if
 
-        if ($filesystem{notification}) {
-          display a {
-            href => "alertlog.cgi?system=$filesystem{system}"}, img {
-            src    => 'alert.png',
-            border => 0,
-            alt    => 'Alert!',
-            title  => 'This filesystem has alerts',
-          };
-        } # if
+      display end_form;
 
-        display end_form;
       display td {class => $class},         $filesystem{filesystem};
       display td {class => $classCentered}, $filesystem{fstype};
       display td {class => $class},         $filesystem{mount};
@@ -1917,10 +1920,8 @@ sub displaySystem ($) {
         . "&filesystem=$filesystem{filesystem}"
         . "&scaling=Day&points=7"
         }, img {
-           src    => "plotfs.cgi?system=$system{name}&"
-                   . "filesystem=$filesystem{filesystem}"
-                   . '&tiny=1',
-           border => 0,
+          src    => "data:image/png;base64,$filesystem{fssmall}",
+          border => 0,
         };
     display end_Tr;
   } # for
@@ -1930,7 +1931,7 @@ sub displaySystem ($) {
   return;
 } # displaySystem
 
-sub displayTask (;$) {
+sub displayTask(;$) {
   my ($task) = @_;
 
   display start_table {cellspacing => 1, width => '98%'};
@@ -2029,7 +2030,7 @@ sub displayTask (;$) {
   return;
 } # DisplayAlerts
 
-sub editAlert (;$) {
+sub editAlert(;$) {
   my ($alert) = @_;
 
   display start_form (
@@ -2110,7 +2111,7 @@ sub editAlert (;$) {
   return;
 } # editAlert
 
-sub editFilesystem ($$) {
+sub editFilesystem($$) {
   my ($system, $filesystem) = @_;
 
   display start_form (
@@ -2211,7 +2212,7 @@ sub editFilesystem ($$) {
   return;
 } # editFilesytem
 
-sub editNotification (;$) {
+sub editNotification(;$) {
   my ($notification) = @_;
 
   display start_form (
@@ -2296,7 +2297,7 @@ sub editNotification (;$) {
   return;
 } # editNotification
 
-sub editSchedule (;$) {
+sub editSchedule(;$) {
   my ($schedule) = @_;
 
   display start_form (
@@ -2399,7 +2400,7 @@ sub editSchedule (;$) {
   return;
 } # editSchedule
 
-sub editSystem (;$) {
+sub editSystem(;$) {
   my ($system) = @_;
 
   display start_form (
@@ -2584,7 +2585,7 @@ sub editSystem (;$) {
   return;
 } # editSystem
 
-sub editTask (;$) {
+sub editTask(;$) {
   my ($task) = @_;
 
   display start_form (
@@ -2685,7 +2686,7 @@ sub editTask (;$) {
   return;
 } # editTask
 
-sub footing () {
+sub footing() {
   my $clearscm = a {-href => 'http://clearscm.com'}, 'ClearSCM, Inc.';
 
   # Figure out which script by using CLEARADM_BASE.
index 410a94e..461f86d 100644 (file)
@@ -81,7 +81,7 @@ $CLEAROPTS{CLEAREXEC_PORT} = $ENV{CLEAREXEC_PORT}
 $CLEAROPTS{CLEAREXEC_MULTITHREADED} = $ENV{CLEAREXEC_MULTITHREADED}
   if $ENV{CLEAREXEC_MULTITHREADED};
 
-sub new () {
+sub new() {
   my ($class) = @_;
 
   my $clearadm = bless {}, $class;
@@ -91,7 +91,7 @@ sub new () {
   return $clearadm;
 } # new
 
-sub _tag ($) {
+sub _tag($) {
   my ($self, $msg) = @_;
 
   my $tag = YMDHMS;
@@ -101,7 +101,7 @@ sub _tag ($) {
   return "$tag$msg";
 } # _tag
 
-sub _verbose ($) {
+sub _verbose($) {
   my ($self, $msg) = @_;
 
   verbose $self->_tag ($msg);
@@ -109,7 +109,7 @@ sub _verbose ($) {
   return;
 } # _verbose
 
-sub _debug ($) {
+sub _debug($) {
   my ($self, $msg) = @_;
 
   debug $self->_tag ($msg);
@@ -117,7 +117,7 @@ sub _debug ($) {
   return;
 } # _debug
 
-sub _log ($) {
+sub _log($) {
   my ($self, $msg) = @_;
 
   display $self->_tag ($msg);
@@ -125,7 +125,7 @@ sub _log ($) {
   return;
 } # log
 
-sub _endServer () {
+sub _endServer() {
   display "Clearexec V$VERSION shutdown at " . localtime;
 
   # Kill process group
@@ -133,7 +133,6 @@ sub _endServer () {
 
   # Wait for all children to die
   while (wait != -1) {
-
     # do nothing
   } # while
 
@@ -141,7 +140,7 @@ sub _endServer () {
   exit;
 } # _endServer
 
-sub _restartServer () {
+sub _restartServer() {
 
   # Not sure what to do on a restart server
   display 'Entered _restartServer';
@@ -149,7 +148,7 @@ sub _restartServer () {
   return;
 } # _restartServer
 
-sub setMultithreaded ($) {
+sub setMultithreaded($) {
   my ($self, $value) = @_;
 
   my $oldValue = $self->{multithreaded};
@@ -159,13 +158,13 @@ sub setMultithreaded ($) {
   return $oldValue;
 } # setMultithreaded
 
-sub getMultithreaded () {
+sub getMultithreaded() {
   my ($self) = @_;
 
   return $self->{multithreaded};
 } # getMultithreaded
 
-sub connectToServer (;$$) {
+sub connectToServer(;$$) {
   my ($self, $host, $port) = @_;
 
   $host ||= $CLEAROPTS{CLEAREXEC_HOST};
@@ -179,8 +178,7 @@ sub connectToServer (;$$) {
 
   return unless $self->{socket};
 
-  $self->{socket}->autoflush
-    if $self->{socket};
+  $self->{socket}->autoflush if $self->{socket};
 
   $self->{host} = $host;
   $self->{port} = $port;
@@ -194,7 +192,7 @@ sub connectToServer (;$$) {
   return;
 } # connectToServer
 
-sub disconnectFromServer () {
+sub disconnectFromServer() {
   my ($self) = @_;
 
   undef $self->{socket};
@@ -202,11 +200,10 @@ sub disconnectFromServer () {
   return;
 } # disconnectFromServer
 
-sub execute ($) {
+sub execute($) {
   my ($self, $cmd) = @_;
 
-  return (-1, 'Unable to talk to server')
-    unless $self->{socket};
+  return (-1, 'Unable to talk to server') unless $self->{socket};
 
   my ($status, $statusLine, @output) = (-1, '', ());
 
@@ -230,14 +227,13 @@ sub execute ($) {
   return ($status, @output);
 } # execute
 
-sub _serviceClient ($$) {
+sub _serviceClient($$) {
   my ($self, $host, $client) = @_;
 
   $self->_verbose ("Serving requests from $host");
 
   # Set autoflush for client
-  $client->autoflush
-    if $client;
+  $client->autoflush if $client;
 
   while () {
     # Read command from client
@@ -274,8 +270,7 @@ sub _serviceClient ($$) {
       $self->_debug ("Returning 0, undef");
     } else {
       # Combines STDERR -> STDOUT if not already specified
-      $cmd .= ' 2>&1'
-        unless $cmd =~ /2>&1/;
+      $cmd .= ' 2>&1' unless $cmd =~ /2>&1/;
 
       $self->_debug ("Executing $cmd");
       ($status, @output) = Execute $cmd;
@@ -295,7 +290,7 @@ sub _serviceClient ($$) {
   return;
 } # _serviceClient
 
-sub startServer (;$) {
+sub startServer(;$) {
   my ($self, $port) = @_;
 
   $port ||= $CLEAROPTS{CLEAREXEC_PORT};
@@ -308,8 +303,7 @@ sub startServer (;$) {
     Reuse     => 1
   );
 
-  error "Could not create socket - $!", 1
-    unless $self->{socket};
+  error "Could not create socket - $!", 1 unless $self->{socket};
 
   # Announce ourselves
   $self->_log ("Clearexec V$VERSION accepting clients at " . localtime);
index e722015..7142ad9 100644 (file)
@@ -56,6 +56,8 @@ create table system (
                      '1 year'
                    ) not null default '6 months',
   loadavgThreshold float (4,2) default 5.00,
+  loadavgsmall     blob,
+  loadavg          blob,
 
   primary key (name)
 ) engine=innodb; -- system
@@ -130,6 +132,8 @@ create table filesystem (
                    '11 months',
                    '1 year'
                  ) not null default '6 months',
+  fssmall        blob,
+  fslarge        blob,
   
   key filesystemIndex (filesystem),
   foreign key systemLink (system) references system (name)
@@ -160,18 +164,22 @@ create table fs (
 -- vobstorage: Contains a snapshot of a vob's storage pools at a given date
 -- and time
 create table vobstorage (
-  tag          varchar(255) not null,
-  region        varchar(255) not null,
-  timestamp    datetime     not null,
-  admin                decimal(10,1),
-  db           decimal(10,1),
-  cleartext    decimal(10,1),
-  derivedobj   decimal(10,1),
-  source       decimal(10,1),
-  total                decimal(10,1),
+  tag            varchar(255) not null,
+  region          varchar(255) not null,
+  timestamp      datetime     not null,
+  admin                  decimal(10,1),
+  db             decimal(10,1),
+  cleartext      decimal(10,1),
+  derivedobj     decimal(10,1),
+  source         decimal(10,1),
+  total                  decimal(10,1),
 
-  key vobtagIndex (tag),
+  key vobtagIndex (tag, region),
   primary key  (tag, region, timestamp)
+  foreign key vobLink (tag, region)
+    references vob (tag, region)
+      on delete cascade
+      on update cascade
 ) engine=innodb; -- vobstorage
 
 -- viewstorage: Contains a snapshot of a view's storage pools at a given date
@@ -185,8 +193,12 @@ create table viewstorage (
   admin                decimal(10,1),
   total         decimal(10,1),
 
-  key viewtagIndex (tag),
-  primary key (tag, region, timestamp)
+  key viewtagIndex (tag, region),
+  primary key (tag, region, timestamp),
+  foreign key viewLink (tag, region)
+    references view (tag, region)
+      on delete cascade
+      on update cascade
 ) engine=innodb; -- viewstorage
 
 -- loadavg: Contains a snapshot reading of a system's load average
@@ -203,43 +215,55 @@ create table loadavg (
     on update cascade
 ) engine=innodb; -- loadavg
 
--- vobs: Describe a system's vobs
+-- vob: Describe a system's vobs
 create table vob (
-  system varchar (255) not null,
-  tag    varchar (255) not null,
+  tag            varchar (255) not null,
+  region         varchar (255) not null,
+  adminsmall     blob,
+  dbsmall        blob,
+  cleartextsmall  blob,
+  derivedobjsmall blob,
+  sourcesmall     blob,
+  totalsmall      blob,
+  adminlarge             blob,
+  dblarge        blob,
+  cleartextlarge  blob,
+  derivedobjlarge blob,
+  sourcelarge     blob,
+  totallarge      blob,
   
-  key systemIndex (system),
-  foreign key systemLink (system) references system (name)
-    on delete cascade
-    on update cascade,
-  primary key (tag)
+  key vobTagIndex (tag),
+  primary key (tag, region)
 ) engine=innodb; -- vob 
 
 -- view: Describe views
 create table view (
-  system    varchar (255) not null,
-  region    varchar (255) not null,
-  tag       varchar (255) not null,
-  owner     tinytext,
-  ownerName tinytext,
-  email     tinytext,
-  type      enum (
-              'dynamic',
-              'snapshot',
-              'web'
-            ) not null default 'dynamic',
-  gpath     tinytext,
-  modified  datetime,
-  timestamp datetime,
-  age       tinytext,
-  ageSuffix tinytext,
+  tag          varchar (255) not null,
+  region       varchar (255) not null,
+  owner        tinytext,
+  ownerName    tinytext,
+  email        tinytext,
+  type         enum (
+                 'dynamic',
+                 'snapshot',
+                 'web'
+               ) not null default 'dynamic',
+  gpath        tinytext,
+  modified     datetime,
+  timestamp    datetime,
+  age          tinytext,
+  ageSuffix    tinytext,
+  privatesmall blob,
+  dbsmall      blob,
+  adminsmall   blob,
+  totalsmall   blob,
+  privatelarge blob,
+  dblarge      blob,
+  adminlarge   blob,
+  totallarge   blob,
   
-  key systemIndex (system),
-  foreign key systemLink (system) references system (name)
-    on delete cascade
-    on update cascade,
-  key regionIndex (region),
-  primary key (region, tag)
+  key viewTagIndex (tag),
+  primary key (tag, region)
 ) engine=innodb; -- view
 
 create table task (
index 9fada55..fa3d45a 100755 (executable)
@@ -39,7 +39,7 @@ use strict;
 use warnings;
 
 use FindBin;
-use CGI qw (:standard :cgi-lib start_table end_table start_Tr end_Tr);
+use CGI qw(:standard :cgi-lib start_table end_table start_Tr end_Tr);
 use GD::Graph::area;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
@@ -55,7 +55,7 @@ my %opts = Vars;
 
 my $clearadm;
 
-sub displayGraph () {
+sub displayGraph() {
   my $parms;
 
   for (keys %opts) {
@@ -66,36 +66,66 @@ sub displayGraph () {
   display '<center>';
   
   if ($opts{type} eq 'loadavg') {
-    unless ($opts{tiny}) {
-      display img {src => "plotloadavg.cgi?$parms", class => 'chart'};
+    my %system = $clearadm->GetSystem($opts{system});
+
+    # We can use the cached version only if the opts are set to default
+    if ($opts{scaling} eq 'Hour' and $opts{points} == 24) {
+      my $data = $opts{tiny} ? $system{loadavgsmall} : $system{loadavg};
+
+      display img {src => "data:image/png;base64,$data"};
     } else {
-      display img {src => "plotloadavg.cgi?$parms", border => 0};
-    } # unless
+      unless ($opts{tiny}) {
+        display img {src => "plotloadavg.cgi?$parms", class => 'chart'};
+      } else {
+        display img {src => "plotloadavg.cgi?$parms", border => 0};
+      } # unless
+    } # if
   } elsif ($opts{type} eq 'filesystem') {
-    unless ($opts{tiny}) {
-      display img {src => "plotfs.cgi?$parms", class => 'chart'};
+    my %filesystem = $clearadm->GetFilesystem($opts{system}, $opts{filesystem});
+
+    # We can use the cached version only if the opts are set to default
+    if ($opts{scaling} eq 'Day' and $opts{points} == 7) {
+      my $data = $opts{tiny} ? $filesystem{fssmall} : $filesystem{fslarge};
+
+      display img {src => "data:image/png;base64,$data"};
     } else {
-      display img {src => "plotfs.cgi?$parms", border => 0};
-    } # unless
+      unless ($opts{tiny}) {
+        display img {src => "plotfs.cgi?$parms", class => 'chart'};
+      } else {
+        display img {src => "plotfs.cgi?$parms", border => 0};
+      } # unless
+    } # if
   } elsif ($opts{type} eq 'vob' or $opts{type} eq 'view') {
-    unless ($opts{tiny}) {
-      display img {src => "plotstorage.cgi?$parms", class => 'chart'};
+    my (%vob, %view);
+
+    %vob  = $clearadm->GetVob($opts{tag}, $opts{region})  if $opts{type} eq 'vob';
+    %view = $clearadm->GetView($opts{tag}, $opts{region}) if $opts{type} eq 'view';
+    # We can use the cached version only if the opts are set to default
+    if ($opts{scaling} eq 'Day' and $opts{points} == 7) {
+      my $storageType = $opts{tiny}          ? "$opts{storage}small" : "$opts{storage}large";
+      my $data        = $opts{type} eq 'vob' ? $vob{$storageType}    : $view{$storageType};
+
+      display img {src => "data:image/png;base64,$data"};
     } else {
-      display img {src => "plotstorage.cgi?$parms", border => 0};
-    } # unless
+      unless ($opts{tiny}) {
+        display img {src => "plotstorage.cgi?$parms", class => 'chart'};
+      } else {
+        display img {src => "plotstorage.cgi?$parms", border => 0};
+      } # unless
+    } # if
   } # if
 
   display '</center>';
   
-  return
+  return;
 } # displayGraph
 
-sub displayFSInfo () {
+sub displayFSInfo() {
   if ($opts{filesystem}) {
     display h3 {-align => 'center'}, 'Latest Filesystem Reading';
   } else {
-       display p;
-       return;
+    display p;
+    return;
   } # if
   
   display start_table {width => '800px', cellspacing => 1};
@@ -161,20 +191,20 @@ sub displayControls() {
   my ($systemLink, $systemButtons);
 
   if ($opts{type} =~ /(vob|view)/i) {
-    $tagsButtons = makeTagsDropdown ($opts{type}, $opts{tag});
+    $tagsButtons = makeTagsDropdown($opts{type}, $opts{tag});
   } else {
     $systemLink = span {id => 'systemLink'}, a {
       href => "systemdetails.cgi?system=$opts{system}",
     }, 'System';
 
-    $systemButtons = makeSystemDropdown (
+    $systemButtons = makeSystemDropdown(
       $systemLink, 
       $opts{system}, 
       'updateFilesystems(this.value);updateSystemLink(this.value)'
     );
   } # if
 
-  my $startButtons = makeTimeDropdown (
+  my $startButtons = makeTimeDropdown(
     $opts{type},
     'startTimestamp',
     $opts{system},
@@ -184,7 +214,7 @@ sub displayControls() {
     $opts{scaling},
   );
 
-  my $endButtons = makeTimeDropdown (
+  my $endButtons = makeTimeDropdown(
     $opts{type},
     'endTimestamp',
     $opts{system},
@@ -204,7 +234,7 @@ sub displayControls() {
     $update = ''; # TODO do I need something here?
   } # if
              
-  my $intervalButtons = makeIntervalDropdown (
+  my $intervalButtons = makeIntervalDropdown(
     'Interval',
     $opts{scaling},
     $update
@@ -264,7 +294,7 @@ sub displayControls() {
 
 $clearadm = Clearadm->new;
 
-my $title  = ucfirst ($opts{type}) . ': ';
+my $title  = ucfirst($opts{type}) . ': ';
 
 $title .= ucfirst $opts{system}           if $opts{system};
 $title .= ":$opts{filesystem}"            if $opts{filesystem};
@@ -281,7 +311,8 @@ display start_form {
 };
 
 # Some hidden fields to pass along
-display input {type => 'hidden', name => 'type', value => $opts{type}};
+display input {type => 'hidden', name => 'type',   value => $opts{type}};
+display input {type => 'hidden', name => 'region', value => $opts{region}};
 
 displayGraph;
 displayFSInfo;
index 8617e79..e02bd10 100755 (executable)
@@ -61,6 +61,7 @@ use strict;
 use warnings;
 
 use FindBin;
+use Convert::Base64;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -68,7 +69,7 @@ use Clearadm;
 use ClearadmWeb;
 use Display;
 
-use CGI qw (:standard :cgi-lib);
+use CGI qw(:standard :cgi-lib);
 use GD::Graph::area;
 
 my %opts = Vars;
@@ -89,7 +90,7 @@ if ($opts{tiny}) {
 
 my $clearadm = Clearadm->new;
 
-my $graph = GD::Graph::area->new ($opts{width}, $opts{height});
+my $graph = GD::Graph::area->new($opts{width}, $opts{height});
 
 graphError "System is required"
   unless $opts{system};
@@ -100,7 +101,7 @@ graphError "Filesystem is required"
 graphError "Points not numeric (points: $opts{points})"
   if $opts{points} and $opts{points} !~ /^\d+$/;
   
-my @fs = $clearadm->GetFS (
+my @fs = $clearadm->GetFS(
   $opts{system},
   $opts{filesystem},
   $opts{start},
@@ -116,7 +117,7 @@ my (@x, @y);
 
 my $i = 0;
 
-foreach (@fs) {
+for (@fs) {
   $i++;
   my %fs = %{$_};
   
@@ -128,7 +129,8 @@ foreach (@fs) {
 
   push @y, $opts{meg} ? $fs{used} / (1024 * 1024) :
                         $fs{used} / (1024 * 1024 * 12024);
-}
+} # for
+
 my @data = ([@x], [@y]);
 
 my $x_label_skip = @x > 1000 ? 200
@@ -144,7 +146,7 @@ my $title   = $opts{tiny} ? '' : "Filesystem usage for "
                                . "$opts{system}:$opts{filesystem}";
 my $labelY  = $opts{tiny} ? '' : '%.2f';
 
-$graph->set (
+$graph->set(
   x_label           =>$x_label,
   x_labels_vertical => 1,
   x_label_skip      => $x_label_skip,
@@ -165,8 +167,12 @@ $graph->set (
 my $image = $graph->plot(\@data)
   or croak $graph->error;
 
-print "Content-type: image/png\n\n";
-print $image->png;
+unless ($opts{generate}) {
+  print "Content-type: image/png\n\n";
+  print $image->png;
+} else {
+  print encode_base64 $image->png;
+} # unless
 
 =pod
 
index c8acbfa..d5cb7ca 100755 (executable)
@@ -59,6 +59,7 @@ use strict;
 use warnings;
 
 use FindBin;
+use Convert::Base64;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -66,7 +67,7 @@ use Clearadm;
 use ClearadmWeb;
 use Display;
 
-use CGI qw (:standard :cgi-lib);
+use CGI qw(:standard :cgi-lib);
 use GD::Graph::area;
 
 my %opts = Vars;
@@ -87,7 +88,7 @@ if ($opts{tiny}) {
 
 my $clearadm = Clearadm->new;
 
-my $graph = GD::Graph::area->new ($opts{width}, $opts{height});
+my $graph = GD::Graph::area->new($opts{width}, $opts{height});
 
 graphError "System is required"
   unless $opts{system};
@@ -95,12 +96,12 @@ graphError "System is required"
 graphError "Points not numeric (points: $opts{points})"
   if $opts{points} and $opts{points} !~ /^\d+$/;
 
-my @loads = $clearadm->GetLoadavg (
+my @loads = $clearadm->GetLoadavg(
   $opts{system},
   $opts{start},
   $opts{end},
   $opts{points},
-  $opts{scaling}
+  $opts{scaling},
 );
 
 graphError "No loadavg data"
@@ -108,7 +109,7 @@ graphError "No loadavg data"
 
 my (@x, @y);
 
-foreach (@loads) {
+for (@loads) {
   my %load = %{$_};
   
   if ($opts{tiny}) {
@@ -118,7 +119,7 @@ foreach (@loads) {
   } # if
 
   push @y, $load{loadavg};
-} # foreach
+} # for
 
 my @data = ([@x], [@y]);
 
@@ -133,7 +134,7 @@ my $y_label = $opts{tiny} ? '' : 'Load';
 my $title   = $opts{tiny} ? '' : "Load Average for $opts{system}";
 my $labelY  = $opts{tiny} ? '' : '%.2f';
 
-$graph->set (
+$graph->set(
   x_label           => $x_label,
   x_labels_vertical => 1,
   x_label_skip      => $x_label_skip,
@@ -154,8 +155,12 @@ $graph->set (
 my $image = $graph->plot(\@data)
   or croak $graph->error;
 
-print "Content-type: image/png\n\n";
-print $image->png;
+unless ($opts{generate}) {
+  print "Content-type: image/png\n\n";
+  print $image->png;
+} else {
+  print encode_base64 $image->png;
+} # unless
 
 =pod
 
index 22c20ba..d879ef3 100755 (executable)
@@ -40,7 +40,7 @@ $Date: 2011/01/14 16:37:04 $
    <storage>: Name of the Clearcase storage pool to plot information for
    <height>:  Height of chart (Default: 480px - tiny: 40)
    <width>:   Width of chart (Default: 800px - tiny: 150)
-   <color>:   A GD::Color color value (Default: lblue)
+   <color>:   A GD::Color color value (Default: purple)
    <scaling>: Currently one of Minute, Hour, Day or Month. Specifies how
               Clearadm::GetFS will scale the data returned (Default: Minute 
               - tiny: Day)
@@ -61,6 +61,7 @@ use strict;
 use warnings;
 
 use FindBin;
+use Convert::Base64;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -69,7 +70,7 @@ use ClearadmWeb;
 use Clearcase;
 use Display;
 
-use CGI qw (:standard :cgi-lib);
+use CGI qw(:standard :cgi-lib);
 use GD::Graph::area;
 
 my %opts = Vars;
@@ -77,7 +78,7 @@ my %opts = Vars;
 my $VERSION  = '$Revision: 1.13 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
-$opts{color}  ||= 'lblue';
+$opts{color}  ||= $opts{type} eq 'vob' ? 'purple' : 'marine';
 $opts{height} ||= 350;
 $opts{width}  ||= 800;
 
@@ -90,7 +91,7 @@ if ($opts{tiny}) {
 
 my $clearadm = Clearadm->new;
 
-my $graph = GD::Graph::area->new ($opts{width}, $opts{height});
+my $graph = GD::Graph::area->new($opts{width}, $opts{height});
 
 graphError "Tag is required"     unless $opts{tag};
 graphError "Type is required"    unless $opts{type};
@@ -99,7 +100,7 @@ graphError "Storage is required" unless $opts{storage};
 graphError "Points not numeric (points: $opts{points})"
   if $opts{points} and $opts{points} !~ /^\d+$/;
   
-my @storage = $clearadm->GetStorage (
+my @storage = $clearadm->GetStoragePool(
   $opts{type},
   $opts{tag},
   $opts{storage},
@@ -147,7 +148,7 @@ my $title   = $opts{tiny} ? '' : "Storage usage for "
                                . "$opts{type}:$opts{tag} $storageLabel";
 my $labelY  = $opts{tiny} ? '' : '%.2f';
 
-$graph->set (
+$graph->set(
   x_label           => $x_label,
   x_labels_vertical => 1,
   x_label_skip      => $x_label_skip,
@@ -168,8 +169,12 @@ $graph->set (
 my $image = $graph->plot(\@data)
   or croak $graph->error;
 
-print "Content-type: image/png\n\n";
-print $image->png;
+unless ($opts{generate}) {
+  print "Content-type: image/png\n\n";
+  print $image->png;
+} else {
+  print encode_base64 $image->png;
+} # unless
 
 =pod
 
index c5a2a4f..cca1d7c 100755 (executable)
@@ -64,7 +64,7 @@ use Utils;
 my $VERSION  = '$Revision: 1.2 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
   
-sub restart ($) {\r
+sub restart($) {\r
   my ($restart) = @_;
 
   my ($status, @output) = Execute "$restart 2>&1";
@@ -72,11 +72,11 @@ sub restart ($) {
   unless ($status) {
     display "Successfully executed restart option: $restart";
       
-    display $_ foreach (@output);
+    display $_ for (@output);
   } else {
     display "Unable to restart process using $restart (Status: $status)";
       
-    display $_ foreach (@output);
+    display $_ for (@output);
   } # unless
   
   return $status;
@@ -122,19 +122,15 @@ unless ($status) {
       . join ("\n", @output), $status;
 } # if
  
-foreach (@output) {
-  next
-    if /grep -i '$name'/;
-    
-  next
-    if /grep -i $name/;
-  
-  next
-    if /$FindBin::Script/;
+for (@output) {
+  next if /grep -i '$name'/;
+  next if /grep -i $name/;
+  next if /$FindBin::Script/;
     
   display "Found processes named $name";
+
   exit 0;
-} # foreach
+} # for
 
 display "Did not find any processes named $name";
 
index 9a259a3..ce994af 100755 (executable)
@@ -40,7 +40,7 @@ use warnings;
 use FindBin;
 use Getopt::Long;
 
-use CGI qw (:standard *table start_Tr end_Tr);
+use CGI qw(:standard *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
@@ -50,7 +50,7 @@ use Display;
 use Utils;
 
 # Main
-GetOptions (
+GetOptions(
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
   'debug'        => sub { set_debug },
@@ -65,8 +65,7 @@ display '<pre><blockquote>';
 
 display h1 {class => 'center'}, "$ClearadmWeb::APPNAME: README";
 
-display $_
-  foreach (ReadFile 'README');
+display $_ foreach (ReadFile 'README');
 
 display '</pre></blockquote>';
 
index 98a0094..094f8ad 100755 (executable)
@@ -73,7 +73,7 @@ use Utils;
 my $VERSION  = '$Revision: 1.1 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
   
-sub SetupAgent () {
+sub SetupAgent() {
   verbose 'Setting up Agent...';
   
   my ($status, @output, $cmd);
@@ -121,8 +121,7 @@ sub SetupAgent () {
 
       ($status, @output) = Execute "$cmd 2>&1";
 
-      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-        if $status;
+      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
       $cmd = "chmod 777 $Clearadm::CLEAROPTS{CLEARADM_BASE}/$_";
 
@@ -137,8 +136,7 @@ sub SetupAgent () {
     # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/init.d
     my $confdir = '/etc/init.d';
 
-    error "Cannot find conf.d directory ($confdir)", 1
-      unless -d $confdir;
+    error "Cannot find conf.d directory ($confdir)", 1 unless -d $confdir;
 
     unless (-e "$confdir/clearagent") {
       $cmd = "ln -s $FindBin::Bin/etc/init.d/clearagent $confdir";
@@ -155,8 +153,7 @@ sub SetupAgent () {
 
       ($status, @output) = Execute "$cmd 2>&1";
 
-      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-        if $status;
+      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
       verbose 'Starting clearagent';
     
@@ -164,15 +161,13 @@ sub SetupAgent () {
 
       ($status, @output) = Execute "$cmd 2>&1";
   
-      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-        if $status;
+      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
     } else {
       $cmd = 'update-rc.d clearagent defaults';
     
       ($status, @output) = Execute "$cmd 2>&1";
   
-      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-        if $status;
+      error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
       verbose 'Starting clearagent';
     
@@ -188,7 +183,7 @@ sub SetupAgent () {
   return;
 } # SetupAgent
 
-sub SetupTasks () {
+sub SetupTasks() {
   my ($status, @output, $cmd);
    
   verbose 'Setting up Tasks...';
@@ -196,16 +191,14 @@ sub SetupTasks () {
   # Symlink $CLEARADM/etc/conf.d/cleartasks -> /etc/init.d
   my $confdir = '/etc/init.d';
 
-  error "Cannot find conf.d directory ($confdir)", 1
-    unless -d $confdir;
+  error "Cannot find conf.d directory ($confdir)", 1 unless -d $confdir;
 
   unless (-e "$confdir/clearadm") {
     $cmd = "ln -s $FindBin::Bin/etc/init.d/cleartasks $confdir";
   
     ($status, @output) = Execute "$cmd 2>&1";
  
-    error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-      if $status;
+    error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
   } # unless
 
   # Setup runlevel links
@@ -213,8 +206,7 @@ sub SetupTasks () {
     
   ($status, @output) = Execute "$cmd 2>&1";
   
-  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-    if $status;
+  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
  
   verbose 'Starting cleartasks';
     
@@ -222,15 +214,14 @@ sub SetupTasks () {
   
   ($status, @output) = Execute "$cmd 2>&1";
   
-  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-    if $status;
+  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
   verbose 'Done';
         
   return;
 } # SetupTasks
  
-sub SetupWeb () {
+sub SetupWeb() {
   verbose 'Setting up Web...';
   
   my ($status, @output, $cmd);
@@ -238,8 +229,7 @@ sub SetupWeb () {
   # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/apache2/conf.d
   my $confdir = '/etc/apache2/conf.d';
 
-  error "Cannot find Apache 2 conf.d directory ($confdir)", 1
-    unless -d $confdir;
+  error "Cannot find Apache 2 conf.d directory ($confdir)", 1 unless -d $confdir;
 
   unless (-e "$confdir/clearadm") {
     $cmd = "ln -s $FindBin::Bin/etc/conf.d/clearadm $confdir";
@@ -266,7 +256,7 @@ sub SetupWeb () {
   return;
 } # SetupWeb
 
-sub SetupDatabase () {
+sub SetupDatabase() {
   verbose 'Setting up Database';
   
   my ($status, @output, $cmd);
@@ -277,8 +267,7 @@ sub SetupDatabase () {
   
   ($status, @output) = Execute "$cmd 2>&1";
   
-  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-    if $status;
+  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
   verbose 'Setting up database users';
         
@@ -286,8 +275,7 @@ sub SetupDatabase () {
   
   ($status, @output) = Execute "$cmd 2>&1";
   
-  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-    if $status;
+  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
   verbose 'Setting up predefined tasks';
         
@@ -295,8 +283,7 @@ sub SetupDatabase () {
   
   ($status, @output) = Execute "$cmd 2>&1";
   
-  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
-    if $status;
+  error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
 
   verbose 'Done';
   
@@ -312,15 +299,14 @@ Usage 'You must be root'
   
 my $package = 'all';
 
-GetOptions (
+GetOptions(
   usage       => sub { Usage },
   verbose     => sub { set_verbose },
   debug       => sub { set_debug },
   'package=s' => \$package,
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 # Announce ourselves
 verbose "$FindBin::Script V$VERSION";
index 1f7aba7..18419f4 100755 (executable)
@@ -48,7 +48,7 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr start_td end_td);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr start_td end_td);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
@@ -65,7 +65,7 @@ my $subtitle = 'Systems Status: All Systems';
 
 my $clearadm;
 
-sub DisplaySystems () {
+sub DisplaySystems() {
   display start_table {cellspacing => 1, class => 'main'};
   
   display start_Tr;
@@ -80,7 +80,7 @@ sub DisplaySystems () {
     display th {class => 'labelCentered'}, 'Load Avg';
   display end_Tr;
   
-  foreach ($clearadm->FindSystem) {
+  for ($clearadm->FindSystem) {
     my %system = %{$_};
   
     $system{alias}  = setField $system{alias},  'N/A';
@@ -174,7 +174,7 @@ sub DisplaySystems () {
       my $lastheardfromClass = 'dataCentered';
       my $lastheardfromData  = $system{lastheardfrom};
   
-      unless ($clearadm->SystemAlive (%system)) {
+      unless ($clearadm->SystemAlive(%system)) {
         $lastheardfromClass = 'dataCenteredAlert';
         $lastheardfromData  = a {
           href  => "alertlog.cgi?system=$system{name}",
@@ -189,16 +189,21 @@ sub DisplaySystems () {
       display td {class => $classRightTop}, "$load{loadavg} ",
         font {class => 'dim' }, "<br>$load{timestamp}";
       display td {class => $classRightTop}, $system{loadavgThreshold};
+
+      my $image = $system{loadavgsmall}
+        ? "data:image/png;base64,$system{loadavgsmall}"
+       : "plotloadavg.cgi?system=$system{name}&tiny=1";
+
       display td {class => $class}, 
         a {
           href => 
             "plot.cgi?type=loadavg&system=$system{name}&scaling=Hour&points=24"
         }, img {
-          src    => "plotloadavg.cgi?system=$system{name}&tiny=1",
+          src    => $image,
           border => 0,
         };
     display end_Tr;
-  } # foreach
+  } # for
 
   display end_table;
   
@@ -213,7 +218,7 @@ sub DisplaySystems () {
 } # DisplaySystems
 
 # Main
-GetOptions (
+GetOptions(
   usage   => sub { Usage },
   verbose => sub { set_verbose },
   debug   => sub { set_debug },
index 3447284..f76dfdd 100755 (executable)
@@ -15,27 +15,27 @@ use Utils;
 my $clearadm = new Clearadm;
 
 my %system = (
-  name                 => 'jupiter',
-  alias                        => 'defaria.com',
-  admin                        => 'Andrew DeFaria',
-  os                   => 'Linux defaria.com 2.6.32-25-generic-pae #45-Ubuntu SMP Sat Oct 16 21:01:33 UTC 2010 i686 GNU/Linux',
-  type                 => 'Linux',
+  name         => 'jupiter',
+  alias                => 'defaria.com',
+  admin                => 'Andrew DeFaria',
+  os           => 'Linux defaria.com 2.6.32-25-generic-pae #45-Ubuntu SMP Sat Oct 16 21:01:33 UTC 2010 i686 GNU/Linux',
+  type         => 'Linux',
   description  => 'Home server',
 );
 
 my %package = (
-  'system'             => 'jupiter',
-  'name'               => 'MySQL',
-  'version'            => '5.1',
+  'system'     => 'jupiter',
+  'name'       => 'MySQL',
+  'version'    => '5.1',
 );
 
 my %update;
 
 my %filesystem = (
-  'system'             => 'jupiter',
+  'system'     => 'jupiter',
   'filesystem' => '/dev/mapper/jupiter-root',
-  'fstype'             => 'ext3',
-  'mount'              => '/',
+  'fstype'     => 'ext3',
+  'mount'      => '/',
   'threshold'  => 90,
 );
 
@@ -57,26 +57,25 @@ GetOptions (
 sub DisplayRecord (%) {
   my (%record) = @_;
   
-  foreach (keys %record) {
-       if ($record{$_}) {
-         display "$_: $record{$_}";
-       } else {
-         display "$_: <undef>";
-       } # if
-  } # foreach
+  for (keys %record) {
+    if ($record{$_}) {
+      display "$_: $record{$_}";
+    } else {
+      display "$_: <undef>";
+    } # if
+  } # for
 } # DisplayRecord
 
-sub DisplayRecords (@) {
+sub DisplayRecords(@) {
   my (@records) = @_;
   
-  DisplayRecord %{$_}
-    foreach (@records);
+  DisplayRecord %{$_} for (@records);
 } # DisplayRecords
 
-sub TestSystem () {
+sub TestSystem() {
   verbose "Adding system $system{name}";
 
-  my ($err, $msg) = $clearadm->AddSystem (%system);
+  my ($err, $msg) = $clearadm->AddSystem(%system);
 
   if ($err == 1062) {
     warning 'You already have that record!';
@@ -85,16 +84,16 @@ sub TestSystem () {
   } # if
 
   verbose "Finding systems that match \'jup\'";
-  DisplayRecords $clearadm->FindSystem ('jup');
+  DisplayRecords $clearadm->FindSystem('jup');
 
   verbose "Getting record for \'jupiter\'";
-  DisplayRecord  $clearadm->GetSystem ('jupiter');
+  DisplayRecord  $clearadm->GetSystem('jupiter');
 
   verbose "Finding systems that match \'def\'";
-  DisplayRecords $clearadm->FindSystem ('def');
+  DisplayRecords $clearadm->FindSystem('def');
   
   verbose "Getting record for \'defaria.com\'";
-  DisplayRecord $clearadm->GetSystem ('defaria.com');
+  DisplayRecord $clearadm->GetSystem('defaria.com');
   
   %update = (
     'region' => 'East Coast',
@@ -102,16 +101,15 @@ sub TestSystem () {
 
   verbose "Updating system $system{name}";
 
-  ($err, $msg) = $clearadm->UpdateSystem ($system{name}, %update);
+  ($err, $msg) = $clearadm->UpdateSystem($system{name}, %update);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 } # TestaSystem
 
-sub TestPackage () {
+sub TestPackage() {
   verbose "Adding package $package{name}";
   
-  my ($err, $msg) = $clearadm->AddPackage (%package);
+  my ($err, $msg) = $clearadm->AddPackage(%package);
 
   if ($err == 1062) {
     warning 'You already have that record!';
@@ -120,108 +118,100 @@ sub TestPackage () {
   } # if
 
   %update = (
-    'vendor'           => 'ClearSCM',
-    'description'      => 'This is not ClearSCM\'s version of MySQL', 
+    'vendor'     => 'ClearSCM',
+    'description' => 'This is not ClearSCM\'s version of MySQL', 
   );
 
   verbose "Updating package $package{name}";
   
-  ($err, $msg) = $clearadm->UpdatePackage ($package{system}, $package{name}, %update);
+  ($err, $msg) = $clearadm->UpdatePackage($package{system}, $package{name}, %update);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   verbose "Finding packages for $system{name} that match \'My\'";
-  DisplayRecords $clearadm->FindPackage ($system{name}, 'My');
+  DisplayRecords $clearadm->FindPackage($system{name}, 'My');
 
   verbose ("Getting package for $system{name} record for \'MySQL\'");
-  DisplayRecord  $clearadm->GetPackage  ($system{name}, 'MySQL');
+  DisplayRecord  $clearadm->GetPackage($system{name}, 'MySQL');
 } # TestPackage
 
-sub TestFilesystem () {
+sub TestFilesystem() {
   verbose "Adding filesystem $filesystem{filesystem}";
   
-  my ($err, $msg) = $clearadm->AddFilesystem (%filesystem);
+  my ($err, $msg) = $clearadm->AddFilesystem(%filesystem);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
   
-  $filesystem{filesystem}      = '/dev/sda5';
-  $filesystem{path}                    = '/disk2';
+  $filesystem{filesystem} = '/dev/sda5';
+  $filesystem{path}      = '/disk2';
 
   verbose "Adding filesystem $filesystem{filesystem}";
   
-  ($err, $msg) = $clearadm->AddFilesystem (%filesystem);
+  ($err, $msg) = $clearadm->AddFilesystem(%filesystem);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   %update = (
-    'filesystem'       => '/dev/sdb5',
+    'filesystem' => '/dev/sdb5',
   );
 
   verbose "Updating filesystem $filesystem{filesystem}";
   
-  ($err, $msg) = $clearadm->UpdateFilesystem (
+  ($err, $msg) = $clearadm->UpdateFilesystem(
     $filesystem{system}, $filesystem{filesystem}, %update
   );
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   verbose "Finding filesystems for $system{name} that match \'My\'";
-  DisplayRecords $clearadm->FindFilesystem ($system{name}, 'root');
+  DisplayRecords $clearadm->FindFilesystem($system{name}, 'root');
 
   verbose ("Getting filesystem for $system{name} record for \'/dev/sdb5\'");
-  DisplayRecord  $clearadm->GetFilesystem ($system{name}, '/dev/sdb5');
+  DisplayRecord  $clearadm->GetFilesystem($system{name}, '/dev/sdb5');
 } # TestFilesystem
 
-sub TestVob () {
+sub TestVob() {
   verbose "Adding vob $vob{tag}";
 
-  my ($err, $msg) = $clearadm->AddVob (%vob);
+  my ($err, $msg) = $clearadm->AddVob(%vob);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
   
   $vob{tag} = '/vobs/clearscm_old';
 
   verbose "Adding vob $vob{tag}";
 
-  ($err, $msg) = $clearadm->AddVob (%vob);
+  ($err, $msg) = $clearadm->AddVob(%vob);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   verbose "Finding vobs that match \'clearscm\'";
-  DisplayRecords $clearadm->FindVob ('clearscm');
+  DisplayRecords $clearadm->FindVob('clearscm');
 
   verbose ("Getting vob for \'clearscm\'");
-  DisplayRecord  $clearadm->GetVob ('clearscm');
+  DisplayRecord  $clearadm->GetVob('clearscm');
 } # TestVob
 
-sub TestView () {
+sub TestView() {
   verbose "Adding view $view{tag}";
 
-  my ($err, $msg) = $clearadm->AddView (%view);
+  my ($err, $msg) = $clearadm->AddView(%view);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   $view{tag} = 'andrew2_view';
 
   verbose "Adding view $view{tag}";
 
-  ($err, $msg) = $clearadm->AddView (%view);
+  ($err, $msg) = $clearadm->AddView(%view);
 
-  error $msg, $err
-    if $err;
+  error $msg, $err if $err;
 
   verbose "Finding views that match \'andrew\'";
-  DisplayRecords $clearadm->FindView ('andrew');
+  DisplayRecords $clearadm->FindView('andrew');
 
   verbose ("Getting view for \'view\'");
-  DisplayRecord  $clearadm->GetView ('andrew');
+  DisplayRecord  $clearadm->GetView('andrew');
 } # TestView
 
 TestSystem;
@@ -233,8 +223,6 @@ TestView;
 ########################
 verbose "Deleting system $system{name}";
   
-my ($err, $msg) = $clearadm->DeleteSystem ($system{name});
+my ($err, $msg) = $clearadm->DeleteSystem($system{name});
 
-error $msg, $err
-  if $err;
-   
+error $msg, $err if $err;
index ff4dd25..60b994e 100755 (executable)
@@ -66,12 +66,15 @@ use Clearcase::Vob;
 use DateUtils;
 use Display;
 use Utils;
+use TimeUtils;
 
 my $VERSION  = '$Revision: 1.29 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
 my $clearadm = Clearadm->new;
 
+my %total;
+
 # Given a view tag, snapshot the storage sizes
 sub snapshotViewStorage($$) {
   my ($tag, $region) = @_;
@@ -91,6 +94,12 @@ sub snapshotViewStorage($$) {
   my ($err, $msg) = $clearadm->AddViewStorage(%viewstorage);
 
   error $msg, $err if $err;
+
+  $total{'Views snapshotted'}++;
+
+  updateView($tag, $region);
+
+  return;
 } # snapshotVobStorage
 
 # Given a vob tag, snapshot the storage sizes
@@ -114,12 +123,134 @@ sub snapshotVobStorage($$) {
   my ($err, $msg) = $clearadm->AddVobStorage(%vobstorage);
 
   error $msg, $err, if $err;
+
+  $total{'VOBs snapshotted'}++;
+
+  updateVob($tag, $region);
+
+  return;
 } # snapshotVobStorage
 
+sub updateVob($$) {
+  my ($tag, $region) = @_;
+
+  my ($err, $msg, $error, @output, $graph);
+
+  my %vob = $clearadm->GetVob($tag, $region);
+
+  for my $graphType (qw(admin cleartext db derivedobj source total)) {
+  #for my $graphType (qw(derivedobj)) {
+    # Windows vob tags begin with "\", which is problematic. The solution is to
+    # escape the "\"
+    my $vobtag = $tag;
+    $vobtag =~ s/^\\/\\\\/;
+
+    my $cmd = "plotstorage.cgi generate=1 type=vob storage=$graphType region=$region scaling=Day points=7 tag=$vobtag";
+
+    $graph = "${graphType}small";
+
+    verbose "Generating $graph for VOB $tag (Region: $region)";
+
+    ($error, @output) = Execute("$cmd tiny=1 2>&1");
+
+    error "Unable to generate $graph" . join("\n", @output), $error if $error;
+
+    $vob{$graph} = join '', @output;
+    $total{'VOB Graphs generated'}++;
+
+    $graph = "${graphType}large";
+
+    verbose "Generating $graph for VOB $tag (Region: $region)";
+
+    ($error, @output) = Execute("$cmd 2>&1");
+
+    error "Unable to generate $graph" . join("\n", @output), $error if $error;
+
+    $vob{$graph} = join '', @output;
+    $total{'VOB Graphs generated'}++;
+  } # for
+
+  if ($vob{tag}) {
+    ($err, $msg) = $clearadm->UpdateVob(%vob);
+
+    error "Unable to update VOB $tag (Region: $region) - $msg", $err if $err;
+
+    $total{'VOBs updated'}++;
+  } else {
+    $vob{tag}    = $tag;
+    $vob{region} = $region;
+
+    ($err, $msg) = $clearadm->AddVob(%vob);
+
+    error "Unable to add VOB $tag (Region: $region) - $msg", $err if $err;
+
+    $total{'VOBs added'}++;
+  } # if
+
+  return;
+} # updateVob
+
+sub updateView($$) {
+  my ($tag, $region) = @_;
+
+  my ($err, $msg, $error, @output, $graph);
+
+  my %view = $clearadm->GetView($tag, $region);
+
+  for my $graphType (qw(private db admin total)) {
+    my $cmd = "plotstorage.cgi generate=1 type=view storage=$graphType region=$region scaling=Day points=7 tag=$tag";
+
+    $graph = "${graphType}small";
+
+    verbose "Generating $graph for View $tag (Region: $region)";
+
+    ($error, @output) = Execute("$cmd tiny=1 2>&1");
+
+    error "Unable to generate $graph" . join("\n", @output), $error if $error;
+
+    $total{'View Graphs generated'}++;
+
+    $view{$graph} = join '', @output;
+
+    $graph = "${graphType}large";
+
+    verbose "Generating $graph for View $tag (Region: $region)";
+
+    ($error, @output) = Execute("$cmd 2>&1");
+
+    error "Unable to generate $graph" . join("\n", @output), $error if $error;
+
+    $total{'View Graphs generated'}++;
+
+    $view{$graph} = join '', @output;
+  } # for
+
+  if ($view{tag}) {
+    ($err, $msg) = $clearadm->UpdateView(%view);
+
+    error "Unable to update View $tag (Region: $region) - $msg", $err if $err;
+
+    $total{'Views updated'}++;
+  } else {
+    $view{tag}    = $tag;
+    $view{region} = $region;
+
+    ($err, $msg) = $clearadm->AddView(%view);
+
+    error "Unable to add VOB $tag (Region: $region) - $msg", $err if $err;
+
+    $total{'Views added'}++;
+  } # if
+
+  return;
+} # updateView
+
 my %opts;
 
 # Main
-GetOptions (
+my $startTime = time;
+
+GetOptions(
   \%opts,
   'usage'   => sub { Usage },
   'verbose' => sub { set_verbose },
@@ -198,7 +329,7 @@ if ($opts{vob} and $opts{vob} =~ /all/i) {
 } elsif ($opts{vob}) {
   if ($opts{region} =~ /all/i) {
     for my $region ($Clearcase::CC->regions) {
-      verbose "Snapshotting view $opts{vob} in region $region";
+      verbose "Snapshotting vob $opts{vob} in region $region";
 
       snapshotVobStorage $opts{vob}, $region;
     } # for
@@ -209,6 +340,11 @@ if ($opts{vob} and $opts{vob} =~ /all/i) {
   } # if
 } # if
 
+if (get_verbose) {
+  Stats \%total;
+  display_duration $startTime;
+} # if
+
 =pod
 
 =head1 CONFIGURATION AND ENVIRONMENT
index 86df94c..6308e35 100755 (executable)
@@ -54,6 +54,7 @@ use warnings;
 use Net::Domain qw(hostname);
 use FindBin;
 use Getopt::Long;
+use Convert::Base64;
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
@@ -72,17 +73,17 @@ my $clearexec = Clearexec->new;
 my ($host, $fs);
 
 # Given a host and a filesystem, formulate a fs record
-sub snapshotFS ($$) {
+sub snapshotFS($$) {
   my ($systemRef, $filesystem) = @_;
 
   my %system = %{$systemRef};
 
-  my %filesystem = $clearadm->GetFilesystem ($system{name}, $filesystem);
+  my %filesystem = $clearadm->GetFilesystem($system{name}, $filesystem);
   
   unless (%filesystem) {
-       error "Filesystem $host:$filesystem not in clearadm database - try adding it";
-       
-       return;
+    error "Filesystem $host:$filesystem not in clearadm database - try adding it";
+
+    return;
   } # unless
   
   my %fs = (
@@ -100,8 +101,8 @@ sub snapshotFS ($$) {
 
     if ($status != 0) {
       error ('Unable to determine fsinfo for '
-           . "$system{name}:$filesystem{mount} ($cmd)\n" .
-             join "\n", @unixfs);
+           . "$system{name}:$filesystem{mount} ($cmd)\n"
+           . join "\n", @unixfs);
    
       return;
     } # if
@@ -148,7 +149,7 @@ sub snapshotFS ($$) {
 } # snapshotFS
 
 # Main
-GetOptions (
+GetOptions(
   'usage'   => sub { Usage },
   'verbose' => sub { set_verbose },
   'debug'   => sub { set_debug },
@@ -156,8 +157,7 @@ GetOptions (
   'fs=s'    => \$fs,
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 # Announce ourselves
 verbose "$FindBin::Script V$VERSION";
@@ -165,47 +165,67 @@ verbose "$FindBin::Script V$VERSION";
 my $exit = 0;
 
 for my $system ($clearadm->FindSystem ($host)) {
-  next if $$system{active} eq 'false';
+  next if $system->{active} eq 'false';
   
-  my $status = $clearexec->connectToServer (
-    $$system{name}, 
-    $$system{port}
+  my $status = $clearexec->connectToServer(
+    $system->{name}, 
+    $system->{port}
   );
   
   unless ($status) {
-    verbose "Unable to connect to system $$system{name}:$$system{port}";
+    verbose "Unable to connect to system $system->{name}:$system->{port}";
     next;
   } # unless
 
-  for my $filesystem ($clearadm->FindFilesystem ($$system{name}, $fs)) {
-    verbose "Snapshotting $$system{name}:$$filesystem{filesystem}";
+  for my $filesystem ($clearadm->FindFilesystem ($system->{name}, $fs)) {
+    verbose "Snapshotting $system->{name}:$filesystem->{filesystem}";
   
-    my %fs = snapshotFS ($system, $$filesystem{filesystem});
+    my %fs = snapshotFS($system, $filesystem->{filesystem});
     
     if (%fs) {
-      my ($err, $msg) = $clearadm->AddFS (%fs);
+      my ($err, $msg) = $clearadm->AddFS(%fs);
   
       error $msg, $err if $err;
     } # if
     
+    # Generate graphs
+    my $cmd = "plotfs.cgi generate=1 system=$system->{name} filesystem=$filesystem->{filesystem} scaling=Day points=7";
+
+    verbose "Generating fssmall for $system->{name}:$filesystem->{filesystem}";
+    my ($error, @output) = Execute("$cmd tiny=1 2>&1");
+
+    error 'Unable to generate fssmall' . join("\n", @output), $error if $error;
+
+    $filesystem->{fssmall} = join '', @output;
+
+    verbose "Generating fslarge for $system->{name}:$filesystem->{filesystem}";
+    ($error, @output) = Execute("$cmd 2>&1");
+
+    error 'Unable to generate fslarge' . join("\n", @output), $error if $error;
+
+    $filesystem->{fslarge} = join '', @output;
+
+    my ($err, $msg) = $clearadm->UpdateFilesystem($system->{name}, $filesystem->{filesystem}, %$filesystem);
+
+    error "Unable to update filesystem record $msg", $err if $err;
+
     # Check if over threshold
-    my %notification = $clearadm->GetNotification ('Filesystem');
+    my %notification = $clearadm->GetNotification('Filesystem');
 
-    next
-      unless %notification;
+    next unless %notification;
   
     my $usedPct = '0%';
 
     $usedPct = sprintf ('%.2f', (($fs{used} + $fs{reserve}) / $fs{size}) * 100) if $fs{size} != 0;
     
-    if ($usedPct >= $$filesystem{threshold}) {
+    if ($usedPct >= $filesystem->{threshold}) {
       $exit = 2;
       display YMDHMS
-            . " System: $$filesystem{system} "
-            . "Filesystem: $$filesystem{filesystem} Used: $usedPct% " 
-            . "Threshold: $$filesystem{threshold}";    
+            . " System: $filesystem->{system} "
+            . "Filesystem: $filesystem->{filesystem} Used: $usedPct% " 
+            . "Threshold: $filesystem->{threshold}";    
     } else {
-      $clearadm->ClearNotifications ($$system{name}, $$filesystem{filesystem});    
+      $clearadm->ClearNotifications ($system->{name}, $filesystem->{filesystem});    
     } # if
   } # for
   
index e9b4b38..250e06b 100755 (executable)
@@ -72,19 +72,18 @@ my $clearexec = Clearexec->new;
 my $host;
 
 # Given a host, formulate a loadavg record
-sub snapshotLoad ($) {
+sub snapshotLoad($) {
   my ($systemRef) = @_;
 
   my %system = %{$systemRef};
   
   my ($status, @output);
 
-  $status = $clearexec->connectToServer (
+  $status = $clearexec->connectToServer(
     $system{name}, $system{port}
   );
   
-  error "Unable to connect to system $system{name}:$system{port}", 1
-    unless $status;
+  error "Unable to connect to system $system{name}:$system{port}", 1 unless $status;
   
   verbose "Snapshotting load on $system{name}";
   
@@ -94,10 +93,9 @@ sub snapshotLoad ($) {
 
   my $cmd = 'uptime';
   
-  ($status, @output) = $clearexec->execute ($cmd);
+  ($status, @output) = $clearexec->execute($cmd);
 
-  return
-    if $status;
+  return if $status;
 
   # Parsing uptime is odd. Sometimes we get output like
   #
@@ -129,12 +127,11 @@ sub snapshotLoad ($) {
     my $loadvbs = 'c:/cygwin/opt/clearscm/clearadm/load.vbs';
     $cmd = "cscript /nologo $loadvbs";
        
-    ($status, @output) = $clearexec->execute ($cmd);
+    ($status, @output) = $clearexec->execute($cmd);
        
     chop @output if $output[0] =~ /\r/;
        
-    return
-      if $status;
+    return if $status;
          
     $load{loadavg} = $output[0] / 100;
   } # if
@@ -145,49 +142,70 @@ sub snapshotLoad ($) {
 } # snapshotLoad
 
 # Main
-GetOptions (
+GetOptions(
   'usage'   => sub { Usage },
   'verbose' => sub { set_verbose },
   'debug'   => sub { set_debug },
   'host=s'  => \$host,
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 # Announce ourselves
 verbose "$FindBin::Script V$VERSION";
 
 my $exit = 0;
 
-foreach my $system ($clearadm->FindSystem ($host)) {
-  next if $$system{active} eq 'false';
+for my $system ($clearadm->FindSystem($host)) {
+  next if $system->{active} eq 'false';
   
   my %load = snapshotLoad $system;
   
   if (%load) {
-    my ($err, $msg) = $clearadm->AddLoadavg (%load);
+    my ($err, $msg) = $clearadm->AddLoadavg(%load);
   
     error $msg, $err if $err;
   } else {
-    error "Unable to get loadavg for system $$system{name}", 1;
+    error "Unable to get loadavg for system $system->{name}", 1;
   } # if
   
   # Check if over threshold
-  my %notification = $clearadm->GetNotification ('Loadavg');
+  my %notification = $clearadm->GetNotification('Loadavg');
 
-  next
-    unless %notification;
+  next unless %notification;
   
-  if ($load{loadavg} >= $$system{loadavgThreshold}) {
+  if ($load{loadavg} >= $system->{loadavgThreshold}) {
     $exit = 2;
-    error YMDHMS . " System: $$system{name} "
+    error YMDHMS . " System: $system->{name} "
         . "Loadavg $load{loadavg} "
-        . "Threshold $$system{loadavgThreshold}";
+        . "Threshold $system->{loadavgThreshold}";
   } else {
-    $clearadm->ClearNotifications ($$system{name});
+    $clearadm->ClearNotifications ($system->{name});
   } # if
-} # foreach
+
+  # Add graphs to system record
+  my ($loadavgsmall, $loadavg);
+
+  my $cmd = "plotloadavg.cgi generate=1 system=$system->{name} scaling=Hour points=24";
+
+  verbose "Generating loadavgsmall for $system->{name}";
+  my ($error, @output) = Execute("$cmd tiny=1 2>&1");
+
+  error 'Unable to generate loadavgsmall' . join("\n", @output), $error if $error;
+
+  $system->{loadavgsmall} = join '', @output;
+
+  verbose "Generating loadavg for $system->{name}";
+  ($error, @output) = Execute("$cmd 2>&1");
+  
+  error 'Unable to generate loadavg' . join("\n", @output), $error if $error;
+
+  $system->{loadavg} = join '', @output;
+
+  my ($err, $msg) = $clearadm->UpdateSystem($system->{name}, %$system);
+
+  error "Unable to udpate system record $msg", $err if $err;
+} # for
 
 exit $exit;
 
index f5fbb06..1073a85 100755 (executable)
@@ -85,10 +85,9 @@ sub GetFilesystems(%) {
          ? '/usr/xpg4/bin/df -l -P'
          : 'df -l -TP';
    
-  my ($status, @output) = $clearexec->execute ($cmd);
+  my ($status, @output) = $clearexec->execute($cmd);
   
-  error "Unable to execute $cmd - $! (Status: $status)\n" . join ("\n". @output), $status
-    if $status;
+  error "Unable to execute $cmd - $! (Status: $status)\n" . join ("\n". @output), $status if $status;
   
   # Real file systems start with "/"
   my @fs = grep { /^\// } @output;
@@ -114,19 +113,18 @@ sub GetFilesystems(%) {
   return @filesystems;
 } # GetFilesystems
 
-sub GatherSysInfo (;%) {
+sub GatherSysInfo(;%) {
   my (%system) = @_;
 
   # Set name if not currently set  
-  $system{name} = $host
-    unless $system{name};
+  $system{name} = $host unless $system{name};
     
   my ($status, @output);
   
   $system{port} ||= $port;
 
   # Connect to clearexec server
-  $status = $clearexec->connectToServer ($system{name}, $system{port});
+  $status = $clearexec->connectToServer($system{name}, $system{port});
 
   unless ($status) {
     warning "Unable to connect to $system{name}:$port";
@@ -136,10 +134,9 @@ sub GatherSysInfo (;%) {
   # Get OS info
   my $cmd = 'uname -a';
 
-  ($status, @output) = $clearexec->execute ($cmd);
+  ($status, @output) = $clearexec->execute($cmd);
   
-  error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
-    if $status;
+  error "Unable to execute '$cmd' - $!", $status . join("\n". @output) if $status;
   
   $system{os} = $output[0];
   
@@ -147,10 +144,9 @@ sub GatherSysInfo (;%) {
   
   $cmd = 'uname -s';
   
-  ($status, @output) = $clearexec->execute ($cmd);
+  ($status, @output) = $clearexec->execute($cmd);
 
-  error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
-    if $status;
+  error "Unable to execute '$cmd' - $!", $status . join("\n". @output) if $status;
   
   # TODO: Need to handle this better
   if ($output[0] =~ /sunos/i) {
@@ -164,7 +160,7 @@ sub GatherSysInfo (;%) {
   return %system;  
 } # GatherSysInfo
 
-sub AddFilesystems (%) {
+sub AddFilesystems(%) {
   my (%system) = @_;
 
   my ($err, $msg);
@@ -172,7 +168,7 @@ sub AddFilesystems (%) {
   for (GetFilesystems %system) {
     my %filesystem = %{$_};
     
-    my %oldfilesystem = $clearadm->GetFilesystem (
+    my %oldfilesystem = $clearadm->GetFilesystem(
       $filesystem{system},
       $filesystem{filesystem}
     );
@@ -180,31 +176,29 @@ sub AddFilesystems (%) {
     if (%oldfilesystem) {
       verbose "Updating filesystem $filesystem{system}:$filesystem{filesystem}";
       
-      ($err, $msg) = $clearadm->UpdateFilesystem (
+      ($err, $msg) = $clearadm->UpdateFilesystem(
         $filesystem{system},
         $filesystem{filesystem},
         %filesystem,
       );
       
       error 'Unable to update filesystem '
-          . "$filesystem{system}:$filesystem{filesystem}"
-        if $err;
+          . "$filesystem{system}:$filesystem{filesystem}" if $err;
     } else {
       verbose 'Adding filesystem '
             . "$filesystem{system}:$filesystem{filesystem}";
     
-      ($err, $msg) = $clearadm->AddFilesystem (%filesystem);
+      ($err, $msg) = $clearadm->AddFilesystem(%filesystem);
 
       error 'Unable to add filesystem '
-          . "$filesystem{system}:$filesystem{filesystem}"
-        if $err;
-    } # if      
+          . "$filesystem{system}:$filesystem{filesystem}" if $err;
+    } # if
   } # for
   
   return ($err, $msg);  
 } # AddFilesystems
 
-sub AddSystem ($) {
+sub AddSystem($) {
   my ($system) = @_;
   
   verbose "Adding newhost $system";
@@ -214,10 +208,9 @@ sub AddSystem ($) {
   # If GatherSysInfo was able to connect to clearagent it will set this field
   my $clearagent = delete $system{clearagent};
   
-  my ($err, $msg) = $clearadm->AddSystem (%system);
+  my ($err, $msg) = $clearadm->AddSystem(%system);
   
-  return ($err, $msg)
-    if $err;
+  return ($err, $msg) if $err;
     
   if ($clearagent) {
     return AddFilesystems %system;
@@ -226,12 +219,12 @@ sub AddSystem ($) {
   } # if
 } # AddSystem
 
-sub UpdateSystem (%) {
+sub UpdateSystem(%) {
   my (%system) = @_;
   
   my ($err, $msg);
   
-  %system = GatherSysInfo (%system);
+  %system = GatherSysInfo(%system);
   
   # If GatherSysInfo was able to connect to clearagent it will set this field
   my $clearagent = delete $system{clearagent};
@@ -240,7 +233,7 @@ sub UpdateSystem (%) {
   
   verbose "Updating existing host $system{name}";
   
-  ($err, $msg) = $clearadm->UpdateSystem ($system{name}, %system);
+  ($err, $msg) = $clearadm->UpdateSystem($system{name}, %system);
     
   return ($err, $msg) if $err;
 
@@ -255,7 +248,7 @@ sub UpdateSystem (%) {
 $host = hostname;
 $port = $Clearexec::CLEAROPTS{CLEAREXEC_PORT};
 
-GetOptions (
+GetOptions(
   'usage'   => sub { Usage },
   'verbose' => sub { set_verbose },
   'debug'   => sub { set_debug },
@@ -264,12 +257,10 @@ GetOptions (
   'port=s'  => \$port,
 ) or Usage "Invalid parameter";
 
-Usage 'Extraneous options: ' . join ' ', @ARGV
-  if @ARGV;
+Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
 
 if ($delete) {
-  error "Must specify -host if you specify -delete", 1
-    unless $host;
+  error "Must specify -host if you specify -delete", 1 unless $host;
 } # if
 
 # Announce ourselves
@@ -283,7 +274,7 @@ if ($delete) {
   my $answer = <STDIN>;
   
   if ($answer =~ /(y|yes)/i) {
-    ($err, $msg) = $clearadm->DeleteSystem ($host);
+    ($err, $msg) = $clearadm->DeleteSystem($host);
   
     if ($err == 0) {
        error "No host named $host in database";
@@ -300,18 +291,17 @@ if ($delete) {
     for ($clearadm->FindSystem) {
       my %system = %$_;
       
-      ($err, $msg) = UpdateSystem (%system);
+      ($err, $msg) = UpdateSystem(%system);
   
-      error "Unable to update host $system{name}\n$msg", $err
-        if $err;
+      error "Unable to update host $system{name}\n$msg", $err if $err;
     } # for
   } else {
-    my %system = $clearadm->GetSystem ($host);
+    my %system = $clearadm->GetSystem($host);
     
     if (%system) {
-      ($err, $msg) = UpdateSystem (%system);
+      ($err, $msg) = UpdateSystem(%system);
     } else {
-      ($err, $msg) = AddSystem ($host);
+      ($err, $msg) = AddSystem($host);
     } # if
 
     if ($err) {
old mode 100755 (executable)
new mode 100644 (file)
index 9ac1b1e..150237a
@@ -120,7 +120,7 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
 use File::stat;
 use Time::localtime;
@@ -162,7 +162,7 @@ my $script     = 'http://'
 my %total;
 my $nbrThreshold;       # Number of views threshold - think top 10
 
-sub GenerateRegion ($) {
+sub GenerateRegion($) {
   my ($region) = @_;
 
   verbose "Processing region $region";
@@ -185,7 +185,7 @@ sub GenerateRegion ($) {
       verbose_nolf '.';
     }# if
 
-    my $view = Clearcase::View->new ($name, $region);
+    my $view = Clearcase::View->new($name, $region);
     
     my $gpath;
 
@@ -207,13 +207,13 @@ sub GenerateRegion ($) {
     # Note if the view server is unreachable (e.g. user puts view on laptop and
     # the laptop is powered off), then these fields will be undef. Change them
     # to Unknown. (Should Clearcase::View.pm do this instead?).
-    my $type   = $view->type;
-       $type ||= 'Unknown';
+    my $type      = $view->type;
+       $type    ||= 'dynamic';
+    my $ownerid   = $view->owner;
+       $ownerid ||= 'Unknown';
 
     my $user;
 
-    my $ownerid = $view->owner;
-
     if ($ownerid =~ /^\w+(\\|\/)(\w+)/) {
       # TODO: Handle user identification better
       #$user = User->new ($ownerid);
@@ -239,8 +239,6 @@ sub GenerateRegion ($) {
       # Compute age
       $age       = Age ($modified_date);
       $ageSuffix = $age != 1 ? 'days' : 'day';
-    #} else {
-    #  $modified_date = 'Unknown';
     } # if
 
     my %oldView = $clearadm->GetView($view->tag, $view->region);
@@ -248,7 +246,6 @@ sub GenerateRegion ($) {
     my ($err, $msg);
 
     my %viewRec = (
-      system    => $view->shost,
       region    => $view->region,
       tag       => $view->tag,
       owner     => $ownerid,
@@ -264,11 +261,11 @@ sub GenerateRegion ($) {
     $viewRec{modified} = $modified_date if $modified_date;
 
     if (%oldView) {
-      ($err, $msg) = $clearadm->UpdateView($view->tag, $view->region, %viewRec);
+      ($err, $msg) = $clearadm->UpdateView(%viewRec);
 
       error "Unable to update view $name in Clearadm\n$msg", $err if $err;
     } else {
-      ($err, $msg) = $clearadm->AddView (%viewRec);
+      ($err, $msg) = $clearadm->AddView(%viewRec);
 
       error "Unable to add view $name to Clearadm\n$msg", $err if $err;
     } # if
@@ -282,12 +279,10 @@ sub GenerateRegion ($) {
 sub Generate ($) {
   my ($region) = @_;
 
-  if ($region =~ /all/i) {
-    for ($Clearcase::CC->regions) {
-      GenerateRegion $_;
-    } # for
-  } else {
+  if ($region) {
     GenerateRegion $region;
+  } else {
+    GenerateRegion $_ for $Clearcase::CC->regions;
   } # if
   
   return;
@@ -347,7 +342,7 @@ $view{tag},$view{owner},$view{type},$view{modified},$view{age},$view{ageSuffix}
   return;
 } # Report
 
-sub FormatTable ($@) {
+sub FormatTable($@) {
   my ($style, @views) = @_;
   
   my $table;
@@ -366,12 +361,12 @@ sub FormatTable ($@) {
 
   my $caption;
 
-  my $regionDropdown = start_form (
+  my $regionDropdown = start_form(
     -action => $script,
   );
 
   $regionDropdown .= font {-class => 'captionLabel'}, 'Region: ';
-  $regionDropdown .= popup_menu (
+  $regionDropdown .= popup_menu(
     -name     => 'region',
     -values   => [$Clearcase::CC->regions],
     -default  => $Clearcase::CC->region,
@@ -528,12 +523,12 @@ sub FormatTable ($@) {
 
 # TODO: Add an option to remove views older than a certain date
 
-sub EmailUser ($@) {
+sub EmailUser($@) {
   my ($emailTo, @oldViews) = @_;
 
   @oldViews = sort { $$b{age} <=> $$a{age} } @oldViews;
 
-  my $msg  = '<style>' . join ("\n", ReadFile 'viewager.css') . '</style>';
+  my $msg  = '<style>' . join("\n", ReadFile 'viewager.css') . '</style>';
      $msg .= <<"END";
 <h1 align="center">You have old Clearcase Views</h1>
 
@@ -584,7 +579,7 @@ which will stop it from being reported as old.</p>
 Your friendly Clearcase Administrator
 END
  
-  mail (
+  mail(
     to          => $emailTo,
 #    to          => 'Andrew@DeFaria.com',
     mode        => 'html',
@@ -595,7 +590,7 @@ END
   return
 } # EmailUser
 
-sub EmailUsers (@) {
+sub EmailUsers(@) {
   my (@views) = @_;
   
   @views = sort { $$a{ownerName} cmp $$b{ownerName} } @views;
@@ -606,16 +601,14 @@ sub EmailUsers (@) {
   for (@views) {
     my %view = %{$_};
 
-    next
-      unless $view{email};
+    next unless $view{email};
 
     if ($currUser ne $view{ownerName}) {
-      EmailUser $view{email}, @userViews
-        if @userViews;
+      EmailUser $view{email}, @userViews if @userViews;
 
       $currUser = $view{ownerName};
 
-      @userViews =();
+      @userViews = ();
     } else {
       if ($view{age} > $opts{ageThreshold}) {
         push @userViews, \%view
@@ -630,7 +623,7 @@ sub EmailUsers (@) {
 } # EmailUsers
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -656,8 +649,6 @@ verbose "$FindBin::Script v$VERSION";
 $clearadm = Clearadm->new;
 
 if ($opts{action} and $opts{action} eq 'generate') {
-  $opts{region} ||= 'all';
-
   Generate $opts{region};
   Stats \%total if $opts{verbose};
 } else {
@@ -670,10 +661,9 @@ if ($opts{action} and $opts{action} eq 'generate') {
   
   $opts{region} ||= $Clearcase::CC->region;
 
-  my @views = $clearadm->FindView (
-    'all',
-    $opts{region},
+  my @views = $clearadm->FindView(
     $opts{tag},
+    $opts{region},
     $opts{user}
   );
   
index 72b486b..4daff35 100755 (executable)
@@ -52,11 +52,12 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
+use Clearadm;
 use ClearadmWeb;
 use Clearcase;
 use Clearcase::View;
@@ -68,13 +69,9 @@ my %opts = Vars;
 
 my $subtitle = 'View Details';
 
-if ($Clearcase::CC->region) {
-  $opts{region} ||= $Clearcase::CC->region;
-} else {
-  $opts{region} ||= 'Clearcase not installed';
-} # if
+$opts{region} ||= $Clearcase::CC->region;
 
-my $VERSION  = '$Revision: 1.11 $';
+my $VERSION  = '$Revision: 1.12 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
 sub DisplayTable ($) {
@@ -94,6 +91,10 @@ sub DisplayTable ($) {
     -class          => 'main',
   };
 
+  my $clearadm = Clearadm->new;
+
+  my %clearadmview = $clearadm->GetView($view->tag, $view->region);
+
   display start_Tr;
     display th {class => 'label'},              'Tag:';
     display td {class => 'data', colspan => 3}, setField $view->tag;
@@ -154,36 +155,54 @@ sub DisplayTable ($) {
     display th {class => 'labelCentered', colspan => 10}, 'View Storage Pools';
   display end_Tr;
 
+  my $image = $clearadmview{dbsmall}
+    ? "data:image/png;base64,$clearadmview{dbsmall}"
+    : "plotstorage.cgi?type=view&storage=db&tiny=1&tag=" . $view->tag;
+
   display start_Tr;
     display th {class => 'label'},                                'Database:';
     display td {class => 'data', colspan => 3, align => 'center'}, a {href =>
-       "plot.cgi?type=view&storage=private&tag=" . $view->tag
+       "plot.cgi?type=view&storage=db&scaling=Day&points=7&region=" . $view->region . '&tag=' . $view->tag
     }, img {
-      src    => "plotstorage.cgi?type=view&storage=private&tiny=1&tag=" . $view->tag,
+      src    => $image,
       border => 0,
     };
+
+    $image = $clearadmview{privatesmall}
+      ? "data:image/png;base64,$clearadmview{privatesmall}"
+      : "plotstorage.cgi?type=view&storage=private&tiny=1&tag=" . $view->tag;
+
     display th {class => 'label'},                                'Private:';
     display td {class => 'data', colspan => 5, align => 'center'}, a {href =>
-       "plot.cgi?type=view&storage=db&tag=" . $view->tag
+       "plot.cgi?type=view&storage=private&scaling=Day&points=7&region=" . $view->region . '&tag=' . $view->tag
     }, img {
-      src    => "plotstorage.cgi?type=view&storage=db&tiny=1&tag=" . $view->tag,
+      src    => $image,
       border => 0,
     };
   display end_Tr;
 
+  $image = $clearadmview{adminsmall}
+    ? "data:image/png;base64,$clearadmview{adminsmall}"
+    : "plotstorage.cgi?type=view&storage=admin&tiny=1&tag=" . $view->tag;
+
   display start_Tr;
     display th {class => 'label'},                                'Admin:';
     display td {class => 'data', colspan => 3, align => 'center'}, a {href =>
-       "plot.cgi?type=view&storage=admin&tag=" . $view->tag
+       "plot.cgi?type=view&storage=admin&scaling=Day&points=7&region=" . $view->region . '&tag=' . $view->tag
     }, img {
-      src    => "plotstorage.cgi?type=view&storage=admin&tiny=1&tag=" . $view->tag,
+      src    => $image,
       border => 0,
     };
+
+    $image = $clearadmview{totalsmall}
+      ? "data:image/png;base64,$clearadmview{totalsmall}"
+      : "plotstorage.cgi?type=view&storage=total&tiny=1&tag=" . $view->tag;
+
     display th {class => 'label'},                                'Total Space:';
     display td {class => 'data', colspan => 5, align => 'center'}, a {href =>
-       "plot.cgi?type=view&storage=total&tag=" . $view->tag
+       "plot.cgi?type=view&storage=total&scaling=Day&points=7&region=" . $view->region . '&tag=' . $view->tag
     }, img {
-      src    => "plotstorage.cgi?type=view&storage=total&tiny=1&tag=" . $view->tag,
+      src    => $image,
       border => 0,
     };
   display end_Tr;
@@ -193,17 +212,15 @@ sub DisplayTable ($) {
   return
 } # DisplayTable
 
-sub DisplayRegion {
+sub DisplayRegion() {
   display start_form (action => 'viewdetails.cgi');
 
   display 'Region ';
 
-  my ($defaultRegion, @regions) = ('', ('Clearcase not installed'));
-
   display popup_menu (
     -name     => 'region',
-    -values   => [@regions],
-    -default  => $defaultRegion,
+    -values   => [$Clearcase::CC->regions],
+    -default  => $Clearcase::CC->region,
     -onchange => 'submit();',
   );
 
@@ -216,7 +233,7 @@ sub DisplayRegion {
   return
 } # DisplayRegion
 
-sub DisplayViews ($) {
+sub DisplayViews($) {
   my ($region) = @_;
 
   my $views = Clearcase::Views->new ($region);
@@ -226,7 +243,7 @@ sub DisplayViews ($) {
     push @views, 'No Views';
   } # unless
 
-  display start_form (action => 'viewdetails.cgi');
+  display start_form(action => 'viewdetails.cgi');
 
   display 'Region ';
 
@@ -245,7 +262,7 @@ sub DisplayViews ($) {
      -onchange => 'submit();',
   );
 
-  display submit (
+  display submit(
     -value     => 'Go',
   );
 
@@ -255,7 +272,7 @@ sub DisplayViews ($) {
 } # DisplayViews
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -283,9 +300,7 @@ unless ($opts{tag}) {
   exit;
 } # unless
 
-my $view = Clearcase::View->new ($opts{tag}, $opts{region});
-
-DisplayTable $view;
+DisplayTable(Clearcase::View->new($opts{tag}, $opts{region}));
 
 footing;
 
@@ -315,6 +330,7 @@ L<Getopt::Long|Getopt::Long>
 
 =begin man 
 
+ Clearadm
  ClearadmWeb
  Clearcase
  Clearcase::View
@@ -327,6 +343,7 @@ L<Getopt::Long|Getopt::Long>
 =begin html
 
 <blockquote>
+<a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=lib/Clearcase.pm">Clearcase</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=lib/Clearcase/View.pm">Clearcase::View</a><br>
index f214c04..90639b0 100755 (executable)
@@ -51,7 +51,7 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
@@ -71,7 +71,7 @@ my $subtitle = 'View Servers';
 my $VERSION  = '$Revision: 1.9 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
-sub DisplayTable (@) {
+sub DisplayTable(@) {
   my (@viewServers) = @_;
 
   my $unknown = font {-class => 'unknown'}, 'Unknown';
@@ -98,7 +98,7 @@ sub DisplayTable (@) {
 
   my $i = 0;
 
-  foreach (@viewServers) {
+  for (@viewServers) {
     my $server = Clearcase::Server->new ($_, $opts{region});
 
     # Data fields
@@ -123,7 +123,7 @@ sub DisplayTable (@) {
         -class => 'data',
       }, $osVer;
     display end_Tr;
-  } # foreach
+  } # for
 
   display end_table;
   
@@ -131,7 +131,7 @@ sub DisplayTable (@) {
 } # DisplayTable
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -155,13 +155,13 @@ error "Unable to list all views in the region $opts{region}" . join ("\n", @outp
 
 my %viewServers;
 
-foreach (@output) {
+for (@output) {
   if (/Server host: (.*)/) {
     $viewServers{$1} = undef;
   } # if
-} # foreach
+} # for
 
-DisplayTable sort (keys (%viewServers));
+DisplayTable sort(keys(%viewServers));
 
 footing;
 
index 89a38d6..0fc968e 100755 (executable)
@@ -52,11 +52,12 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
 
+use Clearadm;
 use ClearadmWeb;
 use Clearcase;
 use Clearcase::Vob;
@@ -77,7 +78,7 @@ if ($Clearcase::CC->region) {
 my $VERSION  = '$Revision: 1.11 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
-sub DisplayTable ($) {
+sub DisplayTable($) {
   my ($vob) = @_;
 
   my $active = ($vob->active) ? 'YES' : 'NO';
@@ -91,6 +92,10 @@ sub DisplayTable ($) {
     -class          => 'main',
   };
 
+  my $clearadm = Clearadm->new;
+
+  my %clearadmvob = $clearadm->GetVob($vob->tag, $vob->region);
+
   display start_Tr;
     display th {class => 'label'},              'Tag:';
     display td {class => 'data', colspan => 3}, setField $vob->tag;
@@ -199,53 +204,80 @@ sub DisplayTable ($) {
     display th {class => 'labelCentered', colspan => 10}, 'VOB Storage Pools';
   display end_Tr;
 
+  my $image = $clearadmvob{adminsmall}
+    ? "data:image/png;base64,$clearadmvob{adminsmall}"
+    : "plotstorage.cgi?type=vob&storage=admin&tiny=1&tag=" . $vob->tag;
+
   display start_Tr;
     display th {class => 'label'},                                'Admin:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=admin&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=admin&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=admin&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
+
+    $image = $clearadmvob{sourcesmall}
+      ? "data:image/png;base64,$clearadmvob{sourcesmall}"
+      : 'plotstorage.cgi?type=vob&storage=source&tiny=1&region=' . $vob->region . '&tag=' . $vob->tag;
+
     display th {class => 'label'},                                'Source Size:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=source&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=source&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=source&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
   display end_Tr;
 
   display start_Tr;
+    $image = $clearadmvob{dbsmall}
+      ? "data:image/png;base64,$clearadmvob{dbsmall}"
+      : 'plotstorage.cgi?type=vob&storage=db&tiny=1&region=' . $vob->region . '&tag=' . $vob->tag;
+
     display th {class => 'label'},                                'Database:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=db&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=db&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=db&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
+
+    $image = $clearadmvob{derivedobjsmall}
+      ? "data:image/png;base64,$clearadmvob{derivedobjsmall}"
+      : 'plotstorage.cgi?type=vob&storage=derivedobj&tiny=1&region=' . $vob->region . '&tag=' . $vob->tag;
+
     display th {class => 'label'},                                'Derived Obj:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=derivedobj&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=derivedobj&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=derivedobj&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
   display end_Tr;
 
   display start_Tr;
+    $image = $clearadmvob{cleartextsmall}
+      ? "data:image/png;base64,$clearadmvob{cleartextsmall}"
+      : 'plotstorage.cgi?type=vob&storage=cleartext&tiny=1&region=' . $vob->retion . '&tag=' . $vob->tag;
+
     display th {class => 'label'},                                'Cleartext:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=cleartext&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=cleartext&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=cleartext&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
+
+    $image = $clearadmvob{totalsmall}
+      ? "data:image/png;base64,$clearadmvob{totalsmall}"
+      : 'plotstorage.cgi?type=vob&storage=total&tiny=1&region=' . $vob->region . '&tag=' . $vob->tag;
+
     display th {class => 'label'},                                'Total Size:';
     display td {class => 'data', colspan => 4, align => 'center'}, a {href =>
-      "plot.cgi?type=vob&storage=total&scaling=Hour&points=24&tag=" . $vob->tag
+      'plot.cgi?type=vob&storage=total&scaling=Day&points=7&region=' . $vob->region . '&tag=' . $vob->tag
     }, img {
-      src    => "plotstorage.cgi?type=vob&storage=total&tiny=1&tag=" . $vob->tag,
+      src    => $image,
       border => 0,
     };
   display end_Tr;
@@ -255,21 +287,21 @@ sub DisplayTable ($) {
   return;
 } # DisplayTable
 
-sub DisplayRegion {
+sub DisplayRegion() {
   display start_form (action => 'vobdetails.cgi');
 
   display 'Region ';
 
   my ($defaultRegion, @regions) = ('', ('Clearcase not installed'));
 
-  display popup_menu (
+  display popup_menu(
     -name     => 'region',
     -values   => [@regions],
     -default  => $defaultRegion,
     -onchange => 'submit();',
   );
 
-  display submit (
+  display submit(
     -value => 'Go',
   );
 
@@ -287,11 +319,11 @@ sub DisplayVobs($) {
     push @vobs, 'No VOBs';
   } # unless
 
-  display start_form (action => 'vobdetails.cgi');
+  display start_form(action => 'vobdetails.cgi');
 
   display 'Region ';
 
-  display popup_menu (
+  display popup_menu(
     -name     => 'region',
     -values   => [$Clearcase::CC->regions],
     -default  => $region,
@@ -300,13 +332,13 @@ sub DisplayVobs($) {
 
   display b ' VOB: ';
 
-  display popup_menu (
+  display popup_menu(
      -name     => 'vob',
      -values   => \@vobs,
      -onchange => 'submit();',
   );
 
-  display submit (
+  display submit(
     -value     => 'Go',
   );
 
@@ -316,7 +348,7 @@ sub DisplayVobs($) {
 } # DisplayVobs
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -344,7 +376,7 @@ unless ($opts{tag}) {
   exit;
 } # unless
 
-my $vob = Clearcase::Vob->new ($opts{tag}, $opts{region});
+my $vob = Clearcase::Vob->new($opts{tag}, $opts{region});
 
 DisplayTable $vob;
 
@@ -388,6 +420,7 @@ L<Getopt::Long|Getopt::Long>
 =begin html
 
 <blockquote>
+<a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/ClearadmWeb.pm">ClearadmWeb</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=lib/Clearcase.pm">Clearcase</a><br>
 <a href="http://clearscm.com/php/scm_man.php?file=lib/Clearcase/View.pm">Clearcase::View</a><br>
index 6748c9e..a50487e 100755 (executable)
@@ -51,7 +51,7 @@ use warnings;
 
 use FindBin;
 use Getopt::Long;
-use CGI qw (:standard :cgi-lib *table start_Tr end_Tr start_ol end_ol);
+use CGI qw(:standard :cgi-lib *table start_Tr end_Tr start_ol end_ol);
 use CGI::Carp 'fatalsToBrowser';
 
 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
@@ -135,7 +135,7 @@ sub DisplayVobs($) {
   display end_table;
 } # DisplayVob
 
-sub DisplayTable (@) {
+sub DisplayTable(@) {
   my (@vobServers) = @_;
 
   my $unknown = font {-class => 'unknown'}, 'Unknown';
@@ -177,7 +177,7 @@ sub DisplayTable (@) {
   my $server;
 
   for (@vobServers) {
-    $server = Clearcase::Server->new ($_, $opts{region});
+    $server = Clearcase::Server->new($_, $opts{region});
 
     display start_Tr;
       display td {
@@ -323,7 +323,7 @@ sub DisplayTable (@) {
 } # DisplayTable
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -345,8 +345,7 @@ my ($status, @output) = $Clearcase::CC->execute (
 );
 
 error "Unable to list all vobs in the region $opts{region}"
-    . join ("\n", @output), 1
-  if $status;
+    . join("\n", @output), 1 if $status;
 
 my %vobServers;
 
@@ -356,7 +355,7 @@ for (@output) {
   } # if
 } # for
 
-DisplayTable sort (keys (%vobServers));
+DisplayTable sort(keys(%vobServers));
 
 footing;
 
index 79dea02..3405e40 100644 (file)
@@ -127,7 +127,7 @@ use warnings;
 use Clearcase;
 use Display; 
 
-sub new ($;$) {
+sub new($;$) {
   my ($class, $tag, $region) = @_;
 
 =pod
@@ -170,14 +170,19 @@ Returns:
 
 =cut
 
-  my $self = bless { tag => $tag }, $class;
+  $region ||= $Clearcase::CC->region;
+
+  my $self = bless {
+    tag    => $tag,
+    region => $region
+  }, $class;
 
-  $self->updateViewInfo ($region);
+  $self->updateViewInfo;
 
   return $self;
 } # new
   
-sub accessed_by () {
+sub accessed_by() {
   my ($self) = @_;
    
 =pod
@@ -215,7 +220,7 @@ Returns:
   return $self->{accessed_by};
 } # accessed_by
 
-sub accessed_date () {
+sub accessed_date() {
   my ($self) = @_;
      
 =pod
@@ -253,7 +258,7 @@ Returns:
   return $self->{accessed_date};
 } # accessed_date
 
-sub access_path () {
+sub access_path() {
   my ($self) = @_;
    
 =pod
@@ -291,7 +296,7 @@ Returns:
   return $self->{access_path};
 } # access_path
 
-sub active () {
+sub active() {
   my ($self) = @_;
   
 =pod
@@ -329,7 +334,7 @@ Returns:
   return $self->{active};
 } # active
 
-sub additional_groups () {
+sub additional_groups() {
   my ($self) = @_;
   
 =pod
@@ -372,7 +377,7 @@ Returns:
   } # if
 } # additional_groups
 
-sub created_by () {
+sub created_by() {
   my ($self) = @_;
   
 =pod
@@ -410,7 +415,7 @@ Returns:
   return $self->{created_by};
 } # created_by
 
-sub created_date () {
+sub created_date() {
    my ($self) = @_;
    
 =pod
@@ -448,7 +453,7 @@ Returns:
   return $self->{created_date};
 } # created_date
 
-sub cs_updated_by () {
+sub cs_updated_by() {
   my ($self) = @_;
   
 =pod
@@ -486,7 +491,7 @@ Returns:
   return $self->{cs_updated_by};
 } # cs_updated_by
 
-sub cs_updated_date () {
+sub cs_updated_date() {
   my ($self) = @_;
 
 =pod
@@ -524,7 +529,7 @@ Returns:
   return $self->{cs_updated_date};
 } # cs_updated_date
 
-sub dynamic () {
+sub dynamic() {
   my ($self) = @_;
   
 =pod
@@ -559,10 +564,11 @@ Returns:
 
 =cut
 
+  return unless $self->{type};
   return $self->type eq 'dynamic';
 } # dynamic
 
-sub gpath () {
+sub gpath() {
   my ($self) = @_;
   
 =pod
@@ -600,7 +606,7 @@ Returns:
   return $self->{gpath};
 } # gpath
 
-sub group () {
+sub group() {
   my ($self) = @_;
   
 =pod
@@ -638,7 +644,7 @@ Returns:
   return $self->{group};
 } # group
 
-sub group_mode () {
+sub group_mode() {
   my ($self) = @_;
   
 =pod
@@ -676,7 +682,7 @@ Returns:
   return $self->{group_mode};
 } # group_mode
 
-sub host () {
+sub host() {
   my ($self) = @_;
   
 =pod
@@ -714,7 +720,7 @@ Returns:
   return $self->{host};
 } # host
 
-sub mode () {
+sub mode() {
   my ($self) = @_;
   
 =pod
@@ -752,7 +758,7 @@ Returns:
   return $self->{mode};
 } # mode
 
-sub modified_by () {
+sub modified_by() {
   my ($self) = @_;
   
 =pod
@@ -790,7 +796,7 @@ Returns:
   return $self->{modified_by};
 } # modified_by
 
-sub modified_date () {
+sub modified_date() {
   my ($self) = @_;
   
 =pod
@@ -828,7 +834,7 @@ Returns:
   return $self->{modified_date};
 } # modified_date
 
-sub other_mode () {
+sub other_mode() {
   my ($self) = @_;
   
 =pod
@@ -866,7 +872,7 @@ Returns:
   return $self->{other_mode};
 } # other_mode
 
-sub owner () {
+sub owner() {
   my ($self) = @_;
   
 =pod
@@ -904,7 +910,7 @@ Returns:
   return $self->{owner}
 } # owner
 
-sub owner_mode () {
+sub owner_mode() {
   my ($self) = @_;
   
 =pod
@@ -942,7 +948,7 @@ Returns:
   return $self->{owner_mode}
 } # owner_mode
 
-sub properties () {
+sub properties() {
   my ($self) = @_;
   
 =pod
@@ -980,7 +986,7 @@ Returns:
   return $self->{properties};
 } # properties
 
-sub region () {
+sub region() {
   my ($self) = @_;
   
 =pod
@@ -1018,7 +1024,7 @@ Returns:
   return $self->{region};
 } # region
 
-sub shost () {
+sub shost() {
   my ($self) = @_;
   
 =pod
@@ -1056,7 +1062,7 @@ Returns:
   return $self->{shost};
 } # shost
 
-sub snapshot () {
+sub snapshot() {
   my ($self) = @_;
   
 =pod
@@ -1091,10 +1097,11 @@ Returns:
 
 =cut
 
+  return unless $self->{type};
   return $self->type eq 'snapshot';
 } # snapshot
 
-sub webview () {
+sub webview() {
   my ($self) = @_;
   
 =pod
@@ -1129,10 +1136,11 @@ Returns:
 
 =cut
 
-  return $self->type eq 'webview';
+  return unless $self->{type};
+  return $self->{type} eq 'webview';
 } # webview
 
-sub tag () {
+sub tag() {
   my ($self) = @_;
   
 =pod
@@ -1170,7 +1178,7 @@ Returns:
   return $self->{tag};
 } # tag
 
-sub text_mode () {
+sub text_mode() {
   my ($self) = @_;
   
 =pod
@@ -1208,7 +1216,7 @@ Returns:
   return $self->{text_mode};
 } # tag
 
-sub type () {
+sub type() {
   my ($self) = @_;
   
 =pod
@@ -1243,10 +1251,10 @@ Returns:
 
 =cut
 
-  return $self->{type} ? $self->{type} : 'Unknown';
+  return $self->{type};
 } # type
 
-sub ucm () {
+sub ucm() {
   my ($self) = @_;
   
 =pod
@@ -1284,7 +1292,7 @@ Returns:
   return $self->{ucm};
 } # ucm
 
-sub uuid () {
+sub uuid() {
   my ($self) = @_;
   
 =pod
@@ -1322,7 +1330,7 @@ Returns:
   return $self->{uuid};
 } # uuid
 
-sub exists () {
+sub exists() {
   my ($self) = @_;
 
 =pod
@@ -1357,12 +1365,12 @@ Returns:
 
 =cut
 
-  my ($status, @output) = $Clearcase::CC->execute ("lsview $self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("lsview -region $self->{region} $self->{tag}");
   
   return !$status;
 } # exists
 
-sub create (;$$$) {
+sub create(;$$$) {
   my ($self, $host, $vws, $region) = @_;
     
 =pod
@@ -1412,7 +1420,7 @@ Ouput from cleartool
   $region ||= $Clearcase::CC->region;
 
   if ($self->exists) {
-    $self->updateViewInfo ($region);
+    $self->updateViewInfo;
       
     return (0, ())
   } # if
@@ -1421,21 +1429,21 @@ Ouput from cleartool
     
   if ($host && $vws) {
     ($status, @output) = 
-      $Clearcase::CC->execute ("mkview -tag $self->{tag} -region $region "
+      $Clearcase::CC->execute("mkview -tag $self->{tag} -region $region "
                           .    "-host $host -hpath $vws -gpath $vws $vws");
   } else {
     # Note this requires that -stgloc's work and that using -auto is not a 
     # problem.
     ($status, @output) =
-       $Clearcase::CC->execute ("mkview -tag $self->{tag} -stgloc -auto");
+       $Clearcase::CC->execute("mkview -tag $self->{tag} -stgloc -auto");
   } # if
 
-  $self->updateViewInfo ($region);
+  $self->updateViewInfo;
 
   return ($status, @output);
 } # create
   
-sub createUCM ($$) {
+sub createUCM($$) {
   my ($self, $stream, $pvob, $region) = @_;
 
 =pod
@@ -1493,18 +1501,18 @@ Array of output
     
   # Need to create the view
   my ($status, @output) = 
-    $Clearcase::CC->execute ("mkview -tag $self->{tag} -stream " 
+    $Clearcase::CC->execute("mkview -tag $self->{tag} -stream " 
                            . "$self->{stream}\@$self->{pvob} -stgloc -auto");
  
   return ($status, @output)
     if $status;
       
-  $self->updateViewInfo ($region);
+  $self->updateViewInfo;
 
   return ($status, @output);
 } # createUCM
 
-sub remove () {
+sub remove() {
   my ($self) = @_;
 
 =pod
@@ -1551,12 +1559,12 @@ Ouput from cleartool
   my ($status, @output);
 
   if ($self->dynamic) {
-    ($status, @output) = $Clearcase::CC->execute (
+    ($status, @output) = $Clearcase::CC->execute(
        "rmview -force -tag $self->{tag}"
      );
   } else {
     error 'Removal of snapshot views not implemented yet', 1;
-    #($status, @output) = $Clearcase::CC->execute (
+    #($status, @output) = $Clearcase::CC->execute(
     #  "rmview -force $self->{snapshot_view_pname}"
     #);
   } # if
@@ -1564,7 +1572,7 @@ Ouput from cleartool
   return ($status, @output);
 } # remove
 
-sub start () {
+sub start() {
   my ($self) = @_;
 
 =pod
@@ -1605,10 +1613,10 @@ Ouput from cleartool
 
 =cut
 
-  return $Clearcase::CC->execute ("startview $self->{tag}");
+  return $Clearcase::CC->execute("startview $self->{tag}");
 } # start
 
-sub stop () {
+sub stop() {
   my ($self) = @_;
 
 =pod
@@ -1649,10 +1657,10 @@ Ouput from cleartool
 
 =cut
 
-  return $Clearcase::CC->execute ("endview $self->{tag}");
+  return $Clearcase::CC->execute("endview $self->{tag}");
 } # stop
 
-sub kill () {
+sub kill() {
   my ($self) = @_;
 
 =pod
@@ -1693,10 +1701,10 @@ Ouput from cleartool
 
 =cut
 
-  return $Clearcase::CC->execute ("endview -server $self->{tag}");
+  return $Clearcase::CC->execute("endview -server $self->{tag}");
 } # kill
 
-sub set () {
+sub set() {
   my ($self) = @_;
 
 =pod
@@ -1744,15 +1752,15 @@ Ouput from cleartool
   return ($status, @output);
 } # set
 
-sub updateViewInfo ($$) {
-  my ($self, $region) = @_;
-
-  $region ||= $Clearcase::CC->region;
+sub updateViewInfo($$) {
+  my ($self) = @_;
 
-  my ($status, @output) = $Clearcase::CC->execute (
-    "lsview -region $region -long -properties -full $self->{tag}"
+  my ($status, @output) = $Clearcase::CC->execute(
+    "lsview -region $self->{region} -long -properties -full $self->{tag}"
   );
 
+  return if $status;
+
   # Assuming this view is an empty shell of an object that the user may possibly
   # use the create method on, return our blessings...
 
@@ -2167,7 +2175,7 @@ Returns:
 sub updateViewSpace() {
   my ($self) = @_;
 
-  my ($status, @output) = $Clearcase::CC->execute (
+  my ($status, @output) = $Clearcase::CC->execute(
     "space -region $self->{region} -view $self->{tag}"
   );
 
index 596fafb..f8c636b 100644 (file)
@@ -98,8 +98,8 @@ use warnings;
 use Clearcase;
 use OSDep;
 
-sub new ($) {
-  my ($class, $tag) = @_;
+sub new($;$) {
+  my ($class, $tag, $region) = @_;
 
 =pod
 
@@ -141,8 +141,11 @@ Returns:
 
 =cut
 
+  $region ||= $Clearcase::CC->region;
+
   $class = bless {
-    tag => $tag
+    tag    => $tag,
+    region => $region,
   }, $class;
 
   $class->updateVobInfo;
@@ -150,7 +153,7 @@ Returns:
   return $class;
 } # new
 
-sub tag () {
+sub tag() {
   my ($self) = @_;
    
 =pod
@@ -188,7 +191,7 @@ Returns:
   return $self->{tag};
 } # tag
 
-sub gpath () {
+sub gpath() {
   my ($self) = @_;
   
 =pod
@@ -226,7 +229,7 @@ Returns:
   return $self->{gpath};
 } # gpath
 
-sub shost () {
+sub shost() {
   my ($self) = @_;
   
 =pod
@@ -268,7 +271,8 @@ Returns:
 sub name() {
   goto &tag;
 } # name
-sub access () {
+
+sub access() {
   my ($self) = @_;
   
 =pod
@@ -308,7 +312,7 @@ Returns either public for public VOBs or private for private VOBs
   return $self->{access};
 } # access
 
-sub mopts () {
+sub mopts() {
   my ($self) = @_;
   
 =pod
@@ -346,7 +350,7 @@ Returns:
   return $self->{mopts};
 } # mopts
 
-sub region () {
+sub region() {
   my ($self) = @_;
   
 =pod
@@ -384,7 +388,7 @@ Returns:
   return $self->{region};
 } # region
 
-sub active () {
+sub active() {
   my ($self) = @_;
   
 =pod
@@ -423,7 +427,7 @@ Returns:
   return $self->{active};
 } # active
 
-sub replica_uuid () {
+sub replica_uuid() {
   my ($self) = @_;
   
 =pod
@@ -461,7 +465,7 @@ Returns:
   return $self->{replica_uuid};
 } # replica_uuid
 
-sub host () {
+sub host() {
   my ($self) = @_;
   
 =pod
@@ -499,7 +503,7 @@ Returns:
   return $self->{host};
 } # host
 
-sub access_path () {
+sub access_path() {
   my ($self) = @_;
   
 =pod
@@ -539,7 +543,7 @@ This is the path relative to the VOB's host
   return $self->{access_path};
 } # access_path
 
-sub family_uuid () {
+sub family_uuid() {
   my ($self) = @_;
   
 =pod
@@ -577,7 +581,7 @@ Returns:
   return $self->{family_uuid};
 } # family_uuid
 
-sub vob_registry_attributes () {
+sub vob_registry_attributes() {
   my ($self) = @_;
   
 =pod
@@ -615,7 +619,7 @@ Returns:
   return $self->{vob_registry_attributes};
 } # vob_registry_attributes
 
-sub expand_space () {
+sub expand_space() {
   my ($self) = @_;
 
   my ($status, @output) = $Clearcase::CC->execute ("space -vob $self->{tag}");
@@ -647,10 +651,10 @@ sub expand_space () {
   return;
 } # expand_space
 
-sub expand_description () {
+sub expand_description() {
   my ($self) = @_;
 
-  my ($status, @output) = $Clearcase::CC->execute ("describe -long vob:$self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("describe -long vob:$self->{tag}");
 
   for (my $i = 0; $i < @output; $i++) {
     if ($output[$i] =~ /created (\S+) by (.+) \((\S+)\)/) {
@@ -1353,7 +1357,7 @@ Returns:
   return %{$self->{hyperlinks}};
 } # hyperlinks
 
-sub countdb () {
+sub countdb() {
   my ($self) = @_;
 
   # Set values to zero in case we cannot get the right values from countdb
@@ -1367,13 +1371,13 @@ sub countdb () {
   chomp $cwd;
   chdir "$self->{gpath}/db";
 
-   my $cmd    = "$Clearcase::COUNTDB vob_db 2>&1";
-   my @output = `$cmd`;
+  my $cmd    = "$Clearcase::COUNTDB vob_db 2>&1";
+  my @output = `$cmd`;
 
-   if ($? != 0) {
-     chdir $cwd;
-     return;
-    }    # if
+  if ($? != 0) {
+    chdir $cwd;
+    return;
+  } # if
 
   chomp @output;
 
@@ -1393,7 +1397,7 @@ sub countdb () {
   return;
 } # countdb
 
-sub elements () {
+sub elements() {
   my ($self) = @_;
 
 =pod
@@ -1433,7 +1437,7 @@ Returns:
   return $self->{elements};
 } # elements
 
-sub branches () {
+sub branches() {
   my ($self) = @_;
 
 =pod
@@ -1473,7 +1477,7 @@ Returns:
   return $self->{branches};
 } # branches
 
-sub versions () {
+sub versions() {
   my ($self) = @_;
 
 =pod
@@ -1513,7 +1517,7 @@ Returns:
   return $self->{versions};
 } # versions
 
-sub dbsize () {
+sub dbsize() {
   my ($self) = @_;
 
 =pod
@@ -1553,7 +1557,7 @@ Returns:
   return $self->{dbsize};
 } # dbsize
 
-sub admsize () {
+sub admsize() {
   my ($self) = @_;
 
 =pod
@@ -1593,7 +1597,7 @@ Returns:
   return $self->{admsize};
 } # admsize
 
-sub ctsize () {
+sub ctsize() {
   my ($self) = @_;
 
 =pod
@@ -1633,7 +1637,7 @@ Returns:
   return $self->{ctsize};
 } # ctsize
 
-sub dosize () {
+sub dosize() {
   my ($self) = @_;
 
 =pod
@@ -1673,7 +1677,7 @@ Returns:
   return $self->{dosize};
 } # dosize
 
-sub srcsize () {
+sub srcsize() {
   my ($self) = @_;
 
 =pod
@@ -1713,7 +1717,7 @@ Returns:
   return $self->{srcsize};
 } # srcsize
 
-sub size () {
+sub size() {
   my ($self) = @_;
 
 =pod
@@ -1753,7 +1757,7 @@ Returns:
   return $self->{size};
 } # size
 
-sub mount () {
+sub mount() {
   my ($self) = @_;
 
 =pod
@@ -1796,12 +1800,12 @@ An array of lines output from the cleartool mount command
 
   return 0 if $self->{active} && $self->{active} eq "YES";
 
-  my ($status, @output) = $Clearcase::CC->execute ("mount $self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("mount $self->{tag}");
 
   return ($status, @output);
 } # mount
 
-sub umount () {
+sub umount() {
   my ($self) = @_;
 
 =pod
@@ -1842,12 +1846,12 @@ Ouput from cleartool
 
 =cut
 
-  my ($status, @output) = $Clearcase::CC->execute ("umount $self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("umount $self->{tag}");
 
   return ($status, @output);
 } # umount
 
-sub exists () {
+sub exists() {
   my ($self) = @_;
 
 =pod
@@ -1882,12 +1886,12 @@ Returns:
 
 =cut
 
-  my ($status, @output) = $Clearcase::CC->execute ("lsvob $self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("lsvob -region $self->{region} $self->{tag}");
 
   return !$status;
 } # exists
 
-sub create (;$$$%) {
+sub create(;$$$%) {
   my ($self, $host, $vbs, $comment, %opts) = @_;
 
 =pod
@@ -1956,14 +1960,14 @@ Ouput from cleartool
   if ($host && $vbs) {
     $additionalOpts .= '-ucmproject' if $self->{ucmproject};
 
-    ($status, @output) = $Clearcase::CC->execute (
+    ($status, @output) = $Clearcase::CC->execute(
       "mkvob -tag $self->{tag} $comment $additionalOpts -host $host -hpath $vbs "
     . "-gpath $vbs $vbs");
   } else {
     # Note this requires that -stgloc's work and that using -auto is not a 
     # problem.
     ($status, @output) =
-      $Clearcase::CC->execute ("mkvob -tag $self->{tag} $comment $additionalOpts -stgloc -auto");
+      $Clearcase::CC->execute("mkvob -tag $self->{tag} $comment $additionalOpts -stgloc -auto");
   } # if
 
   $self->updateVobInfo;
@@ -1971,7 +1975,7 @@ Ouput from cleartool
   return ($status, @output);
 } # create
 
-sub remove () {
+sub remove() {
   my ($self) = @_;
 
 =pod
@@ -2012,13 +2016,13 @@ Ouput from cleartool
 
 =cut
 
-  return $Clearcase::CC->execute ("rmvob -force $self->{gpath}");
+  return $Clearcase::CC->execute("rmvob -force $self->{gpath}");
 } # remove
 
 sub updateVobInfo ($$) {
   my ($self) = @_;
 
-  my ($status, @output) = $Clearcase::CC->execute ("lsvob -long $self->{tag}");
+  my ($status, @output) = $Clearcase::CC->execute("lsvob -long $self->{tag}");
 
   # Assuming this vob is an empty shell of an object that the user may possibly
   # use the create method on, return our blessings...
index 40a581e..6c8164f 100644 (file)
@@ -102,11 +102,11 @@ my $SECS_IN_HOUR = $SECS_IN_MIN * 60;
 my $SECS_IN_DAY  = $SECS_IN_HOUR * 24;
 
 # Forwards
-sub Today2SQLDatetime();
-sub DateToEpoch($);
-sub EpochToDate($);
+sub Today2SQLDatetime ();
+sub DateToEpoch ($);
+sub EpochToDate ($);
 
-sub ymdhms(;$) {
+sub ymdhms {
   my ($time) = @_;
 
   $time ||= time;
@@ -121,7 +121,7 @@ sub ymdhms(;$) {
     $wday,
     $yday,
     $isdst
-  ) = localtime($time);
+  ) = localtime ($time);
 
   # Adjust month
   $mon++;
@@ -139,7 +139,7 @@ sub ymdhms(;$) {
   return $year, $mon, $mday, $hour, $min, $sec;
 } # ymdhms
 
-sub julian($$$) {
+sub julian ($$$) {
   my ($year, $month, $day) = @_;
 
   my $days = 0;
@@ -154,19 +154,19 @@ sub julian($$$) {
   return $days + $day;
 } # julian
 
-sub _is_leap_year($) {
+sub _is_leap_year ($) {
   my ($year) = @_;
-
+  
   return 0 if $year % 4;
   return 1 if $year % 100;
   return 0 if $year % 400;
-
+  
   return 1; 
 } # _is_leap_year
 
-sub Add($%) {
+sub Add ($%) {
   my ($datetime, %parms) = @_;
-
+  
 =pod
 
 =head2 Add ($datetime, %parms)
@@ -192,7 +192,7 @@ Hash of parms. Acceptable values are of the following format:
  hours   => $hours
  days    => $days
  month   => $month
-
 Note that month will simply increment the month number, adjusting for overflow
 of year if appropriate. Therefore a date of 2/28/2001 would increase by 1 month
 to yield 3/28/2001. And, unfortunately, an increase of 1 month to 1/30/2011 
@@ -223,47 +223,47 @@ Returns:
     'days',
     'months',
   );
-
-  for (keys %parms) {
-    unless (InArray($_, @validKeys)) {
+  
+  foreach (keys %parms) {
+    unless (InArray ($_, @validKeys)) {
       croak "Invalid key in DateUtils::Add: $_";
     } # unless
-  } # for
-
+  } # foreach
+  
   my $epochTime = DateToEpoch $datetime;
-
+  
   my $amount = 0;
-
+  
   $parms{seconds} ||= 0;
   $parms{minutes} ||= 0;
   $parms{hours}   ||= 0;
   $parms{days}    ||= 0;
-
+  
   $amount += $parms{days}    * $SECS_IN_DAY;
   $amount += $parms{hours}   * $SECS_IN_HOUR;
   $amount += $parms{minutes} * $SECS_IN_MIN;
   $amount += $parms{seconds};
-
+    
   $epochTime += $amount;
 
   $datetime = EpochToDate $epochTime;
-
+  
   if ($parms{month}) {
     my $years  = $parms{month} / 12;
     my $months = $parms{month} % 12;
-
+     
     my $month = substr $datetime, 5, 2;
-
+    
     $years += ($month + $months) / 12;
-    substr($datetime, 5, 2) = ($month + $months) % 12;
-
-    substr($datetime, 0, 4) = substr ($datetime, 0, 4) + $years;
+    substr ($datetime, 5, 2) = ($month + $months) % 12;
+    
+    substr ($datetime, 0, 4) = substr ($datetime, 0, 4) + $years;
   } # if
-
+  
   return $datetime;
 } # Add
 
-sub Age($) {
+sub Age ($) {
   my ($timestamp) = @_;
 
 =pod
@@ -312,13 +312,13 @@ Returns:
   my $timestamp_days = julian $timestamp_year, $month, $day;
 
   if ($timestamp_year > $today_year or
-     ($timestamp_days > $today_days and $timestamp_year == $today_year)) {
+      ($timestamp_days > $today_days and $timestamp_year == $today_year)) {
     return;
   } else {
     my $leap_days = 0;
 
     for (my $i = $timestamp_year; $i < $today_year; $i++) {
-
+       
       $leap_days++ if $i % 4 == 0;
     } # for
 
@@ -327,9 +327,9 @@ Returns:
   } # if
 } # Age
 
-sub Compare($$) {
+sub Compare ($$) {
   my ($date1, $date2) = @_;
-
+  
 =pod
 
 =head2 Compare ($date2, $date2)
@@ -372,9 +372,9 @@ Returns:
   return DateToEpoch ($date1) <=> DateToEpoch ($date2);
 } # Compare
 
-sub DateToEpoch($) {
+sub DateToEpoch ($) {
   my ($date) = @_;
-
+  
 =pod
 
 =head2 DateToEpoch ($datetime)
@@ -415,13 +415,13 @@ Returns:
   my $hour    = substr $date, 11, 2;
   my $minute  = substr $date, 14, 2;
   my $seconds = substr $date, 17, 2;
-
+  
   my $days;
 
   for (my $i = 1970; $i < $year; $i++) {
     $days += _is_leap_year ($i) ? 366 : 365;
   } # for
-
+  
   my @monthDays = (
     0,
     31, 
@@ -436,23 +436,23 @@ Returns:
     304,
     334,
   );
-
+  
   $days += $monthDays[$month - 1];
-
+  
   $days++
     if _is_leap_year ($year) and $month > 2;
-
+    
  $days += $day - 1;
-
+  
   return ($days   * $SECS_IN_DAY)
        + ($hour   * $SECS_IN_HOUR)
        + ($minute * $SECS_IN_MIN)
        + $seconds;
 } # DateToEpoch
 
-sub EpochToDate($) {
+sub EpochToDate ($) {
   my ($epoch) = @_;
-
+  
 =pod
 
 =head2 EpochToDate ($epoch)
@@ -491,19 +491,19 @@ Returns:
   my ($month, $day, $hour, $minute, $seconds);
   my $leapYearSecs = 366 * $SECS_IN_DAY;
   my $yearSecs     = $leapYearSecs - $SECS_IN_DAY;
-
+  
   while () {
     my $amount = _is_leap_year ($year) ? $leapYearSecs : $yearSecs;
-
+    
     last
       if $amount > $epoch;
-
+      
     $epoch -= $amount;
     $year++;
   } # while
-
-  my $leapYearAdjustment = _is_leap_year($year) ? 1 : 0;
-
+  
+  my $leapYearAdjustment = _is_leap_year ($year) ? 1 : 0;
+  
   if ($epoch >= (334 + $leapYearAdjustment) * $SECS_IN_DAY) {
     $month = '12';
     $epoch -= (334 + $leapYearAdjustment) * $SECS_IN_DAY;
@@ -541,24 +541,24 @@ Returns:
     $month = '01';
   } # if
 
-  $day     = int(($epoch / $SECS_IN_DAY) + 1);
+  $day     = int (($epoch / $SECS_IN_DAY) + 1);
   $epoch   = $epoch % $SECS_IN_DAY;
-  $hour    = int($epoch / $SECS_IN_HOUR);
+  $hour    = int ($epoch / $SECS_IN_HOUR);
   $epoch   = $epoch % $SECS_IN_HOUR;
-  $minute  = int($epoch / $SECS_IN_MIN);
+  $minute  = int ($epoch / $SECS_IN_MIN);
   $seconds = $epoch % $SECS_IN_MIN;
-
+  
   $day     = "0$day"     if $day     < 10;
   $hour    = "0$hour"    if $hour    < 10;
   $minute  = "0$minute"  if $minute  < 10;
   $seconds = "0$seconds" if $seconds < 10;
-
+  
   return "$year-$month-$day $hour:$minute:$seconds";
 } # EpochToDate
 
-sub UTCTime($) {
+sub UTCTime ($) {
   my ($datetime) = @_;
-
+  
 =pod
 
 =head2 UTCTime ($epoch)
@@ -594,10 +594,10 @@ Returns:
 =cut
 
   my @localtime = localtime;
-  my ($sec, $min, $hour, $mday, $mon, $year) = gmtime(
+  my ($sec, $min, $hour, $mday, $mon, $year) = gmtime (
     DateToEpoch ($datetime) - (timegm (@localtime) - timelocal (@localtime))
   );
-
+      
   $year += 1900;
   $mon++;
 
@@ -606,13 +606,13 @@ Returns:
   $hour = '0' . $hour if $hour < 10;  
   $mon  = '0' . $mon  if $mon  < 10;
   $mday = '0' . $mday if $mday < 10;
-
+      
   return "$year-$mon-${mday}T$hour:$min:${sec}Z";  
 } # UTCTime
 
-sub UTC2Localtime($) {
+sub UTC2Localtime ($) {
   my ($utcdatetime) = @_;
-
+  
   # If the field does not look like a UTC time then just return it.
   return $utcdatetime unless $utcdatetime =~ /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/;
 
@@ -626,7 +626,7 @@ sub UTC2Localtime($) {
   );
 } # UTC2Localtime
 
-sub FormatDate($) {
+sub FormatDate ($) {
   my ($date) = @_;
 
 =pod
@@ -670,7 +670,7 @@ Returns:
        . substr ($date, 0, 4);
 } # FormatDate
 
-sub FormatTime($) {
+sub FormatTime ($) {
   my ($time) = @_;
 
 =pod
@@ -712,13 +712,13 @@ Returns:
   my $AmPm    = $hours > 12 ? "Pm" : "Am";
 
   $hours = $hours - 12 if $hours > 12;
-
+  
   $hours = "0$hours" if length $hours == 1;
 
   return "$hours:$minutes $AmPm";
 } # FormatTime
 
-sub MDY(;$) {
+sub MDY (;$) {
   my ($time) = @_;
 
 =pod
@@ -760,7 +760,7 @@ Returns:
   return "$mon/$mday/$year";
 } # MDY
 
-sub SQLDatetime2UnixDatetime($) {
+sub SQLDatetime2UnixDatetime ($) {
   my ($sqldatetime) = @_;
 
 =pod
@@ -815,12 +815,12 @@ Returns:
   my $year  = substr $sqldatetime, 0, 4;
   my $month = substr $sqldatetime, 5, 2;
   my $day   = substr $sqldatetime, 8, 2;
-  my $time  = FormatTime(substr $sqldatetime, 11);
+  my $time  = FormatTime (substr $sqldatetime, 11);
 
   return $months{$month} . " $day, $year \@ $time";
 } # SQLDatetime2UnixDatetime
 
-sub SubtractDays($$) {
+sub SubtractDays ($$) {
   my ($timestamp, $nbr_of_days) = @_;
 
 =pod
@@ -914,7 +914,7 @@ Returns:
   return $year . "-" . $month . "-" . $days . substr $timestamp, 10;
 } # SubtractDays
 
-sub Today2SQLDatetime() {
+sub Today2SQLDatetime () {
 
 =pod
 
@@ -951,7 +951,7 @@ Returns:
   return UnixDatetime2SQLDatetime (scalar (localtime));
 } # Today2SQLDatetime
 
-sub UnixDatetime2SQLDatetime($) {
+sub UnixDatetime2SQLDatetime ($) {
   my ($datetime) = @_;
 
 =pod
@@ -1060,7 +1060,7 @@ Returns:
   unless ($months{$month_name}) {
     $month_name = substr $datetime, 8, 3;
   } # unless
-
+  
   my $month = $months{$month_name};
   my $time  = substr $datetime, 11, 8;
 
@@ -1072,12 +1072,12 @@ Returns:
     warning "Year undefined for $orig_datetime\nReturning today's date";
     return Today2SQLDatetime;
   } # unless
-
+    
   unless ($month) {
     warning "Month undefined for $orig_datetime\nReturning today's date";
     return Today2SQLDatetime;
   } # unless
-
+  
   unless ($day) {
     warning "Day undefined for $orig_datetime\nReturning today's date";
     return Today2SQLDatetime;
@@ -1091,7 +1091,7 @@ Returns:
   return "$year-$month-$day $time";
 } # UnixDatetime2SQLDatetime
 
-sub YMD(;$) {
+sub YMD (;$) {
   my ($time) = @_;
 
 =pod
@@ -1133,7 +1133,7 @@ Returns:
   return "$year$mon$mday";
 } # YMD
 
-sub YMDHM(;$) {
+sub YMDHM (;$) {
   my ($time) = @_;
 
 =pod
@@ -1175,7 +1175,7 @@ Returns:
   return "$year$mon$mday\@$hour:$min";
 } # YMDHM
 
-sub YMDHMS(;$) {
+sub YMDHMS (;$) {
   my ($time) = @_;
 
 =pod
@@ -1217,7 +1217,7 @@ Returns:
   return "$year$mon$mday\@$hour:$min:$sec";
 } # YMDHMS
 
-sub timestamp(;$) {
+sub timestamp (;$) {
   my ($time) = @_;
 
 =pod
@@ -1257,72 +1257,6 @@ Returns:
   return "$year$mon${mday}_$hour$min$sec";
 } # timestamp
 
-sub MDYHMS2SQLDatetime($) {
-  my ($datetime) = @_;
-
-  $datetime =~ s/^\s+|\s+$//g;
-
-  my ($year, $mon, $day, $hour, $min, $sec, $ampm);
-
-  # For datetime format of MM/DD/YYYY HH:MM:SS [Am|Pm]
-  if ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2}) (\w{2})$/) {
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = $4;
-    $min   = $5;
-    $sec   = $6;
-    $ampm  = $7;
-  # For datetime format of MM/DD/YYYY HH:MM:SS
-  } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/){
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = $4;
-    $min   = $5;
-    $sec   = $6;
-  # For datetime format of MM/DD/YYYY
-  } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) {
-    $mon   = $1;
-    $day   = $2;
-    $year  = $3;
-    $hour  = '00';
-    $min   = '00';
-    $sec   = '00';
-  } else {
-    return
-  } # if
-
-  # Range checks
-  return if $mon  > 12 or $mon  <= 0;
-  return if $day  > 31 or $day  <= 0;
-  return if $hour > 23 or $hour <  0;
-  return if $min  > 59 or $min  <  0;
-
-  if ($day >= 31 and ($mon == 2
-                   or $mon == 4
-                   or $mon == 6
-                   or $mon == 9
-                   or $mon == 11)) {
-    return;
-  } # if
-
-  return if $day >  29 and  $mon == 2;
-  return if $day == 29 and  $mon == 2 and not _is_leap_year($year);
-
-  # Convert to 24 hour time if necessary
-  $hour += 12 if $ampm and $ampm =~ /pm/i;
-
-  # Add any leading zeros
-  $mon  = "0$mon"  if length $mon  == 1;
-  $day  = "0$day"  if length $day  == 1;
-  $hour = "0$hour" if length $hour == 1;
-  $min  = "0$min"  if length $min  == 1;
-  $sec  = "0$sec"  if length $sec  == 1;
-
-  return "$year-$mon-$day $hour:$min:$sec";
-} # MDYHMS2SQLDatetime
-
 1;
 
 =head2 DEPENDENCIES