#!/usr/bin/perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#(C)IBM Corp

#

#-----------------------------------------------------------------------------

=head1   servicenode 

 This updates the service node with files necessary to access the 
 database on the MasterNode and restarts the xcat daemon

 On AIX systems this does the service node configuration.

=cut

#-----------------------------------------------------------------------------

# MAIN

my $rc=0;

$::osname = `uname`;
chomp $::osname;

$::sdate = `/bin/date`;
chomp $::sdate;

$::hname = `hostname`;
chomp $::hname;

if ($::osname eq 'AIX')
{
	# AIX service node setup
	$rc = &setupAIXsn;
	if ( $rc != 0) {
		my $msg="$::sdate  servicenode: One or more errors occurred when attempting to configure node $::hname as an xCAT service node.\n";
		print "$msg\n";
		`logger -t xcat $msg`;
	}
} 
else
{
	# Linux setup
	#  remove OpenIPMI-tools and tftp
	#  install xcat from /install/xcat
	#  Copy Certificates, and config file to apprpriate directories 
	#  from /install and restart xcatd
	&runcmd("rpm -e OpenIPMI-tools");

	&runcmd("rpm -e tftp-server");
	if ($ENV{'NODESETSTATE'} eq "install")
	{
    	$msg = "Installing xCAT";
    	`logger -t xcat $msg`;
    	&runcmd("rpm -ivh /xcatpost/xcat/RPMS/*/*.rpm");
	}
	&runcmd("/opt/xcat/sbin/copycerts");
}

exit $rc;

#
# Subroutines
#

# run the command
sub runcmd
{
    my ($cmd) = @_;
    my $rc=0;

    $cmd .= ' 2>&1' ;
    $::outref = [];
    $::outref = `$cmd`;
    if ($?)
    {
        $rc = $? >> 8;
        if ($rc > 0)
        {
            my $msg="$cmd returned rc=$rc @$::outref\n";
            `logger -t xcat $msg`;
        }
    }
	return $rc;
}

# do AIX service node setup
sub setupAIXsn
{
	my $error=0;
	my $servnode;

	# get the name of my service node/NIM master from the /etc/xcatinfo file
	#  file was created by xcataixpost when the node was first installed
	if (-f "/etc/xcatinfo") {
    		my $cmd = "cat /etc/xcatinfo | grep 'XCATSERVER'";
    		&runcmd($cmd);
    		my $SNline = $::outref;
    		my $junk;
    		($junk, $servnode) =  split(/=/, $SNline);
    		$servnode =~ s/^\s*//;
    		chomp $servnode;
	} else {
			$msg = "$::sdate servicenode: Could not find /etc/xcatinfo file.\n";
        	`logger -t xcat $msg`;
    		$error++;
	}

	my $rcpcmd = "rcp -r $servnode:/etc/hosts /etc";
	if (&runcmd($rcpcmd) != 0) {
		$msg = "$::sdate servicenode: Could not get /etc/hosts file.\n";
        `logger -t xcat $msg`;
		$error++;
	}

	# make sure we have enough space in /xcatpost ("/") fs
	my $dfcmd = "df -m / | grep '\/' |tr -s ' '| cut -f 3 -d ' '";
	if (&runcmd($dfcmd) != 0) {
		$msg = "$::sdate servicenode: Could not find file system free space.\n";
		`logger -t xcat $msg`;
		$error++;
	}
	my $freespace = $::outref;
	if ($freespace <= 220) {
		# add to "/" fs if needed
		my $chfscmd = "/usr/sbin/chfs -a size=+220M  /";
		if (&runcmd($chfscmd) != 0) {
			$msg = "$::sdate servicenode: Could not increase file system size.\n";
        	`logger -t xcat $msg`;
          	$error++;
		}
	}

	# make sure we have enough space in /usr fs
    my $dfcmd = "df -m /usr | grep 'usr' |tr -s ' '| cut -f 3 -d ' '";
    if (&runcmd($dfcmd) != 0) {
        $msg = "$::sdate servicenode: Could not find file system free space.\n";
        `logger -t xcat $msg`;
        $error++;
    }
    my $freespace = $::outref;
    if ($freespace <= 2200) {
        # add to "/usr" fs if needed
        my $chfscmd = "/usr/sbin/chfs -a size=+2200M  /usr";
        if (&runcmd($chfscmd) != 0) {
            $msg = "$::sdate servicenode: Could not increase file system size.\n
";
            `logger -t xcat $msg`;
            $error++;
        }
    }

	# copy SN software to /xcatpost/AIX/xcatpkgs
	my $rcpcmd = "mkdir -p /xcatpost/AIX/xcatpkgs; rcp -r $servnode:/install/AIX/xcatpkgs/* /xcatpost/AIX/xcatpkgs";
    if (&runcmd($rcpcmd) != 0) {
		$msg = "$::sdate servicenode: Could not copy service node software from the management node.\n";
		`logger -t xcat $msg`;
        $error++;
    }

	# run inutoc
	my $inucmd = "inutoc /xcatpost/AIX/xcatpkgs";
	if (&runcmd($rcpcmd) != 0) {
		$msg = "$::sdate servicenode: Could not run inutoc.\n";
        `logger -t xcat $msg`;
        $error++;
    }

	# install openssl
	my $gencmd = "geninstall -IaXY -d /xcatpost/AIX/xcatpkgs -f /xcatpost/AIX/xcatpkgs/xCATinstpSN.bnd";
	if (&runcmd($gencmd) != 0) {
		$msg = "$::sdate servicenode: Could not install openssl.\n";
        `logger -t xcat $msg`;
        $error++;
    }

	# install openssh
	my $gencmd = "geninstall -IaXY -d /xcatpost/AIX/xcatpkgs -f /xcatpost/AIX/xcatpkgs/xCATaixSSH.bnd";
	if (&runcmd($gencmd) != 0) {
		$msg = "$::sdate servicenode: Could not install openssh.\n";
        `logger -t xcat $msg`;
        $error++;
    }

	# 
	# run updatepkg to update RPM's reflection of the software
    #   installed by installp - may already be done - but won't hurt!
    if (&runcmd("/usr/sbin/updtvpkg") != 0) {
		$msg = "$::sdate servicenode: Could not run updtvpkg.\n";
        `logger -t xcat $msg`;
        $error++;
    }

	# install rpms
	my $rpmcmd = "rpm -U /xcatpost/AIX/xcatpkgs/*.rpm";
	&runcmd($rpmcmd);

	# so conserver will start
	if (&runcmd("mkdir -p /var/log/consoles")!= 0) {
		$msg = "$::sdate servicenode: Could not make /var/log/consoles.\n";
        `logger -t xcat $msg`;
		$error++;
	}

	# makes it a service node
	if (&runcmd("touch /etc/xCATSN") != 0 ) {
		$msg = "$::sdate servicenode: Could not touch /etc/xCATSN\n";
        `logger -t xcat $msg`;
	    $error++;
    }

	# call copycerts
	if (&runcmd("/opt/xcat/sbin/copycerts") != 0) {
		$msg = "$::sdate servicenode: Could not run copycerts.\n";
        `logger -t xcat $msg`;
	    $error++;
    }

	# copy the cfgloc file from /xcatpost
	if (&runcmd("mkdir -p /etc/xcat")!= 0) {
		$msg = "$::sdate servicenode: Could not make /etc/xcat directory.\n";
        `logger -t xcat $msg`;
        $error++;
    }

	my $sedcmd = "sed -e 's/host=.*|xcatadmin/host=$servnode|xcatadmin/' /xcatpost/etc/xcat/cfgloc > /etc/xcat/cfgloc";
	if (&runcmd($sedcmd)!= 0) {
		$msg = "$::sdate servicenode: Could not copy cfgloc file.\n";
        `logger -t xcat $msg`;
        $error++;
    }
	
	# start xcatd
	if (&runcmd("/opt/xcat/sbin/xcatd &") != 0) {
		$msg = "$::sdate servicenode: Could not start xcatd.\n";
        `logger -t xcat $msg`;
	    $error++;
    }

	# TODO - add xcatd as system service???
	# mkssys -s xcatd -p /opt/xcat/sbin/xcatd -u 0 -K

	# add xcatd to /etc/inittab???
	$mkitab_cmd = 'mkitab "xcatd:2:once:/opt/xcat/sbin/xcatd > /dev/console 2>&1"';
	# $mkitab_cmd = 'mkitab "xcatd:2:once:/usr/bin/startsrc -s xcatd > /dev/console 2>&1"';

	if (&runcmd($mkitab_cmd) != 0) {
		$msg = "$::sdate servicenode: Could not add xcatd to /etc/inittab.\n";
        `logger -t xcat $msg`;
	    $error++;
    }

	# do nim master setup - master fileset already installed
	if (&runcmd("nim_master_setup -a mk_resource=no") != 0) {
		$msg = "$::sdate servicenode: Could not run nim_master_setup.\n";
        `logger -t xcat $msg`;
	    $error++;
    }

	if ($error > 0) {
		return $error;
	}

	return 0;
}