mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1561 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			380 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			380 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/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 File::Basename;
 | 
						|
use Getopt::Long;
 | 
						|
use xCAT::MsgUtils;
 | 
						|
use xCAT::Utils;
 | 
						|
use File::Copy;
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head1   updateSNimage 
 | 
						|
 | 
						|
   This routine updates the service node diskless install image with
 | 
						|
   the extra files it needs to support running the postgresql and xcatd
 | 
						|
   daemon on the service node. If also creates a new fstab in the install image.
 | 
						|
 | 
						|
   Arguments:
 | 
						|
	  -n host ipaddress or name that can be used to scp, or blank for local host
 | 
						|
	  -p full path to diskless image to update
 | 
						|
	  -h help
 | 
						|
	  -v version
 | 
						|
 | 
						|
   Returns:
 | 
						|
	   0 = success
 | 
						|
	   1 = error
 | 
						|
   Globals:
 | 
						|
	   none
 | 
						|
   Error:
 | 
						|
     none
 | 
						|
   Example:
 | 
						|
     updateSNimage -n <hostipaddress/name> -i <path to image>
 | 
						|
     updateSNimage -i <path to image>
 | 
						|
 | 
						|
   Comments:
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
# Main
 | 
						|
 | 
						|
my $rc = 0;
 | 
						|
 | 
						|
my $hostname;
 | 
						|
my $path;
 | 
						|
my $cpy;
 | 
						|
my $cmd;
 | 
						|
 | 
						|
@hostpath = &getarg();
 | 
						|
$path     = pop @hostpath;
 | 
						|
my $hostname  = pop @hostpath;
 | 
						|
my $thostname = $hostname;
 | 
						|
if ($thostname eq "local")
 | 
						|
{    # local host
 | 
						|
    $cpy      = "cp";
 | 
						|
    $hostname = "";     # no hostname in the copy and use local cp
 | 
						|
    `unalias cp`;       # remove prompting
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    $cpy = "scp";
 | 
						|
    $hostname .= ":";
 | 
						|
}
 | 
						|
 | 
						|
# check to see  /etc/xcat/ca and /etc/xcat/cert directory exist
 | 
						|
# if not make them
 | 
						|
 | 
						|
if ($thostname eq "local")
 | 
						|
{                       # local host
 | 
						|
    $cmd = "ls $path/etc/xcat/ca";
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    $cmd = "ssh $hostname ls $path/etc/xcat/ca";
 | 
						|
}
 | 
						|
my @output = xCAT::Utils->runcmd($cmd, -1);
 | 
						|
if ($::RUNCMD_RC != 0)
 | 
						|
{
 | 
						|
    if ($thostname eq "local")
 | 
						|
    {                   # local host
 | 
						|
        $cmd = "mkdir $path/etc/xcat/ca";
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        $cmd = "ssh $hostname mkdir $path/etc/xcat/ca";
 | 
						|
    }
 | 
						|
    my @output = xCAT::Utils->runcmd($cmd, 0);
 | 
						|
    if ($::RUNCMD_RC != 0)
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("E", "Error from $cmd, @output");
 | 
						|
    }
 | 
						|
}
 | 
						|
if ($thostname eq "local")
 | 
						|
{    # local host
 | 
						|
    $cmd = "ls $path/etc/xcat/cert";
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    $cmd = "ssh $hostname ls $path/etc/xcat/cert";
 | 
						|
}
 | 
						|
my @output = xCAT::Utils->runcmd($cmd, -1);
 | 
						|
if ($::RUNCMD_RC != 0)
 | 
						|
{
 | 
						|
    if ($thostname eq "local")
 | 
						|
    {    # local host
 | 
						|
        $cmd = "mkdir $path/etc/xcat/cert";
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        $cmd = "ssh $hostname mkdir $path/etc/xcat/cert";
 | 
						|
    }
 | 
						|
    my @output = xCAT::Utils->runcmd($cmd, 0);
 | 
						|
    if ($::RUNCMD_RC != 0)
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("E", "Error from $cmd, @output");
 | 
						|
    }
 | 
						|
}
 | 
						|
if ($thostname eq "local")
 | 
						|
{    # local host
 | 
						|
    $cmd = "ls $path/root/.xcat";
 | 
						|
}
 | 
						|
else
 | 
						|
{
 | 
						|
    $cmd = "ssh $hostname ls $path/root/.xcat";
 | 
						|
}
 | 
						|
my @output = xCAT::Utils->runcmd($cmd, -1);
 | 
						|
if ($::RUNCMD_RC != 0)
 | 
						|
{
 | 
						|
    if ($thostname eq "local")
 | 
						|
    {    # local host
 | 
						|
        $cmd = "mkdir $path/root/.xcat";
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        $cmd = "ssh $hostname mkdir $path/root/.xcat";
 | 
						|
    }
 | 
						|
    my @output = xCAT::Utils->runcmd($cmd, 0);
 | 
						|
    if ($::RUNCMD_RC != 0)
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("E", "Error from $cmd, @output");
 | 
						|
    }
 | 
						|
}
 | 
						|
my $path1 = "$path/";
 | 
						|
 | 
						|
# build each copy command
 | 
						|
my $path1 = "$path/";
 | 
						|
 | 
						|
# build each copy command
 | 
						|
# cp -p /etc/sysconfig/xcat $path/etc/sysconfig/xcat , if local or
 | 
						|
# scp -p /etc/sysconfig/xcat $hostname:$path/etc/sysconfig/xcat if remote
 | 
						|
#my $filename  = " /etc/sysconfig/xcat ";
 | 
						|
#my $filename2 = "etc/sysconfig/xcat ";
 | 
						|
#my $copy1     = $cpy;
 | 
						|
#$copy1 .= " -p ";
 | 
						|
#$copy1 .= $filename;
 | 
						|
#$copy1 .= $hostname;
 | 
						|
#$copy1 .= $path1;
 | 
						|
#$copy1 .= $filename2;
 | 
						|
 | 
						|
# cp -p /etc/xcat/cfgloc $path/etc/xcat/cfgloc , if local or
 | 
						|
# scp -p /etc/xcat/cfgloc $hostname:$path/etc/xcat/cfgloc if remote
 | 
						|
$filename  = " /etc/xcat/cfgloc ";
 | 
						|
$filename2 = "etc/xcat/cfgloc ";
 | 
						|
my $copy2 = $cpy;
 | 
						|
$copy2 .= " -p ";
 | 
						|
$copy2 .= $filename;
 | 
						|
$copy2 .= $hostname;
 | 
						|
$copy2 .= $path1;
 | 
						|
$copy2 .= $filename2;
 | 
						|
 | 
						|
# cp -p /root/.xcat/* $path/root/.xcat/. , if local or
 | 
						|
# scp -p /root/.xcat/* $hostname:$path/root/.xcat/. if remote
 | 
						|
$filename  = " /root/.xcat/* ";
 | 
						|
$filename2 = "root/.xcat/. ";
 | 
						|
my $copy3 = $cpy;
 | 
						|
$copy3 .= " -p ";
 | 
						|
$copy3 .= $filename;
 | 
						|
$copy3 .= $hostname;
 | 
						|
$copy3 .= $path1;
 | 
						|
$copy3 .= $filename2;
 | 
						|
 | 
						|
# cp -p /etc/syslog $path/etc/syslog , if local or
 | 
						|
# scp -p /etc/syslog $hostname:$path/etc/syslog if remote
 | 
						|
$filename  = " /etc/syslog.conf ";
 | 
						|
$filename2 = "etc/syslog.conf ";
 | 
						|
my $copy4 = $cpy;
 | 
						|
$copy4 .= " -p ";
 | 
						|
$copy4 .= $filename;
 | 
						|
$copy4 .= $hostname;
 | 
						|
$copy4 .= $path1;
 | 
						|
$copy4 .= $filename2;
 | 
						|
 | 
						|
# cp -rp /etc/xcat/ca/* $path/etc/xcat/ca/. , if local or
 | 
						|
# scp -rp /etc/xcat/ca/* $hostname:$path/etc/xcat/ca/. if remote
 | 
						|
$filename  = " /etc/xcat/ca/* ";
 | 
						|
$filename2 = "etc/xcat/ca/. ";
 | 
						|
my $copy5 = $cpy;
 | 
						|
$copy5 .= " -rp ";
 | 
						|
$copy5 .= $filename;
 | 
						|
$copy5 .= $hostname;
 | 
						|
$copy5 .= $path1;
 | 
						|
$copy5 .= $filename2;
 | 
						|
 | 
						|
# cp -p /etc/xcat/cert/* $path/etc/xcat/cert/. , if local or
 | 
						|
# scp -p /etc/xcat/cert/* $hostname:$path/etc/xcat/cert/. if remote
 | 
						|
$filename  = " /etc/xcat/cert/* ";
 | 
						|
$filename2 = "etc/xcat/cert/. ";
 | 
						|
my $copy6 = $cpy;
 | 
						|
$copy6 .= " -p ";
 | 
						|
$copy6 .= $filename;
 | 
						|
$copy6 .= $hostname;
 | 
						|
$copy6 .= $path1;
 | 
						|
$copy6 .= $filename2;
 | 
						|
 | 
						|
#my @cmd = ($copy1, $copy2, $copy3, $copy4, $copy5, $copy6);
 | 
						|
my @cmd = ($copy2, $copy3, $copy4, $copy5, $copy6);
 | 
						|
 | 
						|
foreach $cmd (@cmd)
 | 
						|
{
 | 
						|
 | 
						|
    my @output = xCAT::Utils->runcmd($cmd, 0);
 | 
						|
    if ($::RUNCMD_RC != 0)
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("E", "Error from $cmd, @output");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
# create a new fstab
 | 
						|
 | 
						|
$rc = &create_fstab($path);
 | 
						|
 | 
						|
exit $rc;
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2   getarg 
 | 
						|
 | 
						|
  parses input 
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub getarg
 | 
						|
{
 | 
						|
 | 
						|
    Getopt::Long::Configure("posix_default");
 | 
						|
    Getopt::Long::Configure("no_gnu_compat");
 | 
						|
    Getopt::Long::Configure("bundling");
 | 
						|
    my @output;
 | 
						|
    my %options = ();
 | 
						|
 | 
						|
    if (
 | 
						|
        !GetOptions(
 | 
						|
            'h|help'    => \$options{'help'},
 | 
						|
            'n|node=s'  => \$options{'node'},
 | 
						|
            'p|path=s'  => \$options{'path'},
 | 
						|
            'v|version' => \$options{'version'}
 | 
						|
 | 
						|
        )
 | 
						|
      )
 | 
						|
    {
 | 
						|
 | 
						|
        &usage;
 | 
						|
        exit 1;
 | 
						|
    }
 | 
						|
    if ($options{'help'})
 | 
						|
    {
 | 
						|
        &usage;
 | 
						|
        exit 0;
 | 
						|
    }
 | 
						|
    if ($options{'version'})
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("I", "Version 2.0\n");
 | 
						|
        exit 0;
 | 
						|
    }
 | 
						|
 | 
						|
    # must input hostname and path
 | 
						|
    if (!($options{'path'}))    # required
 | 
						|
    {
 | 
						|
        xCAT::MsgUtils->message("E", "-p path to image is required\n");
 | 
						|
        exit 1;
 | 
						|
    }
 | 
						|
    if ($options{'node'})
 | 
						|
    {
 | 
						|
        push @output, $options{'node'};
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        push @output, "local";
 | 
						|
    }
 | 
						|
    push @output, $options{'path'};
 | 
						|
 | 
						|
    return @output;
 | 
						|
}
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2   usage 
 | 
						|
 | 
						|
  displays usages message 
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
sub usage
 | 
						|
{
 | 
						|
    my $usage;
 | 
						|
    my $usage1 = " updateSNimage -h \n updateSNimage -v \n ";
 | 
						|
    my $usage2 = "updateSNimage {-n hostname | hostip } [-p path to image] \n ";
 | 
						|
    my $usage3 =
 | 
						|
      "               -n hostname or ipadress where image is located \n ";
 | 
						|
    "                  if not input copies to local host. \n ";
 | 
						|
    my $usage4 = "               -p full path to image to update with  \n ";
 | 
						|
    my $usage5 = "                   service node files. \n ";
 | 
						|
    $usage .= $usage1 .= $usage2 .= $usage3 .= $usage4 .= $usage5;
 | 
						|
    xCAT::MsgUtils->message("I", $usage);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2   create_fstab 
 | 
						|
 | 
						|
 Saves old fstab and creates a new one, if not already done 
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub create_fstab
 | 
						|
{
 | 
						|
    my ($path) = @_;
 | 
						|
    my $cmd;
 | 
						|
    my $file = "$path/etc/fstab";
 | 
						|
    my $file2 = "$path/etc/fstab.ORIG";
 | 
						|
    if (!(-e $file2))
 | 
						|
    {    # if not already done
 | 
						|
        $cmd = "cp -p $file $file2";
 | 
						|
        my @output = xCAT::Utils->runcmd($cmd, 0);
 | 
						|
        if ($::RUNCMD_RC != 0)
 | 
						|
        {
 | 
						|
            xCAT::MsgUtils->message("E", "Error from $cmd, @output");
 | 
						|
            return 1;
 | 
						|
        }
 | 
						|
 | 
						|
        # build the fstab file
 | 
						|
        my @fstabtemplate;
 | 
						|
        $fstabtemplate[0] = "proc        /proc            proc     rw 0 0\n";
 | 
						|
        $fstabtemplate[1] = "sysfs       /sys             sysfs    rw 0 0\n";
 | 
						|
        $fstabtemplate[2] =
 | 
						|
          "devpts      /dev/pts         devpts   rw,gid=5,mode=620 0 0\n";
 | 
						|
        $fstabtemplate[3] = "#tmpfs      /dev/shm         tmpfs    rw 0 0\n";
 | 
						|
        $fstabtemplate[4] = "compute_x86_64 /             tmpfs    rw 0 1\n";
 | 
						|
        $fstabtemplate[5] =
 | 
						|
          "#none        /tmp             tmpfs    defaults,size=10m 0 2\n";
 | 
						|
        $fstabtemplate[6] =
 | 
						|
          "#none        /var/tmp         tmpfs    defaults,size=10m 0 2\n";
 | 
						|
 | 
						|
        open(FSTABCFG, ">$file")
 | 
						|
          or
 | 
						|
          xCAT::MsgUtils->message('S', "Cannot open $file for fstab setup. \n");
 | 
						|
        print FSTABCFG @fstabtemplate;
 | 
						|
        close FSTABCFG;
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 |