summaryrefslogtreecommitdiff
path: root/rt/bin/rtadmin
diff options
context:
space:
mode:
Diffstat (limited to 'rt/bin/rtadmin')
-rw-r--r--rt/bin/rtadmin1040
1 files changed, 1040 insertions, 0 deletions
diff --git a/rt/bin/rtadmin b/rt/bin/rtadmin
new file mode 100644
index 000000000..25ba1b06a
--- /dev/null
+++ b/rt/bin/rtadmin
@@ -0,0 +1,1040 @@
+#!!!PERL!! -w
+#
+# $Header: /home/cvs/cvsroot/freeside/rt/bin/Attic/rtadmin,v 1.1 2002-08-12 06:17:07 ivan Exp $
+# RT is (c) 1996-2001 Jesse Vincent <jesse@fsck.com>
+
+use strict;
+use Carp;
+use Getopt::Long qw(:config pass_through);
+
+use lib "!!RT_LIB_PATH!!";
+use lib "!!RT_ETC_PATH!!";
+
+use RT::Interface::CLI qw(CleanEnv LoadConfig DBConnect
+ GetCurrentUser GetMessageContent);
+
+#Clean out all the nasties from the environment
+CleanEnv();
+
+#Load etc/config.pm and drop privs
+LoadConfig();
+
+#Connect to the database and get RT::SystemUser and RT::Nobody loaded
+DBConnect();
+
+#Drop setgid permissions
+RT::DropSetGIDPermissions();
+
+#Get the current user all loaded
+my $CurrentUser = GetCurrentUser();
+
+unless ($CurrentUser->Id) {
+ print "No RT user found. Please consult your RT administrator.\n";
+ exit(1);
+}
+
+
+
+
+PickMode();
+
+
+# {{{ Help
+
+sub Help {
+
+ # {{{ help_acl
+my $help_acl ="
+ Access control
+ --grant-right <right>
+ --revoke-right <right>
+ --userid <user>
+ --groupid <group>
+ --list-rights";
+
+# }}}
+
+ # {{{ help_keyword_sel
+my $help_keyword_sel = "
+ Keyword Selections
+ --add-keyword-select
+ --modify-keyword-select <name>
+ --ks-name <name>
+ --ks-keyword <keyword>
+ --ks-single
+ --ks-multiple
+ --ks-depth <int>
+
+ --disable-keyword-select <name>";
+# }}}
+
+ # {{{ help_scrip
+my $help_scrip = "
+ Scrips
+ --create-scrip
+ --scrip-condition <condition name or id>
+ --scrip-action <action name or id>
+ --scrip-template <template name or id>
+
+ --delete-scrip <id>
+ --list-scrips";
+
+# }}}
+
+ # {{{ help_template
+my $help_template = "
+ Templates
+ --delete-template [<id>|<name>]
+ --display-template [<id>|<name>]
+
+ --create-template
+ --modify-template [<id>|<name>]
+ Flags for --create-template and --modify-template
+ --template-name
+ --template-description
+ --template-edit-content
+
+ --list-templates";
+
+# }}}
+
+
+print <<EOF;
+
+USAGE: rtadmin --user <userid> [Userflags]
+ rtadmin --list-users
+ rtadmin --queue <queueid> [Queueflags]
+ rtadmin --list-queues
+ rtadmin --group [groupflags]
+ rtadmin --list-groups
+ rtadmin --system [SystemFlags]
+ rtadmin --keyword [keywordflags]
+
+User configuration for --user <userid>
+
+ --disable
+ --create
+ --display
+
+ Core Attributes
+ --userid
+ --gecos
+ --password
+ --emailaddress
+ --privileged
+ --comments
+ --signature
+ --organization
+
+ Names
+ --realname
+ --nickname
+
+ Auth and external info
+ --externalcontactinfoid
+ --contactinfosystem
+ --externalauthid
+ --authsystem
+
+ Phone numbers
+ --pagerphone
+ --workphone
+ --mobilemphone
+ --homephone
+
+ Paper address
+ --address1
+ --address2
+ --city
+ --state
+ --zip
+ --country
+ --freeformcontactqinfo
+
+
+Group Configuration for --group <groupid>
+ --create
+ --delete
+ --display
+
+ --name <new name>
+ --description <new description>
+
+
+
+ --add-member <userid>
+ --delete-member <userid>
+ --list-members
+
+Queue Configuration for --queue <queueid>
+ --create
+ --disable
+ --display
+
+ --name <name>
+ --correspondaddress <email address>
+ --commentaddress <email address>
+ --initialpriority <int>
+ --finalpriority <int>
+ --defaultduein <days>
+
+ --add-cc <email address>
+ --delete-cc <email address>
+ --add-admincc <email address>
+ --delete-admincc <email address>
+ --list-watchers
+
+
+
+$help_acl
+
+$help_keyword_sel
+
+$help_template
+
+$help_scrip
+
+
+System configuration for --system
+
+$help_acl
+
+$help_keyword_sel
+
+$help_template
+
+$help_scrip
+
+
+Keyword configuration for --keyword <fully qualified name>
+ --list-children
+ --create-child <name>
+ --disable
+ --name <new name>
+ --description <new description>
+
+EOF
+
+
+
+}
+
+# }}}
+
+# {{{ PickMode
+
+sub PickMode {
+ my ($user,$group, $queue, $system, $keyword, $listusers,
+ $listgroups, $listqueues, $help);
+
+
+ GetOptions ('help|h|usage' => \$help,
+ 'user=s' => \$user,
+ 'queue=s' => \$queue,
+ 'group=s' => \$group,
+ 'system' => \$system,
+ 'keyword=s', => \$keyword,
+ 'list-users' => \$listusers,
+ 'list-queues' => \$listqueues,
+ 'list-groups' => \$listgroups,
+ );
+
+
+
+ if ($user) { AdminUser($user) }
+ elsif ($group) { AdminGroup($group) }
+ elsif ($queue) { AdminQueue($queue) }
+ elsif ($system) { AdminSystem($system) }
+ elsif ($keyword) { AdminKeywords($keyword) }
+ elsif ($listusers) { ListUsers() }
+ elsif ($listgroups) { ListGroups() }
+ elsif ($listqueues) { ListQueues() }
+ elsif ($help) { Help()}
+ else {
+ print "No command found\n";
+ }
+ exit(0);
+}
+
+# }}}
+
+# {{{ AdminUser
+
+sub AdminUser {
+ my $user=shift;
+ my %args;
+
+ GetOptions(\%args,
+ 'create', 'disable|delete', 'display',
+ 'Name=s', 'Gecos=s', 'Password=s',
+ 'EmailAddress=s', 'Privileged=s', 'Comments=s', 'Signature=s',
+ 'Organization=s', 'RealName=s', 'NickName=s',
+ 'ExternalContactInfoId=s', 'ContactInfoSystem=s',
+ 'ExternalAuthId=s', 'AuthSystem=s',
+ 'HomePhone=s', 'WorkPhone=s', 'MobilePhone=s', 'PagerPhone=s',
+ 'Address1=s', 'Address2=s', 'City=s', 'State=s', 'Zip=s',
+ 'Country=s', 'FreeformContactInfo=s');
+
+ my $user_obj = new RT::User($CurrentUser);
+
+
+ #Create the user if we need to
+ if ($args{'create'}) {
+ my ($status, $msg) =
+ $user_obj->Create( Name => ($args{'Name'} || $user),
+ Gecos => $args{'Gecos'},
+ Password => $args{'Password'},
+ EmailAddress => $args{'EmailAddress'},
+ Privileged => $args{'Privileged'},
+ Comments => $args{'Comments'},
+ Signature => $args{'Signature'},
+ Organization => $args{'Organization'},
+ RealName => $args{'RealName'},
+ NickName => $args{'NickName'},
+ ExternalContactInfoId => $args{'ExternalContactInfoId'},
+ ContactInfoSystem => $args{'ContactInfoSystem'},
+ ExternalAuthId => $args{'ExternalAuthId'},
+ AuthSystem => $args{'AuthSystem'},
+ HomePhone => $args{'HomePhone'},
+ WorkPhone => $args{'WorkPhone'},
+ MobilePhone => $args{'MobilePhone'},
+ PagerPhone => $args{'PagerPhone'},
+ Address1 => $args{'Address1'},
+ Address2 => $args{'Address2'},
+ City => $args{'City'},
+ State => $args{'State'},
+ Zip => $args{'Zip'},
+ FreeformContactInfo => $args{'FreeformContactInfo'}
+ );
+
+ print "$msg\n";
+ return();
+
+ }
+ else {
+
+
+ #Load the user
+ $user_obj->Load($user);
+
+ unless ($user_obj->id) {
+ print "User '$user' not found\n";
+ return();
+ }
+
+
+
+ #modify the user if we need to
+ my @attributes = ('Name', 'Gecos',
+ 'EmailAddress', 'Privileged', 'Comments', 'Signature',
+ 'Organization', 'RealName', 'NickName',
+ 'ExternalContactInfoId', 'ContactInfoSystem',
+ 'ExternalAuthId', 'AuthSystem',
+ 'HomePhone', 'WorkPhone', 'MobilePhone', 'PagerPhone',
+ 'Address1', 'Address2', 'City', 'State', 'Zip',
+ 'Country', 'FreeformContactInfo');
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"$attrib"})) and
+ ($user_obj->$attrib() ne $args{"$attrib"})) {
+
+ my $method = "Set$attrib";
+ my ($val, $msg) = $user_obj->$method($args{"$attrib"});
+ print "User ".$user_obj->Name. " $attrib: $msg\n";
+
+ }
+ }
+
+ if (exists ($args{'Password'})) {
+ my ($code, $msg);
+ ($code, $msg) = $user_obj->SetPassword($args{'Password'});
+ print "User ". $user_obj->Name. ' Password: '. $msg . "\n";
+ }
+
+ #Check if we need to display the user
+ if ($args{'display'}) {
+ foreach my $attrib (@attributes) {
+ next if ($attrib eq 'Password'); #Can't see the password
+ printf("%22.22s %-64s\n",$attrib, ($user_obj->$attrib()||'(undefined)'));
+
+ }
+ }
+
+ #Check if we need to delete the user
+ if ($args{'disable'}) {
+ my ($val, $msg) = $user_obj->SetDisabled(1);
+ print "$msg\n";
+ }
+
+ }
+}
+
+# }}}
+
+# {{{ AdminQueue
+
+sub AdminQueue {
+ my $queue=shift;
+ my %args;
+
+ GetOptions(\%args,
+ 'create', 'disable|delete', 'display',
+ 'Name=s', 'CorrespondAddress=s', 'Description=s',
+ 'CommentAddress=s', 'InitialPriority=n', 'FinalPriority=n',
+ 'DefaultDueIn=n',
+
+ 'add-cc=s@', 'add-admincc=s@',
+ 'delete-cc=s@', 'delete-admincc=s@',
+ 'list-watchers', 'create-template'
+ );
+
+ use RT::Queue;
+ my $queue_obj = new RT::Queue($CurrentUser);
+
+ #Create the queue if we need to
+ if ($args{'create'}) {
+ my ($status, $msg) =
+ $queue_obj->Create(
+ Name => ($args{'Name'} || $queue) ,
+ CorrespondAddress => $args{'CorrespondAddress'},
+ Description => $args{'Description'},
+ CommentAddress => $args{'CommentAddress'},
+ InitialPriority => $args{'InitialPriority'},
+ FinalPriority => $args{'FinalPriority'},
+ DefaultDueIn => $args{'DefaultDueIn'}
+ );
+
+ print "$msg\n";
+ }
+ else {
+ #Load the queue
+ $queue_obj->Load($queue);
+
+ unless ($queue_obj->id) {
+ print "Queue '$queue' not found\n";
+ return();
+ }
+
+ #modify if we need to
+ my @attributes = qw(Name CorrespondAddress Description
+ CommentAddress InitialPriority FinalPriority
+ DefaultDueIn
+ );
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"$attrib"})) and
+ ($queue_obj->$attrib() ne $args{"$attrib"})) {
+
+ my $method = "Set$attrib";
+ my ($val, $msg) = $queue_obj->$method($args{"$attrib"});
+ print "Queue ".$queue_obj->Name. " $attrib: $msg\n";
+
+ }
+ }
+
+
+ #Check if we need to display the queue
+ if ($args{'display'}) {
+ foreach my $attrib (@attributes) {
+ printf("%22.22s %-64s\n",$attrib, ($queue_obj->$attrib()||'(undefined)'));
+
+ }
+ }
+
+ foreach my $person (@{$args{'add-cc'}}) {
+ my ($val, $msg) = $queue_obj->AddCc(Email => $person);
+ print "$msg\n";
+ }
+ foreach my $person (@{$args{'add-admincc'}}) {
+ my ($val, $msg) = $queue_obj->AddAdminCc(Email => $person);
+ print "$msg\n";
+ }
+
+ foreach my $person (@{$args{'delete-cc'}}) {
+ my ($val, $msg) = $queue_obj->DeleteCc($person);
+ print "$msg\n";
+ }
+ foreach my $person (@{$args{'delete-admincc'}}) {
+ my ($val, $msg) = $queue_obj->DeleteAdminCc($person);
+ print "$msg\n";
+ }
+
+ if ($args{'list-watchers'}) {
+ require RT::Watchers;
+ my $watchers = new RT::Watchers($CurrentUser);
+ $watchers->LimitToQueue($queue_obj->id);
+ while (my $watcher = $watchers->Next()) {
+ printf("%10s %-60s\n",
+ $watcher->Type, $watcher->Email );
+ }
+ }
+
+ AdminTemplates($queue_obj->Id());
+ AdminScrips($queue_obj->Id());
+ AdminRights($queue_obj->Id());
+ AdminKeywordSelects($queue_obj->Id());
+
+ #Check if we need to delete the queue
+ if ($args{'disable'}) {
+ my ($val, $msg) = $queue_obj->SetDisabled(1);
+ print "$msg\n";
+ }
+
+ }
+}
+
+# }}}
+
+# {{{ AdminKeywords
+
+sub AdminKeywords {
+ my $keyword = shift;
+
+ my %args;
+ GetOptions(\%args, 'list-children', 'create-child=s', 'disable|delete', 'Name=s', 'Description=s');
+
+ use RT::Keyword;
+
+ my $key_obj = new RT::Keyword($CurrentUser);
+ my $key_id;
+
+ #If we're dealing with the root of the keyword list
+ if ($keyword eq '/') {
+ $key_id=0;
+ }
+ else {
+ my ($val, $msg) = $key_obj->LoadByPath( $keyword );
+ unless ($val) {
+ print $msg ."\n";
+ }
+ $key_id = $key_obj->Id();
+ }
+
+ if ($args{'create-child'}) {
+ my $child = new RT::Keyword($CurrentUser);
+
+ my ($val, $msg) = $child->Create( Parent => $key_id,
+ Name => $args{'create-child'},
+ );
+ print $msg ."\n";
+ }
+
+ elsif ($args{'list-children'}) {
+ my $keywords;
+ if ($key_obj->id) {
+ $keywords = $key_obj->Children();
+ }
+ #If we didn't actually have a keyword object, we need to create our own Keywords object.
+ else {
+ $keywords = new RT::Keywords($CurrentUser);
+ $keywords->LimitToParent(0);
+ }
+
+ while (my $key=$keywords->Next) {
+ print $key->Name;
+ if ($key->Description) {
+ print " (" . $key->Description .")";
+ }
+ print "\n";
+ }
+
+
+ }
+
+ #Else we wanna do some modification.
+ else {
+
+ #If we didn't load a keyword, get out
+ return(undef) unless ($key_obj->Id);
+
+
+ my @attributes = qw( Name Description );
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"$attrib"})) and
+ ($key_obj->$attrib() ne $args{"$attrib"})) {
+
+ my $method = "Set$attrib";
+ my ($val, $msg) = $key_obj->$method($args{"$attrib"});
+
+ print "Keyword ".$key_obj->Name. " $attrib: $msg\n"; }
+ }
+
+ if ($args{'disable'}) {
+ $key_obj->SetDisabled(1);
+
+ }
+
+ }
+}
+
+# }}}
+
+# {{{ AdminKeywordSelects
+
+sub AdminKeywordSelects {
+ my $queue = shift;
+ # O for queue means global
+
+ my %args;
+ GetOptions(\%args, 'add-keyword-select','disable-keyword-select|delete-keyword-select=s',
+ 'modify-keyword-select=s',
+ 'keyword-select-Keyword|ks-keyword=s',
+ 'keyword-select-Single|ks-single',
+ 'keyword-select-Multiple|ks-multiple',
+ 'keyword-select-Depth|ks-depth=i',
+ 'keyword-select-Name|ks-name=s'
+ );
+
+ # sanitize single vs multiple.
+ if ($args{'keyword-select-Multiple'}) {
+ $args{'keyword-select-Single'} = 0;
+ }
+
+ use RT::KeywordSelect;
+ my $keysel_obj = new RT::KeywordSelect($CurrentUser);
+ if ($args{'add-keyword-select'}) {
+
+ my ($val, $msg) = $keysel_obj->Create( Keyword => $args{'keyword-select-Keyword'},
+ Depth => $args{'keyword-select-Depth'},
+ Single => $args{'keyword-select-Single'},
+ Name => $args{'keyword-select-Name'},
+ ObjectType => 'Ticket',
+ ObjectField => 'Queue',
+ ObjectValue => $queue);
+ print $msg ."\n";
+ }
+ elsif ($args{'modify-keyword-select'}) {
+ $keysel_obj->LoadByName(Name => $args{'modify-keyword-select'},
+ Queue => $queue
+ );
+
+ unless ($keysel_obj->Id()) {
+ print "Keyword select not found\n";
+ return();
+ }
+ my @attributes = qw( Name Keyword Single Depth );
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"keyword-select-$attrib"})) and
+ ($keysel_obj->$attrib() ne $args{"keyword-select-$attrib"})) {
+
+ my $method = "Set$attrib";
+ my ($val, $msg) = $keysel_obj->$method($args{"keyword-select-$attrib"});
+
+ print "Keyword select ".$keysel_obj->Name. " $attrib: $msg\n"; }
+ }
+
+
+ }
+
+
+ elsif ($args{'disable-keyword-select'}) {
+ $keysel_obj->LoadByName(Name => $args{'disable-keyword-select'},
+ Queue => $queue);
+
+ $keysel_obj->SetDisabled(1);
+
+ }
+}
+
+# }}}
+
+# {{{ AdminGroup
+
+sub AdminGroup {
+ my $group = shift;
+
+ my (%args);
+
+ GetOptions(\%args,
+ 'create', 'delete', 'display',
+ 'Name=s', 'Description=s',
+
+ 'add-member=s@', 'delete-member=s@',
+ 'list-members'
+ );
+
+
+ use RT::Group;
+ my $group_obj = new RT::Group($CurrentUser);
+ unless ($group) {
+ print "Group not specified.\n";
+ return();
+ }
+
+
+ #Create the group if we need to
+ if ($args{'create'}) {
+ my ($val, $msg) = $group_obj->Create( Name => ($args{'Name'} || $group),
+ Description => $args{'Description'} );
+ print $msg ."\n";
+ }
+ #otherwise we load it
+ else {
+ $group_obj->Load($group);
+ }
+
+ #If we have no group object, get the hell out
+ unless ($group_obj->Id) {
+ print "Group not found.\n";
+ }
+
+ if ($args{'delete'}) {
+ my ($val, $msg) = $group_obj->Delete();
+ print $msg ."\n";
+ return();
+ }
+
+
+
+ #modify if we need to
+ my @attributes = qw(Name Description
+
+ );
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"$attrib"})) and
+ ($group_obj->$attrib() ne $args{"$attrib"})) {
+
+ my $method = "Set$attrib";
+ my ($val, $msg) = $group_obj->$method($args{"$attrib"});
+ print "Group ".$group_obj->Name. " $attrib: $msg\n";
+
+ }
+ }
+
+ foreach my $user (@{$args{'add-member'}}) {
+ my ($val, $msg) = $group_obj->AddMember($user);
+ print $msg. "\n";
+ }
+ foreach my $user (@{$args{'delete-member'}}) {
+ my ($val, $msg) = $group_obj->DeleteMember($user);
+ print $msg ."\n";
+ }
+
+ if ($args{'list-members'}) {
+ my $members = $group_obj->MembersObj();
+ while (my $member = $members->Next()) {
+ print $member->UserObj->Name() ."\n";
+ }
+ }
+
+}
+
+# }}}
+
+# {{{ AdminSystem
+sub AdminSystem {
+ print "In AdminSystem\n";
+
+ AdminTemplates(0);
+ AdminScrips(0);
+ AdminRights(0);
+ AdminKeywordSelects(0);
+}
+# }}}
+
+# {{{ sub AdminTemplates
+
+sub AdminTemplates {
+ my $queue = shift;
+ #Queue = 0 means 'global';
+
+ my %args;
+
+
+ GetOptions(\%args, 'list-templates', 'create-template','modify-template=s',
+ 'delete-template=s', 'display-template=s',
+ 'template-Name=s', 'template-Description=s',
+ 'template-edit-content!');
+
+ # {{{ List templates
+ if ($args{'list-templates'}) {
+ print "Templates for $queue\n";
+ require RT::Templates;
+ my $templates = new RT::Templates($CurrentUser);
+ if ($queue != 0) {
+ $templates->LimitToQueue($queue);
+ }
+ else {
+ $templates->LimitToGlobal();
+ }
+ while (my $template = $templates->Next) {
+ print $template->Id.": ".$template->Name." - " . $template->Description ."\n";
+ }
+ }
+
+ # }}}
+
+ require RT::Template;
+ my $template = new RT::Template($CurrentUser);
+ if ($args{'delete-template'}) {
+ $template->Load($args{'delete-template'});
+ unless ($template->id) {
+ print "Couldn't load template";
+ return(undef);
+ }
+ my ($val, $msg) = $template->Delete();
+ print "$msg\n";
+ }
+ elsif ($args{'create-template'}) {
+ #TODO edit the template content
+ my $content;
+
+ my $linesref = GetMessageContent(CurrentUser => $CurrentUser,
+ Edit => 1);
+
+ $content = join("\n", @{$linesref});
+
+
+ my ($val, $msg) = $template->Create(Name => $args{'template-Name'},
+ Description => $args{'template-Description'},
+ Content => $content,
+ Queue => $queue);
+ print "$msg\n";
+ }
+ elsif ($args{'modify-template'}) {
+
+ $template->Load($args{'modify-template'});
+ unless ($template->Id()) {
+ print "Template not found\n";
+ return();
+ }
+ my @attributes = qw( Name Description );
+ foreach my $attrib (@attributes) {
+ if ( (exists ($args{"template-$attrib"})) and
+ ($template->$attrib() ne $args{"template-$attrib"})) {
+
+ my $method = "Set$attrib";
+ my $val = $template->$method($args{"template-$attrib"});
+
+ }
+ }
+ if ($args{'template-edit-content'}) {
+
+ my $linesref = GetMessageContent(CurrentUser => $CurrentUser,
+ Content => $template->Content,
+ Edit => 1);
+
+ my $content = join("\n", @{$linesref});
+ my ($val) = $template->SetContent($content);
+ print $val."\n";
+ }
+
+ }
+ if ($args{'display-template'}) {
+ $template->Load($args{'display-template'});
+ print $template->Name . "\n". $template->Description ."\n". $template->Content."\n";
+ }
+}
+
+# }}}
+
+# {{{ sub AdminScrips
+
+sub AdminScrips {
+ my $queue = shift;
+ #Queue = 0 means 'global';
+
+ my %args;
+
+
+ GetOptions(\%args, 'list-scrips', 'create-scrip','modify-scrip=s',
+ 'scrip-action=s', 'scrip-template=s', 'scrip-condition=s',
+ 'delete-scrip=s');
+
+
+ # {{{ List entries
+ if ($args{'list-scrips'}) {
+ print "Scrips for $queue\n";
+ require RT::Scrips;
+ my $scrips = new RT::Scrips($CurrentUser);
+ if ($queue != 0) {
+ $scrips->LimitToQueue($queue);
+ }
+ else {
+ $scrips->LimitToGlobal();
+ }
+ while (my $scrip = $scrips->Next) {
+ print $scrip->Id.": If ".
+ $scrip->ConditionObj->Name." then " .
+ $scrip->ActionObj->Name." with template " .
+ $scrip->TemplateObj->Name."\n";
+ }
+ }
+
+ # }}}
+
+ require RT::Scrip;
+ my $scrip = new RT::Scrip($CurrentUser);
+ if ($args{'delete-scrip'}) {
+ $scrip->Load($args{'delete-scrip'});
+ unless ($scrip->id) {
+ print "Couldn't load scrip";
+ return(undef);
+ }
+ my ($val, $msg) = $scrip->Delete();
+ print "$msg\n";
+ }
+ elsif ($args{'create-scrip'}) {
+ my ($val, $msg) = $scrip->Create( ScripAction => $args{'scrip-action'},
+ ScripCondition => $args{'scrip-condition'},
+ Template => $args{'scrip-template'},
+ Queue => $queue);
+
+ print "$msg\n";
+ }
+}
+
+# }}}
+
+# {{{ sub AdminRights
+
+sub AdminRights {
+ my $queue = shift;
+ #Queue = 0 means 'global';
+
+ my ($scope, $appliesto);
+ if ($queue == 0) {
+ $scope = 'System';
+ $appliesto = 0;
+ }
+ else {
+ $scope = 'Queue';
+ $appliesto = $queue;
+ }
+
+ my %args;
+ GetOptions(\%args,
+ 'grant-right|add-right|new-right|create-right=s@',
+ 'revoke-right|del-right|delete-right=s@',
+ 'list-rights', 'userid=s@', 'groupid=s@',
+ );
+
+
+ # {{{ List entries
+ if ($args{'list-rights'}) {
+ require RT::ACL;
+ my $acl = new RT::ACL($CurrentUser);
+ if ($queue != 0) {
+ $acl->LimitToQueue($queue);
+ }
+ else {
+ $acl->LimitToSystem();
+ }
+ while (my $ace = $acl->Next) {
+ print $ace->RightScope;
+
+ #Print the queue name if we have it.
+ print " " . $ace->AppliesToObj->Name if (defined $ace->AppliesToObj);
+
+ print ": ". $ace->PrincipalType . " " .$ace->PrincipalObj->Name .
+ " has right " . $ace->RightName ."\n";
+
+ }
+ }
+
+ # }}}
+
+ require RT::ACE;
+
+ # {{{ Build up an array of principals
+ my (@principals);
+ my $i = 0;
+ foreach my $group (@{$args{'groupid'}}) {
+
+
+ my $princ = new RT::Group($CurrentUser);
+ $princ->Load("$group");
+ if ($princ->id) {
+ $principals[$i]->{'type'} = 'Group';
+ $principals[$i]->{'id'} = $princ->id();
+ $i++;
+ }
+ else {
+ print "Could not find group $group\n";
+ }
+ }
+
+
+ foreach my $user (@{$args{'userid'}}) {
+ my $princ = new RT::User($CurrentUser);
+ $princ->Load("$user");
+ if ($princ->id) {
+ $principals[$i]->{'type'} = 'User';
+ $principals[$i]->{'id'} = $princ->id();
+ $i++;
+ }
+ else {
+ print "Could not find user $user.\n";
+ }
+ }
+ # }}}
+
+
+ foreach my $principal (@principals) {
+
+ # {{{ Delete rights that need deleting
+ foreach my $right (@{$args{'revoke-right'}}) {
+ my $ace = new RT::ACE($CurrentUser);
+ $RT::Logger->debug("Trying to delete a right: $right \n");
+ my ($val, $msg) = $ace->LoadByValues( RightName => $right,
+ RightScope => $scope,
+ PrincipalType => $principal->{'type'},
+ PrincipalId => $principal->{'id'},
+ RightAppliesTo => $appliesto);
+
+ unless ($val) {
+ print "Right $right not found for" . $principal->{'type'} . " " .
+ $principal->{'id'} . " in scope $scope ($appliesto)\n";
+ next;
+ }
+ my ($delval, $delmsg) =$ace->Delete;
+ print "$delmsg\n";
+
+
+ }
+
+ # }}}
+
+ # {{{ grant rights that need granting
+ foreach my $right (@{$args{'grant-right'}}) {
+ my $ace = new RT::ACE($CurrentUser);
+ my ($val, $msg) = $ace->Create(RightName => $right,
+ PrincipalType => $principal->{'type'},
+ PrincipalId => $principal->{'id'},
+ RightScope => $scope,
+ RightAppliesTo => $appliesto);
+
+ print $msg . "\n";
+ }
+
+ # }}}
+ }
+
+}
+
+# }}}
+
+
+sub ListUsers {
+ require RT::Users;
+ my $users = new RT::Users($CurrentUser);
+ $users->UnLimit();
+ while (my $user = $users->Next()) {
+ printf ("%16s %-16s\n",$user->Name(), $user->EmailAddress());
+ }
+}
+sub ListQueues {
+ require RT::Queues;
+ my $queues = new RT::Queues($CurrentUser);
+ $queues->UnLimit();
+ while (my $queue = $queues->Next()) {
+ printf ("%16s %-16s\n",$queue->Name(), $queue->Description());
+ }
+}
+
+sub ListGroups {
+ require RT::Groups;
+ my $groups = new RT::Groups($CurrentUser);
+ $groups->UnLimit();
+ while (my $group = $groups->Next()) {
+ printf ("%16s %-16s\n",$group->Name(), $group->Description());
+ }
+}