RSS Git Download  Clone
Raw Blame History
#!/usr/bin/perl -w

# controls fastcgiexternalserver via init.d script, or hilis4_daemon_control.pl

use strict;

BEGIN { 
    use FindBin qw($Bin); # warn 'BIN:'.$Bin;
    # set lib paths for app:
    use lib (
        '/home/raj/perl5/lib/perl5',
        "$Bin/../lib",
        "$Bin/..",
    );
}

use FCGI;
use CGI::Fast();
use LIMS::Dispatch;
use FCGI::ProcManager;

my $CENTRE = $ENV{CENTRE} || die 'no env var CENTRE set'; # set in init.d script

my $socket  = FCGI::OpenSocket( "/var/run/hilis4/$CENTRE.socket", 2 ); # path, backlog
my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket );

my $proc_manager = FCGI::ProcManager->new({ n_processes => 2 });

=begin # don't need this if using Daemon::Control fork(2):
fork && exit;
POSIX::setsid();
fork && exit;
=cut

print "FastCGI daemon started (pid $$)\n"; # prints to stdout (set in daemon control script)
open STDIN,  "+</dev/null" or die $!;
open STDOUT, ">&STDIN"     or die $!;
open STDERR, ">&STDIN"     or die $!;

my $pid_file = "/var/run/hilis4/$CENTRE.pid";
# if not already created by other process eg Daemon::Control:
if (! -e $pid_file) { # warn 'here';
   $proc_manager->pm_write_pid_file($pid_file);
}

$proc_manager->pm_manage();

$CGI::Fast::Ext_Request = $request;

while ( my $query = CGI::Fast->new() ) {
	# set active db to production - default is `test`:
    $ENV{ROSEDB_DEVINIT} = "$Bin/../config/rosedb_devinit_prod.pl";
    # set flag for LIMS::_set_cgisession_options & QueryLog:
    $ENV{FAST_CGI} = 1;
	# set DBI trace:
	# $ENV{DBI_TRACE} = "1=$Bin/../logs/trace.log";
	
    $proc_manager->pm_pre_dispatch();
    
    eval {
        LIMS::Dispatch->dispatch(
            args_to_new => { QUERY => $query },
            default => '',
            debug => 0,
        );
    };
	my $err = $@;
	if ($err) {
		warn "$0 error: $err";
		exit 0; # to free $dbh from stuck transaction and restart process(es)
	}
	
	$proc_manager->pm_post_dispatch();
}

FCGI::CloseSocket( $socket );