xcat-core/xCAT-server/sbin/restartxcatd
2010-08-29 11:33:54 +00:00

268 lines
6.5 KiB
Perl
Executable File

#!/usr/bin/perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#(C)IBM Corp
#
BEGIN
{
$::XCATROOT =
$ENV{'XCATROOT'} ? $ENV{'XCATROOT'}
: -d '/opt/xcat' ? '/opt/xcat'
: '/usr';
}
use lib "$::XCATROOT/lib/perl";
use Getopt::Long;
use File::Basename;
use xCAT::MsgUtils;
use xCAT::Utils;
#-----------------------------------------------------------------------------
=head1 startstopxcatd
restartxcatd - this routine is used to restart the xcatd processes by
startsrc and stopsrc commands.
It runs on AIX.
=cut
#-----------------------------------------------------------------------------
# Main
$::RE_CHECK_NUM = 10; # the times to check the result of command, the checking interval is 1 second
my $rc;
my @output;
my $inoperative = 0;
my $check_num;
if (!(xCAT::Utils->isAIX()))
{ # only runs on AIX
xCAT::MsgUtils->message("E", "Error: This command should only be run on AIX.");
exit 1;
}
my $cmd = basename($0);
# for auditing
my $current_userid = getpwuid($>);
my $rsp = {};
my $host=`hostname`;
$host=~ s/\s*//g; # remove blanks
# check the arguments
&parse_args($cmd);
$rsp->{syslogdata}->[0] ="restartxcatd invoked by $current_userid.\n";
$rsp->{userid} ->[0] = $current_userid;
$rsp->{clientname} -> [0] = $host;
$rsp->{clienttype} -> [0]= "cli";
$rsp->{command} -> [0] = $cmd;
$rsp->{status} -> [0] = "allowed";
xCAT::MsgUtils->message("SA",$rsp); # syslog and auditlog
# Check whether the xcatd subsystem has been created
$cmd = "/usr/bin/lssrc -s xcatd | grep \"xcatd Subsystem is not on file\"";
@output = `$cmd`;
if (scalar(@output)) {
# create the subsystem if it does not exist
$cmd = "mkssys -p $::XCATROOT/sbin/xcatd -s xcatd -u 0 -S -n 15 -f 15 -a \"-f\"";
$rc = system($cmd);
if ($rc >> 8) {
xCAT::MsgUtils->message("E", "Error: Cannot create the xcatd subsystem.\n");
exit 1;
}
}
# Check the current status of xcatd subsystem
$cmd = "lssrc -s xcatd | grep 'xcatd' | grep 'inoperative'";
@output = `$cmd`;
if (scalar(@output)) {
if ($::VERBOSE) {
xCAT::MsgUtils->message("I", "xcatd subsystem in inoperative status.\n");
}
$inoperative = 1;
}
if (! $inoperative) { # active
# Stop the xcatd subsystem
$cmd = "/usr/bin/stopsrc -s xcatd";
$rc = system($cmd);
if ($rc >> 8) {
xCAT::MsgUtils->message("E", "Error: Cannot run stopsrc command correctly.\n");
exit 1;
}
# Wait for end of the xcatd subsystem
$check_num = $::RE_CHECK_NUM;
while ($check_num > 0) {
$cmd = "lssrc -s xcatd | grep 'xcatd' | grep 'inoperative'";
@output = `$cmd`;
if (scalar(@output) == 0) {
sleep 1;
} else {
last;
}
$check_num--;
}
if ($check_num <= 0) {
xCAT::MsgUtils->message("E", "Error: Cannot stop the xcatd subsystem correctly.\n");
exit 1;
} else {
if ($::VERBOSE) {
xCAT::MsgUtils->message("I", "Stopped the xcatd subsystem.\n");
}
}
}
# Kill xcatd manually if needed
$cmd = "ps -ef | grep xcatd: | grep -v grep";
@output = `$cmd`;
if (scalar(@output)) {
$cmd = "ps -ef | grep xcatd | grep 'SSL listener'";
@output = `$cmd`;
foreach my $ps (@output) {
$ps =~ s/^\s+//; # strip any leading spaces
my ($uid, $pid, $ppid, $desc) = split /\s+/, $ps;
my $cmd = "/usr/bin/kill -15 -$pid >/dev/null 2>&1";
`$cmd`;
}
# Kill the xcatd by force if it still there
$cmd = "ps -ef | grep xcatd: | grep -v grep";
@output = `$cmd`;
foreach my $ps (@output) {
$ps =~ s/^\s+//; # strip any leading spaces
my ($uid, $pid, $ppid, $desc) = split /\s+/, $ps;
my $cmd = "/usr/bin/kill -9 $pid >/dev/null 2>&1";
`$cmd`;
}
$check_num = $::RE_CHECK_NUM;
while ($check_num > 0) {
$cmd = "ps -ef | grep xcatd: | grep -v grep";
@output = `$cmd`;
if (scalar(@output)) {
sleep 1;
} else {
last;
}
$check_num--;
}
if ($check_num <= 0) {
xCAT::MsgUtils->message("E", "Error: Cannot kill the xcatd processes correctly.\n");
exit 1;
}
}
# Start the xcatd subsystem
$cmd = "/usr/bin/startsrc -s xcatd";
if ($ENV{XCATRELOAD} || $ENV{XCATROOT} || $ENV{PATH}) {
$cmd .= " -e \"";
if ($ENV{XCATRELOAD}) {
$cmd .= " XCATRELOAD=$ENV{XCATRELOAD}";
}
if ($ENV{XCATROOT}) {
$cmd .= " XCATROOT=$ENV{XCATROOT}";
}
if ($ENV{PATH}) {
$cmd .= " PATH=$ENV{PATH}";
}
$cmd .= "\"";
}
$rc = system($cmd);
if ($rc >> 8) {
xCAT::MsgUtils->message("E", "Error: Cannot run startsrc command correctly.\n");
exit 1;
}
# Sleep a while to make sure the startsrc has completed it's work
sleep 3;
# Check the status of xcatd subsystem
$check_num = $::RE_CHECK_NUM;
while ($check_num > 0) {
$cmd = "lssrc -s xcatd | grep 'xcatd' | grep 'active'";
my @output = `$cmd`;
if (scalar(@output) == 0) {
sleep 1;
} else {
last;
}
$check_num--;
}
if ($check_num <= 0) {
xCAT::MsgUtils->message("E", "Error: Cannot start the xcatd subsystem correctly.\n");
exit 1;
}
# now see if we can really talk to the database, up to a minute
$wait = 60;
while ($wait > 0) {
sleep 10;
$wait = $wait -10;
xCAT::Utils->runcmd("$::XCATROOT/sbin/tabdump site",-1);
if ($::RUNCMD_RC == 0) {
$wait=0;
}
}
if ($::VERBOSE) {
xCAT::MsgUtils->message("I", "Started the xcatd subsystem.\n");
}
exit 0;
#-----------------------------------------------------------------------------
=head3 parse_args
Parses for input
=cut
#-----------------------------------------------------------------------------
sub parse_args
{
my $usagemsg = "restartxcatd [[-h|--help] | [-v|--version] | [-r|--reload]] [-V|--verbose]\n";
Getopt::Long::Configure("posix_default");
Getopt::Long::Configure("no_gnu_compat");
Getopt::Long::Configure("bundling");
if (
!GetOptions(
'h|help' => \$::HELP,
'r|reload' => \$::RELOAD,
'v|version' => \$::VERSION,
'V|verbose' => \$::VERBOSE
)
)
{
xCAT::MsgUtils->message("E", $usagemsg);
exit 1;
}
if ($::HELP)
{
xCAT::MsgUtils->message("I", $usagemsg);
exit 0;
}
if ($::RELOAD)
{
$ENV{XCATRELOAD} = "yes";
}
if ($::VERSION)
{
my $version = xCAT::Utils->Version();
$version .="\n";
xCAT::MsgUtils->message("I", $version);
exit 0;
}
}