# 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 -p [-i ] [-d ]\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";