diff options
Diffstat (limited to 'rt/sbin')
-rw-r--r-- | rt/sbin/extract_pod_tests | 159 | ||||
-rw-r--r-- | rt/sbin/regression_harness | 56 | ||||
-rwxr-xr-x | rt/sbin/rt-clean-sessions | 12 | ||||
-rw-r--r-- | rt/sbin/rt-clean-sessions.in | 12 | ||||
-rwxr-xr-x | rt/sbin/rt-dump-database | 4 | ||||
-rwxr-xr-x | rt/sbin/rt-dump-database.in | 4 | ||||
-rw-r--r-- | rt/sbin/rt-setup-database | 474 | ||||
-rw-r--r-- | rt/sbin/rt-setup-database.in | 4 | ||||
-rw-r--r-- | rt/sbin/rt-test-dependencies | 574 | ||||
-rw-r--r-- | rt/sbin/rt-test-dependencies.in | 58 |
10 files changed, 65 insertions, 1292 deletions
diff --git a/rt/sbin/extract_pod_tests b/rt/sbin/extract_pod_tests deleted file mode 100644 index 897564daf..000000000 --- a/rt/sbin/extract_pod_tests +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (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 -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# 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 }}} -use strict; -use vars qw($VERSION); -$VERSION = '0.06'; - -use Pod::Tests; -use Symbol; - -=pod - -=head1 NAME - -extract_pod_tests - RT-specific variant of pod2tests - -=head1 SYNOPSIS - - pod2test [-Mmodule] [input [output]] - -=head1 DESCRIPTION - -B<pod2test> is a front-end for Test::Inline. It generates the -"Bodies" of MakeMaker style .t testing files from embedded tests and -code examples. - -If output is not specified, the resulting .t file will go to STDOUT. -Otherwise, it will go to the given output file. If input is not -given, it will draw from STDIN. - -If the given file contains no tests or code examples, no output will -be given and no output file will be created. - -=cut - -my($infile, $outfile) = @ARGV; -my($infh,$outfh); - - -if( defined $infile ) { - $infh = gensym; - open($infh, $infile) or - die "Can't open the POD file $infile: $!"; -} -else { - $infh = \*STDIN; -} - -unless ($outfile) { - ( my $test = $infile ) =~ s/\.(pm|pod)$//; - $test =~ s/^lib\W//; - $test =~ s/\W/-/; - $test =~ s/\//__/g; - - $outfile = "lib/t/autogen/autogen-$test.t"; -} - - -my $p = Pod::Tests->new; -$p->parse_fh($infh); - -# XXX Hack to put the filename into the #line directive -$p->{file} = $infile || ''; - -my @tests = $p->build_tests($p->tests); -my @examples = $p->build_examples($p->examples); - -exit unless @tests or @examples; - - -if( defined $outfile) { - $outfh = gensym; - open($outfh, ">$outfile") or - die "Can't open the test file $outfile: $!"; -} -else { - $outfh = \*STDOUT; -} - - -print $outfh <<EOF; - -use Test::More qw/no_plan/; -use RT; -RT::LoadConfig(); -RT::Init(); - -EOF -foreach my $test (@tests, @examples) { - print $outfh "$test\n"; -} - -print $outfh "1;\n"; - -=pod - -=head1 BUGS and CAVEATS - -This is a very simple rough cut. It only does very rudimentary tests -on the examples. - -=head1 AUTHOR - - - -Based on pod2tests by Michael G Schwern <schwern@pobox.com> - -=head1 SEE ALSO - -L<Test::Inline> - -=cut - -1; diff --git a/rt/sbin/regression_harness b/rt/sbin/regression_harness deleted file mode 100644 index 7460135f2..000000000 --- a/rt/sbin/regression_harness +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (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 -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# 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 }}} -open (FH,"make regression|"); - -my $skip_frontmatter = 1; -while (<FH>) { - next if /^ok/; - $skip_frontmatter = 0 if (/autogen/); - print $_ unless ($skip_frontmatter); -} diff --git a/rt/sbin/rt-clean-sessions b/rt/sbin/rt-clean-sessions index 0092a4809..f769031fc 100755 --- a/rt/sbin/rt-clean-sessions +++ b/rt/sbin/rt-clean-sessions @@ -139,11 +139,11 @@ rt-clean-sessions - clean old and duplicate RT sessions rt-clean-sessions [--debug] [--older <NUM>[H|D|M|Y]] - rt-clean sessions - rt-clean sessions --debug - rt-clean sessions --older 10D - rt-clean sessions --debug --older 1M - rt-clean sessions --older 10D --skip-user + rt-clean-sessions + rt-clean-sessions --debug + rt-clean-sessions --older 10D + rt-clean-sessions --debug --older 1M + rt-clean-sessions --older 10D --skip-user =head1 DESCRIPTION @@ -162,7 +162,7 @@ Script is safe because data in the sessions is temporary and can be deleted. Date interval in the C<< <NUM>[<unit>] >> format. Default unit is D(ays), H(our), M(onth) and Y(ear) are also supported. -For exmaple: C<rt-clean sessions --older 1M> would delete all sessions that are +For example: C<rt-clean-sessions --older 1M> would delete all sessions that are older than 1 month. =item skip-user diff --git a/rt/sbin/rt-clean-sessions.in b/rt/sbin/rt-clean-sessions.in index ac736e631..7be5ce9e0 100644 --- a/rt/sbin/rt-clean-sessions.in +++ b/rt/sbin/rt-clean-sessions.in @@ -139,11 +139,11 @@ rt-clean-sessions - clean old and duplicate RT sessions rt-clean-sessions [--debug] [--older <NUM>[H|D|M|Y]] - rt-clean sessions - rt-clean sessions --debug - rt-clean sessions --older 10D - rt-clean sessions --debug --older 1M - rt-clean sessions --older 10D --skip-user + rt-clean-sessions + rt-clean-sessions --debug + rt-clean-sessions --older 10D + rt-clean-sessions --debug --older 1M + rt-clean-sessions --older 10D --skip-user =head1 DESCRIPTION @@ -162,7 +162,7 @@ Script is safe because data in the sessions is temporary and can be deleted. Date interval in the C<< <NUM>[<unit>] >> format. Default unit is D(ays), H(our), M(onth) and Y(ear) are also supported. -For exmaple: C<rt-clean sessions --older 1M> would delete all sessions that are +For example: C<rt-clean-sessions --older 1M> would delete all sessions that are older than 1 month. =item skip-user diff --git a/rt/sbin/rt-dump-database b/rt/sbin/rt-dump-database index 6175a1043..ce023adab 100755 --- a/rt/sbin/rt-dump-database +++ b/rt/sbin/rt-dump-database @@ -48,6 +48,10 @@ # END BPS TAGGED BLOCK }}} use strict; +# As we specify that XML is UTF-8 and we output it to STDOUT, we must be sure +# it is UTF-8 so further XMLin will not break +binmode(STDOUT, ":utf8"); + # fix lib paths, some may be relative BEGIN { require File::Spec; diff --git a/rt/sbin/rt-dump-database.in b/rt/sbin/rt-dump-database.in index 878a2091b..cb9f0c3d3 100755 --- a/rt/sbin/rt-dump-database.in +++ b/rt/sbin/rt-dump-database.in @@ -48,6 +48,10 @@ # END BPS TAGGED BLOCK }}} use strict; +# As we specify that XML is UTF-8 and we output it to STDOUT, we must be sure +# it is UTF-8 so further XMLin will not break +binmode(STDOUT, ":utf8"); + # fix lib paths, some may be relative BEGIN { require File::Spec; diff --git a/rt/sbin/rt-setup-database b/rt/sbin/rt-setup-database deleted file mode 100644 index d4a256f07..000000000 --- a/rt/sbin/rt-setup-database +++ /dev/null @@ -1,474 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (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 -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# 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 }}} -use strict; -use warnings; - -use vars qw($Nobody $SystemUser $item); - -# fix lib paths, some may be relative -BEGIN { - require File::Spec; - my @libs = ("lib", "local/lib"); - my $bin_path; - - for my $lib (@libs) { - unless ( File::Spec->file_name_is_absolute($lib) ) { - unless ($bin_path) { - if ( File::Spec->file_name_is_absolute(__FILE__) ) { - $bin_path = ( File::Spec->splitpath(__FILE__) )[1]; - } - else { - require FindBin; - no warnings "once"; - $bin_path = $FindBin::Bin; - } - } - $lib = File::Spec->catfile( $bin_path, File::Spec->updir, $lib ); - } - unshift @INC, $lib; - } - -} - -#This drags in RT's config.pm -# We do it in a begin block because RT::Handle needs to know the type to do its -# inheritance -BEGIN { - use RT; - RT::LoadConfig(); - RT::InitClasses(); -} - -use Term::ReadKey; -use Getopt::Long; - -$| = 1; # unbuffer all output. - -my %args; -GetOptions( - \%args, - 'action=s', - 'force', 'debug', - 'dba=s', 'dba-password=s', 'prompt-for-dba-password', - 'datafile=s', 'datadir=s' -); - -unless ( $args{'action'} ) { - help(); - exit(-1); -} - -# check and setup @actions -my @actions = grep $_, split /,/, $args{'action'}; -if ( @actions > 1 && $args{'datafile'} ) { - print STDERR "You can not use --datafile option with multiple actions.\n"; - exit(-1); -} -foreach ( @actions ) { - unless ( /^(?:init|create|drop|schema|acl|coredata|insert|upgrade)$/ ) { - print STDERR "$0 called with an invalid --action parameter.\n"; - exit(-1); - } - if ( /^(?:init|drop|upgrade)$/ && @actions > 1 ) { - print STDERR "You can not mix init, drop or upgrade action with any action.\n"; - exit(-1); - } -} - -# convert init to multiple actions -my $init = 0; -if ( $actions[0] eq 'init' ) { - @actions = qw(create schema acl coredata insert); - $init = 1; -} - -# set options from environment -foreach my $key(qw(Type Host Name User Password)) { - next unless exists $ENV{ 'RT_DB_'. uc $key }; - print "Using Database$key from RT_DB_". uc($key) ." environment variable.\n"; - RT->Config->Set( "Database$key", $ENV{ 'RT_DB_'. uc $key }); -} - -my $db_type = RT->Config->Get('DatabaseType') || ''; -my $db_host = RT->Config->Get('DatabaseHost') || ''; -my $db_name = RT->Config->Get('DatabaseName') || ''; -my $db_user = RT->Config->Get('DatabaseUser') || ''; -my $db_pass = RT->Config->Get('DatabasePassword') || ''; - -# load it here to get error immidiatly if DB type is not supported -require RT::Handle; - -if ( $db_type eq 'SQLite' && !File::Spec->file_name_is_absolute($db_name) ) { - $db_name = File::Spec->catfile($RT::VarPath, $db_name); - RT->Config->Set( DatabaseName => $db_name ); -} - -my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || $db_user || ''; -my $dba_pass = $args{'dba-password'} || $ENV{'RT_DBA_PASSWORD'}; - -if ( !$args{force} && ( !defined $dba_pass || $args{'prompt-for-dba-password'} ) ) { - $dba_pass = get_dba_password(); - chomp $dba_pass if defined($dba_pass); -} - -print "Working with:\n" - ."Type:\t$db_type\nHost:\t$db_host\nName:\t$db_name\n" - ."User:\t$db_user\nDBA:\t$dba_user\n"; - -foreach my $action ( @actions ) { - no strict 'refs'; - my ($status, $msg) = *{ 'action_'. $action }{'CODE'}->( %args ); - error($action, $msg) unless $status; - print $msg ."\n" if $msg; - print "Done.\n"; -} - -sub action_create { - my %args = @_; - my $dbh = get_system_dbh(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'pre' ); - return ($status, $msg) unless $status; - - print "Now creating a $db_type database $db_name for RT.\n"; - return RT::Handle->CreateDatabase( $dbh ); -} - -sub action_drop { - my %args = @_; - - print "Dropping $db_type database $db_name.\n"; - unless ( $args{'force'} ) { - print <<END; - -About to drop $db_type database $db_name on $db_host. -WARNING: This will erase all data in $db_name. - -END - exit(-2) unless _yesno(); - } - - my $dbh = get_system_dbh(); - return RT::Handle->DropDatabase( $dbh ); -} - -sub action_schema { - my %args = @_; - my $dbh = get_admin_dbh(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'pre' ); - return ($status, $msg) unless $status; - - print "Now populating database schema.\n"; - return RT::Handle->InsertSchema( $dbh, $args{'datafile'} || $args{'datadir'} ); -} - -sub action_acl { - my %args = @_; - my $dbh = get_admin_dbh(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $dbh, 'pre' ); - return ($status, $msg) unless $status; - - print "Now inserting database ACLs\n"; - return RT::Handle->InsertACL( $dbh, $args{'datafile'} || $args{'datadir'} ); -} - -sub action_coredata { - my %args = @_; - $RT::Handle = new RT::Handle; - $RT::Handle->dbh( undef ); - RT::ConnectToDatabase(); - RT::InitLogging(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'pre' ); - return ($status, $msg) unless $status; - - print "Now inserting RT core system objects\n"; - return $RT::Handle->InsertInitialData; -} - -sub action_insert { - my %args = @_; - $RT::Handle = new RT::Handle; - RT::Init(); - my ($status, $msg) = RT::Handle->CheckCompatibility( $RT::Handle->dbh, 'pre' ); - return ($status, $msg) unless $status; - - print "Now inserting data\n"; - my $file = $args{'datafile'}; - $file = $RT::EtcPath . "/initialdata" if $init && !$file; - $file ||= $args{'datadir'}."/content"; - return $RT::Handle->InsertData( $file ); -} - -sub action_upgrade { - my %args = @_; - my $base_dir = $args{'datadir'} || "./etc/upgrade"; - return (0, "Couldn't read dir '$base_dir' with upgrade data") - unless -d $base_dir || -r _; - - my $upgrading_from = undef; - do { - if ( defined $upgrading_from ) { - print "Doesn't match #.#.#: "; - } else { - print "Enter RT version you're upgrading from: "; - } - $upgrading_from = scalar <STDIN>; - chomp $upgrading_from; - $upgrading_from =~ s/\s+//g; - } while $upgrading_from !~ /^\d+\.\d+\.\d+$/; - - my $upgrading_to = $RT::VERSION; - return (0, "The current version $upgrading_to is lower than $upgrading_from") - if RT::Handle::cmp_version( $upgrading_from, $upgrading_to ) > 0; - - return (1, "The version $upgrading_to you're upgrading to is up to date") - if RT::Handle::cmp_version( $upgrading_from, $upgrading_to ) == 0; - - my @versions = get_versions_from_to($base_dir, $upgrading_from, $upgrading_to); - - return (1, "No DB changes between $upgrading_from and $upgrading_to") - unless @versions; - - print "\nGoing to apply following upgrades:\n"; - print map "* $_\n", @versions; - - { - my $custom_upgrading_to = undef; - do { - if ( defined $custom_upgrading_to ) { - print "Doesn't match #.#.#: "; - } else { - print "\nEnter RT version if you want to stop upgrade at some point,\n"; - print " or leave it blank if you want apply above upgrades: "; - } - $custom_upgrading_to = scalar <STDIN>; - chomp $custom_upgrading_to; - $custom_upgrading_to =~ s/\s+//g; - last unless $custom_upgrading_to; - } while $custom_upgrading_to !~ /^\d+\.\d+\.\d+$/; - - if ( $custom_upgrading_to ) { - return ( - 0, "The version you entered ($custom_upgrading_to) is lower than\n" - ."version you're upgrading from ($upgrading_from)" - ) if RT::Handle::cmp_version( $upgrading_from, $custom_upgrading_to ) > 0; - - return (1, "The version you're upgrading to is up to date") - if RT::Handle::cmp_version( $upgrading_from, $custom_upgrading_to ) == 0; - - if ( RT::Handle::cmp_version( $RT::VERSION, $custom_upgrading_to ) < 0 ) { - print "Version you entered is greater than installed ($RT::VERSION).\n"; - _yesno() or exit(-2); - } - # ok, checked everything no let's refresh list - $upgrading_to = $custom_upgrading_to; - @versions = get_versions_from_to($base_dir, $upgrading_from, $upgrading_to); - - return (1, "No DB changes between $upgrading_from and $upgrading_to") - unless @versions; - - print "\nGoing to apply following upgrades:\n"; - print map "* $_\n", @versions; - } - } - - print "\nIT'S VERY IMPORTANT TO BACK UP BEFORE THIS STEP\n\n"; - _yesno() or exit(-2) unless $args{'force'}; - - foreach my $v ( @versions ) { - print "Processing $v\n"; - my %tmp = (%args, datadir => "$base_dir/$v", datafile => undef); - if ( -e "$base_dir/$v/schema.$db_type" ) { - action_schema( %tmp ); - } - if ( -e "$base_dir/$v/acl.$db_type" ) { - action_acl( %tmp ); - } - if ( -e "$base_dir/$v/content" ) { - action_insert( %tmp ); - } - } - return 1; -} - -sub get_versions_from_to { - my ($base_dir, $from, $to) = @_; - - opendir my $dh, $base_dir or die "couldn't open dir: $!"; - my @versions = grep -d "$base_dir/$_" && /\d+\.\d+\.\d+/, readdir $dh; - closedir $dh; - - return - grep RT::Handle::cmp_version($_, $to) <= 0, - grep RT::Handle::cmp_version($_, $from) > 0, - sort RT::Handle::cmp_version @versions; -} - -sub error { - my ($action, $msg) = @_; - print STDERR "Couldn't finish '$action' step.\n\n"; - print STDERR "ERROR: $msg\n\n"; - exit(-1); -} - -sub get_dba_password { - print "In order to create or update your RT database," - . " this script needs to connect to your " - . " $db_type instance on $db_host as $dba_user\n"; - print "Please specify that user's database password below. If the user has no database\n"; - print "password, just press return.\n\n"; - print "Password: "; - ReadMode('noecho'); - my $password = ReadLine(0); - ReadMode('normal'); - print "\n"; - return ($password); -} - -=head2 get_system_dbh - -Returns L<DBI> database handle connected to B<system> with DBA credentials. - -See also L<RT::Handle/SystemDSN>. - -=cut - -sub get_system_dbh { - return _get_dbh( RT::Handle->SystemDSN, $dba_user, $dba_pass ); -} - -sub get_admin_dbh { - return _get_dbh( RT::Handle->DSN, $dba_user, $dba_pass ); -} - -=head2 get_rt_dbh [USER, PASSWORD] - -Returns L<DBI> database handle connected to RT database, -you may specify credentials(USER and PASSWORD) to connect -with. By default connects with credentials from RT config. - -=cut - -sub get_rt_dbh { - return _get_dbh( RT::Handle->DSN, $db_user, $db_pass ); -} - -sub _get_dbh { - my ($dsn, $user, $pass) = @_; - my $dbh = DBI->connect( - $dsn, $user, $pass, - { RaiseError => 0, PrintError => 0 }, - ); - unless ( $dbh ) { - my $msg = "Failed to connect to $dsn as user '$user': ". $DBI::errstr; - if ( $args{'debug'} ) { - require Carp; Carp::confess( $msg ); - } else { - print STDERR $msg; exit -1; - } - } - return $dbh; -} - -sub _yesno { - print "Proceed [y/N]:"; - my $x = scalar(<STDIN>); - $x =~ /^y/i; -} - -sub help { - - print <<EOF; - -$0: Set up RT's database - ---action init Initialize the database. This is combination of - multiple actions listed below. Create DB, schema, - setup acl, insert core data and initial data. - - upgrade Apply all needed schema/acl/content updates (will ask - for version to upgrade from) - - create Create the database. - - drop Drop the database. - This will ERASE ALL YOUR DATA - - schema Initialize only the database schema - To use a local or supplementary datafile, specify it - using the '--datadir' option below. - - acl Initialize only the database ACLs - To use a local or supplementary datafile, specify it - using the '--datadir' option below. - - coredata Insert data into RT's database. This data is required - for normal functioning of any RT instance. - - insert Insert data into RT's database. - By default, will use RT's installation data. - To use a local or supplementary datafile, specify it - using the '--datafile' option below. - -Several actions can be combined using comma separated list. - ---datafile /path/to/datafile ---datadir /path/to/ Used to specify a path to find the local - database schema and acls to be installed. - - ---dba dba's username ---dba-password dba's password ---prompt-for-dba-password Ask for the database administrator's password interactively - - -EOF - -} - -1; diff --git a/rt/sbin/rt-setup-database.in b/rt/sbin/rt-setup-database.in index a51076fee..ea9b99ba0 100644 --- a/rt/sbin/rt-setup-database.in +++ b/rt/sbin/rt-setup-database.in @@ -150,7 +150,9 @@ if ( $db_type eq 'SQLite' && !File::Spec->file_name_is_absolute($db_name) ) { } my $dba_user = $args{'dba'} || $ENV{'RT_DBA_USER'} || $db_user || ''; -my $dba_pass = $args{'dba-password'} || $ENV{'RT_DBA_PASSWORD'}; +my $dba_pass = exists($args{'dba-password'}) + ? $args{'dba-password'} + : $ENV{'RT_DBA_PASSWORD'}; if ( !$args{force} && ( !defined $dba_pass || $args{'prompt-for-dba-password'} ) ) { $dba_pass = get_dba_password(); diff --git a/rt/sbin/rt-test-dependencies b/rt/sbin/rt-test-dependencies deleted file mode 100644 index a1fed190b..000000000 --- a/rt/sbin/rt-test-dependencies +++ /dev/null @@ -1,574 +0,0 @@ -#!/usr/bin/perl -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (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 -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# 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 }}} -# -# This is just a basic script that checks to make sure that all -# the modules needed by RT before you can install it. -# - -use strict; -no warnings qw(numeric redefine); -use Getopt::Long; -my %args; -my %deps; -GetOptions( - \%args, 'v|verbose', - 'install', 'with-MYSQL', - 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', - 'with-ORACLE', 'with-FASTCGI', - 'with-SPEEDYCGI', 'with-MODPERL1', - 'with-MODPERL2', 'with-DEV', - 'with-STANDALONE', - - 'with-GPG', - 'with-ICAL', - 'with-SMTP', - 'with-GRAPHVIZ', - 'with-GD', - 'with-DASHBOARDS', - - 'download=s', - 'repository=s', - 'list-deps' -); - -unless (keys %args) { - help(); - exit(1); -} - -# Set up defaults -my %default = ( - 'with-MASON' => 1, - 'with-CORE' => 1, - 'with-CLI' => 1, - 'with-MAILGATE' => 1, - 'with-DEV' => 0, - 'with-STANDALONE' => 1, - 'with-GPG' => 1, - 'with-ICAL' => 1, - 'with-SMTP' => 1, - 'with-GRAPHVIZ' => 0, - 'with-GD' => 1, - 'with-DASHBOARDS' => 1 -); -$args{$_} = $default{$_} foreach grep !exists $args{$_}, keys %default; - -{ - my $section; - my %always_show_sections = ( - perl => 1, - users => 1, - ); - - sub section { - my $s = shift; - $section = $s; - print "$s:\n" unless $args{'list-deps'}; - } - - sub print_found { - my $msg = shift; - my $test = shift; - my $extra = shift; - - unless ( $args{'list-deps'} ) { - if ( $args{'v'} or not $test or $always_show_sections{$section} ) { - print "\t$msg ..."; - print $test ? "found" : "MISSING"; - print "\n"; - } - - print "\t\t$extra\n" if defined $extra; - } - } -} - -sub conclude { - my %missing_by_type = @_; - - unless ( $args{'list-deps'} ) { - unless ( keys %missing_by_type ) { - print "\nAll dependencies have been found.\n"; - return; - } - - print "\nSOME DEPENDENCIES WERE MISSING.\n"; - - for my $type ( keys %missing_by_type ) { - my $missing = $missing_by_type{$type}; - - print "$type missing dependencies:\n"; - for my $name ( keys %$missing ) { - my $module = $missing->{$name}; - my $version = $module->{version}; - print_found( $name . ( $version ? " >= $version" : "" ), - 0, $module->{error} ); - } - } - exit 1; - } -} - - -sub help { - - print <<'.'; - -By default, testdeps determine whether you have -installed all the perl modules RT needs to run. - - --install Install missing modules - -The following switches will tell the tool to check for specific dependencies - - --with-mysql Database interface for MySQL - --with-postgresql Database interface for PostgreSQL - --with-oracle Database interface for Oracle - --with-sqlite Database interface and driver for SQLite (unsupported) - - --with-standalone Libraries needed to support the standalone simple pure perl server - --with-fastcgi Libraries needed to support the fastcgi handler - --with-speedycgi Libraries needed to support the speedycgi handler - --with-modperl1 Libraries needed to support the modperl 1 handler - --with-modperl2 Libraries needed to support the modperl 2 handler - - --with-dev Tools needed for RT development - -You can also specify -v or --verbose to list the status of all dependencies, -rather than just the missing ones. - -The "RT_FIX_DEPS_CMD" environment variable, if set, will be used -instead of the standard CPAN shell by --install to install any -required modules. It will be called with the module name, or, if -"RT_FIX_DEPS_CMD" contains a "%s", will replace the "%s" with the -module name before calling the program. -. -} - - -sub text_to_hash { - my %hash; - for my $line ( split /\n/, $_[0] ) { - my($key, $value) = $line =~ /(\S+)\s*(\S*)/; - $value ||= ''; - $hash{$key} = $value; - } - - return %hash; -} - -$deps{'CORE'} = [ text_to_hash( << '.') ]; -Digest::base -Digest::MD5 2.27 -DBI 1.37 -Class::ReturnValue 0.40 -DBIx::SearchBuilder 1.54 -Text::Template 1.44 -File::ShareDir -File::Spec 0.8 -HTML::Entities -HTML::Scrubber 0.08 -Log::Dispatch 2.0 -Sys::Syslog 0.16 -Locale::Maketext 1.06 -Locale::Maketext::Lexicon 0.32 -Locale::Maketext::Fuzzy -MIME::Entity 5.425 -Mail::Mailer 1.57 -Email::Address -Text::Wrapper -Time::ParseDate -Time::HiRes -File::Temp 0.18 -Text::Quoted 2.02 -Tree::Simple 1.04 -UNIVERSAL::require -Regexp::Common -Scalar::Util -Module::Versions::Report 1.05 -Cache::Simple::TimedExpiry -Calendar::Simple -Encode 2.21 -CSS::Squish 0.06 -File::Glob -Devel::StackTrace 1.19 -. - -$deps{'MASON'} = [ text_to_hash( << '.') ]; -HTML::Mason 1.36 -Errno -Digest::MD5 2.27 -CGI::Cookie 1.20 -Storable 2.08 -Apache::Session 1.53 -XML::RSS 1.05 -Text::WikiFormat 0.76 -CSS::Squish 0.06 -Devel::StackTrace 1.19 -. - -$deps{'STANDALONE'} = [ text_to_hash( << '.') ]; -HTTP::Server::Simple 0.34 -HTTP::Server::Simple::Mason 0.09 -Net::Server -. - -$deps{'MAILGATE'} = [ text_to_hash( << '.') ]; -HTML::TreeBuilder -HTML::FormatText -Getopt::Long -LWP::UserAgent -Pod::Usage -. - -$deps{'CLI'} = [ text_to_hash( << '.') ]; -Getopt::Long 2.24 -LWP -HTTP::Request::Common -Text::ParseWords -Term::ReadLine -Term::ReadKey -. - -$deps{'DEV'} = [ text_to_hash( << '.') ]; -HTML::Form -HTML::TokeParser -WWW::Mechanize -Test::WWW::Mechanize 1.04 -Module::Refresh 0.03 -Test::Expect 0.31 -XML::Simple -File::Find -Test::Deep 0 # needed for shredder tests -String::ShellQuote 0 # needed for gnupg-incoming.t -Test::HTTP::Server::Simple 0.09 -Test::HTTP::Server::Simple::StashWarnings 0.02 -Log::Dispatch::Perl -Test::Warn -Test::Builder 0.77 # needed to fix TODO test -IPC::Run3 -Test::MockTime -HTTP::Server::Simple::Mason 0.13 -. - -$deps{'FASTCGI'} = [ text_to_hash( << '.') ]; -CGI 3.38 -FCGI -CGI::Fast -. - -$deps{'SPEEDYCGI'} = [ text_to_hash( << '.') ]; -CGI 3.38 -CGI::SpeedyCGI -. - - -$deps{'MODPERL1'} = [ text_to_hash( << '.') ]; -CGI 3.38 -Apache::Request -Apache::DBI 0.92 -. - -$deps{'MODPERL2'} = [ text_to_hash( << '.') ]; -CGI 3.38 -Apache::DBI -HTML::Mason 1.36 -. - -$deps{'MYSQL'} = [ text_to_hash( << '.') ]; -DBD::mysql 2.1018 -. - -$deps{'ORACLE'} = [ text_to_hash( << '.') ]; -DBD::Oracle -. - -$deps{'POSTGRESQL'} = [ text_to_hash( << '.') ]; -DBD::Pg 1.43 -. - -$deps{'SQLITE'} = [ text_to_hash( << '.') ]; -DBD::SQLite 1.00 -. - -$deps{'GPG'} = [ text_to_hash( << '.') ]; -GnuPG::Interface -PerlIO::eol -. - -$deps{'ICAL'} = [ text_to_hash( << '.') ]; -Data::ICal -. - -$deps{'SMTP'} = [ text_to_hash( << '.') ]; -Net::SMTP -. - -$deps{'DASHBOARDS'} = [ text_to_hash( << '.') ]; -HTML::RewriteAttributes 0.02 -MIME::Types -. - -$deps{'GRAPHVIZ'} = [ text_to_hash( << '.') ]; -GraphViz -IPC::Run -IPC::Run::SafeHandles -. - -$deps{'GD'} = [ text_to_hash( << '.') ]; -GD -GD::Graph -GD::Text -. - -if ($args{'download'}) { - - download_mods(); -} - - -check_perl_version(); - -check_users(); - -my %Missing_By_Type = (); -foreach my $type (sort grep $args{$_}, keys %args) { - next unless ($type =~ /^with-(.*?)$/); - - $type = $1; - section("$type dependencies"); - - my @missing; - my @deps = @{ $deps{$type} }; - - my %missing = test_deps(@deps); - - if ( $args{'install'} ) { - for my $module (keys %missing) { - resolve_dep($module, $missing{$module}{version}); - delete $missing{$module} if test_dep($module, $missing{$module}{version}); - } - } - - $Missing_By_Type{$type} = \%missing if keys %missing; -} - -conclude(%Missing_By_Type); - -sub test_deps { - my @deps = @_; - - my %missing; - while(@deps) { - my $module = shift @deps; - my $version = shift @deps; - my($test, $error) = test_dep($module, $version); - my $msg = $module . ($version ? " >= $version" : ''); - print_found($msg, $test, $error); - - $missing{$module} = { version => $version, error => $error } unless $test; - } - - return %missing; -} - -sub test_dep { - my $module = shift; - my $version = shift; - - if ( $args{'list-deps'} ) { - print $module, ': ', $version || 0, "\n"; - } - else { - eval "use $module $version ()"; - if ($@) { - my $error = $@; - $error =~ s/\n(.*)$//s; - $error =~ s/at \(eval \d+\) line \d+\.$//; - undef $error unless $error =~ /this is only/; - - return ( 0, $error ); - } - else { - return 1; - } - } -} - -sub resolve_dep { - my $module = shift; - my $version = shift; - - print "\nInstall module $module\n"; - - my $ext = $ENV{'RT_FIX_DEPS_CMD'}; - unless( $ext ) { - my $configured = 1; - { - local @INC = @INC; - if ( $ENV{'HOME'} ) { - unshift @INC, "$ENV{'HOME'}/.cpan"; - } - $configured = eval { require CPAN::MyConfig } || eval { require CPAN::Config }; - } - unless ( $configured ) { - print <<END; -You haven't configured the CPAN shell yet. -Please run `/usr/bin/perl -MCPAN -e shell` to configure it. -END - exit(1); - } - my $rv = eval { require CPAN; CPAN::Shell->install($module) }; - return $rv unless $@; - - print <<END; -Failed to load module CPAN. - --------- Error --------- -$@ ------------------------- - -When we tried to start installing RT's perl dependencies, -we were unable to load the CPAN client. This module is usually distributed -with Perl. This usually indicates that your vendor has shipped an unconfigured -or incorrectly configured CPAN client. -The error above may (or may not) give you a hint about what went wrong - -You have several choices about how to install dependencies in -this situatation: - -1) use a different tool to install dependencies by running setting the following - shell environment variable and rerunning this tool: - RT_FIX_DEPS_CMD='/usr/bin/perl -MCPAN -e"install %s"' -2) Attempt to configure CPAN by running: - `/usr/bin/perl -MCPAN -e shell` program from shell. - If this fails, you may have to manually upgrade CPAN (see below) -3) Try to update the CPAN client. Download it from: - http://search.cpan.org/dist/CPAN and try again -4) Install each dependency manually by downloading them one by one from - http://search.cpan.org - -END - exit(1); - } - - if( $ext =~ /\%s/) { - $ext =~ s/\%s/$module/g; # sprintf( $ext, $module ); - } else { - $ext .= " $module"; - } - print "\t\tcommand: '$ext'\n"; - return scalar `$ext 1>&2`; -} - -sub download_mods { - my %modules; - use CPAN; - - foreach my $key (keys %deps) { - my @deps = (@{$deps{$key}}); - while (@deps) { - my $mod = shift @deps; - my $ver = shift @deps; - next if ($mod =~ /^(DBD-|Apache-Request)/); - $modules{$mod} = $ver; - } - } - my @mods = keys %modules; - CPAN::get(); - my $moddir = $args{'download'}; - foreach my $mod (@mods) { - $CPAN::Config->{'build_dir'} = $moddir; - CPAN::get($mod); - } - - opendir(DIR, $moddir); - while ( my $dir = readdir(DIR)) { - print "Dir is $dir\n"; - next if ( $dir =~ /^\.\.?$/); - - # Skip things we've previously tagged - my $out = `svn ls $args{'repository'}/tags/$dir`; - next if ($out); - - if ($dir =~ /^(.*)-(.*?)$/) { - `svn_load_dirs -no_user_input -t tags/$dir -v $args{'repository'} dists/$1 $moddir/$dir`; - `rm -rf $moddir/$dir`; - - } - - } - closedir(DIR); - exit; -} - -sub check_perl_version { - section("perl"); - eval {require 5.008003}; - if ($@) { - print_found("5.8.3", 0,"RT is known to be non-functional on versions of perl older than 5.8.3. Please upgrade to 5.8.3 or newer."); - exit(1); - } else { - print_found( sprintf(">=5.8.3(%vd)", $^V), 1 ); - } -} - -sub check_users { - section("users"); - print_found("rt group (www)", defined getgrnam("www")); - print_found("bin owner (root)", defined getpwnam("root")); - print_found("libs owner (root)", defined getpwnam("root")); - print_found("libs group (bin)", defined getgrnam("bin")); - print_found("web owner (www)", defined getpwnam("www")); - print_found("web group (www)", defined getgrnam("www")); -} - - - -1; diff --git a/rt/sbin/rt-test-dependencies.in b/rt/sbin/rt-test-dependencies.in index 9819108c6..928db7a2f 100644 --- a/rt/sbin/rt-test-dependencies.in +++ b/rt/sbin/rt-test-dependencies.in @@ -60,7 +60,7 @@ GetOptions( \%args, 'v|verbose', 'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', - 'with-ORACLE', 'with-FASTCGI', + 'with-ORACLE', 'with-FASTCGI', 'with-FASTCGI-SERVER', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2', 'with-DEV', 'with-STANDALONE', @@ -147,7 +147,8 @@ sub conclude { for my $name ( keys %$missing ) { my $module = $missing->{$name}; my $version = $module->{version}; - print_found( $name . ( $version ? " >= $version" : "" ), + my $error = $module->{error}; + print_found( $name . ( $version && !$error ? " >= $version" : "" ), 0, $module->{error} ); } } @@ -172,11 +173,12 @@ The following switches will tell the tool to check for specific dependencies --with-oracle Database interface for Oracle --with-sqlite Database interface and driver for SQLite (unsupported) - --with-standalone Libraries needed to support the standalone simple pure perl server - --with-fastcgi Libraries needed to support the fastcgi handler - --with-speedycgi Libraries needed to support the speedycgi handler - --with-modperl1 Libraries needed to support the modperl 1 handler - --with-modperl2 Libraries needed to support the modperl 2 handler + --with-standalone Libraries needed to support the standalone simple pure perl server + --with-fastcgi-server Libraries needed to support the external fastcgi server + --with-fastcgi Libraries needed to support the fastcgi handler + --with-speedycgi Libraries needed to support the speedycgi handler + --with-modperl1 Libraries needed to support the modperl 1 handler + --with-modperl2 Libraries needed to support the modperl 2 handler --with-dev Tools needed for RT development @@ -295,6 +297,7 @@ Test::Builder 0.77 # needed to fix TODO test IPC::Run3 Test::MockTime HTTP::Server::Simple::Mason 0.13 +Log::Dispatch::Perl . $deps{'FASTCGI'} = [ text_to_hash( << '.') ]; @@ -303,6 +306,16 @@ FCGI CGI::Fast . +$deps{'FASTCGI-SERVER'} = [ text_to_hash( << '.') ]; +CGI 3.38 +CGI::Fast +FCGI::ProcManager +File::Basename +File::Spec +Getopt::Long +Pod::Usage +. + $deps{'SPEEDYCGI'} = [ text_to_hash( << '.') ]; CGI 3.38 CGI::SpeedyCGI @@ -367,8 +380,11 @@ GD::Graph GD::Text . -if ($args{'download'}) { +my %AVOID = ( + 'DBD::Oracle' => [qw(1.23)], +); +if ($args{'download'}) { download_mods(); } @@ -392,7 +408,8 @@ foreach my $type (sort grep $args{$_}, keys %args) { if ( $args{'install'} ) { for my $module (keys %missing) { resolve_dep($module, $missing{$module}{version}); - delete $missing{$module} if test_dep($module, $missing{$module}{version}); + delete $missing{$module} + if test_dep($module, $missing{$module}{version}, $AVOID{$module}); } } @@ -408,8 +425,8 @@ sub test_deps { while(@deps) { my $module = shift @deps; my $version = shift @deps; - my($test, $error) = test_dep($module, $version); - my $msg = $module . ($version ? " >= $version" : ''); + my($test, $error) = test_dep($module, $version, $AVOID{$module}); + my $msg = $module . ($version && !$error ? " >= $version" : ''); print_found($msg, $test, $error); $missing{$module} = { version => $version, error => $error } unless $test; @@ -421,23 +438,32 @@ sub test_deps { sub test_dep { my $module = shift; my $version = shift; + my $avoid = shift; if ( $args{'list-deps'} ) { print $module, ': ', $version || 0, "\n"; } else { eval "use $module $version ()"; - if ($@) { - my $error = $@; + if ( my $error = $@ ) { + return 0 unless wantarray; + $error =~ s/\n(.*)$//s; $error =~ s/at \(eval \d+\) line \d+\.$//; - undef $error unless $error =~ /this is only/; + undef $error if $error =~ /this is only/; return ( 0, $error ); } - else { - return 1; + + if ( $avoid ) { + my $version = $module->VERSION; + if ( grep $version eq $_, @$avoid ) { + return 0 unless wantarray; + return (0, "It's known that there are problems with RT and version '$version' of '$module' module. If it's the latest available version of the module then you have to downgrade manually."); + } } + + return 1; } } |