summaryrefslogtreecommitdiff
path: root/rt/lib/RT.pm
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib/RT.pm')
-rw-r--r--rt/lib/RT.pm191
1 files changed, 170 insertions, 21 deletions
diff --git a/rt/lib/RT.pm b/rt/lib/RT.pm
index 1cfc428ee..90c332bc0 100644
--- a/rt/lib/RT.pm
+++ b/rt/lib/RT.pm
@@ -1,11 +1,82 @@
+# BEGIN LICENSE BLOCK
+#
+# Copyright (c) 1996-2002 Jesse Vincent <jesse@bestpractical.com>
+#
+# (Except where explictly superceded by other copyright notices)
+#
+# 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.
+#
+#
+# Unless otherwise specified, all modifications, corrections or
+# extensions to this work which alter its source code become the
+# property of Best Practical Solutions, LLC when submitted for
+# inclusion in the work.
+#
+#
+# END LICENSE BLOCK
+
+
package RT;
-use RT::Handle;
-use RT::CurrentUser;
use strict;
+use RT::I18N;
+use RT::CurrentUser;
+use RT::System;
+
+use vars qw($VERSION $System $SystemUser $Nobody $Handle $Logger
+ $CORE_CONFIG_FILE
+ $SITE_CONFIG_FILE
+ $VENDOR_CONFIG_FILE
+ $BasePath
+ $EtcPath
+ $VarPath
+ $LocalPath
+ $LocalEtcPath
+ $LocalLexiconPath
+ $LogDir
+ $MasonComponentRoot
+ $MasonLocalComponentRoot
+ $MasonDataDir
+ $MasonSessionDir
+);
+
+$VERSION = '3.0.4';
+$CORE_CONFIG_FILE = "/opt/rt3/etc/RT_Config.pm";
+$SITE_CONFIG_FILE = "/opt/rt3/etc/RT_SiteConfig.pm";
+
+$BasePath = '/opt/rt3';
+
+$EtcPath = '/opt/rt3/etc';
+$VarPath = '/opt/rt3/var';
+$LocalPath = '/opt/rt3/local';
+$LocalEtcPath = '/opt/rt3/local/etc';
+$LocalLexiconPath = '/opt/rt3/local/po';
+
+# $MasonComponentRoot is where your rt instance keeps its mason html files
+
+$MasonComponentRoot = '/opt/rt3/share/html';
+
+# $MasonLocalComponentRoot is where your rt instance keeps its site-local
+# mason html files.
+
+$MasonLocalComponentRoot = '/opt/rt3/local/html';
+
+# $MasonDataDir Where mason keeps its datafiles
+
+$MasonDataDir = '/opt/rt3/var/mason_data';
+
+# RT needs to put session data (for preserving state between connections
+# via the web interface)
+$MasonSessionDir = '/opt/rt3/var/session_data';
-use vars qw($VERSION $SystemUser $Nobody $Handle $Logger);
-$VERSION = '!!RT_VERSION!!';
=head1 NAME
@@ -14,19 +85,45 @@ $VERSION = '!!RT_VERSION!!';
=head1 SYNOPSIS
A fully featured request tracker package
-
=head1 DESCRIPTION
=cut
+=item LoadConfig
+
+Load RT's config file. First, go after the core config file.
+After that, try to load the vendor config.
+After that, go after the site config.
+
+=cut
+
+sub LoadConfig {
+ local *Set = sub { $_[0] = $_[1] unless defined $_[0] };
+ if ( -f "$SITE_CONFIG_FILE" ) {
+ require $SITE_CONFIG_FILE
+ || die ("Couldn't load RT config file '$SITE_CONFIG_FILE'\n$@");
+ }
+ require $CORE_CONFIG_FILE
+ || die ("Couldn't load RT config file '$CORE_CONFIG_FILE'\n$@");
+ RT::I18N->Init;
+}
+
+=item Init
+
+ Conenct to the database, set up logging.
+
+=cut
+
sub Init {
+ require RT::Handle;
#Get a database connection
- $Handle = new RT::Handle($RT::DatabaseType);
+ unless ($Handle && $Handle->dbh->ping) {
+ $Handle = RT::Handle->new();
+ }
$Handle->Connect();
-
#RT's system user is a genuine database user. its id lives here
$SystemUser = new RT::CurrentUser();
$SystemUser->LoadByName('RT_System');
@@ -34,7 +131,9 @@ sub Init {
#RT's "nobody user" is a genuine database user. its ID lives here.
$Nobody = new RT::CurrentUser();
$Nobody->LoadByName('Nobody');
-
+
+ $System = RT::System->new();
+
InitLogging();
}
@@ -51,30 +150,81 @@ sub InitLogging {
$, = '';
use Log::Dispatch 1.6;
- use Log::Dispatch::File;
- use Log::Dispatch::Screen;
- $Logger=Log::Dispatch->new();
+ unless ($RT::Logger) {
+
+ $RT::Logger=Log::Dispatch->new();
if ($RT::LogToFile) {
- my $filename = $RT::LogToFileNamed || "$RT::LogDir/rt.log";
- $Logger->add(Log::Dispatch::File->new
+ unless (-d $RT::LogDir && -w $RT::LogDir) {
+ # localizing here would be hard when we don't have a current user yet
+ # die $self->loc("Log directory [_1] not found or couldn't be written.\n RT can't run.", $RT::LogDir);
+ die ("Log directory $RT::LogDir not found or couldn't be written.\n RT can't run.");
+ }
+
+ my $filename;
+ if ($RT::LogToFileNamed =~ m![/\\]!) {
+ # looks like an absolute path.
+ $filename = $RT::LogToFileNamed;
+ }
+ else {
+ $filename = "$RT::LogDir/$RT::LogToFileNamed";
+ }
+ require Log::Dispatch::File;
+
+
+ $RT::Logger->add(Log::Dispatch::File->new
( name=>'rtlog',
min_level=> $RT::LogToFile,
filename=> $filename,
mode=>'append',
- callbacks => sub {my %p=@_; return "[".gmtime(time)."] [".$p{level}."]: $p{message}\n"}
-
+ callbacks => sub { my %p = @_;
+ my ($package, $filename, $line) = caller(5);
+ return "[".gmtime(time)."] [".$p{level}."]: $p{message} ($filename:$line)\n"}
+
+
+
));
}
if ($RT::LogToScreen) {
- $Logger->add(Log::Dispatch::Screen->new
+ require Log::Dispatch::Screen;
+ $RT::Logger->add(Log::Dispatch::Screen->new
( name => 'screen',
min_level => $RT::LogToScreen,
+ callbacks => sub { my %p = @_;
+ my ($package, $filename, $line) = caller(5);
+ return "[".gmtime(time)."] [".$p{level}."]: $p{message} ($filename:$line)\n"
+ },
+
+ stderr => 1
+ ));
+ }
+ if ($RT::LogToSyslog) {
+ require Log::Dispatch::Syslog;
+ $RT::Logger->add(Log::Dispatch::Syslog->new
+ ( name => 'syslog',
+ ident => 'RT',
+ min_level => $RT::LogToSyslog,
+ callbacks => sub { my %p = @_;
+ my ($package, $filename, $line) = caller(5);
+
+ # syswrite() cannot take utf8; turn it off here.
+ Encode::_utf8_off($p{message});
+
+ if ($p{level} eq 'debug') {
+
+ return "$p{message}\n" }
+ else {
+ return "$p{message} ($filename:$line)\n"}
+ },
+
stderr => 1
));
}
+
+ }
+
# {{{ Signal handlers
## This is the default handling of warnings and die'ings in the code
@@ -88,6 +238,7 @@ $SIG{__WARN__} = sub {$RT::Logger->warning($_[0])};
$SIG{__DIE__} = sub {
unless ($^S || !defined $^S ) {
+ $RT::Handle->Rollback();
$RT::Logger->crit("$_[0]");
exit(-1);
}
@@ -127,10 +278,6 @@ sub DropSetGIDPermissions {
}
-=head1 NAME
-
-RT - Request Tracker
-
=head1 SYNOPSIS
=head1 BUGS
@@ -140,7 +287,6 @@ RT - Request Tracker
=begin testing
-ok (require RT::TestHarness);
ok ($RT::Nobody->Name() eq 'Nobody', "Nobody is nobody");
ok ($RT::Nobody->Name() ne 'root', "Nobody isn't named root");
@@ -152,4 +298,7 @@ ok ($RT::SystemUser->Name() ne 'noname', "The system user isn't noname");
=cut
+eval "require RT_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT_Local.pm});
+
1;