Fixed some image handling
[clearscm.git] / lib / Utils.pm
index 1bed47b..8aabcaa 100644 (file)
@@ -74,6 +74,7 @@ our @EXPORT = qw (
   GetChildren
   GetPassword
   InArray
+  LoadAvg
   PageOutput
   PipeOutput
   PipeOutputArray
@@ -88,9 +89,9 @@ our @EXPORT = qw (
 sub _restoreTerm () {
   # In case the user hits Ctrl-C
   print "\nControl-C\n";
-  
+
   ReadMode 'normal';
-  
+
   exit;
 } # _restoreTerm
 
@@ -141,7 +142,7 @@ Returns:
   $errorlog ||= $NULL;
 
   my $file;
-  
+
   # Redirect STDIN to $NULL
   open STDIN, '<', $NULL
     or error "Can't read $NULL ($!)", 1;
@@ -155,7 +156,7 @@ Returns:
     or error "Can't write to $errorlog ($!)", 1;
 
   # Change the current directory to /
-  my $ROOT = $ARCH eq "windows" ? "C:\\" : "/";
+  my $ROOT = $ARCHITECTURE eq "windows" ? "C:\\" : "/";
   chdir $ROOT
     or error "Can't chdir to $ROOT ($!), 1";
 
@@ -168,7 +169,7 @@ Returns:
 
   # Now the parent exits
   exit if $pid;
-  
+
   # Write pidfile if specified
   if ($pidfile) {
     $pidfile =  File::Spec->rel2abs ($pidfile); 
@@ -177,14 +178,14 @@ Returns:
       or warning "Unable to open pidfile $pidfile for writing - $!";  
 
     print $file "$$\n";
-    
+
     close $file; 
   } # if
-  
+
   # Set process to be session leader
   setsid ()
     or error "Can't start a new session ($!)", 1;
-    
+
   return;
 } # EnterDaemonMode
 
@@ -231,16 +232,10 @@ STDOUT then do so in the $command passed in.
 
 =cut
 
-  # Save $SIG{CHLD} so we can set it to 'DEFAULT' and then restore it later.
-  # Helps when you are doing process handling.
-  my $sigchld = $SIG{CHLD};
-
   local $SIG{CHLD} = 'DEFAULT';
 
   my @output = `$cmd`;
   my $status = $?;
-  
-  local $SIG{CHLD} = $sigchld;
 
   chomp @output;
 
@@ -311,22 +306,57 @@ Returns:
 
 sub GetPassword (;$) {
   my ($prompt) = @_;
+
+=pod
+
+=head2 GetPassword (;$prompt)
+
+Prompt for a password
+
+Parameters:
+
+=for html <blockquote>
+
+=over
+
+=item $prompt
+
+Prompt string to use (Default: "Password:")
+
+=back
+
+=for html </blockquote>
+
+Returns:
+
+=for html <blockquote>
+
+=over
+
+=item $password
+
+=back
+
+=for html </blockquote>
+
+=cut  
+
   
   $prompt ||= 'Password';
-  
+
   my $password;
-  
+
   local $| = 1;
-  
+
   print "$prompt:";
-  
+
   $SIG{INT} = \&_restoreTerm;
-  
+
   ReadMode 'cbreak';
 
   while () {
     my $key;
-    
+
     while (not defined ($key = ReadKey -1)) { }
 
     if ($key =~ /(\r|\n)/) {
@@ -336,14 +366,14 @@ sub GetPassword (;$) {
     } # if
 
     print '*';
-    
+
     $password .= $key;
   } # while
-  
+
   ReadMode 'restore'; # Reset tty mode before exiting.
 
   $SIG{INT} = 'DEFAULT';
-  
+
   return $password;
 } # GetPassword
 
@@ -395,6 +425,60 @@ Returns:
   return $FALSE;
 } # InArray
 
+sub LoadAvg () {
+
+=pod
+
+=head2 LoadAvg ()
+
+Return an array of the 1, 5, and 15 minute load averages.
+
+Parameters:
+
+=for html <blockquote>
+
+=over
+
+=item none
+
+=back
+
+=for html </blockquote>
+
+Returns:
+
+=for html <blockquote>
+
+=over
+
+=item An array of the 1, 5, and 15 minute load averages in a list context.
+In a scalar context just the 1 minute load average.
+
+=back
+
+=for html </blockquote>
+
+=cut  
+
+  # TODO: Make it work on Windows...
+  return if $^O =~ /win/i;
+
+  open my $loadAvg, '/proc/loadavg'
+    or croak "Unable to open /proc/loadavg\n";
+
+  my $load = <$loadAvg>;
+
+  close $loadAvg;
+
+  my @loadAvgs = split /\s/, $load;
+
+  if (wantarray) {
+    return @loadAvgs;
+  } else {
+    return $loadAvgs[0]; # This is the 1 minute average
+  }
+} # LoadAvg
+
 our $pipe;
 
 sub StartPipe ($;$) {
@@ -440,10 +524,10 @@ Returns:
 
   if ($existingPipe) {
     close $existingPipe;
-    
+
     open $existingPipe, '|-', $to
       or error "Unable to open pipe - $!", 1;
-      
+
     return $existingPipe;
   } else {
     open $pipe, '|-', $to
@@ -596,7 +680,7 @@ Returns:
   $pipeToStop ||= $pipe;
 
   close $pipeToStop if $pipeToStop;
-  
+
   return;
 } # StopPipe
 
@@ -649,7 +733,7 @@ Returns:
 
 sub RedirectOutput ($$@) {
   my ($to, $mode, @output) = @_;
-  
+
 =pod
 
 =head2 RedirectOutput ($to, @ouput)
@@ -698,7 +782,7 @@ Returns:
     chomp;
     print $out "$_\n";
   } # foreach
-  
+
   return; 
 } # RedirectOutput
 
@@ -745,27 +829,27 @@ Returns:
 
   open my $file, '<', $filename
     or error "Unable to open $filename ($!)", 1;
-    
+
   if (wantarray) {
     local $/ = "\n";
 
     my @lines = <$file>;
-  
+
     close $file
       or error "Unable to close $filename ($!)", 1;
-  
+
     my @cleansed_lines;
-  
+
     foreach (@lines) {
       chomp;
       chop if /\r/;
       push @cleansed_lines, $_ if !/^#/; # Discard comment lines
     } # foreach
-  
+
     return @cleansed_lines;
   } else {
     local $/ = undef;
-    
+
     return <$file>;
   } # if
 } # ReadFile
@@ -792,7 +876,8 @@ and the values of the hash will be the counters.
 
 =item $log
 
-Logger object to log stats to (if specified)
+Logger object to log stats to (if specified). Note: if the Logger object has 
+errors or warnings then they will be automatically included in the output.
 
 =back
 
@@ -813,8 +898,13 @@ Returns:
 =cut
 
   my $msg = "$FindBin::Script Run Statistics:";
-  
-  if (scalar keys %$total) {
+
+  if ($log and ref $log eq 'Logger') {
+    $total->{errors}   = $log->{errors};
+    $total->{warnings} = $log->{warnings};
+  } # if
+
+  if (keys %$total) {
     # Display statistics (if any)
     if ($log) {
       $log->msg ($msg);
@@ -823,16 +913,16 @@ Returns:
     } # if
 
     foreach (sort keys %$total) {
-      $msg = $$total{$_} . "\t $_";
-      
+      $msg = $total->{$_} . "\t $_";
+
       if ($log) {
-        $log->msg ($$total{$_} . "\t $_");
+        $log->msg ($total->{$_} . "\t $_");
       } else {
         display $msg;
       } # if
     } # foreach
   } # if
-  
+
   return;
 } # Stats