#!/usr/bin/perl -w # # $Header: /home/cvs/cvsroot/freeside/rt/tools/Attic/insertdata,v 1.1 2002-08-12 06:17:08 ivan Exp $ # RT is (c) 1996-2002 Jesse Vincent (jesse@bestpractical.com); package RT; use strict; use vars qw($VERSION $Handle $Nobody $SystemUser $item); use lib "!!RT_LIB_PATH!!"; use lib "!!RT_ETC_PATH!!"; #This drags in RT's config.pm use config; use Carp; use RT::Handle; use RT::User; use RT::CurrentUser; # my $LastVersion = shift || undef; my $LastMinorVersion = undef; #connect to the db $RT::Handle = new RT::Handle($RT::DatabaseType); $RT::Handle->Connect(); #Put together a current user object so we can create a User object my $CurrentUser = new RT::CurrentUser(); if ($LastVersion) { if ( $LastVersion =~ /^2.0.(\d+)$/ ) { $LastMinorVersion = $1; print "Looking for new objects to add to the database" . " since $LastVersion\n\n"; } else { print "This tool does not support upgrades from development releases " . "or non 2.0.x versions"; } } else { # this is a virgin install print "Checking for existing system user..."; my $test_user = RT::User->new($CurrentUser); $test_user->Load('RT_System'); if ( $test_user->id ) { print "Found!\n\nYou appear to have already run insertdata.\n" . "Exiting, so as not to clobber your existing data. To ERASE your\n" . "RT database and start over, type 'make dropdb; make install' in\n" . "the RT installation directory. If you just meant to upgrade the\n" . "content of your database, rerun this program as: \n", " $0 \n" . "where is the last RELEASED version of RT you installed\n" . "for example, if you're upgrading from 2.0.4, you'd type:\n" . " $0 2.0.4\n"; exit(-1); } else { print "not found. This appears to be a new installation"; } print "Creating system user..."; my $RT_System = new RT::User($CurrentUser); my ( $val, $msg ) = $RT_System->_BootstrapCreate( Name => 'RT_System', RealName => 'The RT System itself', Comments => 'Do not delete or modify this user. It is integral to RT\'s internal database structures', Privileged => '2', Creator => '1' ); if ($val) { print "done.\n"; } else { print "$msg\n"; exit(1); } } #now that we bootstrapped that little bit, we can use the standard RT cli # helpers to do what we need 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(); $CurrentUser->LoadByName('RT_System'); # {{{ Users my @users; unless ($LastVersion) { @users = ( { Name => 'Nobody', RealName => 'Nobody in particular', Comments => 'Do not delete or modify this user. It is integral ' . 'to RT\'s internal data structures', Privileged => '2', }, { Name => 'root', Gecos => 'root', RealName => 'Enoch Root', Password => 'password', EmailAddress => "root\@localhost", Comments => 'SuperUser', Privileged => '1', } ); } # }}} # {{{ Groups my @groups; unless ($LastVersion) { @groups = ( { Name => 'Everyone', Description => 'Pseudogroup for internal use', Pseudo => '1', }, { Name => 'Owner', Description => 'Pseudogroup for internal use', Pseudo => '1', }, { Name => 'Requestor', Description => 'Pseudogroup for internal use', Pseudo => '1', }, { Name => 'Cc', Description => 'Pseudogroup for internal use', Pseudo => '1', }, { Name => 'AdminCc', Description => 'Pseudogroup for internal use', Pseudo => '1', }, ); } # }}} # {{{ ACL my @acl; unless ($LastVersion) { @acl = ( #TODO: make this actually take the serial # granted to root. { PrincipalId => '1', PrincipalType => 'User', RightName => 'SuperUser', RightScope => 'System', RightAppliesTo => '0' }, { PrincipalId => '2', PrincipalType => 'User', RightName => 'SuperUser', RightScope => 'System', RightAppliesTo => '0' }, { PrincipalId => '3', PrincipalType => 'User', RightName => 'SuperUser', RightScope => 'System', RightAppliesTo => '0' } ); } # }}} # {{{ Queues my @queues; unless ($LastVersion) { @queues = ( { Name => 'general', Description => 'The default queue', CorrespondAddress => "rt\@localhost", CommentAddress => "rt-comment\@localhost" } ); } # }}} # {{{ ScripActions my @ScripActions; unless ($LastVersion) { @ScripActions = ( { Name => 'AutoreplyToRequestors', Description => 'Always sends a message to the requestors independent of message sender', ExecModule => 'Autoreply', Argument => 'Requestor' }, { Name => 'NotifyRequestors', Description => 'Sends a message to the requestors', ExecModule => 'Notify', Argument => 'Requestor' }, { Name => 'NotifyOwnerAsComment', Description => 'Sends mail to the owner', ExecModule => 'NotifyAsComment', Argument => 'Owner' }, { Name => 'NotifyOwner', Description => 'Sends mail to the owner', ExecModule => 'Notify', Argument => 'Owner' }, { Name => 'NotifyAdminCcsAsComment', Description => 'Sends mail to the administrative Ccs as a comment', ExecModule => 'NotifyAsComment', Argument => 'AdminCc' }, { Name => 'NotifyAdminCcs', Description => 'Sends mail to the administrative Ccs', ExecModule => 'Notify', Argument => 'AdminCc' }, { Name => 'NotifyRequestorsAndCcsAsComment', Description => 'Send mail to requestors and Ccs as a comment', ExecModule => 'NotifyAsComment', Argument => 'Requestor,Cc' }, { Name => 'NotifyRequestorsAndCcs', Description => 'Send mail to requestors and Ccs', ExecModule => 'Notify', Argument => 'Requestor,Cc' }, { Name => 'NotifyAllWatchersAsComment', Description => 'Send mail to all watchers', ExecModule => 'NotifyAsComment', Argument => 'All' }, { Name => 'NotifyAllWatchers', Description => 'Send mail to all watchers', ExecModule => 'Notify', Argument => 'All' }, ); } if ( $LastMinorVersion < 12 ) { push ( @ScripActions, { Name => 'NotifyOtherRecipientsAsComment', Description => 'Sends mail to explicitly listed Ccs and Bccs', ExecModule => 'NotifyAsComment', Argument => 'OtherRecipients' }, { Name => 'NotifyOtherRecipients', Description => 'Sends mail to explicitly listed Ccs and Bccs', ExecModule => 'Notify', Argument => 'OtherRecipients' }, ); } # }}} # {{{ ScripConditions my @ScripConditions; unless ($LastVersion) { @ScripConditions = ( { Name => 'OnCreate', Description => 'When a ticket is created', ApplicableTransTypes => 'Create', ExecModule => 'AnyTransaction', }, { Name => 'OnTransaction', Description => 'When anything happens', ApplicableTransTypes => 'Any', ExecModule => 'AnyTransaction', }, { Name => 'OnCorrespond', Description => 'Whenever correspondence comes in', ApplicableTransTypes => 'Correspond', ExecModule => 'AnyTransaction', }, { Name => 'OnComment', Description => 'Whenever comments come in', ApplicableTransTypes => 'Comment', ExecModule => 'AnyTransaction' }, { Name => 'OnStatus', Description => 'Whenever a ticket\'s status changes', ApplicableTransTypes => 'Status', ExecModule => 'AnyTransaction', }, { Name => 'OnResolve', Description => 'Whenever a ticket is resolved.', ApplicableTransTypes => 'Status', ExecModule => 'StatusChange', Argument => 'resolved' }, ); } # }}} # {{{ Templates my @templates; unless ($LastVersion) { @templates = ( { Queue => '0', Name => 'Autoreply', Description => 'Default Autoresponse Template', Content => 'Subject: AutoReply: {$Ticket->Subject} Greetings, This message has been automatically generated in response to the creation of a trouble ticket regarding: "{$Ticket->Subject()}", a summary of which appears below. There is no need to reply to this message right now. Your ticket has been assigned an ID of [{$rtname} #{$Ticket->id()}]. Please include the string: [{$rtname} #{$Ticket->id}] in the subject line of all future correspondence about this issue. To do so, you may reply to this message. Thank you, {$Ticket->QueueObj->CorrespondAddress()} ------------------------------------------------------------------------- {$Transaction->Content()} ' }, { # id => 2, Queue => '0', Name => 'Transaction', Description => 'Default transaction template', Content => ' {$Transaction->CreatedAsString}: Request {$Ticket->id} was acted upon. Transaction: {$Transaction->Description} Queue: {$Ticket->QueueObj->Name} Subject: {$Transaction->Subject || $Ticket->Subject || "(No subject given)"} Owner: {$Ticket->OwnerObj->Name} Requestors: {$Ticket->Requestors->EmailsAsString()} Status: {$Ticket->Status} Ticket id} > ------------------------------------------------------------------------- {$Transaction->Content()}' }, { Queue => '0', Name => 'AdminCorrespondence', Description => 'Default admin correspondence template', Content => ' id} > {$Transaction->Content()}' }, { Queue => '0', Name => 'Correspondence', Description => 'Default correspondence template', Content => ' {$Transaction->Content()}' }, { Queue => '0', Name => 'AdminComment', Description => 'Default admin comment template', Content => 'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\\[Comment\\]//g; $comment =~ s/^Re//i; $s;} {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} This is a comment. It is not sent to the Requestor(s): {$Transaction->Content()} ' }, { Queue => '0', Name => 'StatusChange', Description => 'Ticket status changed', Content => 'Subject: Status Changed to: {$Transaction->NewValue} {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} {$Transaction->Content()} ' }, { Queue => '0', Name => 'Resolved', Description => 'Ticket Resolved', Content => 'Subject: Ticket Resolved According to our records, your request has been resolved. If you have any further questions or concerns, please respond to this message. ' } ); } # }}} # {{{ Scrips; my @scrips; unless ($LastVersion) { @scrips = ( { Queue => 0, ScripCondition => 'OnCreate', ScripAction => 'AutoreplyToRequestors', Template => 'Autoreply' }, { Queue => 0, ScripCondition => 'OnCreate', ScripAction => 'NotifyAdminCcs', Template => 'Transaction', }, { Queue => 0, ScripCondition => 'OnCorrespond', ScripAction => 'NotifyAllWatchers', Template => 'Correspondence', }, { Queue => 0, ScripCondition => 'OnComment', ScripAction => 'NotifyAdminCcsAsComment', Template => 'AdminComment', }, ) } if ( $LastMinorVersion < 12 ) { push ( @scrips, { Queue => 0, ScripCondition => 'OnComment', ScripAction => 'NotifyOtherRecipientsAsComment', Template => 'Correspondence', }, { Queue => 0, ScripCondition => 'OnCorrespond', ScripAction => 'NotifyOtherRecipients', Template => 'Correspondence', }, ); } # }}} print "Creating ACL..."; use RT::ACE; for $item (@acl) { my $new_entry = new RT::ACE($CurrentUser); #Using an internal function. this should never be used outside of the bootstrap script my $return = $new_entry->_BootstrapRight(%$item); print $return. "."; } print "done.\n"; print "Creating users..."; use RT::User; foreach $item (@users) { my $new_entry = new RT::User($CurrentUser); my ( $return, $msg ) = $new_entry->Create(%$item); print "(Error: $msg)" unless ($return); print $return. "."; } print "done.\n"; print "Creating groups..."; use RT::Group; foreach $item (@groups) { my $new_entry = new RT::Group($CurrentUser); my $return = $new_entry->Create(%$item); print $return. "."; } print "done.\n"; print "Creating queues..."; use RT::Queue; for $item (@queues) { my $new_entry = new RT::Queue($CurrentUser); my ( $return, $msg ) = $new_entry->Create(%$item); print "(Error: $msg)" unless ($return); print $return. "."; } print "done.\n"; print "Creating ScripActions..."; use RT::ScripAction; for $item (@ScripActions) { my $new_entry = new RT::ScripAction($CurrentUser); my $return = $new_entry->Create(%$item); print $return. "."; } print "done.\n"; print "Creating ScripConditions..."; use RT::ScripCondition; for $item (@ScripConditions) { my $new_entry = new RT::ScripCondition($CurrentUser); my $return = $new_entry->Create(%$item); print $return. "."; } print "done.\n"; print "Creating templates..."; use RT::Template; for $item (@templates) { my $new_entry = new RT::Template($CurrentUser); my $return = $new_entry->Create(%$item); print $return. "."; } print "done.\n"; print "Creating Scrips..."; use RT::Scrip; for $item (@scrips) { my $new_entry = RT::Scrip->new($CurrentUser); my ($return,$msg) = $new_entry->Create(%$item); print "(Error: $msg)" unless ($return); print $return."."; } print "done.\n"; $RT::Handle->Disconnect(); 1;