From: Andrew DeFaria Date: Fri, 26 Oct 2018 14:27:51 +0000 (-0700) Subject: Updates from work X-Git-Url: https://defaria.com/gitweb/?a=commitdiff_plain;h=bdb1e0c845a6921e22d52fbff3404d5c1dfae520;p=clearscm.git Updates from work Hopefully fixed the ._hist problem. Major improvements to CmdLine.pm New subroutine for Dateutils.pm --- diff --git a/bin/rexec.pl b/bin/rexec.pl index 1c61a3f..b659338 100755 --- a/bin/rexec.pl +++ b/bin/rexec.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl use strict; use warnings; @@ -18,7 +18,7 @@ Andrew DeFaria =item Revision -$Revision: 1.0 $ +$Revision: 2.0 $ =item Created: @@ -35,7 +35,8 @@ $Date: 2008/02/29 15:09:15 $ Usage: rexec.pl [-usa|ge] [-h|elp] [-v|erbose] [-d|ebug] [-use|rname ] [-p|assword ] [-log] - -m|achines ,,... + [-m|achines ,,...] + [-f|ile ] @@ -47,6 +48,7 @@ $Date: 2008/02/29 15:09:15 $ -use|rname: User name to login as (Default: $USER - Env: REXEC_USER) -p|assword: Password to use (Default: None - Env: REXEC_PASSWD) -m|achines: Machine(s) to run the command on + -f|ile: File containing machine info -l|og: Log output (.log) : Commands to execute (Enclose multiple commands in quotes) @@ -119,15 +121,17 @@ my %opts = ( debug => sub { set_debug }, username => $ENV{REXEC_USER} || $ENV{USER}, password => $ENV{REXEC_PASSWD}, - filename => $ENV{REXEC_MACHINES_FILE} || '/opt/clearscm/data/machines', + database => 1, ); sub Interrupted { use Term::ReadKey; - display BLUE . "\nInterrupted execution on $currentHost->{host}" . RESET; + my $host = $currentHost->{host} || 'Unknown Host'; - display_nolf "Executing on " . YELLOW . $currentHost->{host} . RESET . " - " + display BLUE . "\nInterrupted execution on $host" . RESET; + + display_nolf "Executing on " . CYAN . $host . RESET . " - " . CYAN . BOLD . "C" . RESET . CYAN . "ontinue" . RESET . " or " . MAGENTA . BOLD . "A" . RESET . MAGENTA . "bort run" . RESET . " (" . CYAN . BOLD . "C" . RESET . "/" @@ -147,7 +151,7 @@ sub Interrupted { if ($answer eq "s") { *STDOUT->flush; - display "Skipping $currentHost->{host}"; + display "Skipping $host"; } elsif ($answer eq "a") { display RED . "Aborting run". RESET; exit; @@ -161,9 +165,6 @@ sub Interrupted { sub connectHost ($) { my ($host) = @_; - # Start a log... - $log = Logger->new (name => $host) if $opts{log}; - eval { $currentHost = Rexec->new ( host => $host, @@ -184,27 +185,60 @@ sub connectHost ($) { return; } # connectHost +sub initLog($) { + my ($machine) = @_; + + if ($opts{log}) { + my $logdir = $opts{logdir} ? "$opts{logdir}/$machine" : $machine; + + mkdir $logdir or error "Unable to make directory $logdir", 1; + + $log = Logger->new( + name => 'output', + path => $logdir, + ); + } # if +} # initLog + +sub Log($;$) { + my ($msg, $nocrlf) = @_; + + if ($log) { + $log->msg($msg, $nocrlf); + } else { + verbose $msg, $nocrlf; + } # +} # Log + +sub logError ($;$) { + my ($msg, $exit) = @_; + + if ($log) { + $log->err($msg, $exit); + } else { + error $msg, $exit; + } # if +} # logError + sub execute ($$;$) { my ($host, $cmd, $prompt) = @_; my @lines; - verbose_nolf "Connecting to machine $host..."; + Log "Connecting to machine $host...", 1; - display_nolf BOLD . YELLOW . "$host:" . RESET if $opts{verbose}; + display_nolf BOLD . CYAN . "$host:" . RESET if $opts{verbose}; connectHost $host unless $currentHost and $currentHost->{host} eq $host; return (1, ()) unless $currentHost; - verbose " connected"; + Log ' connected'; - display WHITE . UNDERLINE . "$cmd" . RESET if $opts{verbose}; + Log "$host:" . UNDERLINE . $cmd . RESET; @lines = $currentHost->execute ($cmd); - verbose "Disconnected from $host"; - my $status = $currentHost->status; return ($status, @lines); @@ -224,8 +258,9 @@ GetOptions ( 'log', 'logdir', 'filename=s', - 'database', + 'database!', 'machines=s@', + 'condition=s', ) or pod2usage; $opts{debug} = get_debug if ref $opts{debug} eq 'CODE'; @@ -233,38 +268,47 @@ $opts{verbose} = get_verbose if ref $opts{verbose} eq 'CODE'; my $cmd = join ' ', @ARGV; +$opts{machines} = [$ENV{REXEC_HOST}] if $ENV{REXEC_HOST}; + unless ($opts{machines}) { - $opts{machines} = [$ENV{REXEC_HOST}] if $ENV{REXEC_HOST}; -} # unless + # Connect to Machines module + my $machines; -# Connect to Machines module -my $machines; + unless ($opts{database}) { + require Machines; Machines->import; -unless ($opts{database}) { - require Machines; Machines->import; + $machines = Machines->new(filename => $opts{filename}); + } else { + require Machines::MySQL; Machines::MySQL->import; - $machines = Machines->new(filename => $opts{filename}); -} else { - require Machines::MySQL; Machines::MySQL->import; + $machines = Machines::MySQL->new; - $machines = Machines::MySQL->new; -} # if + my %machines = $machines->select($opts{condition}); -my %machines = $machines->select; + $opts{machines} = [keys %machines]; + } # if +} # if my ($status, @lines); -for my $machine (sort keys %machines) { +for my $machine (sort @{$opts{machines}}) { + initLog $machine; + if ($cmd) { ($status, @lines) = execute $machine, $cmd; - display BOLD . YELLOW . "$machine:" . RESET . WHITE . $cmd; + display BOLD . CYAN . "$machine:" . UNDERLINE . WHITE . $cmd . RESET; + + logError "Execution of $cmd on $machine failed", $status if $status; - error "Execution of $cmd on $machine yielded error $status" if $status; + if ($log) { + $log->log($_) for @lines; + } # if display $_ for @lines; undef $currentHost; + undef $log; } else { verbose_nolf "Connecting to machine $machine..."; @@ -273,13 +317,15 @@ for my $machine (sort keys %machines) { if ($currentHost) { my $cmdline = CmdLine->new (); - $cmdline->set_prompt (BOLD . YELLOW . "$machine:" . RESET . WHITE); + $cmdline->set_prompt (BOLD . CYAN . "$machine:" . RESET . WHITE); while () { - #$cmd = ; + Log "$machine:"; + $cmd = $cmdline->get(); unless ($cmd) { + $log->msg('') if $log; display ''; last; } # unless @@ -289,12 +335,17 @@ for my $machine (sort keys %machines) { chomp $cmd; + Log $cmd; + ($status, @lines) = execute $machine, $cmd; - error "Execution of $cmd on $machine yielded error $status" if $status; + logError "Execution of $cmd on $machine failed", $status if $status; + Log $_ for @lines; display $_ for @lines; } # while } # if + + undef $log; } # if } # for diff --git a/data/machines b/data/machines index 83d6961..db2246e 100644 --- a/data/machines +++ b/data/machines @@ -11,28 +11,22 @@ # Column 4 ClearCase Version (if applicable) # Column 5 Owner (if known) # Column 6 Usage (if known) -chargers:Sun:Solaris 5.9:7.0.1.1:ccadm:ranview1 -colts:Sun:Solaris 5.9:7.0.1.0:ccadm:ranview2 -cowboys:Sun:Solaris 5.9:7.0.1.0:ccadm:ranvob1/registry server -niners:Sun:Solaris 5.9:2003.06.10+:ccadm: -patriots:Sun:Solaris 5.9:7.0.1.0:ccadm:ranvob2 -rams:Sun:Solaris 5.9:7.0.1.0:ccadm:ranvob3/registry server -#ranadm1:Sun:Solaris 5.9::ccadm:Jumpstart, PowerBroker, NIS, SMTP, DNS, NTP -ranadm2:Sun:Solaris 5.9:2003.06.10+:ccadm:License server, Sys admin, NIS, Home Directory server -ranbkp2::::ccadm:Backup -ranbuild1:Sun:Solaris 5.8:7.0.1.0:ccadm:builds -ranbuild2:Sun:Solaris 5.9:2003.06.10+:ccadm:builds -ranbuild4:Sun:Solaris 5.9:7.0.1.1:ccadm:builds -rancpp01:Redhat Linux:2.6.18.53.Eel5xen::ccadm: -rancpp02:Redhat Linux:2.6.18.53.Eel5xen::ccadm: -rancpp03:Redhat Linux:2.6.18.53.Eel5xen::ccadm: -rancpp10:Redhat Linux:2.6.18.53.Eel5xen::ccadm: -#randbs:Sun:Solaris 5.9::ccadm:CQ DB server/Bldforge -randws094:Sun:Solaris 5.10:7.0.1.1:John Hartin:Old workstation -randws103:Sun:Solaris 5.9:7.0.1.1:: -randws106:Sun:Solaris 5.9:2003.06.10+:: -randws113:Sun:Solaris 5.9:7.0.1.1:: -randws114:Sun:Solaris 5.9:2003.06.10+:Tony Trujilo: -randws119:Sun:Solaris 5.9:7.0.1.1:Hy Truong:Workstation -ranlin03:Redhat Linux:2.4.21-50.Elsmp::ccadm: -ranray:Sun:Solaris 5.9:2003.06.10+:ccadm: +rdeadm1:Oracle:Solaris 5.11:9.0.0:Tools Team:Primary Admin Server, NIS Master, DNS slave +rdeadm2:Oracle:Solaris 5.11:9.0.0:Tools Team:Secondary Admin Server, home, NIS Slave, DNS Master, mail and prj +rdevob1:Oracle:Solaris 5.11:9.0.0:Tools Team:Clearcase Vob Server 1 +rdevob2:Oracle:Solaris 5.11:9.0.0:Tools Team:Clearcase Vob Server 2 +rdeview1:Oracle:Solaris 5.11:9.0.0:Tools Team:Clearcase View Server +rdebuild1:Oracle:Solaris 5.11:9.0.0:Tools Team:Build Server 1 +rdebuild2:Oracle:Solaris 5.11:9.0.0:Tools Team:Build Server 2 +rdebuild3:Oracle:Solaris 5.11:9.0.0:Tools Team:Build Server 3 +rdebuild4:Oracle:Solaris 5.11:9.0.0:Tools Team:Build Server 4 +rdedws000:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws033:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws035:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws036:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws094:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws103:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws106:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws113:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws114:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop +rdedws119:Oracle:Solaris 5.11:9.0.0:Tools Team:Engineering Desktop diff --git a/lib/CmdLine.pm b/lib/CmdLine.pm index ed92843..6920f0b 100644 --- a/lib/CmdLine.pm +++ b/lib/CmdLine.pm @@ -93,13 +93,19 @@ use Display; use Utils; use Term::ReadLine; -use Term::ANSIColor qw (color); +use Term::ANSIColor qw(color); # Package globals my $_pos = 0; my $_haveGnu; -my (%_cmds, $_cmdline, $_attribs); +my $promptColor = color('bold yellow'); +my $inputColor = color('underline'); +my $resetColor = color('reset'); + +my (%_cmds, $_attribs); + +our $_cmdline; BEGIN { # See if we can load Term::ReadLine::Gnu @@ -114,7 +120,9 @@ BEGIN { } # BEGIN # Share %opts -our %opts; +our %opts = ( + color => 1, +); my %builtin_cmds = ( history => { @@ -167,7 +175,7 @@ the specified file.', }, ); -sub _cmdCompletion ($$) { +sub _cmdCompletion($$) { my ($text, $state) = @_; return unless %_cmds; @@ -184,13 +192,13 @@ sub _cmdCompletion ($$) { return; } # _cmdCompletion -sub _complete ($$$$) { +sub _complete($$$$) { my ($text, $line, $start, $end) = @_; return $_cmdline->completion_matches ($text, \&CmdLine::_cmdCompletion); } # _complete -sub _gethelp () { +sub _gethelp() { my ($self) = @_; return unless %_cmds; @@ -205,10 +213,10 @@ sub _gethelp () { # Sometimes we are called by ReadLine's callback and can't pass $self if (ref $self eq 'CmdLine') { - $self->help ($line); + $self->help($line); } else { - $CmdLine::cmdline->help ($line); - } # if + $CmdLine::cmdline->help($line); + } # if $_cmdline->on_new_line; } # _gethelp @@ -217,21 +225,20 @@ sub _interpolate ($) { my ($self, $str) = @_; # Skip interpolation for the perl command (Note this is raid specific) - return $str - if $str =~ /^\s*perl\s*/i; + return $str if $str =~ /^\s*perl\s*/i; while ($str =~ /\$/) { if ($str =~ /\$(\w+)/) { my $varname = $1; - if (defined $self->{vars}{$varname}) { - if ($self->{vars}{$varname} =~ / /) { - $str =~ s/\$$varname/\'$self->{vars}{$varname}\'/; - } else { + if ($self->{vars}{$varname}) { + if ($self->{vars}{$varname} =~ / /) { + $str =~ s/\$$varname/\'$self->{vars}{$varname}\'/; + } else { $str =~ s/\$$varname/$self->{vars}{$varname}/; - } # if + } # if } else { - $str =~ s/\$$varname//; + $str =~ s/\$$varname//; } # if } # if } # while @@ -239,7 +246,7 @@ sub _interpolate ($) { return $str; } # _interpolate -sub _builtinCmds ($) { +sub _builtinCmds($) { my ($self, $line) = @_; unless (defined $line) { @@ -259,7 +266,7 @@ sub _builtinCmds ($) { system $1; } # if - #$_cmdline->remove_history ($_cmdline->where_history); + #$_cmdline->remove_history($_cmdline->where_history); return; } # if @@ -268,15 +275,14 @@ sub _builtinCmds ($) { $cmd = $1; } # if - return - unless $cmd; + return unless $cmd; my @parms; # Search for matches of partial commands my $foundCmd; - for (keys %builtin_cmds) { + for (keys %builtin_cmds) { if ($_ eq $cmd) { # Exact match - honor it $foundCmd = $cmd; @@ -303,7 +309,7 @@ sub _builtinCmds ($) { if ($builtin_cmds{$cmd}) { if ($line =~ /^\s*help\s*(.*)/i) { if ($1 =~ /(.+)$/) { - $self->help ($1); + $self->help($1); } else { $self->help; } # if @@ -311,22 +317,22 @@ sub _builtinCmds ($) { if ($1 =~ /(\d+)\s+(\d+)\s*$/) { $self->history ('list', $1, $2); } elsif ($1 =~ /^\s*$/) { - $self->history ('list'); + $self->history('list'); } else { error "Invalid usage"; - $self->help ('history'); + $self->help('history'); } # if } elsif ($line =~ /^\s*savehist\s*(.*)/i) { if ($1 =~ /(\S+)\s+(\d+)\s+(\d+)\s*$/) { - $self->history ('save', $1, $2, $3); + $self->history('save', $1, $2, $3); } else { error 'Invalid usage'; - $self->help ('savehist'); + $self->help('savehist'); } # if } elsif ($line =~ /^\s*get\s*(.*)/i) { if ($1 =~ (/^\$*(\S+)\s*$/)) { - my $value = $self->_get ($1); - + my $value = $self->_get($1); + if ($value) { display "$1 = $value"; } else { @@ -334,14 +340,14 @@ sub _builtinCmds ($) { } # if } else { error 'Invalid usage'; - $self->help ('get'); + $self->help('get'); } # if } elsif ($line =~ /^\s*set\s*(.*)/i) { if ($1 =~ /^\$*(\S+)\s*=\s*(.*)/) { - $self->_set ($1, $2) + $self->_set($1, $2) } else { error 'Invalid usage'; - $self->help ('set'); + $self->help('set'); } # if } elsif ($line =~ /^\s*source\s+(\S+)/i) { $result = $self->source ($1); @@ -350,11 +356,12 @@ sub _builtinCmds ($) { } elsif ($line =~ /^\s*color\s*(.*)/i) { if ($1 =~ /(1|on)/i) { $opts{color} = 1; - delete $ENV{ANSI_COLORS_DISABLED} - if $ENV{ANSI_COLORS_DISABLED}; + delete $ENV{ANSI_COLORS_DISABLED} if $ENV{ANSI_COLORS_DISABLED}; + $self->set_prompt; } elsif ($1 =~ /(0|off)/i) { - $opts{trace} = 0; + $opts{color} = 0; $ENV{ANSI_COLORS_DISABLED} = 1; + $self->set_prompt; } elsif ($1 =~ /\s*$/) { if ($ENV{ANSI_COLORS_DISABLED}) { display 'Color is currently off'; @@ -363,7 +370,7 @@ sub _builtinCmds ($) { } # if } else { error 'Invalid usage'; - $self->help ('color'); + $self->help('color'); } # if } elsif ($line =~ /^\s*trace\s*(.*)/i) { if ($1 =~ /(1|on)/i) { @@ -378,7 +385,7 @@ sub _builtinCmds ($) { } # if } else { error 'Invalid usage'; - $self->help ('trace'); + $self->help('trace'); } # if } # if } # if @@ -388,7 +395,7 @@ sub _builtinCmds ($) { sub _interrupt () { # Announce that we have hit an interrupt - print color ('yellow') . "\n" . color ('reset'); + print color('yellow') . "\n" . color('reset'); # Free up all of the line state info $_cmdline->free_line_state; @@ -404,14 +411,14 @@ sub _interrupt () { return; } # _interrupt -sub _displayMatches ($$$) { +sub _displayMatches($$$) { my ($matches, $numMatches, $maxLength) = @_; - + # Work on a copy... (Otherwise we were getting "Attempt to free unreferenced # scalar" internal errors from perl) my @Matches; - push @Matches, $_ for (@$matches); + push @Matches, $_ for (@$matches); my $match = shift @Matches; @@ -436,14 +443,14 @@ sub _displayMatches ($$$) { unshift @newMatches, $match; - $_cmdline->display_match_list (\@newMatches); + $_cmdline->display_match_list(\@newMatches); $_cmdline->on_new_line; $_cmdline->redisplay; return; } # _displayMatches - -sub new (;$$%) { + +sub new(;$$%) { my ($class, $histfile, $eval, %cmds) = @_; =pod @@ -507,7 +514,7 @@ Returns: my $me = get_me; - $histfile ||= ".${me}_hist"; + $histfile ||= "$ENV{HOME}/.${me}_hist"; error "Creating bogus .${me}_hist file!" if $me eq '-' or $me eq ''; @@ -520,7 +527,7 @@ Returns: } # unless # Instantiate a commandline - $_cmdline = Term::ReadLine->new ($me); + $_cmdline = Term::ReadLine->new($me); # Store the function pointer of what to call when sourcing a file or # evaluating an expression. @@ -532,17 +539,21 @@ Returns: } # if } # if + $self->{promptColor} = $promptColor; + $self->{inputColor} = $inputColor; + $self->{resetColor} = $resetColor; + # Default prompt is "$me:" - $self->{prompt} = "$me:"; + $self->set_prompt("$me:"); # Set commands - $self->set_cmds (%cmds); + $self->set_cmds(%cmds); # Set some ornamentation - $_cmdline->ornaments ('s,e,u,') unless $Config{cppflags} =~ /win32/i; + $_cmdline->ornaments('e,,u') unless $Config{cppflags} =~ /win32/i; # Read in history - $self->set_histfile ($histfile); + $self->set_histfile($histfile); # Generator function for completion matches $_attribs = $_cmdline->Attribs; @@ -555,7 +566,7 @@ Returns: # The following functionality requires Term::ReadLine::Gnu if ($_haveGnu) { # Bind a key to display completion - $_cmdline->add_defun ('help-on-command', \&CmdLine::_gethelp, ord ("\cl")); + $_cmdline->add_defun('help-on-command', \&CmdLine::_gethelp, ord ("\cl")); # Save a handy copy of RL_PROMPT_[START|END]_IGNORE $self->{ignstart} = $_cmdline->RL_PROMPT_START_IGNORE; @@ -570,7 +581,7 @@ Returns: return $self; } # new -sub get () { +sub get() { my ($self) = @_; =pod @@ -613,6 +624,9 @@ Returns: $prompt =~ s/\\\#/$self->{cmdnbr}/g; + # Now color it if color is on + $prompt = "$self->{resetColor}$self->{promptColor}$prompt$self->{resetColor}$self->{inputColor}" if $self->{promptColor}; + use POSIX; # Term::ReadLine::Gnu restarts whatever system call it is using, such that @@ -633,29 +647,32 @@ Returns: $oldaction = POSIX::SigAction->new; # Set up our unsafe signal handler - POSIX::sigaction (&POSIX::SIGINT, $sigaction, $oldaction); + POSIX::sigaction(&POSIX::SIGINT, $sigaction, $oldaction); } # if - $line = $_cmdline->readline ($prompt); + $line = $_cmdline->readline($prompt); + + display_nolf $resetColor; # Restore the old signal handler if ($Config{cppflags} !~ /win32/i) { - POSIX::sigaction (&POSIX::SIGINT, $oldaction); + POSIX::sigaction(&POSIX::SIGINT, $oldaction); } # if - $line = $self->_interpolate ($line) - if $line; + $line = $self->_interpolate($line) if $line; - $self->{cmdnbr}++ - unless $self->{sourcing}; + $self->{cmdnbr}++ unless $self->{sourcing}; - ($cmd, $line, $result) = $self->_builtinCmds ($line); + ($cmd, $line, $result) = $self->_builtinCmds($line); - $line = '' - unless $cmd; + $line = '' unless $cmd; } while ($cmd and $builtin_cmds{$cmd}); - return ($line, $result); + if (wantarray) { + return ($line, $result); + } else { + return $result || $line; + } # if } # get sub set_cmds (%) { @@ -743,14 +760,22 @@ Returns: =cut - my $return = $self->{prompt}; + my $oldPrompt = $self->{prompt}; + + $self->{prompt} = $prompt if $prompt; - $self->{prompt} = $prompt; + if ($opts{color}) { + $self->{promptColor} = $promptColor; + $self->{resetColor} = $resetColor; + } else { + undef $self->{promptColor}; + undef $self->{resetColor}; + } # if - return $return; + return $oldPrompt; } # set_prompt -sub set_histfile ($) { +sub set_histfile($) { my ($self, $histfile) = @_; =pod @@ -795,7 +820,7 @@ Returns: $_cmdline->clear_history; # Now read histfile - $_cmdline->ReadHistory ($histfile); + $_cmdline->ReadHistory($histfile); } # if # Determine the number of lines in the history file @@ -811,7 +836,7 @@ Returns: return; } # set_histfile -sub set_eval (;\&) { +sub set_eval(;\&) { my ($self, $eval) = @_; =pod @@ -856,7 +881,7 @@ Returns: return $returnEval; } # set_eval -sub help (;$) { +sub help(;$) { my ($self, $cmd) = @_; =pod @@ -913,9 +938,9 @@ Returns: if (/$searchStr/i) { $helpFound = 1; - my $cmdcolor = $builtin_cmds{$_} ? color ('cyan') : color ('magenta'); - my $boldOn = $builtin_cmds{$_} ? color ('white on_cyan') : color ('white on_magenta'); - my $boldOff = color ('reset') . $cmdcolor; + my $cmdcolor = $builtin_cmds{$_} ? color('cyan') : color ('magenta'); + my $boldOn = $builtin_cmds{$_} ? color('white on_cyan') : color ('white on_magenta'); + my $boldOff = color('reset') . $cmdcolor; $cmd = "$cmdcolor$_"; $cmd =~ s/($searchStr)/$boldOn$1$boldOff/g; @@ -955,12 +980,12 @@ Returns: } # for } # if - $self->handleOutput ($cmd, @help); + $self->handleOutput($cmd, @help); return; } # help -sub history (;$) { +sub history(;$) { my ($self, $action) = @_; =pod @@ -1023,15 +1048,15 @@ Returns: $start = $_[3]; $end = $_[4]; } elsif ($action eq 'redo') { - $_cmdline->remove_history ($_cmdline->where_history); + $_cmdline->remove_history($_cmdline->where_history); my $nbr = $_[2]; - my $line = $_cmdline->history_get ($nbr); + my $line = $_cmdline->history_get($nbr); - $_cmdline->add_history ($line); + $_cmdline->add_history($line); display $line; - my ($cmd, $result) = $self->_builtinCmds ($line); + my ($cmd, $result) = $self->_builtinCmds($line); if ($builtin_cmds{$cmd}) { return; @@ -1106,12 +1131,12 @@ Returns: return; } # history -sub _get ($$) { +sub _get($$) { my ($self, $name) = @_; =pod -=head2 _get ($name) +=head2 _get($name) This method gets a variable to a value stored in the CmdLine object. @@ -1147,7 +1172,7 @@ Returns: return $self->{vars}{$name} } # _get -sub _set ($$) { +sub _set($$) { my ($self, $name, $value) = @_; =pod @@ -1191,14 +1216,14 @@ Returns: my $returnValue = $self->{vars}{$name}; - if (defined $value) { - $value = $self->_interpolate ($value); + if ($value) { + $value = $self->_interpolate($value); # Do not call eval if we are setting result - otherwise we recurse # infinitely. unless ($name eq 'result') { no strict; - $value = $self->{eval} ($value) + $value = $self->{eval}($value) if $self->{eval}; use strict; } # unless @@ -1211,12 +1236,12 @@ Returns: return $returnValue; } # _set -sub vars ($) { +sub vars($) { my ($self, $cmd) = @_; =pod -=head2 vars ($name) +=head2 vars($name) This method will print out all known variables @@ -1251,10 +1276,10 @@ Returns: push @output, "$_ = $self->{vars}{$_}" for (keys %{$self->{vars}}); - $self->handleOutput ($cmd, @output); + $self->handleOutput($cmd, @output); } # vars -sub handleOutput ($@) { +sub handleOutput($@) { my ($self, $line, @output) = @_; =pod @@ -1321,17 +1346,14 @@ Returns: local $SIG{PIPE} = 'IGNORE'; - open $pipe, '|', $pipeToCmd - or undef $pipe; + open $pipe, '|', $pipeToCmd or undef $pipe; # TODO: Not handling the output here. Need open2 and then recursively call # handleOutput. if ($pipe) { - print $pipe "$_\n" - for (@output); + print $pipe "$_\n" for (@output); - close $pipe - or error "Unable to close pipe for $pipeToCmd - $!"; + close $pipe or error "Unable to close pipe for $pipeToCmd - $!"; } else { error "Unable to open pipe for $pipeToCmd - $!"; } # if @@ -1342,8 +1364,7 @@ Returns: open my $output, '>', $outToFile; if ($output) { - print $output "$_\n" - for (@output); + print $output "$_\n" for (@output); close $output; @@ -1357,7 +1378,7 @@ Returns: return; } # handleOutput -sub source ($) { +sub source($) { my ($self, $file) = @_; =pod @@ -1432,12 +1453,12 @@ Returns: $_ = $self->_interpolate ($_); # Check to see if it's a builtin - my ($cmd, $line, $result) = $self->_builtinCmds ($_); + my ($cmd, $line, $result) = $self->_builtinCmds($_); next if $builtin_cmds{$cmd}; no strict; - $result = $self->{eval} ($line); + $result = $self->{eval}($line); use strict; if (defined $result) { @@ -1459,7 +1480,7 @@ Returns: sub DESTROY { my ($self) = @_; - $_cmdline->WriteHistory ($self->{histfile}) + $_cmdline->WriteHistory($self->{histfile}) if $_cmdline and $_haveGnu; return; diff --git a/lib/DateUtils.pm b/lib/DateUtils.pm index f106394..40a581e 100644 --- a/lib/DateUtils.pm +++ b/lib/DateUtils.pm @@ -60,7 +60,7 @@ use Time::Local; use Display; use Utils; -our @EXPORT = qw ( +our @EXPORT = qw( Add Age Compare @@ -79,6 +79,7 @@ our @EXPORT = qw ( YMDHMS timestamp ymdhms + MDYHMS2SQLDatetime ); my @months = ( @@ -101,11 +102,11 @@ my $SECS_IN_HOUR = $SECS_IN_MIN * 60; my $SECS_IN_DAY = $SECS_IN_HOUR * 24; # Forwards -sub Today2SQLDatetime (); -sub DateToEpoch ($); -sub EpochToDate ($); +sub Today2SQLDatetime(); +sub DateToEpoch($); +sub EpochToDate($); -sub ymdhms { +sub ymdhms(;$) { my ($time) = @_; $time ||= time; @@ -120,7 +121,7 @@ sub ymdhms { $wday, $yday, $isdst - ) = localtime ($time); + ) = localtime($time); # Adjust month $mon++; @@ -138,7 +139,7 @@ sub ymdhms { return $year, $mon, $mday, $hour, $min, $sec; } # ymdhms -sub julian ($$$) { +sub julian($$$) { my ($year, $month, $day) = @_; my $days = 0; @@ -153,19 +154,19 @@ sub julian ($$$) { return $days + $day; } # julian -sub _is_leap_year ($) { +sub _is_leap_year($) { my ($year) = @_; - + return 0 if $year % 4; return 1 if $year % 100; return 0 if $year % 400; - + return 1; } # _is_leap_year -sub Add ($%) { +sub Add($%) { my ($datetime, %parms) = @_; - + =pod =head2 Add ($datetime, %parms) @@ -191,7 +192,7 @@ Hash of parms. Acceptable values are of the following format: hours => $hours days => $days month => $month - + Note that month will simply increment the month number, adjusting for overflow of year if appropriate. Therefore a date of 2/28/2001 would increase by 1 month to yield 3/28/2001. And, unfortunately, an increase of 1 month to 1/30/2011 @@ -222,47 +223,47 @@ Returns: 'days', 'months', ); - - foreach (keys %parms) { - unless (InArray ($_, @validKeys)) { + + for (keys %parms) { + unless (InArray($_, @validKeys)) { croak "Invalid key in DateUtils::Add: $_"; } # unless - } # foreach - + } # for + my $epochTime = DateToEpoch $datetime; - + my $amount = 0; - + $parms{seconds} ||= 0; $parms{minutes} ||= 0; $parms{hours} ||= 0; $parms{days} ||= 0; - + $amount += $parms{days} * $SECS_IN_DAY; $amount += $parms{hours} * $SECS_IN_HOUR; $amount += $parms{minutes} * $SECS_IN_MIN; $amount += $parms{seconds}; - + $epochTime += $amount; $datetime = EpochToDate $epochTime; - + if ($parms{month}) { my $years = $parms{month} / 12; my $months = $parms{month} % 12; - + my $month = substr $datetime, 5, 2; - + $years += ($month + $months) / 12; - substr ($datetime, 5, 2) = ($month + $months) % 12; - - substr ($datetime, 0, 4) = substr ($datetime, 0, 4) + $years; + substr($datetime, 5, 2) = ($month + $months) % 12; + + substr($datetime, 0, 4) = substr ($datetime, 0, 4) + $years; } # if - + return $datetime; } # Add -sub Age ($) { +sub Age($) { my ($timestamp) = @_; =pod @@ -311,13 +312,13 @@ Returns: my $timestamp_days = julian $timestamp_year, $month, $day; if ($timestamp_year > $today_year or - ($timestamp_days > $today_days and $timestamp_year == $today_year)) { + ($timestamp_days > $today_days and $timestamp_year == $today_year)) { return; } else { my $leap_days = 0; for (my $i = $timestamp_year; $i < $today_year; $i++) { - + $leap_days++ if $i % 4 == 0; } # for @@ -326,9 +327,9 @@ Returns: } # if } # Age -sub Compare ($$) { +sub Compare($$) { my ($date1, $date2) = @_; - + =pod =head2 Compare ($date2, $date2) @@ -371,9 +372,9 @@ Returns: return DateToEpoch ($date1) <=> DateToEpoch ($date2); } # Compare -sub DateToEpoch ($) { +sub DateToEpoch($) { my ($date) = @_; - + =pod =head2 DateToEpoch ($datetime) @@ -414,13 +415,13 @@ Returns: my $hour = substr $date, 11, 2; my $minute = substr $date, 14, 2; my $seconds = substr $date, 17, 2; - + my $days; for (my $i = 1970; $i < $year; $i++) { $days += _is_leap_year ($i) ? 366 : 365; } # for - + my @monthDays = ( 0, 31, @@ -435,23 +436,23 @@ Returns: 304, 334, ); - + $days += $monthDays[$month - 1]; - + $days++ if _is_leap_year ($year) and $month > 2; - + $days += $day - 1; - + return ($days * $SECS_IN_DAY) + ($hour * $SECS_IN_HOUR) + ($minute * $SECS_IN_MIN) + $seconds; } # DateToEpoch -sub EpochToDate ($) { +sub EpochToDate($) { my ($epoch) = @_; - + =pod =head2 EpochToDate ($epoch) @@ -490,19 +491,19 @@ Returns: my ($month, $day, $hour, $minute, $seconds); my $leapYearSecs = 366 * $SECS_IN_DAY; my $yearSecs = $leapYearSecs - $SECS_IN_DAY; - + while () { my $amount = _is_leap_year ($year) ? $leapYearSecs : $yearSecs; - + last if $amount > $epoch; - + $epoch -= $amount; $year++; } # while - - my $leapYearAdjustment = _is_leap_year ($year) ? 1 : 0; - + + my $leapYearAdjustment = _is_leap_year($year) ? 1 : 0; + if ($epoch >= (334 + $leapYearAdjustment) * $SECS_IN_DAY) { $month = '12'; $epoch -= (334 + $leapYearAdjustment) * $SECS_IN_DAY; @@ -540,24 +541,24 @@ Returns: $month = '01'; } # if - $day = int (($epoch / $SECS_IN_DAY) + 1); + $day = int(($epoch / $SECS_IN_DAY) + 1); $epoch = $epoch % $SECS_IN_DAY; - $hour = int ($epoch / $SECS_IN_HOUR); + $hour = int($epoch / $SECS_IN_HOUR); $epoch = $epoch % $SECS_IN_HOUR; - $minute = int ($epoch / $SECS_IN_MIN); + $minute = int($epoch / $SECS_IN_MIN); $seconds = $epoch % $SECS_IN_MIN; - + $day = "0$day" if $day < 10; $hour = "0$hour" if $hour < 10; $minute = "0$minute" if $minute < 10; $seconds = "0$seconds" if $seconds < 10; - + return "$year-$month-$day $hour:$minute:$seconds"; } # EpochToDate -sub UTCTime ($) { +sub UTCTime($) { my ($datetime) = @_; - + =pod =head2 UTCTime ($epoch) @@ -593,10 +594,10 @@ Returns: =cut my @localtime = localtime; - my ($sec, $min, $hour, $mday, $mon, $year) = gmtime ( + my ($sec, $min, $hour, $mday, $mon, $year) = gmtime( DateToEpoch ($datetime) - (timegm (@localtime) - timelocal (@localtime)) ); - + $year += 1900; $mon++; @@ -605,13 +606,13 @@ Returns: $hour = '0' . $hour if $hour < 10; $mon = '0' . $mon if $mon < 10; $mday = '0' . $mday if $mday < 10; - + return "$year-$mon-${mday}T$hour:$min:${sec}Z"; } # UTCTime -sub UTC2Localtime ($) { +sub UTC2Localtime($) { my ($utcdatetime) = @_; - + # If the field does not look like a UTC time then just return it. return $utcdatetime unless $utcdatetime =~ /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/; @@ -625,7 +626,7 @@ sub UTC2Localtime ($) { ); } # UTC2Localtime -sub FormatDate ($) { +sub FormatDate($) { my ($date) = @_; =pod @@ -669,7 +670,7 @@ Returns: . substr ($date, 0, 4); } # FormatDate -sub FormatTime ($) { +sub FormatTime($) { my ($time) = @_; =pod @@ -711,13 +712,13 @@ Returns: my $AmPm = $hours > 12 ? "Pm" : "Am"; $hours = $hours - 12 if $hours > 12; - + $hours = "0$hours" if length $hours == 1; return "$hours:$minutes $AmPm"; } # FormatTime -sub MDY (;$) { +sub MDY(;$) { my ($time) = @_; =pod @@ -759,7 +760,7 @@ Returns: return "$mon/$mday/$year"; } # MDY -sub SQLDatetime2UnixDatetime ($) { +sub SQLDatetime2UnixDatetime($) { my ($sqldatetime) = @_; =pod @@ -814,12 +815,12 @@ Returns: my $year = substr $sqldatetime, 0, 4; my $month = substr $sqldatetime, 5, 2; my $day = substr $sqldatetime, 8, 2; - my $time = FormatTime (substr $sqldatetime, 11); + my $time = FormatTime(substr $sqldatetime, 11); return $months{$month} . " $day, $year \@ $time"; } # SQLDatetime2UnixDatetime -sub SubtractDays ($$) { +sub SubtractDays($$) { my ($timestamp, $nbr_of_days) = @_; =pod @@ -913,7 +914,7 @@ Returns: return $year . "-" . $month . "-" . $days . substr $timestamp, 10; } # SubtractDays -sub Today2SQLDatetime () { +sub Today2SQLDatetime() { =pod @@ -950,7 +951,7 @@ Returns: return UnixDatetime2SQLDatetime (scalar (localtime)); } # Today2SQLDatetime -sub UnixDatetime2SQLDatetime ($) { +sub UnixDatetime2SQLDatetime($) { my ($datetime) = @_; =pod @@ -1059,7 +1060,7 @@ Returns: unless ($months{$month_name}) { $month_name = substr $datetime, 8, 3; } # unless - + my $month = $months{$month_name}; my $time = substr $datetime, 11, 8; @@ -1071,12 +1072,12 @@ Returns: warning "Year undefined for $orig_datetime\nReturning today's date"; return Today2SQLDatetime; } # unless - + unless ($month) { warning "Month undefined for $orig_datetime\nReturning today's date"; return Today2SQLDatetime; } # unless - + unless ($day) { warning "Day undefined for $orig_datetime\nReturning today's date"; return Today2SQLDatetime; @@ -1090,7 +1091,7 @@ Returns: return "$year-$month-$day $time"; } # UnixDatetime2SQLDatetime -sub YMD (;$) { +sub YMD(;$) { my ($time) = @_; =pod @@ -1132,7 +1133,7 @@ Returns: return "$year$mon$mday"; } # YMD -sub YMDHM (;$) { +sub YMDHM(;$) { my ($time) = @_; =pod @@ -1174,7 +1175,7 @@ Returns: return "$year$mon$mday\@$hour:$min"; } # YMDHM -sub YMDHMS (;$) { +sub YMDHMS(;$) { my ($time) = @_; =pod @@ -1216,7 +1217,7 @@ Returns: return "$year$mon$mday\@$hour:$min:$sec"; } # YMDHMS -sub timestamp (;$) { +sub timestamp(;$) { my ($time) = @_; =pod @@ -1256,6 +1257,72 @@ Returns: return "$year$mon${mday}_$hour$min$sec"; } # timestamp +sub MDYHMS2SQLDatetime($) { + my ($datetime) = @_; + + $datetime =~ s/^\s+|\s+$//g; + + my ($year, $mon, $day, $hour, $min, $sec, $ampm); + + # For datetime format of MM/DD/YYYY HH:MM:SS [Am|Pm] + if ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2}) (\w{2})$/) { + $mon = $1; + $day = $2; + $year = $3; + $hour = $4; + $min = $5; + $sec = $6; + $ampm = $7; + # For datetime format of MM/DD/YYYY HH:MM:SS + } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/){ + $mon = $1; + $day = $2; + $year = $3; + $hour = $4; + $min = $5; + $sec = $6; + # For datetime format of MM/DD/YYYY + } elsif ($datetime =~ /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) { + $mon = $1; + $day = $2; + $year = $3; + $hour = '00'; + $min = '00'; + $sec = '00'; + } else { + return + } # if + + # Range checks + return if $mon > 12 or $mon <= 0; + return if $day > 31 or $day <= 0; + return if $hour > 23 or $hour < 0; + return if $min > 59 or $min < 0; + + if ($day >= 31 and ($mon == 2 + or $mon == 4 + or $mon == 6 + or $mon == 9 + or $mon == 11)) { + return; + } # if + + return if $day > 29 and $mon == 2; + return if $day == 29 and $mon == 2 and not _is_leap_year($year); + + # Convert to 24 hour time if necessary + $hour += 12 if $ampm and $ampm =~ /pm/i; + + # Add any leading zeros + $mon = "0$mon" if length $mon == 1; + $day = "0$day" if length $day == 1; + $hour = "0$hour" if length $hour == 1; + $min = "0$min" if length $min == 1; + $sec = "0$sec" if length $sec == 1; + + return "$year-$mon-$day $hour:$min:$sec"; +} # MDYHMS2SQLDatetime + 1; =head2 DEPENDENCIES diff --git a/lib/Machines/MySQL.pm b/lib/Machines/MySQL.pm old mode 100644 new mode 100755 index 398fd8f..00f2b7c --- a/lib/Machines/MySQL.pm +++ b/lib/Machines/MySQL.pm @@ -57,11 +57,12 @@ our $VERSION = '$Revision: 1.0 $'; ($VERSION) = ($VERSION =~ /\$Revision: (.*) /); my %MACHINEOPTS = ( - SERVER => 'localhost', - USERNAME => 'machines', - PASSWORD => 'w0rk$harder', + SERVER => $ENV{REXEC_DBHOST} || 'localhost', + USERNAME => 'rexec', + PASSWORD => 'rexec', ); +# Internal methods sub _connect (;$) { my ($self, $dbserver) = @_; @@ -105,7 +106,6 @@ sub _checkRequiredFields ($$) { return; } # _checkRequiredFields -# Internal methods sub _dberror ($$) { my ($self, $msg, $statement) = @_; @@ -239,4 +239,4 @@ sub AddSystem (%) { return $self->_addRecord ('system', %system); } # AddSystem -1; \ No newline at end of file +1; diff --git a/lib/Utils.pm b/lib/Utils.pm index 8aabcaa..eddef3a 100644 --- a/lib/Utils.pm +++ b/lib/Utils.pm @@ -578,7 +578,7 @@ Returns: =cut - open my $pipe, '|', $to + open my $pipe, '|-', $to or error "Unable to open pipe - $!", 1; foreach (@output) { diff --git a/rc/bash_login b/rc/bash_login index d390e56..2d31fb8 100644 --- a/rc/bash_login +++ b/rc/bash_login @@ -121,6 +121,11 @@ if [ -r /etc/bash_completion -a $ARCHITECTURE != "cygwin" ]; then source /etc/bash_completion fi +# Alias ping +if [ $ARCHITECTURE = "cygwin" ]; then + alias ping=$(echo $SYSTEMROOT | tr '\\' '\/')/system32/ping +fi + # We specify /home/$USER here so that when we sudo to another user # we will only trap logout if that user also has a ~/.rc/logout # (doubtfull). diff --git a/rc/client_scripts/GD b/rc/client_scripts/GD index 9b7163e..0ef2f64 100755 --- a/rc/client_scripts/GD +++ b/rc/client_scripts/GD @@ -18,11 +18,6 @@ if [ -d /cleartrig/ent/SNSD/muos/ccadm_tools/vobs/ranccadm/scripts/lib ]; then export PERL5LIB=/cleartrig/ent/SNSD/muos/ccadm_tools/vobs/ranccadm/scripts/lib:$PERL5LIB fi -# This may need to be moved into bash_login -if [ "$ARCHITECTURE" = "cygwin" ]; then - alias ping=$SYSTEMROOT/System32/ping -fi - export QTDIR="/usr/local/Trolltech/Qt-4.2.2" export QMAKESPEC="$QTDIR/mkspecs/solaris-cc" export ORACLE="SID rancq" @@ -66,4 +61,6 @@ append_to_path "/cygcrive/d/Program Files/IBM/RationalSDLC/ClearCase/bin" append_to_path "/cygdrive/c/Program Files (x86)/ibm/gsk8/lib" # Common CDPATHS -CDPATH=$CDPATH:/vobs/ranccadm +export CT=/cleartrig/ent/SNSD/muos/ccadm_tools/vobs/ranccadm/scripts +CDPATH=$CDPATH:/vobs/ranccadm:$CT + diff --git a/rc/git b/rc/git index c6253a2..341ca7b 100644 --- a/rc/git +++ b/rc/git @@ -32,10 +32,20 @@ function git () { # Need to reset title since we put the branch name in the titlebar git=$(which git) - if [ "$1" = "checkout" -o "$1" = "co" ]; then - $git $@ - set_title - else - $git $@ + if [ "${git:0:3}" != "no " ]; then + if [ "$1" = "checkout" -o "$1" = "co" ]; then + $git $@ + set_title + elif [ "$1" = "files" ]; then + if [ -z "$2" ]; then + echo "Files in git commit HEAD" + $git show --pretty="" --name-only HEAD + else + echo "Files in git commit $2" + $git show --pretty="" --name-only $2 + fi + else + $git $@ + fi fi } # git