Change logic for determining when service will be setup.

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1142 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2008-04-22 13:24:38 +00:00
parent d8d5eec409
commit 41329a5990
3 changed files with 245 additions and 182 deletions

View File

@ -364,6 +364,7 @@ sub list_all_node_groups
{
xCAT::MsgUtils->message("E", " Could not read the nodelist table\n");
}
$nodelisttab->close;
return @distinctgroups;
}
@ -437,7 +438,7 @@ sub get_site_attribute
xCAT::MsgUtils->message("E", " Could not read the site table\n");
}
$sitetab->close;
return $values;
}
@ -1366,6 +1367,8 @@ sub GetMasterNodeName
{
xCAT::MsgUtils->message('S',
"Unable to open noderes or nodetype table.\n");
$noderestab->close;
$typetab->close;
return 1;
}
my $sitetab = xCAT::Table->new('site');
@ -1382,9 +1385,15 @@ sub GetMasterNodeName
unless ($master)
{
xCAT::MsgUtils->message('S', "Unable to identify master for $node.\n");
$sitetab->close;
$noderestab->close;
$typetab->close;
return 1;
}
$sitetab->close;
$noderestab->close;
$typetab->close;
return $master;
}
@ -1435,7 +1444,7 @@ sub GetNodeOSARCH
=head3 exportDBConfig
Reads the /etc/sysconfig/xcat file for the DB configuration and exports it
Reads the /etc/xcat/cfgloc file for the DB configuration and exports it
in $XCATCFG
=cut
@ -1444,7 +1453,7 @@ sub exportDBConfig
{
# export the xcat database configuration
my $configfile = "/etc/sysconfig/xcat";
my $configfile = "/etc/xcat/cfgloc";
if (!($ENV{'XCATCFG'}))
{
if (-e ($configfile))
@ -1454,21 +1463,12 @@ sub exportDBConfig
"Cannot open $configfile for DB access. \n");
foreach my $line (<CFGFILE>)
{
if (grep /XCATCFG/, $line)
{
my @cfg = split /XCATCFG=/, $line;
my @cfg2 = split /'/, $cfg[1];
chomp $cfg2[1];
$ENV{'XCATCFG'} = $cfg2[1];
close CFGFILE;
last;
}
}
if (!($ENV{'XCATCFG'}))
{ # no db setup
xCAT::MsgUtils->message('SE',
"/etc/sysconfig/xcat does not contain XCATCFG setup. \n");
return 1;
chop $line;
$exp .= $line;
$ENV{'XCATCFG'} = $exp;
close CFGFILE;
last;
}
}
@ -1535,11 +1535,20 @@ sub readSNInfo
It then:
Checks the database to see if the input Service should be setup on the
input service node
Checks the noderes to see if this service node is a service node for any
node in the table. Any node that matches, it checks the service attribute
to see if this service node is the server, or if the attribute is blank, then
this service node is the server.
Checks the noderes to see if this service node is the tftserver,nfsserver for
and node in the table.
The checks are as follows:
If this service node is the tftpserver or nfsserver, then set it up.
If not then, if the tftpserver or nfsserver is blank then see if this
service node is the xcatmaster, if it is then setup the service.
Checks the networks table to see if the dhcpserver or nameserver(DNS)
should be setup. If this
service node is the address for the dhcpserver or DNS then set it up.
Checks the nodehm table to see if conserver should be setup. If this service
node is the conserver, then set it up.
Input: service nodename, service,ipaddres(s) of service node
Output:
0 - no service required
@ -1559,7 +1568,7 @@ sub readSNInfo
sub isServiceReq
{
my ($class, $servicenodename, $service, $serviceip) = @_;
my @ips = @$serviceip; # list of service node ip addresses
my @ips = @$serviceip; # list of service node ip addresses and names
my $rc = 0;
# check if service is already setup
@ -1586,17 +1595,18 @@ sub isServiceReq
unless ($networkstab)
{
xCAT::MsgUtils->message('S', "Unable to open networks table.\n");
$networkstab->close;
return -1;
}
foreach $serviceip (@ips)
{
my $whereclause =
"$service like '$servicenodename' or $service like '$serviceip'";
my @netlist =
my $whereclause = "$service like '$serviceip'";
my @netlist =
$networkstab->getAllAttribsWhere($whereclause, 'netname',
$service);
if (@netlist)
{
$networkstab->close;
return 1; # found an entry in the networks table for this node
}
}
@ -1611,19 +1621,20 @@ sub isServiceReq
unless ($nodehmtab)
{
xCAT::MsgUtils->message('S', "Unable to open nodehm table.\n");
$nodehmtab->close;
return -1;
}
foreach $serviceip (@ips)
{
my $whereclause =
"node like '$servicenodename' or node like '$serviceip'";
my @nodelist =
my $whereclause = "conserver like '$serviceip'";
my @nodelist =
$nodehmtab->getAllAttribsWhere($whereclause, 'node',
$service);
foreach my $node (@nodelist)
{
if ($node->{$service} ne "") # cons defined
{
$nodehmtab->close;
return 1; # found cons defined for this server
}
}
@ -1638,28 +1649,35 @@ sub isServiceReq
unless ($noderestab)
{
xCAT::MsgUtils->message('S', "Unable to open noderes table.\n");
$noderestab->close;
return -1;
}
foreach $serviceip (@ips)
{
my $whereclause = "$service like '$serviceip'";
my @nodelist =
$noderestab->getAllAttribsWhere($whereclause, 'node',
$service);
if (@nodelist)
{
$noderestab->close;
return 1; # found a match
}
}
# if did not find in service attribute, check xcatmaster, but
# service attribute must be blank
foreach $serviceip (@ips)
{
my $whereclause =
"servicenode like '$servicenodename' or servicenode like '$serviceip'";
"$service is NULL and xcatmaster like '$serviceip'";
my @nodelist =
$noderestab->getAllAttribsWhere($whereclause, 'node',
$service);
foreach my $node (@nodelist)
if (@nodelist)
{
foreach $serviceip (@ips)
{
if ( ($node->{$service} eq $servicenodename)
|| ($node->{$service} eq $serviceip)
|| ($node->{$service} eq ""))
{
return
1
; # found a node using this server for the service
}
}
$noderestab->close;
return 1; # found a match
}
}
}
@ -1674,7 +1692,7 @@ sub isServiceReq
=head3 determinehostname and ip address(s)
Used on the service node to figure out what hostname and ip address(s)
the service node is in the database
are valid names and addresses
Input: None
Output: ipaddress(s),nodename
=cut
@ -1734,10 +1752,10 @@ sub update_xCATSN
=head3 gethost_ips
Will use ifconfig to determine all possible ip addresses for the
host it is running on
host it is running on and then gethostbyaddr to get all possible hostnames
input:
output: array of ipaddress(s)
output: array of ipaddress(s) and hostnames
example: @ips=xCAT::gethost_ips();
=cut
@ -1762,6 +1780,18 @@ sub gethost_ips
my @ip = split(":", $addr1);
push @ipaddress, $ip[1];
}
my @names = @ipaddress;
foreach my $ipaddr (@names)
{
my $packedaddr = inet_aton($ipaddr);
my $hostname = gethostbyaddr($packedaddr, AF_INET);
if ($hostname)
{
my @shorthost = split(/\./, $hostname);
push @ipaddress, $shorthost[0];
}
}
return @ipaddress;
}
@ -1788,7 +1818,8 @@ sub create_postscripts_tar
mkdir("/install/autoinst");
}
$cmd = "cd /install/postscripts; tar -cf /install/autoinst/xcatpost.tar * .ssh/* .xcat/*; gzip -f /install/autoinst/xcatpost.tar";
$cmd =
"cd /install/postscripts; tar -cf /install/autoinst/xcatpost.tar * .ssh/* .xcat/*; gzip -f /install/autoinst/xcatpost.tar";
my @result = xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{
@ -1907,6 +1938,7 @@ sub get_ServiceNode
xCAT::MsgUtils->message('E', "Unable to read site Master value.\n");
$::ERROR_RC = 1;
}
$noderestab->close;
return \%snhash;
}
@ -1925,6 +1957,7 @@ sub get_ServiceNode
push @{$snhash{$master}}, $node;
}
}
$noderestab->close;
return \%snhash;
}
@ -1967,6 +2000,7 @@ sub get_ServiceNode
}
}
}
$noderestab->close;
return \%snhash;
}
@ -1996,6 +2030,7 @@ sub get_ServiceNode
push @{$snhash{$master}}, $node;
}
}
$nodehmtab->close;
return \%snhash;
}
@ -2033,6 +2068,8 @@ sub get_ServiceNode
}
}
}
$noderestab->close;
$nodehmtab->close;
return \%snhash;
}
@ -2048,20 +2085,20 @@ sub get_ServiceNode
}
# IPv4 function to convert hostname to IP address
sub toIP {
sub toIP
{
if ($_[0] =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) {
return([0,$_[0]]);
}
my $packed_ip = gethostbyname($_[0]);
if( !$packed_ip or $! ) {
return([1,"Cannot Resolve: $_[0]\n"]);
}
return([0,inet_ntoa($packed_ip)]);
if ($_[0] =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/)
{
return ([0, $_[0]]);
}
my $packed_ip = gethostbyname($_[0]);
if (!$packed_ip or $!)
{
return ([1, "Cannot Resolve: $_[0]\n"]);
}
return ([0, inet_ntoa($packed_ip)]);
}
1;

View File

@ -85,8 +85,8 @@ sub process_request
=head3 setup_NFS
Sets up NFS services and mounts /install and /tftpboot
on /install and /tftpboot from Master Node
Sets up NFS services and mounts /install
on /install from Master Node
=cut
@ -95,8 +95,7 @@ sub setup_NFS
{
my ($nodename) = @_;
my $rc = 0;
my $tftpdir = "/tftpboot"; # default
my $installdir = "/install"; # default
my $installdir = "/install"; # default
# read DB for nodeinfo
my $master;
@ -104,7 +103,7 @@ sub setup_NFS
my $arch;
my $retdata = xCAT::Utils->readSNInfo($nodename);
if ($retdata->{'arch'})
{ # no error
{ # no error
$master = $retdata->{'master'};
$os = $retdata->{'os'};
$arch = $retdata->{'arch'};
@ -120,99 +119,68 @@ sub setup_NFS
mkdir($installdir);
}
# read tftpdir directory from database, if it exists
my @tftpdir1 = xCAT::Utils->get_site_attribute("tftpdir");
if ($tftpdir1[0])
{
$tftpdir = $tftpdir1[0];
my $cmd = "chkconfig nfs on";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command:$cmd");
}
if (!(-e $tftpdir))
{
mkdir($tftpdir);
# make sure nfs is restarted
my $cmd = "service nfs stop";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command: $cmd");
return 1;
}
if (xCAT::Utils->isLinux())
# make sure nfs is started
my $cmd = "service nfs start";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command: $cmd");
return 1;
}
# check to see if install already mounted
my $directory = $installdir;
$cmd = "df -P $directory";
my @output = xCAT::Utils->runcmd($cmd, -1);
my $found = 0;
foreach my $line (@output)
{
my $cmd = "chkconfig nfs on";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command:$cmd");
}
# make sure nfs is restarted
my $cmd = "service nfs stop";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command: $cmd");
return 1;
}
# make sure nfs is started
my $cmd = "service nfs start";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command: $cmd");
return 1;
}
# check to see if install and tftp directory already mounted
# if not mount then
my @dirs = ($installdir, $tftpdir);
foreach my $directory (@dirs)
my ($file_sys, $blocks, $used, $avail, $cap, $mount_point) =
split(' ', $line);
if ($mount_point eq $directory)
{
$cmd = "df -P $directory";
my @output = xCAT::Utils->runcmd($cmd, -1);
my $found = 0;
foreach my $line (@output)
{
my ($file_sys, $blocks, $used, $avail, $cap, $mount_point) =
split(' ', $line);
if ($mount_point eq $directory)
{
$found = 1;
last;
}
}
if ($found == 0)
{
# need to mount the directory
my $cmd =
" mount -o rw,nolock $master:$directory $directory";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
$found = 1;
last;
}
}
if ($found == 0)
{
# need to mount the directory
my $cmd = " mount -o rw,nolock $master:$directory $directory";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
$rc=1;
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
else
{ #AIX TODO
xCAT::MsgUtils->message('S',
"AIX Service Node not supported yet.\n");
$rc = 1;
}
}
else
{ # error reading Db
{ # error reading Db
$rc = 1;
}
if ($rc == 0)
{
# update fstab so they will mount on reboot
$cmd = "grep $master:$tftpdir $tftpdir /etc/fstab ";
xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0)
{
`echo "$master:$tftpdir $tftpdir nfs timeo=14,intr 1 2" >>/etc/fstab`;
}
# update fstab to mount on reboot
$cmd = "grep $master:$installdir $installdir /etc/fstab ";
xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0)

View File

@ -12,14 +12,14 @@ use Getopt::Long;
#-------------------------------------------------------
=head1
xCAT plugin package to setup of atftp on both service node and MS
xCAT plugin package to setup of atftp service node
#-------------------------------------------------------
=head3 handled_commands
This runs on Service Node and on Management Server
This runs on Service Node
Call setup_TFTP (actually setting up atftp)
=cut
@ -31,14 +31,35 @@ sub handled_commands
my $rc = 0;
# setup atftp
my $service = "tftpserver";
$rc = &setup_TFTP(); # setup TFTP (ATFTP)
if ($rc == 0)
if (xCAT::Utils->isServiceNode())
{
if (xCAT::Utils->isServiceNode())
my @nodeinfo = xCAT::Utils->determinehostname;
my $nodename = pop @nodeinfo; # get hostname
my @nodeipaddr = @nodeinfo; # get ip addresses
my $service = "tftpserver";
$rc = xCAT::Utils->isServiceReq($nodename, $service, \@nodeipaddr);
if ($rc == 1)
{
xCAT::Utils->update_xCATSN($service);
$rc = &setup_TFTP(); # setup TFTP (ATFTP)
if ($rc == 0)
{
xCAT::Utils->update_xCATSN($service);
}
}
else
{
if ($rc == 2)
{ # just start the daemon
my $cmd = "service tftpd start";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
xCAT::MsgUtils->message("S", "Error on command: $cmd");
return 1;
}
}
}
}
return $rc;
@ -83,33 +104,29 @@ sub setup_TFTP
$XCATROOT = $ENV{'XCATROOT'};
}
if (xCAT::Utils->isServiceNode())
{
# read DB for nodeinfo
my @nodeinfo = xCAT::Utils->determinehostname;
my $nodename = pop @nodeinfo; # get hostname
my @nodeipaddr = @nodeinfo; # get ip addresses
my $retdata = xCAT::Utils->readSNInfo($nodename);
$master = $retdata->{'master'};
$os = $retdata->{'os'};
$arch = $retdata->{'arch'};
if (!($arch))
{ # error
xCAT::MsgUtils->message("S", " Error reading service node arch.");
return 1;
}
# read DB for nodeinfo
my @nodeinfo = xCAT::Utils->determinehostname;
my $nodename = pop @nodeinfo; # get hostname
my @nodeipaddr = @nodeinfo; # get ip addresses
my $retdata = xCAT::Utils->readSNInfo($nodename);
$master = $retdata->{'master'};
$os = $retdata->{'os'};
$arch = $retdata->{'arch'};
if (!($arch))
{ # error
xCAT::MsgUtils->message("S", " Error reading service node arch.");
return 1;
}
# check to see if atftp is installed
$cmd = "/usr/sbin/in.tftpd -V";
my @output = xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0)
{ # not installed
{ # not installed
xCAT::MsgUtils->message("S", "atftp is not installed");
return 1;
}
if ($output[0] =~ "atftp") # it is atftp
if ($output[0] =~ "atftp") # it is atftp
{
# read tftp directory from database, if it exists
@ -120,20 +137,7 @@ sub setup_TFTP
}
mkdir($tftpdir);
# update fstab so that it will restart on reboot
if (xCAT::Utils->isServiceNode())
{
$cmd =
"fgrep \"$master:$tftpdir $tftpdir nfs timeo=14,intr 1 2\" /etc/fstab";
xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0) # not already there
{
`echo "$master:$tftpdir $tftpdir nfs timeo=14,intr 1 2" >>/etc/fstab`;
}
}
# start atftp for both MS and Service node
# start atftp
$cmd = "service tftpd stop";
xCAT::Utils->runcmd($cmd, -1);
@ -154,6 +158,60 @@ sub setup_TFTP
xCAT::MsgUtils->message("S", "atftp is not installed");
return 1;
}
# read tftpdir directory from database, if it exists
my @tftpdir1 = xCAT::Utils->get_site_attribute("tftpdir");
if ($tftpdir1[0])
{
$tftpdir = $tftpdir1[0];
}
if (!(-e $tftpdir))
{
mkdir($tftpdir);
}
# check to see if tftp directory already mounted
# if not mount then
my $directory = $tftpdir;
$cmd = "df -P $directory";
my @output = xCAT::Utils->runcmd($cmd, -1);
my $found = 0;
foreach my $line (@output)
{
my ($file_sys, $blocks, $used, $avail, $cap, $mount_point) =
split(' ', $line);
if ($mount_point eq $directory)
{
$found = 1;
last;
}
}
if ($found == 0)
{
# need to mount the directory
my $cmd = " mount -o rw,nolock $master:$directory $directory";
xCAT::Utils->runcmd($cmd, 0);
if ($::RUNCMD_RC != 0)
{ # error
$rc = 1;
xCAT::MsgUtils->message("S", "Error $cmd");
}
}
if ($rc == 0)
{
# update fstab so that it will restart on reboot
$cmd =
"fgrep \"$master:$tftpdir $tftpdir nfs timeo=14,intr 1 2\" /etc/fstab";
xCAT::Utils->runcmd($cmd, -1);
if ($::RUNCMD_RC != 0) # not already there
{
`echo "$master:$tftpdir $tftpdir nfs timeo=14,intr 1 2" >>/etc/fstab`;
}
}
return $rc;
}
1;