#!/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 );