X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2FUtils.pm;h=b9be1e45a510daaeb0955ddd7ff80a83102816ed;hb=e672c44f0dc66da49b7c7e3da81096bac1663531;hp=74fe13c47b90656318854b9fdbad340c20e343ca;hpb=b04ccb7ff71f4c535d365e2d439d3f1cc4c2678b;p=clearscm.git diff --git a/lib/Utils.pm b/lib/Utils.pm index 74fe13c..b9be1e4 100644 --- a/lib/Utils.pm +++ b/lib/Utils.pm @@ -74,10 +74,12 @@ our @EXPORT = qw ( GetChildren GetPassword InArray + LoadAvg PageOutput PipeOutput PipeOutputArray ReadFile + RequiredFields RedirectOutput StartPipe Stats @@ -88,9 +90,9 @@ our @EXPORT = qw ( sub _restoreTerm () { # In case the user hits Ctrl-C print "\nControl-C\n"; - + ReadMode 'normal'; - + exit; } # _restoreTerm @@ -141,7 +143,7 @@ Returns: $errorlog ||= $NULL; my $file; - + # Redirect STDIN to $NULL open STDIN, '<', $NULL or error "Can't read $NULL ($!)", 1; @@ -155,7 +157,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 +170,7 @@ Returns: # Now the parent exits exit if $pid; - + # Write pidfile if specified if ($pidfile) { $pidfile = File::Spec->rel2abs ($pidfile); @@ -177,14 +179,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 +233,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; @@ -347,20 +343,20 @@ Returns: =cut $prompt ||= 'Password'; - - my $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)/) { @@ -369,15 +365,24 @@ Returns: last; } # if - print '*'; - - $password .= $key; + # Handle backspaces + if ($key eq chr(127)) { + unless ($password eq '') { + chop $password; + + print "\b \b"; + } # unless + } else { + print '*'; + + $password .= $key; + } # if } # while - + ReadMode 'restore'; # Reset tty mode before exiting. $SIG{INT} = 'DEFAULT'; - + return $password; } # GetPassword @@ -429,6 +434,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 ($;$) { @@ -474,10 +533,10 @@ Returns: if ($existingPipe) { close $existingPipe; - + open $existingPipe, '|-', $to or error "Unable to open pipe - $!", 1; - + return $existingPipe; } else { open $pipe, '|-', $to @@ -630,7 +689,7 @@ Returns: $pipeToStop ||= $pipe; close $pipeToStop if $pipeToStop; - + return; } # StopPipe @@ -683,7 +742,7 @@ Returns: sub RedirectOutput ($$@) { my ($to, $mode, @output) = @_; - + =pod =head2 RedirectOutput ($to, @ouput) @@ -732,7 +791,7 @@ Returns: chomp; print $out "$_\n"; } # foreach - + return; } # RedirectOutput @@ -779,27 +838,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 @@ -826,7 +885,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 @@ -847,8 +907,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); @@ -857,16 +922,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 @@ -915,6 +980,67 @@ Returns: exit 1; } # Usage +sub RequiredFields($$) { + +=pod + +=head2 RequiredFields($total, $log) + +Check if a list of fields are contained in a hash + +Parameters: + +=for html
+ +=over + +=item $fields + +Array reference to a list of field names that are required + +=item $rec + +Hash reference whose key values we are checking + +=back + +=for html+ +Returns: + +=for html
+ +=over + +=item Message + +Returns either an empty string or a string naming the first missing required +field + +=back + +=for html+ +=cut + + my ($fields, $rec) = @_; + + for my $fieldname (@$fields) { + my $found = 0; + + for (keys %$rec) { + if ($fieldname eq $_) { + $found = 1; + last; + } # if + } # for + + return "$fieldname is required" unless $found; + } # for + + return; +} # RequiredFields + END { StopPipe; } # END @@ -935,8 +1061,6 @@ L