#! /usr/bin/perl
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
#  
#  
# Licensed Materials - Property of IBM 
#  
# (C) COPYRIGHT International Business Machines Corp. 2001,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:  cthagsglsmp
#*
#* Description:
#*      Script to start the Group Services Daemon as an SRC subsystem.
#*
# sccsid = "@(#)03   1.13   src/rsct/pgs/cmds/cluster/cthagsglsmp.perl, gsctrl, rsct_rady, rady2035a 11/12/15 16:44:46"
#
# print "$0 $#ARGV $[ input arguments: @ARGV\n";

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

require "/opt/rsct/bin/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";
    warn "Exiting\n";
    exit -1;
}

# Avoid getopts, to remove dependencies on Perl libraries...
# Defect 170091: $DomainName gives ClusterID and the -i option gives
# ClusterName. So reverse the two input variables.


while (@ARGV) {
    $arg = shift @ARGV;
    if ("-s" eq $arg) {
        $subsys = shift @ARGV;
    } elsif ("-p" eq $arg) {
        $DomainName = shift @ARGV;
        $ClusterID = $DomainName;
    } elsif ("-i" eq $arg) {
        $ClusterName = shift @ARGV;
    } elsif ("-d" eq $arg) {
        $DefaultLogName = shift @ARGV;
    } else {
        $Usage;
    }
}

$Perl = $ENV{'SW_GROUPIE_PERL'};

$ENV{'HA_DOMAIN_TYPE'} = "CLUSTER";
$domainType = $ENV{'HA_DOMAIN_TYPE'};

# defect 170091: export ClusterName so that hagsreap can use it in
# log file name.
$ENV{'CLUSTERNAME'} = "$ClusterName";

# find PGSD_SUBSYS .... only under ClusterDomain
$pgsdSubsys = "cthags";
&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 = "hagsglsmd";
} 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" );

# create soc directory
if (!defined $ENV{'HAGSGLSM_SOCK_DIR'}) {
    if($domainType eq "CLUSTER") {
        $sock_dir = "/var/ct/$DomainName/soc/${subsys}";
    }
    $ENV{'HAGSGLSM_SOCK_DIR'} = $sock_dir;
}
if( -d $sock_dir){
    eval `rm -rf $sock_dir/*`;
}
if(! -d $sock_dir) {
    if($domainType eq "CLUSTER") {
        eval `mkdir -p $sock_dir`;
        if ($? != 0) {
            local($msg) = " cannot create directory $sock_dir.";
            &TSprint( TRACE_FYI, "$msg\n");
            printf STDERR "$msg\n";
            exit 3;
        }
    }
    eval `chmod 0750 $sock_dir`;
}
&TSprint( TRACE_FYI, "HAGSGLSM_SOCK_DIR=$ENV{'HAGSGLSM_SOCK_DIR'}\n" );

if (!defined( $ENV{'HAGSGLSM_SERVER_SOCKET'} ) ) {                          
    $ENV{'HAGSGLSM_SERVER_SOCKET'} = "/var/ct/$DomainName/soc/${subsys}/${subsys}dsocket.{DomainName}";
}                                                                               
                                                                                
&TSprint( TRACE_FYI, "HAGSGLSM_SERVER_SOCKET=$ENV{'HAGSGLSM_SERVER_SOCKET'}\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'} ) ) {
    if($domainType eq "CLUSTER") {
        $ENV{'SW_GROUPIE_LOGFILE'} 
 	    = "$LogDir/${daemonName}_${NodeNumber}_$IncarnationNumber.$ClusterName";
    } else {
        $ENV{'SW_GROUPIE_LOGFILE'} 
 	    = "$LogDir/${daemonName}_${NodeNumber}_$IncarnationNumber.$DomainName";
    }
}
if (!defined( $ENV{'SW_GROUPIE_LOGSIZE'} ) ) {
    $ENV{'SW_GROUPIE_LOGSIZE'} 
	= 40000; 
}

&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`;
}

# heartbeat will see it.
# Set CT_DOMAIN, CT_CLUSTER_ID, and CT_CLUSTER_NAME
$ENV{'CT_DOMAIN'} = 1;
&TSprint( TRACE_FYI, "CT_DOMAIN=$ENV{'CT_DOMAIN'}\n" );
&TSprint( TRACE_FYI, "CLUSTER: $ClusterName, $ClusterID\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";