summaryrefslogtreecommitdiff
path: root/rt/bin/standalone_httpd.in
diff options
context:
space:
mode:
Diffstat (limited to 'rt/bin/standalone_httpd.in')
-rwxr-xr-xrt/bin/standalone_httpd.in141
1 files changed, 130 insertions, 11 deletions
diff --git a/rt/bin/standalone_httpd.in b/rt/bin/standalone_httpd.in
index 8aebdb8..b87a332 100755
--- a/rt/bin/standalone_httpd.in
+++ b/rt/bin/standalone_httpd.in
@@ -2,8 +2,8 @@
# BEGIN BPS TAGGED BLOCK {{{
#
# COPYRIGHT:
-#
-# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
+#
+# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
# <jesse@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -49,19 +49,138 @@
use warnings;
use strict;
+# fix lib paths, some may be relative
BEGIN {
- use lib( "@LOCAL_LIB_PATH@", "@RT_LIB_PATH@");
- use RT;
- RT::LoadConfig();
- if ($RT::DevelMode) { require Module::Refresh; }
+ require File::Spec;
+ my @libs = ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@");
+ 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;
+ }
+
}
-RT::Init();
+use RT;
+RT::LoadConfig();
+RT->InitLogging();
+if (RT->Config->Get('DevelMode')) { require Module::Refresh; }
+
+RT::CheckPerlRequirements();
+RT->InitPluginPaths();
+
+my $explicit_port = shift @ARGV;
+my $port = $explicit_port || RT->Config->Get('WebPort') || '8080';
+
+
+require RT::Handle;
+my ($integrity, $state, $msg) = RT::Handle->CheckIntegrity;
+
+unless ( $integrity ) {
+ print STDERR <<EOF;
+
+RT couldn't connect to the database where tickets are stored.
+If this is a new installation of RT, you should visit the URL below
+to configure RT and initialize your database.
+
+If this is an existing RT installation, this may indicate a database
+connectivity problem.
+
+The error RT got back when trying to connect to your database was:
+
+$msg
+
+EOF
+
+ require RT::Installer;
+ # don't enter install mode if the file exists but is unwritable
+ if (-e RT::Installer->ConfigFile && !-w _) {
+ die 'Since your configuration exists ('
+ . RT::Installer->ConfigFile
+ . ") but is not writable, I'm refusing to do anything.\n";
+ }
-my $port = shift @ARGV || $RT::WebPort || '8080';
-use RT::Interface::Web::Standalone;
+ RT->Config->Set( 'LexiconLanguages' => '*' );
+ RT::I18N->Init;
+
+ RT->InstallMode(1);
+} else {
+ RT->ConnectToDatabase();
+ RT->InitSystemObjects();
+ RT->InitClasses();
+ RT->InitPlugins();
+ RT->Config->PostLoadCheck();
+
+ my ($status, $msg) = RT::Handle->CheckCompatibility(
+ $RT::Handle->dbh, 'post'
+ );
+ unless ( $status ) {
+ print STDERR $msg, "\n\n";
+ exit -1;
+ }
+}
+
+require RT::Interface::Web::Standalone;
my $server = RT::Interface::Web::Standalone->new;
-$server->port($port);
-$server->run();
+run_server($port);
+exit 0;
+sub run_server {
+ my $port = shift;
+ $server->port($port);
+ eval { $server->run() };
+ if ( my $err = $@ ) {
+ handle_startup_error($err);
+ }
+}
+
+sub handle_startup_error {
+ my $err = shift;
+ if ( $err =~ /bind: Permission denied/ ) {
+ handle_bind_error();
+ } else {
+ die
+ "Something went wrong while trying to run RT's standalone web server:\n\t"
+ . $err;
+ }
+}
+
+
+sub handle_bind_error {
+
+ print STDERR <<EOF;
+WARNING: RT couldn't start up a web server on port @{[$port]}.
+This is often the case if you're running @{[$0]} as
+someone other than your system's "root" user.
+EOF
+
+ if ($explicit_port) {
+ print STDERR
+ "Please check your system configuration or choose another port\n\n";
+ } else {
+ print STDERR "\nFor now, RT has chosen an alternate port to run on.\n\n";
+ if ( !$integrity ) {
+ print STDERR <<EOF;
+You can use this server to configure and explore RT. While configuring
+RT, you'll have a chance to set a permanent port and URL for your
+server.
+
+EOF
+ }
+ run_server( 8000 + int( rand(1024) ) );
+ }
+}