import rt 2.0.14
[freeside.git] / rt / tools / insertdata
diff --git a/rt/tools/insertdata b/rt/tools/insertdata
new file mode 100755 (executable)
index 0000000..b3e76e6
--- /dev/null
@@ -0,0 +1,618 @@
+#!/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 <version>\n"
+          . "where <version> 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 <URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} >
+-------------------------------------------------------------------------
+{$Transaction->Content()}'
+        },
+
+        {
+
+            Queue       => '0',
+            Name        => 'AdminCorrespondence',
+            Description => 'Default admin correspondence template',
+            Content     => '
+
+
+<URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->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;
+