add support for exporting /install on Stateful SN, if installloc not set for statelite

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5596 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2010-03-29 16:33:43 +00:00
parent 9422219be9
commit 580ce97aa1

View File

@ -26,8 +26,13 @@ use Getopt::Long;
Linux.
A few functions are done not based on the servicenode table. For example:
mounts /install if site.installloc set
on a Linux Service Node
if site.installloc set
mounts /install
if site.installloc not set
creates /install if needed
sets up nfs
exports /install
#-------------------------------------------------------
@ -38,7 +43,7 @@ If xcat daemon reload then exit
Check to see if on a Service Node
If Linux
Call mountInstall
Call setupInstallloc
If this is a service Node
Read Service Node Table
For each service returned to be setup
@ -50,9 +55,9 @@ else if on the Management Node
#-------------------------------------------------------
sub handled_commands
{ return; }
sub init_plugin
sub handled_commands { return; }
sub init_plugin
{
my $doreq = shift;
@ -81,15 +86,15 @@ sub init_plugin
{
# service needed on Linux Service Node
$service = "mountInstall";
$rc = &mountInstall($nodename); # mount install
$service = "setupInstallloc";
$rc = &setupInstallloc($nodename);
if ($rc == 0)
{
xCAT::Utils->update_xCATSN($service);
}
$service = "ssh";
$rc = &setup_SSH(); # setup SSH
$rc = &setup_SSH(); # setup SSH
if ($rc == 0)
{
xCAT::Utils->update_xCATSN($service);
@ -118,7 +123,6 @@ sub init_plugin
}
$service = "ftpserver";
if (grep(/$service/, @servicelist))
{
@ -159,7 +163,7 @@ sub init_plugin
if (grep(/$service/, @servicelist))
{
$rc = &setup_TFTP($nodename,$doreq); # setup TFTP
$rc = &setup_TFTP($nodename, $doreq); # setup TFTP
if ($rc == 0)
{
xCAT::Utils->update_xCATSN($service);
@ -167,7 +171,6 @@ sub init_plugin
}
} # end Linux only
#
@ -193,11 +196,12 @@ sub init_plugin
{
xCAT::Utils->update_xCATSN($service);
}
# The nfsserver field in servicenode table
# The nfsserver field in servicenode table
# will also setup http service for Linux
if (xCAT::Utils->isLinux())
{
$rc = &setup_HTTP($nodename); # setup HTTP
$rc = &setup_HTTP($nodename); # setup HTTP
if ($rc == 0)
{
xCAT::Utils->update_xCATSN('http');
@ -205,10 +209,12 @@ sub init_plugin
}
}
#
# setup dhcp only on Linux and last
# setup dhcp only on Linux and last
#
if (xCAT::Utils->isLinux()) {
if (xCAT::Utils->isLinux())
{
my $service = "dhcpserver";
if (grep(/$service/, @servicelist))
{
@ -222,7 +228,6 @@ sub init_plugin
}
}
# done now in setupntp postinstall script, but may change
#$service = "ntpserver";
#if (grep(/$service/, @servicelist))
@ -249,7 +254,8 @@ sub init_plugin
# $rc = &setup_NTPmn(); # setup NTP on the Management Node
if (xCAT::Utils->isLinux())
{
print "\n"; # make OK prints look better. Only need to do this for the 1st service.
print "\n"
; # make OK prints look better. Only need to do this for the 1st service.
$rc = &setup_FTP(); # setup FTP
}
}
@ -272,21 +278,29 @@ sub process_request
#-----------------------------------------------------------------------------
=head3 mountInstall
=head3 setupInstallloc
if site.installloc attribute set
mount the install directory
If the installdir directory is exported, unexport it
mount the installdir directory from the installloc location
if site.installoc not set and we are on a Stateful install
If installdir mounted, unmount it
If installdir directory not created, create it
setup NFS
export the installdir directory
=cut
#-----------------------------------------------------------------------------
sub mountInstall
sub setupInstallloc
{
my ($nodename) = @_;
my $rc = 0;
my $installdir = xCAT::Utils->getInstallDir();
my $installloc = xCAT::Utils->getInstallDir();
my $installloc;
my $newinstallloc;
# read DB for nodeinfo
my $master;
my $os;
@ -295,7 +309,7 @@ sub mountInstall
my $retdata = xCAT::Utils->readSNInfo($nodename);
if (ref $retdata and $retdata->{'arch'})
{ # no error
{ # no error
$master = $retdata->{'master'}; # management node
$os = $retdata->{'os'};
$arch = $retdata->{'arch'};
@ -312,8 +326,8 @@ sub mountInstall
my ($hostname, $newinstallloc) = split ":", $installlocation[0];
if ($hostname)
{ # hostname set in /installloc attribute
$master = $hostname; # set name for mount
$installloc = $newinstallloc; #set path for mount point
$master = $hostname; # set name for mount
$installloc = $newinstallloc; #set path for mount point
}
}
else
@ -322,48 +336,190 @@ sub mountInstall
}
}
else
{ # if no install location then we do not mount
{ # if no installloc attribute then we do not mount
$nomount = 1;
}
if ($nomount == 0)
{ # mount the install directory
if ($nomount == 0) # we do have installloc attribute
{
# mount the install directory from the installloc location
# make the directory to mount on
if (!(-e $installdir))
{
mkpath($installdir);
}
# check if exported, and unexport it
my $cmd = "/bin/cat /etc/exports | grep '$installdir'";
my $outref = xCAT::Utils->runcmd("$cmd", -1);
if ($::RUNCMD_RC == 0) # it is exported
{
# remove from /etc/exports
my $sedcmd = "sed \\";
$sedcmd .= "$installdir/d /etc/exports > /etc/exports.tmp";
system $sedcmd;
if ($? > 0)
{ # error
xCAT::MsgUtils->message("S", "Error $cmd");
}
else
{
$cmd = "cp /etc/exports.tmp /etc/exports";
system $cmd;
if ($? > 0)
{ # error
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
# restart nfs
&setup_NFS($nodename);
$cmd = " exportfs -a";
system $cmd;
if ($? > 0)
{ # error
$rc = 1;
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
# check to see if install already mounted
my $mounted = xCAT::Utils->isMounted($installdir);
if ($mounted == 0)
{ # not mounted
{ # not mounted
# need to mount the directory
my $cmd = "mount -o rw,nolock $master:$installloc $installdir";
system $cmd;
if ($? > 0)
{ # error
{ # error
$rc = 1;
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
}
else
{
# installloc not set so we will export /install on the SN, if Stateful
if (xCAT::Utils->isStateful())
{
# no installloc attribute, create and export installdir
# check to see if installdir is mounted
my $mounted = xCAT::Utils->isMounted($installdir);
if ($mounted == 1)
{
# need to unmount the directory
my $cmd = "umount $installdir";
system $cmd;
if ($? > 0)
{ # error
$rc = 1;
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
# if it does not exist,need to make the installdir directory
if (!(-e $installdir))
{
mkpath($installdir);
}
# export the installdir
#
# add /install to /etc/exports - if needed
#
my $cmd = "/bin/cat /etc/exports | grep '$installdir'";
my $outref = xCAT::Utils->runcmd("$cmd", -1);
my $changed_exports;
if ($::RUNCMD_RC != 0)
{
# ok - then add this entry
my $cmd =
"/bin/echo '$installdir *(rw,no_root_squash,sync)' >> /etc/exports";
my $outref = xCAT::Utils->runcmd("$cmd", 0);
if ($::RUNCMD_RC != 0)
{
xCAT::MsgUtils->message('S',
"Could not update the /etc/exports file.");
}
else
{
$changed_exports++;
}
}
if ($changed_exports)
{
# restart nfs
&setup_NFS($nodename);
my $cmd = "/usr/sbin/exportfs -a";
my $outref = xCAT::Utils->runcmd("$cmd", 0);
if ($::RUNCMD_RC != 0)
{
xCAT::MsgUtils->message('S', "Error with $cmd.");
}
}
}
}
}
else
{ # error reading Db
{ # error reading Db
$rc = 1;
}
if ($rc == 0 && $nomount == 0)
if ($rc == 0)
{
# update fstab to mount on reboot
# update fstab
my $cmd = "grep $master:$installloc $installdir /etc/fstab ";
xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0)
{
`echo "$master:$installloc $installdir nfs timeo=14,intr 1 2" >>/etc/fstab`;
if ($nomount == 0) # then add the entry
{
`echo "$master:$installloc $installdir nfs timeo=14,intr 1 2" >>/etc/fstab`;
}
}
else
{ # fstab entry there
if ($nomount == 1)
{
# then remove the entry
my $sedcmd = "sed \\";
$sedcmd .= "$installdir/d /etc/fstab > /etc/fstab.tmp";
system $sedcmd;
if ($? > 0)
{ # error
xCAT::MsgUtils->message("S", "Error $cmd");
}
else
{
$cmd = "cp /etc/fstab.tmp /etc/fstab";
system $cmd;
if ($? > 0)
{ # error
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
}
}
}
return $rc;
@ -398,10 +554,10 @@ sub setup_CONS
# make the consever 8 configuration file
my $cmdref;
$cmdref->{command}->[0] = "makeconservercf";
$cmdref->{arg}->[0] = "-l";
$cmdref->{arg}->[0] = "-l";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
$cmdref->{svboot}->[0] = "yes";
no strict "refs";
no strict "refs";
my $modname = "conserver";
${"xCAT_plugin::" . $modname . "::"}{process_request}
->($cmdref, \&xCAT::Client::handle_response);
@ -459,10 +615,10 @@ sub setup_DHCP
}
my $cmdref;
$cmdref->{command}->[0] = "makedhcp";
$cmdref->{arg}->[0] = "-l";
$cmdref->{arg}->[0] = "-l";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
$cmdref->{arg}->[0] = "-n";
no strict "refs";
no strict "refs";
my $modname = "dhcp";
${"xCAT_plugin::" . $modname . "::"}{process_request}
->($cmdref, \&xCAT::Client::handle_response);
@ -474,7 +630,7 @@ sub setup_DHCP
}
$cmdref;
$cmdref->{command}->[0] = "makedhcp";
$cmdref->{arg}->[0] = "-l";
$cmdref->{arg}->[0] = "-l";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
$cmdref->{arg}->[0] = "-a";
@ -509,7 +665,7 @@ sub setup_FTP
# link installdir
# restart the daemon
my $installdir = xCAT::Utils->getInstallDir();
if (!(-e $installdir)) # make it
if (!(-e $installdir)) # make it
{
mkpath($installdir);
}
@ -598,13 +754,16 @@ sub setup_NFS
my $rc = 0;
if (xCAT::Utils->isLinux())
{
my $os = xCAT::Utils->osver();
if ($os =~ /sles.*/) {
$rc = xCAT::Utils->startService("nfs");
$rc = xCAT::Utils->startService("nfsserver");
} else {
$rc = xCAT::Utils->startService("nfs");
}
my $os = xCAT::Utils->osver();
if ($os =~ /sles.*/)
{
$rc = xCAT::Utils->startService("nfs");
$rc = xCAT::Utils->startService("nfsserver");
}
else
{
$rc = xCAT::Utils->startService("nfs");
}
}
else
{ #AIX
@ -656,7 +815,7 @@ sub setup_NTPsn
# create config file
open(CFGFILE, ">$ntpcfg")
or xCAT::MsgUtils->message('SE',
"Cannot open $ntpcfg for NTP update. \n");
"Cannot open $ntpcfg for NTP update. \n");
print CFGFILE "server ";
print CFGFILE $master;
print CFGFILE "\n";
@ -696,7 +855,7 @@ sub setup_NTPmn
# add server names
open(CFGFILE, ">$ntpcfg")
or xCAT::MsgUtils->message('SE',
"Cannot open $ntpcfg for NTP update. \n");
"Cannot open $ntpcfg for NTP update. \n");
my @servers = split ',', $ntpservers[0];
foreach my $addr (@servers)
{
@ -865,12 +1024,12 @@ sub setup_TFTP
{
my ($nodename, $doreq) = @_;
my $rc = 0;
my $rc = 0;
my $cmd;
my $master;
my $os;
my $arch;
my $XCATROOT = "/opt/xcat"; # default
my $XCATROOT = "/opt/xcat"; # default
if ($ENV{'XCATROOT'})
{
@ -903,13 +1062,14 @@ sub setup_TFTP
# read sharedtftp attribute from site table, if exist
my $stab = xCAT::Table->new('site');
my $sharedtftp = $stab->getAttribs({key=>'sharedtftp'},'value');
if ($sharedtftp)
my $sharedtftp = $stab->getAttribs({key => 'sharedtftp'}, 'value');
if ($sharedtftp)
{
$mountdirectory = $sharedtftp->{value};
$mountdirectory =~ tr/a-z/A-Z/; # convert to upper
}
$stab->close;
# read tftpdir directory from database
$tftpdir = xCAT::Utils->getTftpDir();
if (!(-e $tftpdir))
@ -935,45 +1095,58 @@ sub setup_TFTP
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
} else { #if not mounting, have to regenerate....
#first, run mknb to get nbfs and such going?
}
else
{ #if not mounting, have to regenerate....
#first, run mknb to get nbfs and such going?
my $cmdref;
use xCAT_plugin::mknb;
for my $architecture ("ppc64","x86","x86_64") {
unless (-d "$::XCATROOT/share/xcat/netboot/$architecture") {
for my $architecture ("ppc64", "x86", "x86_64")
{
unless (-d "$::XCATROOT/share/xcat/netboot/$architecture")
{
next;
}
$cmdref->{command}->[0] = "mknb";
$cmdref->{arg}->[0] = $architecture;
$doreq->($cmdref,\&xCAT::Client::handle_response);
$cmdref->{arg}->[0] = $architecture;
$doreq->($cmdref, \&xCAT::Client::handle_response);
}
#now, run nodeset enact on
my $mactab = xCAT::Table->new('mac');
my $hmtab = xCAT::Table->new('noderes');
if ($mactab and $hmtab) {
my @mentries = ($mactab->getAllNodeAttribs([qw(node mac)])); #nodeset fails if no mac entry, filter on discovered nodes first...
my $hmtab = xCAT::Table->new('noderes');
if ($mactab and $hmtab)
{
my @mentries =
($mactab->getAllNodeAttribs([qw(node mac)]))
; #nodeset fails if no mac entry, filter on discovered nodes first...
my %netmethods;
my @tnodes;
foreach (@mentries) {
foreach (@mentries)
{
unless (defined $_->{mac}) { next; }
push @tnodes,$_->{node};
push @tnodes, $_->{node};
}
my %hmhash = %{$hmtab->getNodesAttribs(\@tnodes,[qw(node netboot)])};
foreach (@tnodes) {
if ($hmhash{$_}->[0]->{netboot}) {
push @{$netmethods{$hmhash{$_}->[0]->{netboot}}},$_;
}
my %hmhash =
%{$hmtab->getNodesAttribs(\@tnodes, [qw(node netboot)])};
foreach (@tnodes)
{
if ($hmhash{$_}->[0]->{netboot})
{
push @{$netmethods{$hmhash{$_}->[0]->{netboot}}}, $_;
}
}
$cmdref->{command}->[0] = "nodeset";
$cmdref->{command}->[0] = "nodeset";
$cmdref->{inittime}->[0] = "1";
$cmdref->{arg}->[0] = "enact";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
my $plugins_dir=$::XCATROOT.'/lib/perl/xCAT_plugin';
foreach my $modname (keys %netmethods) {
$cmdref->{arg}->[0] = "enact";
$cmdref->{cwd}->[0] = "/opt/xcat/sbin";
my $plugins_dir = $::XCATROOT . '/lib/perl/xCAT_plugin';
foreach my $modname (keys %netmethods)
{
$cmdref->{node} = $netmethods{$modname};
$doreq->($cmdref,\&xCAT::Client::handle_response);
$doreq->($cmdref, \&xCAT::Client::handle_response);
}
}
}
@ -1030,8 +1203,9 @@ sub setup_HTTP
if (xCAT::Utils->isLinux())
{
my $os = xCAT::Utils->osver();
if ($os =~ /sles.*/) {
$rc = xCAT::Utils->startService("apache2");
if ($os =~ /sles.*/)
{
$rc = xCAT::Utils->startService("apache2");
}
else
{