X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FInterface%2FCLI.pm;h=ab90915930a65f30cc9a7dcf010efde64c88ad00;hp=53315041567f5c9409b51acdae86c996693a777c;hb=7322f2afedcc2f427e997d1535a503613a83f088;hpb=2dfda73eeb3eae2d4f894099754794ef07d060dd diff --git a/rt/lib/RT/Interface/CLI.pm b/rt/lib/RT/Interface/CLI.pm index 533150415..ab9091593 100644 --- a/rt/lib/RT/Interface/CLI.pm +++ b/rt/lib/RT/Interface/CLI.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2016 Best Practical Solutions, LLC +# +# # (Except where explicitly superseded by other copyright notices) -# -# +# +# # LICENSE: -# +# # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. -# +# # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# +# +# # CONTRIBUTION SUBMISSION POLICY: -# +# # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) -# +# # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that @@ -43,29 +43,17 @@ # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. -# +# # END BPS TAGGED BLOCK }}} -use strict; -use RT; package RT::Interface::CLI; +use strict; +use warnings; +use RT::Base; - -BEGIN { - use Exporter (); - use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); - - # set the version for version checking - $VERSION = do { my @r = (q$Revision: 1.1.1.7 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker - - @ISA = qw(Exporter); - - # your exported package globals go here, - # as well as any optionally exported functions - @EXPORT_OK = qw(&CleanEnv - &GetCurrentUser &GetMessageContent &debug &loc); -} +use base 'Exporter'; +our @EXPORT_OK = qw(CleanEnv GetCurrentUser debug loc Init); =head1 NAME @@ -73,54 +61,42 @@ BEGIN { =head1 SYNOPSIS - use lib "/path/to/rt/libraries/"; + use lib "/opt/rt4/local/lib", "/opt/rt4/lib"; - use RT::Interface::CLI qw(CleanEnv - GetCurrentUser GetMessageContent loc); + use RT::Interface::CLI qw(GetCurrentUser Init loc); - #Clean out all the nasties from the environment - CleanEnv(); + # Process command-line arguments, load the configuration, and connect + # to the database + Init(); - #let's talk to RT' - use RT; - - #Load RT's config file - RT::LoadConfig(); - - # Connect to the database. set up loggign - RT::Init(); - - #Get the current user all loaded + # Get the current user all loaded my $CurrentUser = GetCurrentUser(); - print loc('Hello!'); # Synonym of $CuurentUser->loc('Hello!'); + print loc('Hello!'); # Synonym of $CurrentUser->loc('Hello!'); =head1 DESCRIPTION =head1 METHODS -=begin testing - -ok(require RT::Interface::CLI); - -=end testing =cut =head2 CleanEnv -Removes some of the nastiest nasties from the user\'s environment. +Removes some of the nastiest nasties from the user's environment. =cut sub CleanEnv { + RT->Deprecated( Remove => "4.4" ); + $ENV{'PATH'} = '/bin:/usr/bin'; # or whatever you need $ENV{'CDPATH'} = '' if defined $ENV{'CDPATH'}; $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'}; $ENV{'ENV'} = '' if defined $ENV{'ENV'}; - $ENV{'IFS'} = '' if defined $ENV{'IFS'}; + $ENV{'IFS'} = '' if defined $ENV{'IFS'}; } @@ -130,7 +106,6 @@ sub CleanEnv { my $CurrentUser; # shared betwen GetCurrentUser and loc -# {{{ sub GetCurrentUser =head2 GetCurrentUser @@ -140,29 +115,25 @@ loaded with that user. if the current user isn't found, returns a copy of RT::N =cut sub GetCurrentUser { - + require RT::CurrentUser; - + #Instantiate a user object - - my $Gecos= ($^O eq 'MSWin32') ? Win32::LoginName() : (getpwuid($<))[0]; + + my $Gecos= (getpwuid($<))[0]; #If the current user is 0, then RT will assume that the User object #is that of the currentuser. - $CurrentUser = new RT::CurrentUser(); + $CurrentUser = RT::CurrentUser->new(); $CurrentUser->LoadByGecos($Gecos); - + unless ($CurrentUser->Id) { - $RT::Logger->debug("No user with a unix login of '$Gecos' was found. "); + $RT::Logger->error("No user with a GECOS (unix login) of '$Gecos' was found."); } return($CurrentUser); } -# }}} - - -# {{{ sub loc =head2 loc @@ -174,97 +145,101 @@ sub loc { die "No current user yet" unless $CurrentUser ||= RT::CurrentUser->new; return $CurrentUser->loc(@_); } -# }}} } +sub debug { + RT->Deprecated( Remove => "4.4", Instead => '$RT::Logger->debug' ); + $RT::Logger->debug(@_); +} + +sub ShowHelp { + my $self = shift; + my %args = @_; + require Pod::Usage; + Pod::Usage::pod2usage( + -message => $args{'Message'}, + -exitval => $args{'ExitValue'} || 0, + -verbose => 99, + -sections => $args{'Sections'} || ($args{'ExitValue'} + ? 'NAME|USAGE' + : 'NAME|USAGE|OPTIONS|DESCRIPTION' + ), + ); +} -# {{{ sub GetMessageContent +=head2 Init -=head2 GetMessageContent +A shim for L which automatically adds a +C<--help> option if it is not supplied. It then calls L +and L. -Takes two arguments a source file and a boolean "edit". If the source file -is undef or "", assumes an empty file. Returns an edited file as an -array of lines. +It sets the C setting to C, to ensure that the +user sees all relevant warnings. It also adds C<--quiet> and +C<--verbose> options, which adjust the C value to C +or C, respectively. =cut -sub GetMessageContent { - my %args = ( Source => undef, - Content => undef, - Edit => undef, - CurrentUser => undef, - @_); - my $source = $args{'Source'}; - - my $edit = $args{'Edit'}; - - my $currentuser = $args{'CurrentUser'}; - my @lines; - - use File::Temp qw/ tempfile/; - - #Load the sourcefile, if it's been handed to us - if ($source) { - open (SOURCE, "<$source"); - @lines = (); - close (SOURCE); +sub Init { + require Getopt::Long; + require Pod::Usage; + + my %exists; + my @args; + my $hash; + if (ref $_[0]) { + $hash = shift(@_); + for (@_) { + m/^([a-zA-Z0-9-]+)/; + $exists{$1}++; + push @args, $_ => \($hash->{$1}); + } + } else { + $hash = {}; + @args = @_; + while (@_) { + my $key = shift(@_); + $exists{$key}++; + shift(@_); + } } - elsif ($args{'Content'}) { - @lines = split('\n',$args{'Content'}); - } - #get us a tempfile. - my ($fh, $filename) = tempfile(); - - #write to a tmpfile - for (@lines) { - print $fh $_; - } - close ($fh); - - #Edit the file if we need to - if ($edit) { - - unless ($ENV{'EDITOR'}) { - $RT::Logger->crit('No $EDITOR variable defined'. "\n"); - return undef; - } - system ($ENV{'EDITOR'}, $filename); - } - - open (READ, "<$filename"); - my @newlines = (); - close (READ); - - unlink ($filename) unless (debug()); - return(\@newlines); - -} -# }}} + push @args, "help|h!" => \($hash->{help}) + unless $exists{help}; -# {{{ sub debug + push @args, "verbose|v!" => \($hash->{verbose}) + unless $exists{verbose}; -sub debug { - my $val = shift; - my ($debug); - if ($val) { - $RT::Logger->debug($val."\n"); - if ($debug) { - print STDERR "$val\n"; - } + push @args, "quiet|q!" => \($hash->{quiet}) + unless $exists{quiet}; + + my $ok = Getopt::Long::GetOptions( @args ); + Pod::Usage::pod2usage(1) if not $ok and not defined wantarray; + + return unless $ok; + + Pod::Usage::pod2usage({ verbose => 2}) + if not $exists{help} and $hash->{help}; + + require RT; + RT::LoadConfig(); + + if (not $exists{quiet} and $hash->{quiet}) { + RT->Config->Set(LogToSTDERR => "error"); + } elsif (not $exists{verbose} and $hash->{verbose}) { + RT->Config->Set(LogToSTDERR => "debug"); + } else { + RT->Config->Set(LogToSTDERR => "warning"); } - if ($debug) { - return(1); - } -} -# }}} + RT::Init(); + $| = 1; + + return $ok; +} -eval "require RT::Interface::CLI_Vendor"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/CLI_Vendor.pm}); -eval "require RT::Interface::CLI_Local"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/Interface/CLI_Local.pm}); +RT::Base->_ImportOverlays(); 1;