Fixed FormatTime to properly fill in leading zeros when hours are less
[clearscm.git] / lib / Utils.pm
index a94edd1..9666d81 100644 (file)
@@ -63,6 +63,7 @@ use base 'Exporter';
 use POSIX qw (setsid);
 use File::Spec;
 use Carp;
+use Term::ReadKey;
 
 use OSDep;
 use Display;
@@ -71,7 +72,9 @@ our @EXPORT = qw (
   EnterDaemonMode
   Execute
   GetChildren
+  GetPassword
   InArray
+  LoadAvg
   PageOutput
   PipeOutput
   PipeOutputArray
@@ -83,6 +86,15 @@ our @EXPORT = qw (
   Usage
 );
 
+sub _restoreTerm () {
+  # In case the user hits Ctrl-C
+  print "\nControl-C\n";
+  
+  ReadMode 'normal';
+  
+  exit;
+} # _restoreTerm
+
 sub EnterDaemonMode (;$$$) {
   my ($logfile, $errorlog, $pidfile) = @_;
 
@@ -131,13 +143,6 @@ Returns:
 
   my $file;
   
-  if ($pidfile) {
-    $pidfile =  File::Spec->rel2abs ($pidfile); 
-
-    open $file, '>', $pidfile
-      or warning "Unable to open pidfile $pidfile for writing - $!";  
-  } # if
-  
   # Redirect STDIN to $NULL
   open STDIN, '<', $NULL
     or error "Can't read $NULL ($!)", 1;
@@ -167,6 +172,11 @@ Returns:
   
   # Write pidfile if specified
   if ($pidfile) {
+    $pidfile =  File::Spec->rel2abs ($pidfile); 
+
+    open $file, '>', $pidfile
+      or warning "Unable to open pidfile $pidfile for writing - $!";  
+
     print $file "$$\n";
     
     close $file; 
@@ -300,6 +310,79 @@ Returns:
   return @children;
 } # GetChildren
 
+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)/) {
+       print "\n";
+
+       last;
+    } # if
+
+    print '*';
+    
+    $password .= $key;
+  } # while
+  
+  ReadMode 'restore'; # Reset tty mode before exiting.
+
+  $SIG{INT} = 'DEFAULT';
+  
+  return $password;
+} # GetPassword
+
 sub InArray ($@) {
   my ($item, @array) = @_;
 
@@ -348,6 +431,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 ($;$) {
@@ -447,7 +584,7 @@ Returns:
 
 =cut
 
-  open my $pipe, "|$to" 
+  open my $pipe, '|', $to 
     or error "Unable to open pipe - $!", 1;
 
   foreach (@output) {
@@ -549,6 +686,8 @@ Returns:
   $pipeToStop ||= $pipe;
 
   close $pipeToStop if $pipeToStop;
+  
+  return;
 } # StopPipe
 
 sub PageOutput (@) {
@@ -715,7 +854,7 @@ Returns:
   
     return @cleansed_lines;
   } else {
-    local $/;
+    local $/ = undef;
     
     return <$file>;
   } # if
@@ -743,7 +882,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
 
@@ -765,7 +905,12 @@ Returns:
 
   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);
@@ -774,10 +919,10 @@ 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