Removed /usr/local from CDPATH
[clearscm.git] / clearadm / viewager.cgi
old mode 100755 (executable)
new mode 100644 (file)
index c283ebe..150237a
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/local/bin/perl
 
 =pod
 
@@ -59,7 +59,8 @@ including old ones.
 
  Where:
    -u|sage:            Displays usage
-   -region <region>:   Region to use when looking for the view
+   -region <region>:   Region to use when looking for views (Default
+                       for generate action: all)
    -e|mail:            Send email to owners of old views
    -ag|eThreshold:     Number of days before a view is considered old
                        (Default: 180)
@@ -119,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;
@@ -140,11 +141,11 @@ use User;
 my $VERSION  = '$Revision: 1.11 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
-my %opts = Vars;
+my %opts;
 my $clearadm;
 
-$opts{sortby} ||= 'age';
-$opts{region} ||= $Clearcase::CC->region;
+$opts{sortby}       ||= 'age';
+$opts{ageThreshold}   = 180; # Default number of days a view must be older than
 
 my $subtitle = 'View Aging Report';
 my $email;
@@ -158,14 +159,13 @@ my $script     = 'http://'
                . $port
                . $scriptName;
 
-my (%total, $action);
-my $ageThreshold = 180; # Default number of days a view must be older than
+my %total;
 my $nbrThreshold;       # Number of views threshold - think top 10
 
-sub GenerateRegion ($) {
+sub GenerateRegion($) {
   my ($region) = @_;
 
-  verbose "Processing $region";
+  verbose "Processing region $region";
   $total{Regions}++;
 
   my $views = Clearcase::Views->new ($region);
@@ -176,7 +176,7 @@ sub GenerateRegion ($) {
 
   my $i = 0;
 
-  foreach my $name (@Views) {
+  for my $name (@Views) {
     $total{Views}++;
 
     if (++$i % 100 == 0) {
@@ -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,20 +207,24 @@ 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);
 
-    if ($ownerid) {
-      $user = User->new ($ownerid);
-
-      $user->{name} ||= 'Unknown';
+      $ownerid       = $2;
+      $user->{name}  = $2;
+      $user->{email} = "$2\@gddsi.com";
     } else {
       $ownerid       = 'Unknown';
       $user->{name}  = 'Unknown';
+      $user->{email} = 'unknown@gddsi.com';
     } # if
 
     my $age       = 0;
@@ -235,29 +239,39 @@ sub GenerateRegion ($) {
       # Compute age
       $age       = Age ($modified_date);
       $ageSuffix = $age != 1 ? 'days' : 'day';
-    } else {
-      $modified_date = 'Unknown';
     } # if
 
-    my ($err, $msg) = $clearadm->AddView (
-      system        => $view->shost,
-      region        => $view->region,
-      tag           => $view->tag,
-      owner         => $ownerid,
-      ownerName     => $user->{name},
-      email         => $user->{email},
-      type          => $type,
-      gpath         => $gpath,
-      modified_date => $modified_date,
-      age           => $age,
-      ageSuffix     => $ageSuffix,
+    my %oldView = $clearadm->GetView($view->tag, $view->region);
+
+    my ($err, $msg);
+
+    my %viewRec = (
+      region    => $view->region,
+      tag       => $view->tag,
+      owner     => $ownerid,
+      ownerName => $user->{name},
+      email     => $user->{email},
+      type      => $type,
+      gpath     => $gpath,
+      age       => $age,
+      ageSuffix => $ageSuffix,
     );
 
-    error "Unable to add view $name to Clearadm\n$msg", $err
-      if $err;
-  } # foreach
+    # Some views have not yet been modified
+    $viewRec{modified} = $modified_date if $modified_date;
+
+    if (%oldView) {
+      ($err, $msg) = $clearadm->UpdateView(%viewRec);
+
+      error "Unable to update view $name in Clearadm\n$msg", $err if $err;
+    } else {
+      ($err, $msg) = $clearadm->AddView(%viewRec);
+
+      error "Unable to add view $name to Clearadm\n$msg", $err if $err;
+    } # if
+  } # for
 
-  verbose "\nProcessed $region";
+  verbose "\nProcessed region $region";
   
   return;
 } # GenerateRegion
@@ -265,12 +279,10 @@ sub GenerateRegion ($) {
 sub Generate ($) {
   my ($region) = @_;
 
-  if ($region =~ /all/i) {
-     foreach ($Clearcase::CC->regions) {
-        GenerateRegion $_;
-     } # foreach
-  } else {
+  if ($region) {
     GenerateRegion $region;
+  } else {
+    GenerateRegion $_ for $Clearcase::CC->regions;
   } # if
   
   return;
@@ -283,21 +295,21 @@ sub Report (@) {
 
   my @sortedViews;
 
-  if ($opts{sort} eq 'age') {
+  if ($opts{sortby} eq 'age') {
     # Sort by age numerically decending
     @sortedViews = sort { $$b{$opts{sortby}} <=> $$a{$opts{sortby}} } @views;
   } else {
-    @sortedViews = sort { $$a{$opts{sort}} cmp $$b{$opts{sort}} } @views;
+    @sortedViews = sort { $$a{$opts{sortby}} cmp $$b{$opts{sortby}} } @views;
   } # if
 
   $total{Reported} = 0;
 
-  foreach (@sortedViews) {
+  for (@sortedViews) {
     my %view = %{$_};
 
     last
       if ($nbrThreshold and $total{Reported} + 1 > $nbrThreshold) or
-         ($view{age} < $ageThreshold);
+         ($view{age} < $opts{ageThreshold});
 
     $total{Reported}++;
 
@@ -321,16 +333,16 @@ format STDOUT_TOP =
 .
 format STDOUT =
 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<< @<<<<<<<<<<<<<<< @>>>> @<<<<
-$view{tag},$view{owner},$view{type},$view{modified_date},$view{age},$view{ageSuffix}
+$view{tag},$view{owner},$view{type},$view{modified},$view{age},$view{ageSuffix}
 .
 
     write;
-  } # foreach
+  } # for
   
   return;
 } # Report
 
-sub FormatTable ($@) {
+sub FormatTable($@) {
   my ($style, @views) = @_;
   
   my $table;
@@ -349,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,
@@ -369,17 +381,12 @@ sub FormatTable ($@) {
     width        => '100%',
   };
 
-  my $registryHost = $Clearcase::CC->registry_host;
-  
-  $registryHost = font {class => 'unknown'}, 'Unknown'
-    unless $registryHost;
-
   $caption   .= start_Tr;
     $caption .= td {
        -align => 'left',
        -width => '30%',
     }, font ({-class => 'label'}, 'Registry: '),
-       $registryHost, '<br>',
+       setField($Clearcase::CC->registry_host), '<br>',
        font ({-class => 'label'}, 'Views: '),
        $nbrViews;
     $caption .= td {
@@ -454,18 +461,20 @@ sub FormatTable ($@) {
     # Sort by age numerically decending
     @views = $opts{reverse} == 1
            ? sort { $$a{$opts{sortby}} <=> $$b{$opts{sortby}} } @views
-           : sort { $$b{$opts{sortby}} <=> $$a{$opts{sortby}} } @views
+           : sort { $$b{$opts{sortby}} <=> $$a{$opts{sortby}} } @views;
   } else {
     @views = $opts{reverse} == 1
            ? sort { $$b{$opts{sortby}} cmp $$a{$opts{sortby}} } @views
-           : sort { $$a{$opts{sortby}} cmp $$b{$opts{sortby}} } @views
+           : sort { $$a{$opts{sortby}} cmp $$b{$opts{sortby}} } @views;
   } # if
 
   my $i;
 
-  foreach (@views) {
+  for (@views) {
     my %view = %{$_};
 
+    next if $view{region} ne $opts{region};
+
     my $owner = $view{owner};
 
     if ($view{owner} =~ /\S+(\\|\/)(\S+)/) {
@@ -474,7 +483,9 @@ sub FormatTable ($@) {
 
     $owner = $view{ownerName} ? $view{ownerName} : 'Unknown';
 
-    my $rowClass= $view{age} > $ageThreshold ? 'oldview' : 'view';
+    next if $opts{user} and $owner ne $opts{user};
+
+    my $rowClass= $view{age} > $opts{ageThreshold} ? 'oldview' : 'view';
 
     $table   .= start_Tr {
       class => $rowClass
@@ -503,7 +514,7 @@ sub FormatTable ($@) {
         class => $view{type}
       }, $view{age}, ' ', $view{ageSuffix});
     $table .= end_Tr;
-  } # foreach
+  } # for
 
   $table .= end_table;
 
@@ -512,19 +523,19 @@ 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>
 
 <p>Won't you take a moment to review this message and clean up any views you no
 longer need?</p>
 
-<p>The following views are owned by you and have not been modified in $ageThreshold
+<p>The following views are owned by you and have not been modified in $opts{ageThreshold}
 days:</p>
 END
 
@@ -568,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',
@@ -579,7 +590,7 @@ END
   return
 } # EmailUser
 
-sub EmailUsers (@) {
+sub EmailUsers(@) {
   my (@views) = @_;
   
   @views = sort { $$a{ownerName} cmp $$b{ownerName} } @views;
@@ -587,26 +598,24 @@ sub EmailUsers (@) {
   my @userViews;
   my $currUser = $views [0]->{ownerName};
 
-  foreach (@views) {
+  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} > $ageThreshold) {
+      if ($view{age} > $opts{ageThreshold}) {
         push @userViews, \%view
           if !-f "$view{gpath}/ageless";
       } # if
     } # if
-  } # foreach
+  } # for
 
   display"Done";
   
@@ -614,7 +623,7 @@ sub EmailUsers (@) {
 } # EmailUsers
 
 # Main
-GetOptions (
+GetOptions(
   \%opts,
   'usage'        => sub { Usage },
   'verbose'      => sub { set_verbose },
@@ -627,18 +636,21 @@ GetOptions (
   'nbrThreshold=i',
 ) or Usage "Invalid parameter";
 
-local $| = 1;
+# Get options from CGI
+my %CGIOpts = Vars;
 
-$opts{region} ||= '';
+$opts{$_} = $CGIOpts{$_} for keys %CGIOpts;
+
+local $| = 1;
 
 # Announce ourselves
 verbose "$FindBin::Script v$VERSION";
 
 $clearadm = Clearadm->new;
 
-if ($action and $action eq 'generate') {
+if ($opts{action} and $opts{action} eq 'generate') {
   Generate $opts{region};
-  Stats \%total;
+  Stats \%total if $opts{verbose};
 } else {
   if ($opts{region} and ($opts{region} eq 'Clearcase not installed')) {
     heading;
@@ -647,14 +659,15 @@ if ($action and $action eq 'generate') {
     exit 1; 
   } # if
   
-  my @views = $clearadm->FindView (
-    'all',
-    $opts{region},
+  $opts{region} ||= $Clearcase::CC->region;
+
+  my @views = $clearadm->FindView(
     $opts{tag},
+    $opts{region},
     $opts{user}
   );
   
-  if ($action and $action eq 'report') {
+  if ($opts{action} and $opts{action} eq 'report') {
     Report @views;
     Stats \%total;
   } elsif ($email) {
@@ -743,4 +756,4 @@ Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
 
 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
 
-=cut
\ No newline at end of file
+=cut