#!/usr/bin/perl -s
use File::Basename;
use File::Path;
use File::Spec;

$INST_LOG_DIR = "install";

mkdir($INST_LOG_DIR) if (! -d $INST_LOG_DIR);;
open(STDOUT, "| tee -a $INST_LOG_DIR/install.log");
open(STDERR, "| tee -a $INST_LOG_DIR/install_err.log");
print "Install start: ", `date`;

if (-f "$INST_LOG_DIR/config.ph") {
	require "$INST_LOG_DIR/config.ph";
	# skip initialize 
} else {
# initialize variables
# password for admin user (recogadm) of RECOG server (mandatory)
$RECOGADM_PASSWD = "Root#111";

# BLAST command path (default: current command path)
$BLAST_PATH = "";

## MySQL server setup
# mysql install path (default: taken from current command path)
$MYSQL_BASE_DIR = "";
# mysql database path (default: $RECOG_HOME/mysql)
$MYSQL_DATA_DIR = "";

# password for mysql root user (mandatory)
$MYSQL_ROOT_PASSWD = 'Root#111';
# mysql regog user name (default: recog)
$MYSQL_USER_NAME = 'recog';
# password for mysql recog user (mandatory)
$MYSQL_USER_PASSWD = 'Recog@999';

# GDBM library path
$GDBM_PATH = "";

## http server (apache) setup
# IP address for httpd server
$SERVER_ADDR = "";
# Port number for httpd server
$SERVER_PORT = "";
# httpd.conf file path
$HTTPD_CONF = "";

## queuing system setup
# qstat/qsub command path
$QSTAT_PATH = "";
# directory for output (must be commonly accessible from each node) (default: $RECOG_HOME/work/qsub)
$QSUB_PUB_DIR = "";
# maximum number of jobs to be submitted simultaneously (default: 32)
$QSUB_MAXNODES = "64";
# name of queue for job submission
$QSUB_QUEUE = "";

}

$QSUB_PUB_DIR_DEF = "RECOG_HOME/work/qsub";

if (! $RECOG_HOME) {
	$RECOG_HOME = $ENV{RECOG_HOME};
	if (! $RECOG_HOME) {
		chomp ($pwd = `which $0`);
		$pwd = File::Spec->rel2abs($pwd);
		$RECOG_HOME = dirname($pwd);
	}
	$RECOG_HOME = &ask_variable("RECOG home", $RECOG_HOME, 'path');
}
$ENV{RECOG_HOME} = $ENV{MBGD_HOME} = $RECOG_HOME;
print "RECOG_HOME=$ENV{RECOG_HOME}\n";

if (! $RECOGADM_PASSWD) {
	$RECOGADM_PASSWD = &ask_variable("RECOG admin passwd", "", 'passwd');
}

if (! $BLAST_PATH) {
	chomp ($BLAST_PATH = `which legacy_blast.pl 2>/dev/null`);
	if ($BLAST_PATH) {
		$WITH_BLAST_PLUS = 1;
	} else {
		chomp ($BLAST_PATH = `which blastall 2>/dev/null`);
	}
	$BLAST_PATH = &ask_variable("Blast path", "$BLAST_PATH", 'path');
	$BLAST_PATH = dirname($BLAST_PATH);
}

if (! $MYSQL_BASE_DIR) {
	chomp ($MYSQL_PATH = `which mysql 2>/dev/null`);
	$MYSQL_PATH = dirname(dirname($MYSQL_PATH));
	$MYSQL_BASE_DIR = &ask_variable("Mysql basedir", $MYSQL_PATH, 'path');
}
if (! $MYSQL_DATA_DIR) {
	$MYSQL_DATA_DIR = &ask_variable("Mysql datadir", "$RECOG_HOME/mysql", 'path');
}
if (! $MYSQL_ROOT_PASSWD) {
	$MYSQL_ROOT_PASSWD = &ask_variable("MySQL root passwd", "", 'passwd');
}
if (! $MYSQL_USER_NAME) {
	$MYSQL_USER_NAME = &ask_variable("MySQL user name", "recog", 'user');
}
if (! $MYSQL_USER_PASSWD) {
	$MYSQL_USER_PASSWD = &ask_variable("MySQL user passwd", "", 'passwd');
}
if (! $GDBM_PATH) {
	foreach my $p ('/usr', '/usr/local', '/opt/local') {
		foreach my $l ('lib', 'lib64') {
			if ( (-f "$p/$l/libgdbm.a" || -f "$p/$l/libgdbm.so") &&
				(-f "$p/include/gdbm.h") ) {
				$GDBM_PATH = $p;
				last;
			}
		}
	}
	$GDBM_PATH = &ask_variable("GDBM path", $GDBM_PATH, 'path');
}
if (! $HTTPD_CONF) {
	foreach my $f ('/etc/httpd/conf/httpd.conf', '/etc/apache2/httpd.conf') {
		if (-f $f) {
			$HTTPD_CONF = $f;
			last;
		}
	}
	$HTTPD_CONF = &ask_variable("Apache httpd.conf file", "$HTTPD_CONF", 'addr');
}
if (! $SERVER_ADDR) {
	foreach $int ('eth', 'en') {
		foreach $n (0..3) {
			my($tmp_addr);
			chomp( $tmp_addr = `/sbin/ifconfig $int$n 2>/dev/null | grep inet[^6]` );
			($SERVER_ADDR) = ($tmp_addr =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/);
			last if ($SERVER_ADDR);
		}
		last if ($SERVER_ADDR);
	}
	$SERVER_ADDR = &ask_variable("Server address", "$SERVER_ADDR", 'addr');
}
if (! $SERVER_PORT) {
	$SERVER_PORT = &ask_variable("Server httpd port", "8080", 'addr');
}

if ($QSTAT_PATH) {
	$use_qsub = 'y';
} else {
	$def_ans = 'n';
	chomp ($QSTAT_PATH = `which qstat 2>/dev/null`);
	if ($QSTAT_PATH) {
		$def_ans = 'y';
	}
	$use_qsub = &ask_variable("Do you use queuing system (y/n)?", "$def_ans", '');
	if ($use_qsub =~ /y/i) {
		$QSTAT_PATH = &ask_variable("Qstat path", $QSTAT_PATH, 'path');
	}
}
if ($use_qsub =~ /y/i) {
	if ($QSTAT_PATH =~ /\/qstat$/) {
		$QSTAT_PATH = dirname($QSTAT_PATH);
	}
	if (! $QSUB_PUB_DIR) {
		$QSUB_PUB_DIR = &ask_variable("Working dir for qsub", $QSUB_PUB_DIR_DEF, 'mkpath');
	}
	if (! -d $QSUB_PUB_DIR) {
		mkpath($QSUB_PUB_DIR, 0, 0755);
	}
	if (! $QSUB_MAXNODES) {
		$QSUB_MAXNODES = &ask_variable("Maximum number of jobs to be submitted simultaneously", "32", 'num');
	}
	if (! $QSUB_QUEUE) {
		$QSUB_QUEUE = &ask_variable("Queue name", "<default queue>", '');
	}
	$qsub_opt = "--with-nqs-dir=$QSTAT_PATH " .
		"--with-nqs-pub-dir=$QSUB_PUB_DIR " .
		"--with-nqs-max-nodes=$QSUB_MAXNODES ";
	if ($QSUB_QUEUE ne '<default queue>') {
		$qsub_opt .= "--with-nqs-queue=$QSUB_QUEUE";
	}

}

&write_variables;

if (! -f "$INST_LOG_DIR/recog_conf_done") {
  chdir "perllib";
  system "autoconf";
  system "./configure --with-recogadm-passwd='$RECOGADM_PASSWD' " .
	"--with-blast-dir='$BLAST_PATH' " .
	"--with-mysql-dir='$MYSQL_BASE_DIR' " .
	"--with-gdbm='$GDBM_PATH' " .
	" $qsub_opt";
  if ($?) {
	die "configure recog setting failed\n";
  }
  chdir "..";
  system("touch $INST_LOG_DIR/recog_conf_done");
}

if (! -f "$INST_LOG_DIR/mysql_conf_done") {
  chdir "build/mysql";
  system "autoconf";
  system "./configure --with-base-dir='$MYSQL_BASE_DIR' " .
	"--with-data-dir='$MYSQL_DATA_DIR' " .
	"--with-root-passwd='$MYSQL_ROOT_PASSWD' " .
	"--with-user-name='$MYSQL_USER_NAME' " .
	"--with-user-passwd='$MYSQL_USER_PASSWD' ";

  if ($?) {
  	chdir "../..";
	die "configure mysql setting failed\n";
  }
  chdir "../..";
  system("touch $INST_LOG_DIR/mysql_conf_done");
}

chdir "WWW/conf";
system "./SetUp -HTTPD_CONF=$HTTPD_CONF -LISTEN_ADDR=${SERVER_ADDR}:${SERVER_PORT}";

chdir "../..";

sub ask_variable {
	my($message, $default, $type) = @_;
	if ($type =~ /path/) {
		$default =~ s/RECOG_HOME/$RECOG_HOME/;
	}
	my($val) = $default;
	while (1) {
		print "$message [$default]: ";
		chomp ($ans = <>);
		if ($ans) {
			if ($type =~ /path/ && ! -e $ans) {
				print "No such file or directory: $ans\n";
				if ($type eq 'mkpath') {
					print "Create (Y/n)? ";
					chomp ($ans2 = <>);
					if (! $ans2 || $ans2 =~/^y/i) {
						return $ans;
					}
				}
				next;
			}
			$val = $ans;
		}
		if ($val) {
			return $val;
		}
	}
}

sub write_variables {
print STDERR "Write setting...\n";
open(O, ">$INST_LOG_DIR/config.ph") || die "Can't open $INST_LOG_DIR/config.ph file\n";
print O <<EOF;
#!/usr/bin/perl
\$RECOG_HOME = "$RECOG_HOME";
# initialize variables
# password for admin user (recogadm) of RECOG server (mandatory)
\$RECOGADM_PASSWD = "$RECOGADM_PASSWD";

# BLAST command path (default: current command path)
\$BLAST_PATH = "$BLAST_PATH";
\$WITH_BLAST_PLUS = $WITH_BLAST_PLUS;

## MySQL server setup
# mysql install path (default: taken from current command path)
\$MYSQL_BASE_DIR = "$MYSQL_BASE_DIR";
# mysql database path (default: $RECOG_HOME/mysql)
\$MYSQL_DATA_DIR = "$MYSQL_DATA_DIR";

# password for mysql root user (mandatory)
\$MYSQL_ROOT_PASSWD = '$MYSQL_ROOT_PASSWD';
# mysql regog user name (default: recog)
\$MYSQL_USER_NAME = '$MYSQL_USER_NAME';
# password for mysql recog user (mandatory)
\$MYSQL_USER_PASSWD = '$MYSQL_USER_PASSWD';

# GDBM library path
\$GDBM_PATH = "$GDBM_PATH";

## http server (apache) setup
# IP address for httpd server
\$SERVER_ADDR = "$SERVER_ADDR";
# Port number for httpd server
\$SERVER_PORT = "$SERVER_PORT";
# httpd.conf file path
\$HTTPD_CONF = "$HTTPD_CONF";

## queuing system setup
# qstat/qsub command path
\$QSTAT_PATH = "$QSTAT_PATH";
# directory for output (must be commonly accessible from each node) (default: $RECOG_HOME/work/qsub)
\$QSUB_PUB_DIR = "$QSUB_PUB_DIR";
# maximum number of jobs to be submitted simultaneously (default: 32)
\$QSUB_MAXNODES = "$QSUB_MAXNODES";
# name of queue for job submission
\$QSUB_QUEUE = "$QSUB_QUEUE";
1;
EOF
close(O);
}
