#!/usr/local/bin/perl -wT
#########
# ProServer DAS Server
# Author:        rmp
# Maintainer:    rmp
# Created:       2003-05-22
# Last Modified: 2005-05-11 # logfile config patch from ak
#
use lib qw(./blib/lib ../blib/lib . ..);
package proserver;

=head1 AUTHOR

Roger Pettett <rmp@sanger.ac.uk>.

Based on AGPServer by

Tony Cox <avc@sanger.ac.uk>.

Copyright (c) 2004 GRL (The Sanger Institute)

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.  See DISCLAIMER.txt for
disclaimers of warranty.

=cut

use strict;
use Bio::Das::ProServer::Daemon;
use Bio::Das::ProServer::Config;
use Bio::Das::ProServer::Loader::agp;
use Getopt::Long;
use POSIX;
use Sys::Hostname;

$ENV{'PATH'} = "/bin";
my %opts   = ();
my @saveargv = @ARGV;
my $result = GetOptions(
			'dsn:s'        => \$opts{'dsn'},
			'dsnversion:i' => \$opts{'dsnversion'},
			'agpfile:s'    => \$opts{'agpfile'},
			'agpdir:s'     => \$opts{'agpdir'},
			'tmpdir:s'     => \$opts{'tmpdir'},
			'p|port:i'     => \$opts{'port'},
			'h|hostname:s' => \$opts{'hostname'},
			'dbhost:s'     => \$opts{'dbhost'},
			'dbname:s'     => \$opts{'dbname'},
			'username:s'   => \$opts{'username'},
			'password:s'   => \$opts{'password'},
			'dbport:i'     => \$opts{'dbport'},
			'help|?'       => \$opts{'usage'},
			'c|config:s'   => \$opts{'inifile'},
			'x'            => \$opts{'X'}
		       );

print STDERR qq(##########################################################
#  Starting ProServer Daemon (c) GRL 2004...             #
#  http://www.sanger.ac.uk/Software/analysis/proserver/  #
##########################################################\n);
@ARGV      = @saveargv;
my $config = Bio::Das::ProServer::Config->new($opts{'inifile'});

if(!$opts{'X'} && fork()) {
  print STDERR qq(Parent process detached...\n);
  exit;

}

POSIX::setsid() or die "Can't setsid";

my $logfile = $config->logfile();
if (!defined $logfile) {
  my ($pidpath)  = ($config->pidfile()   ||"") =~ /^(.*)\//;
  my ($confpath) = ($config->{'inifile'} ||"") =~ /^(.*)\//;
  $pidpath     ||= $confpath;
  $pidpath      .= $pidpath?"/":"";
  $logfile       = sprintf("%sproserver.%s.log", $pidpath, &hostname());
}

print STDERR qq(Logging to $logfile\n);

open STDIN,  '</dev/null' or die "Can't open STDIN from /dev/null: [$!]\n";
#  open STDOUT, '>/dev/null' or die "Can't open STDOUT to /dev/null: [$!]\n";
open STDOUT, ">$logfile" or die "Can't open STDOUT to /dev/null: [$!]\n";
open STDERR, '>&STDOUT'   or die "Can't open STDERR to STDOUT: [$!]\n";



$config->{'port'}     = $opts{'port'}            if(defined $opts{'port'});
$config->{'hostname'} = $opts{'hostname'}        if(defined $opts{'hostname'});

if(exists $config->{'ensemblhome'}) {
  $ENV{'ENS_ROOT'}      = $config->{'ensemblhome'};
  print STDERR qq(Set ENS_ROOT to $ENV{'ENS_ROOT'}\n);
}

if(exists $config->{'oraclehome'}) {
  $ENV{'ORACLE_HOME'}   = $config->{'oraclehome'};
  print STDERR qq(Set ORACLE_HOME to $ENV{'ORACLE_HOME'}\n);
}

if(exists $config->{'bioperlhome'}) {
  $ENV{'BIOPERL_HOME'}   = $config->{'bioperlhome'};
  print STDERR qq(Set BIOPERL_HOME to $ENV{'BIOPERL_HOME'}\n);
}

if(defined $opts{'dsn'}) {
  die("You must specify a dsn name when using '--dsn'")     if($opts{'dsn'} eq "");
  die("You must provide a username using '--username'")     unless $opts{'username'};

  unless ($opts{'agpfile'} || $opts{'agpdir'}) {
    die("You must provide an AGP filename or directory containing an AGP file\nusing '--agpfile' or '--agpdir'");
  }

  my $settings = {
		  'adaptor'   => 'agp',
		  'state'     => 'on',
		  'transport' => 'dbi',
		  'host'      => $opts{'dbhost'}   || "localhost",
		  'port'      => $opts{'dbport'}   || "3306",
		  'username'  => $opts{'username'},
		  'password'  => $opts{'password'} || "",
		  'dbname'    => $opts{'dbname'}   || 'agptest',
		  'tablename' => "tmp_agp_$opts{'dsn'}",
		  'tmpdir'    => $opts{'tmpdir'}   || "/tmp",
		  'agpfile'   => $opts{'agpfile'},
		  'agpdir'    => $opts{'agpdir'},
		 };

  print STDERR qq(Loading AGP data into $settings->{'host'}:$settings->{'port'}/$settings->{'dbname'}.$settings->{'tablename'}\n);

  my $loader = Bio::Das::ProServer::Loader::agp->new($settings);

  #########
  # entirely override our configured adaptors (only serves 1 dsn)
  #
  $config->{'adaptors'} = {$opts{'dsn'} => $settings};
}

Bio::Das::ProServer::Daemon->new($config)->handle();

1;
