mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@7299 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			268 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 |