X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2FUtils.pm;h=9666d81d3e7ef3d1c3e28dd4a8d67e3bd1afd357;hb=7d315689b9496ecf44f7029ada26d927760107c7;hp=a94edd1cc68cc664e25ccdff46490e273320c50f;hpb=81cbd130706633b1c19ff59371c2ef61d80c562b;p=clearscm.git diff --git a/lib/Utils.pm b/lib/Utils.pm index a94edd1..9666d81 100644 --- a/lib/Utils.pm +++ b/lib/Utils.pm @@ -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
+ +=over + +=item $prompt + +Prompt string to use (Default: "Password:") + +=back + +=for html+ +Returns: + +=for html
+ +=over + +=item $password + +=back + +=for html+ +=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
+ +=over + +=item none + +=back + +=for html+ +Returns: + +=for html
+ +=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+ +=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