[freeside-commits] freeside/rt/sbin rt-setup-database.in,1.7,1.8

Ivan,,, ivan at wavetail.420.am
Fri Aug 3 14:49:05 PDT 2007


Update of /home/cvs/cvsroot/freeside/rt/sbin
In directory wavetail:/tmp/cvs-serv31370/sbin

Modified Files:
	rt-setup-database.in 
Log Message:
merging RT_3_6_4 to HEAD

Index: rt-setup-database.in
===================================================================
RCS file: /home/cvs/cvsroot/freeside/rt/sbin/rt-setup-database.in,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- rt-setup-database.in	17 Oct 2006 09:03:49 -0000	1.7
+++ rt-setup-database.in	3 Aug 2007 21:49:03 -0000	1.8
@@ -3,7 +3,7 @@
 # 
 # COPYRIGHT:
 #  
-# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC 
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
 #                                          <jesse at bestpractical.com>
 # 
 # (Except where explicitly superseded by other copyright notices)
@@ -23,7 +23,9 @@
 # 
 # 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
 # 
 # 
 # CONTRIBUTION SUBMISSION POLICY:
@@ -47,8 +49,9 @@
 use strict;
 use vars qw($PROMPT $VERSION $Handle $Nobody $SystemUser $item);
 use vars
-  qw(@Groups @Users @ACL @Queues @ScripActions @ScripConditions @Templates @CustomFields @Scrips);
+  qw(@Groups @Users @ACL @Queues @ScripActions @ScripConditions @Templates @CustomFields @Scrips @Attributes);
 
+use lib "@LOCAL_LIB_PATH@";
 use lib "@RT_LIB_PATH@";
 
 #This drags in  RT's config.pm
@@ -81,6 +84,11 @@
     'datadir=s'
 );
 
+unless ( $args{'action'} ) {
+    help();
+    exit(-1);
+}
+
 $| = 1;    #unbuffer that output.
 
 require RT::Handle;
@@ -93,56 +101,50 @@
     chomp( $args{'dba-password'} );
 }
 
-unless ( $args{'action'} ) {
-    help();
-    die;
-}
 if ( $args{'action'} eq 'init' ) {
     $dbh = DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} )
       || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
     print "Now creating a database for RT.\n";
-    if ($RT::DatabaseType ne 'Oracle' ||
-        $args{'dba'} ne $RT::DatabaseUser) {
-    create_db();
+    if ( $RT::DatabaseType ne 'Oracle' || $args{'dba'} ne $RT::DatabaseUser ) {
+        create_db();
     } else {
         print "...skipped as ".$args{'dba'} ." is not " . $RT::DatabaseUser . " or we're working with Oracle.\n";
     }
 
-    if ($RT::DatabaseType eq "mysql") {
+    if ( $RT::DatabaseType eq "mysql" ) {
         # Check which version we're running
         my ($version) = $dbh->selectrow_hashref("show variables like 'version'")->{Value} =~ /^(\d\.\d+)/;
         print "*** Warning: RT is unsupported on MySQL versions before 4.0.x\n" if $version < 4;
 
         # MySQL must have InnoDB support
         my $innodb = $dbh->selectrow_hashref("show variables like 'have_innodb'")->{Value};
-        if ($innodb eq "NO") {
+        if ( $innodb eq "NO" ) {
             die "RT requires that MySQL be compiled with InnoDB table support.\n".
               "See http://dev.mysql.com/doc/mysql/en/InnoDB.html\n";
-        } elsif ($innodb eq "DISABLED") {
+        } elsif ( $innodb eq "DISABLED" ) {
             die "RT requires that MySQL InnoDB table support be enabled.\n".
               ($version < 4
                ? "Add 'innodb_data_file_path=ibdata1:10M:autoextend' to the [mysqld] section of my.cnf\n"
                : "Remove the 'skip-innodb' line from your my.cnf file, restart MySQL, and try again.\n");
         }
     }
-    
+
     # SQLite can't deal with the disconnect/reconnect
-    unless ($RT::DatabaseType eq 'SQLite') {
+    unless ( $RT::DatabaseType eq 'SQLite' ) {
 
         $dbh->disconnect;
 
-	if ($RT::DatabaseType eq "Oracle") {
-        $RT::DatabasePassword = $RT::DatabasePassword; #Warning avidance
-        $dbh = DBI->connect( $Handle->DSN, ${RT::DatabaseUser}, ${RT::DatabasePassword} ) || die $DBI::errstr;
-	} else {
-	
-        $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) || die $DBI::errstr;
-	}
+        if ( $RT::DatabaseType eq "Oracle" ) {
+            $RT::DatabasePassword = $RT::DatabasePassword; #Warning avidance
+            $dbh = DBI->connect( $Handle->DSN, ${RT::DatabaseUser}, ${RT::DatabasePassword} ) || die $DBI::errstr;
+        } else {	
+            $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) || die $DBI::errstr;
+        }
     }
     print "Now populating database schema.\n";
     insert_schema();
     print "Now inserting database ACLs\n";
-    insert_acl() unless ($RT::DatabaseType eq 'Oracle');
+    insert_acl() unless $RT::DatabaseType eq 'Oracle';
     print "Now inserting RT core system objects\n";
     insert_initial_data();
     print "Now inserting RT data\n";
@@ -150,11 +152,11 @@
 }
 elsif ( $args{'action'} eq 'drop' ) {
     unless ( $dbh =
-         DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) )
+        DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) )
     {
         warn $DBI::errstr;
         warn "Database doesn't appear to exist. Aborting database drop.";
-        exit(0);
+        exit;
     }
     drop_db();
 }
@@ -162,38 +164,43 @@
     insert_initial_data();
 }
 elsif ( $args{'action'} eq 'insert' ) {
-    insert_data( $args{'datafile'} || ($args{'datadir'}."/content"));
+    insert_data( $args{'datafile'} || ($args{'datadir'}."/content") );
 }
-elsif ($args{'action'} eq 'acl') {
+elsif ( $args{'action'} eq 'acl' ) {
     $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
       || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
-     insert_acl($args{'datadir'});
+    insert_acl($args{'datadir'});
 }
-elsif ($args{'action'} eq 'schema') {
+elsif ( $args{'action'} eq 'schema' ) {
     $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} )
       || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr";
-        insert_schema($args{'datadir'});
+    insert_schema($args{'datadir'});
 }
-
 else {
-    print STDERR '$0 called with an invalid --action parameter';
+    print STDERR "$0 called with an invalid --action parameter\n";
     exit(-1);
 }
 
 # {{{ sub insert_schema
 sub insert_schema {
-        my $base_path = (shift || $RT::EtcPath);
+    my $base_path = (shift || $RT::EtcPath);
     my (@schema);
     print "Creating database schema.\n";
 
-    if ( -f $base_path . "/schema." . $RT::DatabaseType ) {
-	no warnings 'unopened';
+    my $schema_file = $base_path . "/schema." . $RT::DatabaseType;
+    if ( -f $schema_file ) {
+        open( SCHEMA, "<$schema_file"  ) or die "Can't open $schema_file: $!";
+	my @lines = <SCHEMA>;
 
-        open( SCHEMA, "<" . $base_path . "/schema." . $RT::DatabaseType );
-        open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType );
+	my $local_schema_file = $RT::LocalEtcPath . "/schema." . $RT::DatabaseType;
+	if (-f $local_schema_file) {
+	    open( SCHEMA_LOCAL, "<$local_schema_file" )
+		or die "Can't open $local_schema_file: $!";
+	    push @lines, ';;', <SCHEMA_LOCAL>;
+	}
 
         my $statement = "";
-        foreach my $line (<SCHEMA>, ($_ = ';;'), <SCHEMA_LOCAL>) {
+        foreach my $line (@lines) {
             $line =~ s/\#.*//g;
             $line =~ s/--.*//g;
             $statement .= $line;
@@ -204,11 +211,12 @@
             }
         }
 
-	local $SIG{__WARN__} = sub {};
-	my $is_local = 0; # local/etc/schema needs to be nonfatal. 
+        local $SIG{__WARN__} = sub {};
+        my $is_local = 0; # local/etc/schema needs to be nonfatal.
         $dbh->begin_work or die $dbh->errstr;
         foreach my $statement (@schema) {
-	    if ($statement =~ /^\s*;$/) { $is_local = 1; next; }
+            if ( $statement =~ /^\s*;$/ ) { $is_local = 1; next; }
+
             print STDERR "SQL: $statement\n" if defined $args{'debug'};
             my $sth = $dbh->prepare($statement) or die $dbh->errstr;
             unless ( $sth->execute or $is_local ) {
@@ -216,13 +224,11 @@
             }
         }
         $dbh->commit or die $dbh->errstr;
-
     }
     else {
         die "Couldn't find schema file for " . $RT::DatabaseType . "\n";
     }
     print "Done setting up database schema.\n";
-
 }
 
 # }}}
@@ -232,13 +238,13 @@
     if ( $RT::DatabaseType eq 'Oracle' ) {
         print <<END;
 
-To delete the tables and sequences of the RT Oracle database by running 
-    \@etc/drop.Oracle 
+To delete the tables and sequences of the RT Oracle database by running
+    \@etc/drop.Oracle
 through SQLPlus.
 
 END
         return;
-    }	
+    }
     unless ( $args{'force'} ) {
         print <<END;
 
@@ -253,8 +259,8 @@
     print "Dropping $RT::DatabaseType database $RT::DatabaseName.\n";
 
     if ( $RT::DatabaseType eq 'SQLite' ) {
-	unlink $RT::DatabaseName or warn $!;
-	return;
+        unlink $RT::DatabaseName or warn $!;
+        return;
     }
     $dbh->do("Drop DATABASE $RT::DatabaseName") or warn $DBI::errstr;
 }
@@ -269,15 +275,15 @@
     }
     elsif ( $RT::DatabaseType eq 'Pg' ) {
         $dbh->do("CREATE DATABASE $RT::DatabaseName WITH ENCODING='UNICODE'");
-        if ($DBI::errstr) {
+        if ( $DBI::errstr ) {
             $dbh->do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr;
         }
     }
-    elsif ($RT::DatabaseType eq 'Oracle') {
+    elsif ( $RT::DatabaseType eq 'Oracle' ) {
         insert_acl();
     }
     elsif ( $RT::DatabaseType eq 'Informix' ) {
-	$ENV{DB_LOCALE} = 'en_us.utf8';
+        $ENV{DB_LOCALE} = 'en_us.utf8';
         $dbh->do("CREATE DATABASE $RT::DatabaseName WITH BUFFERED LOG");
     }
     else {
@@ -315,8 +321,7 @@
 
 # {{{ insert_acls
 sub insert_acl {
-
-        my $base_path = (shift || $RT::EtcPath);
+    my $base_path = (shift || $RT::EtcPath);
 
     if ( $RT::DatabaseType =~ /^oracle$/i ) {
         do $base_path . "/acl.Oracle"
@@ -378,8 +383,8 @@
         $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/;
     }
     elsif ( $RT::DatabaseType eq 'Informix' ) {
-	# with Informix, you want to connect sans database:
-	$dsn =~ s/Informix:$RT::DatabaseName/Informix:/;
+        # with Informix, you want to connect sans database:
+        $dsn =~ s/Informix:$RT::DatabaseName/Informix:/;
     }
     return $dsn;
 }
@@ -418,14 +423,15 @@
         Comments =>
 'Do not delete or modify this user. It is integral to RT\'s internal database structures',
         Creator => '1',
-        LastUpdatedBy => '1' );
+        LastUpdatedBy => '1',
+    );
 
-    unless ($val) {
+    unless ( $val ) {
         print "$msg\n";
-        exit(1);
+        exit(-1);
     }
     print "done.\n";
-    $RT::Handle->Disconnect() unless ($RT::DatabaseType eq 'SQLite');
+    $RT::Handle->Disconnect() unless $RT::DatabaseType eq 'SQLite';
 
 }
 
@@ -461,77 +467,78 @@
     require $datafile
       || die "Couldn't find initial data for import\n" . $@;
 
-    if (@Groups) {
+    if ( @Groups ) {
         print "Creating groups...";
         foreach $item (@Groups) {
             my $new_entry = RT::Group->new($CurrentUser);
             my ( $return, $msg ) = $new_entry->_Create(%$item);
-            print "(Error: $msg)" unless ($return);
+            print "(Error: $msg)" unless $return;
             print $return. ".";
         }
         print "done.\n";
     }
-    if (@Users) {
+    if ( @Users ) {
         print "Creating users...";
         foreach $item (@Users) {
             my $new_entry = new RT::User($CurrentUser);
             my ( $return, $msg ) = $new_entry->Create(%$item);
-            print "(Error: $msg)" unless ($return);
+            print "(Error: $msg)" unless $return;
             print $return. ".";
         }
         print "done.\n";
     }
-    if (@Queues) {
+    if ( @Queues ) {
         print "Creating queues...";
         for $item (@Queues) {
             my $new_entry = new RT::Queue($CurrentUser);
             my ( $return, $msg ) = $new_entry->Create(%$item);
-            print "(Error: $msg)" unless ($return);
+            print "(Error: $msg)" unless $return;
             print $return. ".";
         }
         print "done.\n";
     }
-    if (@ACL) {
+    if ( @ACL ) {
         print "Creating ACL...";
         for my $item (@ACL) {
 
-	    my ($princ, $object);
+            my ($princ, $object);
 
-	    # Global rights or Queue rights?
-	    if ($item->{'Queue'}) {
+            # Global rights or Queue rights?
+            if ( $item->{'Queue'} ) {
                 $object = RT::Queue->new($CurrentUser);
                 $object->Load( $item->{'Queue'} );
-	    } else {
-		$object = $RT::System;
-	    }
+            } else {
+                $object = $RT::System;
+            }
 
-	    # Group rights or user rights?
-	    if ($item->{'GroupDomain'}) {
+            # Group rights or user rights?
+            if ( $item->{'GroupDomain'} ) {
                 $princ = RT::Group->new($CurrentUser);
-	        if ($item->{'GroupDomain'} eq 'UserDefined') {
+                if ( $item->{'GroupDomain'} eq 'UserDefined' ) {
                   $princ->LoadUserDefinedGroup( $item->{'GroupId'} );
-	        } elsif ($item->{'GroupDomain'} eq 'SystemInternal') {
+                } elsif ( $item->{'GroupDomain'} eq 'SystemInternal' ) {
                   $princ->LoadSystemInternalGroup( $item->{'GroupType'} );
-	        } elsif ($item->{'GroupDomain'} eq 'RT::System-Role') {
+                } elsif ( $item->{'GroupDomain'} eq 'RT::System-Role' ) {
                   $princ->LoadSystemRoleGroup( $item->{'GroupType'} );
-	        } elsif ($item->{'GroupDomain'} eq 'RT::Queue-Role' &&
-			 $item->{'Queue'}) {
+                } elsif ( $item->{'GroupDomain'} eq 'RT::Queue-Role' &&
+                          $item->{'Queue'} )
+                {
                   $princ->LoadQueueRoleGroup( Type => $item->{'GroupType'},
-					      Queue => $object->id);
-	        } else {
+                                              Queue => $object->id);
+                } else {
                   $princ->Load( $item->{'GroupId'} );
-	        }
-	    } else {
-		$princ = RT::User->new($CurrentUser);
-		$princ->Load( $item->{'UserId'} );
-	    }
+                }
+            } else {
+                $princ = RT::User->new($CurrentUser);
+                $princ->Load( $item->{'UserId'} );
+            }
 
-	    # Grant it
-	    my ( $return, $msg ) = $princ->PrincipalObj->GrantRight(
+            # Grant it
+            my ( $return, $msg ) = $princ->PrincipalObj->GrantRight(
                                                      Right => $item->{'Right'},
                                                      Object => $object );
 
-            if ($return) {
+            if ( $return ) {
                 print $return. ".";
             }
             else {
@@ -542,65 +549,68 @@
         }
         print "done.\n";
     }
-    if (@CustomFields) {
+    if ( @CustomFields ) {
         print "Creating custom fields...";
         for $item (@CustomFields) {
             my $new_entry = new RT::CustomField($CurrentUser);
             my $values    = $item->{'Values'};
             delete $item->{'Values'};
-            my $q     = $item->{'Queue'};
-            my $q_obj = RT::Queue->new($CurrentUser);
-            $q_obj->Load($q);
-            if ( $q_obj->Id ) {
-                $item->{'Queue'} = $q_obj->Id;
-            }
-            elsif ( $q == 0 ) {
-                $item->{'Queue'} = 0;
-            }
-            else {
-                print "(Error: Could not find queue " . $q . ")\n"
-                  unless ( $q_obj->Id );
+            my ( $return, $msg ) = $new_entry->Create(%$item);
+            unless( $return ) {
+                print "(Error: $msg)\n";
                 next;
             }
-            my ( $return, $msg ) = $new_entry->Create(%$item);
 
             foreach my $value ( @{$values} ) {
                 my ( $eval, $emsg ) = $new_entry->AddValue(%$value);
-                print "(Error: $emsg)\n" unless ($eval);
+                print "(Error: $emsg)\n" unless $eval;
             }
 
-            print "(Error: $msg)\n" unless ($return);
+            if ( $item->{LookupType} && !exists $item->{'Queue'} ) { # enable by default
+                my $ocf = RT::ObjectCustomField->new($CurrentUser);
+                $ocf->Create( CustomField => $new_entry->Id );
+            }
+
+            print "(Error: $msg)\n" unless $return;
             print $return. ".";
         }
 
         print "done.\n";
     }
 
-    if (@ScripActions) {
+    if ( @ScripActions ) {
         print "Creating ScripActions...";
 
         for $item (@ScripActions) {
             my $new_entry = RT::ScripAction->new($CurrentUser);
-            my $return    = $new_entry->Create(%$item);
+            my ($return,$msg) = $new_entry->Create(%$item);
+            unless ($return) {
+                print "(Error: $msg)\n";
+                exit;
+            }
             print $return. ".";
         }
 
         print "done.\n";
     }
 
-    if (@ScripConditions) {
+    if ( @ScripConditions ) {
         print "Creating ScripConditions...";
 
         for $item (@ScripConditions) {
             my $new_entry = RT::ScripCondition->new($CurrentUser);
-            my $return    = $new_entry->Create(%$item);
+            my ($return,$msg) = $new_entry->Create(%$item);
+            unless ($return) {
+                print "(Error: $msg)\n";
+                exit;
+            }
             print $return. ".";
         }
 
         print "done.\n";
     }
 
-    if (@Templates) {
+    if ( @Templates ) {
         print "Creating templates...";
 
         for $item (@Templates) {
@@ -610,13 +620,13 @@
         }
         print "done.\n";
     }
-    if (@Scrips) {
+    if ( @Scrips ) {
         print "Creating scrips...";
 
         for $item (@Scrips) {
             my $new_entry = new RT::Scrip($CurrentUser);
             my ( $return, $msg ) = $new_entry->Create(%$item);
-            if ($return) {
+            if ( $return ) {
                 print $return. ".";
             }
             else {
@@ -625,7 +635,24 @@
         }
         print "done.\n";
     }
-    $RT::Handle->Disconnect() unless ($RT::DatabaseType eq 'SQLite');
+    if ( @Attributes ) {
+        print "Creating predefined searches...";
+        my $sys = RT::System->new($CurrentUser);
+
+        for $item (@Attributes) {
+            my $obj = delete $item->{Object}; # XXX: make this something loadable
+            $obj ||= $sys;
+            my ( $return, $msg ) = $obj->AddAttribute (%$item);
+            if ( $return ) {
+                print $return. ".";
+            }
+            else {
+                print "(Error: $msg)\n";
+            }
+        }
+        print "done.\n";
+    }
+    $RT::Handle->Disconnect() unless $RT::DatabaseType eq 'SQLite';
     print "Done setting up database content.\n";
 }
 
@@ -651,7 +678,7 @@
 $0: Set up RT's database
 
 --action        init    Initialize the database
-                drop    Drop the database. 
+                drop    Drop the database.
                         This will ERASE ALL YOUR DATA
                 insert_initial 
                         Insert RT's core system objects
@@ -659,11 +686,11 @@
                         By default, will use RT's installation data.
                         To use a local or supplementary datafile, specify it
                         using the '--datafile' option below.
-                        
+
                 acl     Initialize only the database ACLs
                         To use a local or supplementary datafile, specify it
                         using the '--datadir' option below.
-                        
+
                 schema  Initialize only the database schema
                         To use a local or supplementary datafile, specify it
                         using the '--datadir' option below.



More information about the freeside-commits mailing list