
BEGIN {
	push(@INC, "$ENV{SVP_HOME}\\wk\\supervisor\\setup");
}

use strict;
use Win32;
use Win32::API;
use Win32::Service;
use Win32::OLE('in');

require 'MPCServices.pm';

use constant serviceStoppingTimeout => 60;
use constant TRUE => 1;
use constant FALSE => 0;

use constant START_BAT => "$ENV{SVP_HOME}\\wk\\supervisor\\dkcman\\startinstancemanager.bat";


use constant FILE_NAME => "startAllMPCServices";


use constant ERR_NOT_FOUND_FILE => 300;

use constant ERR_OTHER => 202;

use constant ERR_TIMEOUT => 200;

use constant ERR_PROCESS => 201;

use constant ERR_ADMIN => 100;

use constant ERROR_SERVICE_ALREADY_RUNNING => 1056;
use constant ERROR_SERVICE_NOT_ACTIVE => 1062;
use constant ERROR_ACCESS_DENIED => 5;
use constant ERROR_SUCCESS => 0;
use constant ERROR => 1;

use constant STR_RUNNING => "RUNNING";
my $host = "localhost";

my @services = ("DKCMan", "MAPPWebServer", "MAPPAppServer", "MAPPRestAPIServer");

use constant ID_CHECK_START => 0x500;
use constant ID_START_BY_BAT => 0x600;

my $outLog;

$MPCServices::mode = 0;

sub isServiceStarted {
  my $serviceName = $_[0];
  my %status;

  Win32::Service::GetStatus($host, $serviceName, \%status);
  if (MPCServices::getServiceStatusCodeStr( $status{ 'CurrentState' } ) eq STR_RUNNING ) {
    return TRUE;
  }
  
  return FALSE;
}


sub startCheckService()
{
	my $serviceName;
	my $numWaiting = 0;
	my $errCode = ERROR_SUCCESS;
	
	print "Waiting for Storage Navigator services to start...\n";
	foreach $serviceName (@services){
		$numWaiting = 0;
		$errCode = ERROR_SUCCESS;
		while(! isServiceStarted($serviceName)){
			sleep(1);
			
			if($numWaiting++ >= serviceStoppingTimeout) {
				$errCode = ERR_TIMEOUT;
				last;
			}
		}
		
		MPCServices::writeLog(ID_CHECK_START, $errCode, $serviceName, $outLog);
		
		if($errCode != ERROR_SUCCESS){
			return $errCode;
		}

	}
	return $errCode;
}


sub startServiceBybat(){
	my %status;
	my $errCode = ERROR_SUCCESS;
	my $command = START_BAT ." 2>&1 |";
	
	if(! -f START_BAT) {
		$errCode = ERR_NOT_FOUND_FILE;
		MPCServices::printMessage(ERR_NOT_FOUND_FILE);
		MPCServices::writeLog(ID_START_BY_BAT, $errCode, START_BAT, $outLog);
		exit(ERROR);
	}
	
	
	open my $rs,  $command;
	my @rlist = <$rs>;
	foreach (@rlist){
		chomp;
		if(/\s*\[SC\]\s*([\w]*)\s*FAILED\s*([\d]*)/)
		{
			$errCode = $2;
			if($errCode == ERROR_ACCESS_DENIED){
				MPCServices::printMessage(ERR_ADMIN);
				MPCServices::writeLog(ID_START_BY_BAT, $errCode, START_BAT, $outLog);
				exit(ERROR);
			}
			if($errCode != ERROR_SERVICE_ALREADY_RUNNING){
				$errCode = MPCServices::printMessage(ERR_OTHER);
				MPCServices::writeLog(ID_START_BY_BAT, $errCode, START_BAT, $outLog);
				exit(ERROR);
			}

		}
	}
	
	return $errCode;
}


my $err;

print "Starting Storage Navigator services...\n";

$outLog = MPCServices::openLog(FILE_NAME);

$err = startServiceBybat();

$err = startCheckService();

MPCServices::closeLog($outLog);

$err = MPCServices::printMessage($err);

exit($err);