X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Fsbin%2Frt-email-group-admin;h=bfbdccd2784f31d79e4d9ce8bee380ac63269bb0;hb=ed1f84b4e8f626245995ecda5afcf83092c153b2;hp=75b51a589665e6a11a332fad3bcbc9f5c6d5aa49;hpb=b4b0c7e72d7eaee2fbfc7022022c9698323203dd;p=freeside.git diff --git a/rt/sbin/rt-email-group-admin b/rt/sbin/rt-email-group-admin index 75b51a589..bfbdccd27 100755 --- a/rt/sbin/rt-email-group-admin +++ b/rt/sbin/rt-email-group-admin @@ -1,41 +1,41 @@ #!/usr/bin/perl # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2014 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 @@ -44,7 +44,7 @@ # 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 }}} =head1 NAME @@ -89,7 +89,7 @@ use strict; # fix lib paths, some may be relative BEGIN { require File::Spec; - my @libs = ("lib", "local/lib"); + my @libs = ("/opt/rt3/lib", "/opt/rt3/local/lib"); my $bin_path; for my $lib (@libs) { @@ -111,23 +111,14 @@ BEGIN { } -use RT; -RT::LoadConfig; -RT::Init; - -require RT::Principal; -require RT::User; -require RT::Group; -require RT::ScripActions; - use Getopt::Long qw(GetOptions); +Getopt::Long::Configure( "pass_through" ); our $cmd = 'usage'; our $opts = {}; sub parse_args { my $tmp; - Getopt::Long::Configure( "pass_through" ); if ( GetOptions( 'list' => \$tmp ) && $tmp ) { $cmd = 'list'; } @@ -180,18 +171,28 @@ sub parse_args { } sub usage { - local $@; - eval "require Pod::PlainText;"; - if ( $@ ) { - print "see `perldoc $0`\n"; - } else { - my $parser = Pod::PlainText->new( sentence => 0, width => 78 ); - $parser->parse_from_file( $0 ); - } + require Pod::Usage; + Pod::Usage::pod2usage({ verbose => 2 }); +} + +my $help; +if ( GetOptions( 'help|h' => \$help ) && $help ) { + usage(); + exit; } parse_args(); +require RT; +RT->LoadConfig; +RT->Init; + +require RT::Principal; +require RT::User; +require RT::Group; +require RT::ScripActions; + + { eval "main::$cmd()"; if ( $@ ) { @@ -231,7 +232,7 @@ sub _list { print "Members: \n"; foreach( @princ ) { - my $obj = RT::Principal->new( $RT::SystemUser ); + my $obj = RT::Principal->new( RT->SystemUser ); $obj->Load( $_ ); next unless $obj->id; @@ -244,15 +245,16 @@ sub _list { return; } -=head2 create NAME [--comment] [--group GNAME] [--user UNAME] +=head2 create NAME [--comment] [--group GNAME] [--user NAME-OR-EMAIL] Creates new action with NAME and adds users and/or groups to its -recipient list. Would be notify as comment if --comment specified. +recipient list. Would be notify as comment if --comment specified. The +user, if specified, will be autocreated if necessary. =cut sub create { - my $actions = RT::ScripActions->new( $RT::SystemUser ); + my $actions = RT::ScripActions->new( RT->SystemUser ); $actions->Limit( FIELD => 'Name', VALUE => $opts->{'name'}, @@ -281,7 +283,7 @@ sub __create_empty { my $name = shift; my $as_comment = shift || 0; require RT::ScripAction; - my $action = RT::ScripAction->new( $RT::SystemUser ); + my $action = RT::ScripAction->new( RT->SystemUser ); $action->Create( Name => $name, Description => "Created with rt-email-group-admin script", @@ -294,37 +296,54 @@ sub __create_empty { sub _check_groups { - return grep { $_ ? 1: do { print STDERR "Group '$_' skipped, doesn't exist\n"; 0; } } - map { __check_group($_) } @_; + return map {$_->[1]} + grep { $_->[1] ? 1: do { print STDERR "Group '$_->[0]' skipped, doesn't exist\n"; 0; } } + map { [$_, __check_group($_)] } @_; } sub __check_group { my $instance = shift; require RT::Group; - my $obj = RT::Group->new( $RT::SystemUser ); + my $obj = RT::Group->new( RT->SystemUser ); $obj->LoadUserDefinedGroup( $instance ); return $obj->id ? $obj : undef; } sub _check_users { - return grep { $_ ? 1: do { print STDERR "User '$_' skipped, doesn't exist\n"; 0; } } - map { __check_user($_) } @_; + return map {$_->[1]} + grep { $_->[1] ? 1: do { print STDERR "User '$_->[0]' skipped, doesn't exist and couldn't autocreate\n"; 0; } } + map { [$_, __check_user($_)] } @_; } sub __check_user { my $instance = shift; require RT::User; - my $obj = RT::User->new( $RT::SystemUser ); + my $obj = RT::User->new( RT->SystemUser ); $obj->Load( $instance ); + $obj->LoadByEmail( $instance ) + if not $obj->id and $instance =~ /@/; + + unless ($obj->id) { + my ($ok, $msg) = $obj->Create( + Name => $instance, + EmailAddress => $instance, + Privileged => 0, + Comments => 'Autocreated when added to notify action via rt-email-group-admin', + ); + print STDERR "Autocreate of user '$instance' failed: $msg\n" + unless $ok; + } + return $obj->id ? $obj : undef; } -=head2 add NAME [--group GNAME] [--user UNAME] +=head2 add NAME [--group GNAME] [--user NAME-OR-EMAIL] -Adds groups and/or users to recipients of the action NAME. +Adds groups and/or users to recipients of the action NAME. The user, if +specified, will be autocreated if necessary. =cut @@ -378,7 +397,7 @@ sub delete { } require RT::Scrips; - my $scrips = RT::Scrips->new( $RT::SystemUser ); + my $scrips = RT::Scrips->new( RT->SystemUser ); $scrips->Limit( FIELD => 'ScripAction', VALUE => $action->id ); if ( $scrips->Count ) { my @sid; @@ -451,7 +470,7 @@ sub rename { exit(-1); } - my $actions = RT::ScripActions->new( $RT::SystemUser ); + my $actions = RT::ScripActions->new( RT->SystemUser ); $actions->Limit( FIELD => 'Name', VALUE => $opts->{'newname'} ); if ( $actions->Count ) { print STDERR "ScripAction '". $opts->{'newname'} ."' allready exists\n"; @@ -482,7 +501,7 @@ sub argument_to_list { } sub _get_our_actions { - my $actions = RT::ScripActions->new( $RT::SystemUser ); + my $actions = RT::ScripActions->new( RT->SystemUser ); $actions->Limit( FIELD => 'ExecModule', VALUE => 'NotifyGroup',