import SAPDB::Install::StdIO;
import SAPDB::Install::System;
import SAPDB::Install::Registry;
import SAPDB::Install::Tools;
import SAPDB::Install::SetUser;

$progpath{'name'} = 'independent program path';
$progpath{'default'}=getSysProgPath().'/sapdb/indep_prog'; #default
$progpath{'list'} = 'utils.lst';
$progpath{'opt'} = 'indep_prog=s';
$progpath{'mode'}=0775;
$progpath{'update'}=0;

$usage= '';
$usage_desc = '';

@paths = (\%progpath);
$main_path=\%progpath;
$skip=0;
@opts=();

my $xserver_info;

sub preinstall{
  	my ($data,$prog)=readIndepPath();
    #  -d $prog or diesoft("independent program path not found\n");
	$prog =~ /\S/ or $prog = $SAPDB::Install::Values::indep_prog_path;
	$data =~ /\S/ or $data = $SAPDB::Install::Values::indep_data_path;
	$prog =~ /\S/ or print2stderr("independent program path not found\n") and diesoft($SAPDB::Install::Values::diemsg);
	$progpath{'value'}=$prog;
	return 1 if $^O =~ /mswin/i;
	if(defined $SAPDB::Install::Values::xserver_info){
		$xserver_info = $SAPDB::Install::Values::xserver_info;
	}
	else{
		$xserver_info = xserverInfo({'max_ping' => 3});
	}

	foreach my $key (keys(%$xserver_info)){
		$key eq 'data' and next;
		$SAPDB::Install::Values::log->SetMsg("XSERVER INFO: $key = ".$xserver_info->{$key}."\n");
	}

	if($xserver_info->{'is_running'} and $xserver_info->{'is_updatable'}){
		unbusy("$prog/pgm/vserver","$prog/pgm/niserver") unless($^O =~ /mswin/i);
	}
}

sub postinstall{
	unless ($^O =~ /mswin/i){
		chmod (0500, $progpath{'value'}.'/pgm/starter');
		chown (0, $packobj->GID, $progpath{'value'}.'/pgm/starter/sdbstarter');
		chmod (04510, $progpath{'value'}.'/pgm/starter/sdbstarter');
	}
}

sub registerWin{
	my $path = $progpath{'value'};
	$path=~s/\//\\/g;
	{
		sub xserver_test{
			my $text=$_[0];
			if($text =~ /.*is\ already\ installed.*/){
				sub myfunc{
					my ($text)=@_;
					($text=~/removed\ successfully/) and return 1;
					return 0;
				}
				callsystem("x_server remove",\&myfunc);
				callsystem("x_server install",\&xserver_test);
				return 1;
			}
			elsif($text =~ /.*installed\ successfully.*/){
				return 1;
			}
			else{
				print2stderr("cannot install x_server as service\n");
				return 0;
			}
		}
		callsystem("x_server install",\&xserver_test);
	}
	setSysPath("$path\\bin;$path\\pgm");
}

sub registerUX{
	if($xserver_info->{'is_running'} and $xserver_info->{'is_updatable'}){

		if(SetUser($xserver_info->{'uid'}) == -1){            #set effective uid and gid
			print2stderr("cannot set effective uid and gid\n");
			diesoft($SAPDB::Install::Values::diemsg);
		}
		else{
			$SAPDB::Install::StartInstall::log->SetMsg("MSG: switch effective uid successfully\n");
		}

		callsystem('id',sub{return 1;},1);
		callsystem($progpath{'value'}.'/bin/x_niserver stop',sub {return 1},1);
		callsystem($progpath{'value'}.'/bin/x_server update',sub {return 1},1);

		if(SetUser() == -1){                              #set effective uid and gid
			print2stderr("cannot set effective uid and gid back to root\n");
		}
		else{
			$SAPDB::Install::StartInstall::log->SetMsg("MSG: switch back effective uid successfully\n");
		}#set effective uid and gid back (real uid/gid)

	}
}


*register =             $^O =~ /^MsWin/i ? \&registerWin :
        \&registerUX;



sub unregisterWin{
    my $path = $regpackobj->Path;
	$path=~s/\//\\/g;
	my $success = 0;

	sub xservertest{
		my ($text) = @_;
		$text =~ /removed\s+successfully/s and $success = 1 and return 1;
		return 0;
	}
	callsystem("x_server stop",sub{return 1;},1);
	callsystem("x_server remove",\&xservertest,1);
	$success or print2stderr("cannot remove x_server service\n");

}

sub unregisterUX{
	return 1 if ((caller)[0] eq 'SAPDB::Install::Misc') ; # do not stop x_server in update case
	my $path = $regpackobj->Path;
	callsystem("$path/bin/x_server stop",sub{return 1;},1);
}


*unregister =           $^O =~ /^MsWin/i ? \&unregisterWin :
        \&unregisterUX;


sub preuninstall{

}

sub postuninstall{
	my ($data,$prog)=readIndepPath();
	opendir(DH,"$data/wrk") or print2stderr("cannot open dir \"$data/wrk\"\n");
	foreach (readdir(DH)){
		if(/dbmsrv.prt/ or /xserver.p/){
			-f "$data/wrk/$_" and (unlink("$data/wrk/$_") or print2stderr("cannot delete file \"$data/wrk/$_\": $!\n"));
		}
	}
	closedir(DH);
}

1;

