# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
#  
#  
# Licensed Materials - Property of IBM 
#  
# (C) COPYRIGHT International Business Machines Corp. 1997,2019 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
#*======================================================================
#*
#* Module Name:  hagsglsmp
#*
#* Description:
#*      Script to start the Group Services Daemon as an SRC subsystem.
#*
#*      This file is formatted with tabstops of 4.
#*======================================================================

# sccsid = "@(#)53   1.15   src/rsct/pgs/cmds/aix/hagsglsmp.pl, gsctrl, rsct_rady, rady2035a 11/12/15 16:44:41"

# print "$0 $#ARGV $[ input arguments: @ARGV\n";

unshift(@INC, '/opt/rsct/bin');

require "hagsSetup.pkg";

($dir,$progname) = $0 =~ /(.*\/)?(.*)/; # get basename of $0

&TSprint( TRACE_FYI, "$0 $#ARGV $[ $subsys input arguments: @ARGV\n" );

sub Usage {
    warn "Usage: $progname -s <subsystem_name> -p <domain_name> [-i <cluster_id>] [-d <default_log_name>]\n";
    exit -1;
}

# Too many arguments?
if (8 <= $#ARGV) {
    &Usage;
}
# Avoid getopts, to remove dependencies on Perl libraries...
while (@ARGV) {
    $arg = shift @ARGV;
    if ("-s" eq $arg) {
        $subsys = shift @ARGV;
    } elsif ("-p" eq $arg) {
        $DomainName = shift @ARGV;
    } elsif ("-i" eq $arg) {
        $ClusterID = shift @ARGV;
    } elsif ("-d" eq $arg) {
        $DefaultLogName = shift @ARGV;
    } else {
        $Usage;
    }
}

$Perl = $ENV{'SW_GROUPIE_PERL'};

$domainType = $ENV{'HA_DOMAIN_TYPE'};

# find PGSD_SUBSYS
$pgsdSubsys = $ENV{'HA_GS_SUBSYS'};
if(!defined($pgsdSubsys)) {
	$pgsdSubsys = $ENV{'PGSD_SUBSYS'};
}
if(!defined($pgsdSubsys)) {
	if($domainType eq "HAES") {
		$pgsdSubsys = "grpsvcs";
	} elsif($domainType eq "CLUSTER") {
		$pgsdSubsys = "ctgrpsvcs";
	} else {
		$pgsdSubsys = "hags";
	}
}

if($domainType eq "CLUSTER") {
   &TSprint( TRACE_FYI, "ClusterID=$ClusterID ,");
}
&TSprint( TRACE_FYI, "subsys=$subsys, pgsdSubsys=$pgsdSubsys, DomainName=$DomainName, DefaultLogName=$DefaultLogName Perl=$Perl\n" );

if (!defined $ENV{'SW_GROUPIE_DAEMON'}) {
    $daemon = "${subsys}d";
} else {
    $daemon = $ENV{'SW_GROUPIE_DAEMON'};
}

$NodeNumber = $ENV{'SW_GROUPIE_NODE_NUMBER'};
&TSprint( TRACE_FYI, "NodeNumber=$NodeNumber\n" );
&TSprint( TRACE_FYI, "SW_GROUPIE_NODE_NUMBER=$ENV{'SW_GROUPIE_NODE_NUMBER'}\n" );

if($domainType eq "CLUSTER") {
     $daemonName = $subsys;
} else {
     $daemonName = (0 == $NodeNumber) ? "$subsys.$DomainName" : $subsys;
}

if (!defined $ENV{'PATH'}) {                                                    
    $ENV{'PATH'} =  "/opt/rsct/bin:/opt/rsct/install/bin::/usr/sbin:/usr/bin:/bin";
}                                                                               
                                                                                
#
# Find TID_DIR
if (!defined $ENV{'SW_GROUPIE_TID_DIR'}) {
    if( $domainType eq "CLUSTER" ) {
        $TidDir = "/var/ct/$ClusterID/lck/$pgsdSubsys/$subsys.tid.$DomainName";
    } else {
        $TidDir = "/var/ha/lck/$subsys.tid.$DomainName";
    }
    $ENV{'SW_GROUPIE_TID_DIR'} = $TidDir;
} else {
    $TidDir = $ENV{'SW_GROUPIE_TID_DIR'};
}
if(! -d $TidDir) {
    eval `mkdir -p $TidDir`;
    if ($? != 0) {
        local($msg) = " cannot create directory $TidDir.";
        &TSprint( TRACE_FYI, "$msg\n");
        printf STDERR "$msg\n";
        exit 3;
    }
    eval `chmod 0750 $TidDir`;
}
&TSprint( TRACE_FYI, "SW_GROUPIE_TID_DIR=$ENV{'SW_GROUPIE_TID_DIR'}\n" );


# RUN_DIR
if (!defined $ENV{'SW_GROUPIE_RUN_DIR'}) {
    if($domainType eq "CLUSTER") {
        $RunDir = "/var/ct/$ClusterID/run/$subsys";
    } else {
        $RunDir = "/var/ha/run/$subsys.$DomainName";
    }
    $ENV{'SW_GROUPIE_RUN_DIR'} = $RunDir;
} else {
    $RunDir = $ENV{'SW_GROUPIE_RUN_DIR'};
}
if(! -d $RunDir) {
    eval `mkdir -p $RunDir`;
    if ($? != 0) {
        local($msg) = " cannot create directory $RunDir.";
        &TSprint( TRACE_FYI, "$msg\n");
        printf STDERR "$msg\n";
        exit 3;
    }
    eval `chmod 0750 $RunDir`;
}
&TSprint( TRACE_FYI, "SW_GROUPIE_RUN_DIR=$ENV{'SW_GROUPIE_RUN_DIR'}\n" );

# set for AggregateIP support
$ENV{'SW_GROUPIE_AGGIP_CFG'}="$ENV{'SW_GROUPIE_RUN_DIR'}/AggregateIP.cfg";
&TSprint( TRACE_FYI, "SW_GROUPIE_AGGIP_CFG=$ENV{'SW_GROUPIE_AGGIP_CFG'}\n" );

# set SW_GROUPIE_LOGFILE
local($LogDir) = $ENV{'SW_GROUPIE_LOGDIR'};
if(!defined($LogDir)) {
   if($domainType eq "CLUSTER") {
	$LogDir = "/var/ct/$ClusterID/log/$pgsdSubsys";
   } else {
        $LogDir = "/var/ha/log";
   }
   $ENV{'SW_GROUPIE_LOGDIR'} = $LogDir;
}
if(! -d $LogDir) {
    eval `mkdir -p $LogDir`;
    if ($? != 0) {
        local($msg) = " cannot create directory $LogDir.";
        &TSprint( TRACE_FYI, "$msg\n");
        printf STDERR "$msg\n";
        exit 3;
    }
    eval `chmod 0750 $LogDir`;
}

# hagsreap is a perl script which will trim the amount of space that
# hags logs and cores occupies.  We fire it off, and then just let it
# go, and check back on it later.

# hagsreap will remove hags logs and core files so that they consume
# no more than sizeLimit bytes.
$Command=$ENV{'SW_GROUPIE_REAP_CMD'};
$sizeLimit=$ENV{'SW_GROUPIE_REAP_SIZE'};

$DefaultLogNameParameter = ("" ne $DefaultLogName) ? "-d $DefaultLogName" : "";
    
$cmd = "$Perl -S hagsreap  $DefaultLogNameParameter  $subsys       $DomainName   $Command   $sizeLimit" .
	           	  " $NodeNumber   $ENV{'SW_GROUPIE_LOGDIR'}   $ENV{'SW_GROUPIE_RUN_DIR'}";

&TSprint( TRACE_FYI, "cmd = $cmd.\n" );

system($cmd);

#
#
$IncarnationNumber = &GetInstance( $TidDir, "SwitchGroupie" );
$ENV{'SW_GROUPIE_INCARNATION_NUMBER'} = $IncarnationNumber;
&TSprint( TRACE_FYI, "SW_GROUPIE_INCARNATION_NUMBER=$ENV{'SW_GROUPIE_INCARNATION_NUMBER'}\n" );


if (!defined( $ENV{'SW_GROUPIE_LOGFILE'} ) ) {
    $ENV{'SW_GROUPIE_LOGFILE'} 
	= "$LogDir/${daemonName}_${NodeNumber}_$IncarnationNumber.$DomainName";
}

&TSprint( TRACE_FYI, "SW_GROUPIE_LOGFILE=$ENV{'SW_GROUPIE_LOGFILE'}, SW_GROUPIE_LOGDIR=$ENV{'SW_GROUPIE_LOGDIR'}\n" );

# note that MoveToRunDir should probably be called BEFORE hagsreap,
# so that the core file is found and renamed before we calculate how
# much disk space we are using, otherwise it's not counted.
# It will be counted the next time we restart, however.
# If we move it, we lose some parallelism, as we'd have to determine
# our incarnation number first.

&MoveToRunDir( $RunDir, $NodeNumber, $IncarnationNumber );


if ("" ne $DefaultLogName) {
    # We want to save the messages in the default log.
    # so, we rename it to the log name, and daemon appends to the log!
    local($newDefaultLogName) = "$DefaultLogName.${NodeNumber}_$IncarnationNumber";
    &TSprint(TRACE_FYI, "rename $DefaultLogName to $newDefaultLogName\n");
    rename($DefaultLogName, $newDefaultLogName) || warn "rename of $DefaultLogName to $newDefaultLogName failed!: $!\n";
    eval `chmod 0644 $newDefaultLogName`;
}

# Set the env variable HA_SYSPAR_NAME to our partition name so that
# heartbeat will see it.
$ENV{'SP_NAME'} = $DomainName;
if($domainType eq "CLUSTER") {
        # Set CT_DOMAIN, CT_CLUSTER_ID, and CT_CLUSTER_NAME
        $ENV{'CT_DOMAIN'} = 1;
	$ENV{'HA_GS_SUBSYS'} = $pgsdSubsys;
	$ENV{'HA_DOMAIN_NAME'} = $DomainName;
	&TSprint( TRACE_FYI, "CT_DOMAIN=$ENV{'CT_DOMAIN'}\n" );
	&TSprint( TRACE_FYI, "HA_GS_SUBSYS=$ENV{'HA_GS_SUBSYS'}\n" );
	&TSprint( TRACE_FYI, "HA_DOMAIN_NAME=$ENV{'HA_DOMAIN_NAME'}\n" );
} elsif(!defined($ENV{'PGSD_SUPP_SOCK'})) {
    $ENV{'HA_SYSPAR_NAME'} = $DomainName;
    $ENV{'HA_DOMAIN_NAME'} = $DomainName;
    &TSprint( TRACE_FYI, "HA_SYSPAR_NAME=$ENV{'HA_SYSPAR_NAME'}\n" );
    &TSprint( TRACE_FYI, "HA_DOMAIN_NAME=$ENV{'HA_DOMAIN_NAME'}\n" );
}

&TSprint( TRACE_FYI, "PGSD_SUPP_SOCK=$ENV{'PGSD_SUPP_SOCK'}\n" );

#
# Force thread managament as system scope (1-1 between user/kernel threads)
$ENV{'AIXTHREAD_SCOPE'} = "S";

# In locustgrove, hagsglsm renamed old core files to core.old.
# here we remove any such files, since we (in MoveToRunDir)
# rename them differently now.  This should probably be done in the
# installation script.  But, it's cheap; we do it here for now.
if (-e "core.old") {
    &TSprint( TRACE_FYI, "removing core.old\n" );
    unlink "core.old";
}

$cmd = "$daemon $daemonName @ARGV";

$| = 1; # flush stdout

&TSprint( TRACE_FYI, "cmd = $cmd\n" );

$| = 0; # got back to buffering it, if this matters after the exec...

exec $cmd;

die "exec $cmd failed!: $!\n";