mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-30 01:26:38 +00:00
Merge branch 'master' of ssh://git.code.sf.net/p/xcat/xcat-core
change to doxcat
This commit is contained in:
commit
bf3e88261b
@ -3993,8 +3993,7 @@ sub parse_and_run_dsh
|
||||
{
|
||||
$options{'user'} = $ENV{'DSH_TO_USERID'};
|
||||
}
|
||||
|
||||
if ((!(defined(@$nodes))) && (!(defined($options{'rootimg'}))))
|
||||
if ((!(defined($nodes))) && (!(defined($options{'rootimg'}))))
|
||||
{ # no nodes and not -i option, error
|
||||
my $rsp = ();
|
||||
$rsp->{error}->[0] = "Unless using -i option, noderange is required.";
|
||||
@ -4033,7 +4032,7 @@ sub parse_and_run_dsh
|
||||
{ # from sinv, discard this name
|
||||
undef @$nodes;
|
||||
}
|
||||
if (defined(@$nodes))
|
||||
if (@$nodes)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] =
|
||||
@ -4405,7 +4404,7 @@ sub parse_and_run_dcp
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((!(defined(@$nodes))) && (!(defined($options{'rootimg'}))))
|
||||
if ((!(defined($nodes))) && (!(defined($options{'rootimg'}))))
|
||||
{ # no nodes and not -i option, error
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] = "Unless using -i option, noderange is required.";
|
||||
@ -4502,7 +4501,7 @@ sub parse_and_run_dcp
|
||||
#
|
||||
# build list of nodes
|
||||
my @nodelist;
|
||||
if (defined(@$nodes))
|
||||
if (@$nodes)
|
||||
{ # there are nodes
|
||||
@nodelist = @$nodes;
|
||||
$options{'nodes'} = join(',', @nodelist);
|
||||
@ -4972,7 +4971,8 @@ sub parse_rsync_input_file_on_MN
|
||||
$::process_line = 0;
|
||||
my $destfileisdir;
|
||||
my $clause=0;
|
||||
|
||||
my $addmergescript =0;
|
||||
my $addappendscript =0;
|
||||
open(INPUTFILE, "< $input_file") || die "File $input_file does not exist\n";
|
||||
while (my $line = <INPUTFILE>)
|
||||
{
|
||||
@ -5013,12 +5013,16 @@ sub parse_rsync_input_file_on_MN
|
||||
# this triggers the running of the appendscript
|
||||
$::appendscript ="/opt/xcat/share/xcat/scripts/xdcpappend.sh";
|
||||
}
|
||||
|
||||
# add the append script to the sync
|
||||
my $appscript ="/opt/xcat/share/xcat/scripts/xdcpappend.sh";
|
||||
my $appendscriptline = "$appscript -> $appscript";
|
||||
$syncappendscript=1; # syncing the xdcpappend.sh script
|
||||
&build_append_rsync($appendscriptline,$nodes, $options, $input_file,$rsyncSN, $syncdir,$nodesyncfiledir,$onServiceNode,$syncappendscript);
|
||||
}
|
||||
if ($addappendscript == 0) { # only add once
|
||||
my $appscript ="/opt/xcat/share/xcat/scripts/xdcpappend.sh";
|
||||
my $appendscriptline = "$appscript -> $appscript";
|
||||
$syncappendscript=1; # syncing the xdcpappend.sh script
|
||||
&build_append_rsync($appendscriptline,$nodes, $options, $input_file,$rsyncSN, $syncdir,$nodesyncfiledir,$onServiceNode,$syncappendscript);
|
||||
$addappendscript=1;
|
||||
}
|
||||
} # end APPEND clause
|
||||
if ($clause =~ /MERGE:/) {
|
||||
# location of the base merge script
|
||||
# for MERGE we have to sync the mergescript and the
|
||||
@ -5030,12 +5034,16 @@ sub parse_rsync_input_file_on_MN
|
||||
# this triggers the running of the mergescript
|
||||
$::mergescript ="/opt/xcat/share/xcat/scripts/xdcpmerge.sh";
|
||||
}
|
||||
|
||||
# add the merge script to the sync
|
||||
my $mergescript ="/opt/xcat/share/xcat/scripts/xdcpmerge.sh";
|
||||
my $mergescriptline = "$mergescript -> $mergescript";
|
||||
$syncmergescript=1; # syncing the xdcpmerge.sh script
|
||||
&build_merge_rsync($mergescriptline,$nodes, $options, $input_file,$rsyncSN, $syncdir,$nodesyncfiledir,$onServiceNode,$syncmergescript);
|
||||
}
|
||||
if ($addmergescript == 0) { # only add once
|
||||
my $mergescript ="/opt/xcat/share/xcat/scripts/xdcpmerge.sh";
|
||||
my $mergescriptline = "$mergescript -> $mergescript";
|
||||
$syncmergescript=1; # syncing the xdcpmerge.sh script
|
||||
&build_merge_rsync($mergescriptline,$nodes, $options, $input_file,$rsyncSN, $syncdir,$nodesyncfiledir,$onServiceNode,$syncmergescript);
|
||||
$addmergescript=1;
|
||||
}
|
||||
} # end MERGE clause
|
||||
|
||||
}
|
||||
} else { # not processing EXECUTE, EXECUTEALWAYS or APPEND
|
||||
|
@ -19,6 +19,7 @@ use File::Path;
|
||||
use Math::BigInt;
|
||||
use Socket;
|
||||
use xCAT::GlobalDef;
|
||||
use Data::Dumper;
|
||||
use strict;
|
||||
use warnings "all";
|
||||
my $socket6support = eval { require Socket6 };
|
||||
@ -2028,6 +2029,61 @@ sub getSubnetGateway
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
=head3 getNodeNameservers
|
||||
Description:
|
||||
Get nameservers of specified nodes.
|
||||
The priority: noderes.nameservers > networks.nameservers > site.nameservers
|
||||
Arguments:
|
||||
node: node name list
|
||||
Returns:
|
||||
Return a hash ref, of the $nameservers{$node}
|
||||
undef - Failed to get the nameservers
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
my $nameservers = xCAT::NetworkUtils::getNodeNameservers(\@node);
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
#-------------------------------------------------------------------------------
|
||||
sub getNodeNameservers{
|
||||
my $nodes=shift;
|
||||
if( $nodes =~ /xCAT::NetworkUtils/)
|
||||
{
|
||||
$nodes=shift;
|
||||
}
|
||||
my @nodelist = @$nodes;
|
||||
my %nodenameservers;
|
||||
my $nrtab = xCAT::Table->new('noderes',-create=>0);
|
||||
my %nrhash = %{$nrtab->getNodesAttribs(\@nodelist,['nameservers'])};
|
||||
|
||||
my $nettab = xCAT::Table->new("networks");
|
||||
my %nethash = xCAT::DBobjUtils->getNetwkInfo( \@nodelist );
|
||||
|
||||
my @nameservers = xCAT::TableUtils->get_site_attribute("nameservers");
|
||||
my $sitenameservers=$nameservers[0];
|
||||
|
||||
|
||||
foreach my $node (@nodelist){
|
||||
if ($nrhash{$node} and $nrhash{$node}->[0] and $nrhash{$node}->[0]->{nameservers})
|
||||
{
|
||||
$nodenameservers{$node}=$nrhash{$node}->[0]->{nameservers};
|
||||
}elsif($nethash{$node}{nameservers})
|
||||
{
|
||||
$nodenameservers{$node}=$nethash{$node}{nameservers};
|
||||
}elsif($sitenameservers)
|
||||
{
|
||||
$nodenameservers{$node}=$sitenameservers;
|
||||
}
|
||||
}
|
||||
|
||||
return \%nodenameservers;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 getNodeNetworkCfg
|
||||
|
@ -156,7 +156,7 @@ sub connect {
|
||||
# Shell prompt regexp based on HW Type
|
||||
##################################################
|
||||
my %prompt = (
|
||||
hmc => "~> \$",
|
||||
hmc => "~>\\s*\$",
|
||||
ivm => "\\\$ \$"
|
||||
);
|
||||
##################################################
|
||||
|
@ -921,6 +921,11 @@ site => {
|
||||
" '0' value means include all the nodes in the subnet.\n\n".
|
||||
" pruneservices: Whether to enable service pruning when noderm is run (i.e.\n".
|
||||
" removing DHCP entries when noderm is executed)\n\n".
|
||||
" managedaddressmode: The mode of networking configuration during node provision.\n".
|
||||
" If set to 'static', the network configuration will be configured \n".
|
||||
" in static mode based on the node and network definition on MN.\n".
|
||||
" If set to 'dhcp', the network will be configured with dhcp protocol.\n".
|
||||
" The default is 'dhcp'.\n\n".
|
||||
" ------------\n".
|
||||
"DNS ATTRIBUTES\n".
|
||||
" ------------\n".
|
||||
@ -941,6 +946,12 @@ site => {
|
||||
" \"<xcatmaster>\" to mean the DNS server for each node should be the\n".
|
||||
" node that is managing it (either its service node or the management\n".
|
||||
" node).\n\n".
|
||||
" externaldns: To specify that external dns is used. If externaldns is set to any value\n".
|
||||
" then, makedns command will not start the local nameserver on xCAT MN. \n".
|
||||
" Default is to start the local nameserver.\n\n".
|
||||
" dnsupdaters: The value are \',\' separated string which will be added to the zone config\n".
|
||||
" section. This is an interface for user to add configuration entries to\n".
|
||||
" the zone sections in named.conf.\n\n".
|
||||
" -------------------------\n".
|
||||
"HARDWARE CONTROL ATTRIBUTES\n".
|
||||
" -------------------------\n".
|
||||
@ -1096,6 +1107,10 @@ site => {
|
||||
" will not interfere.\n\n".
|
||||
" vmwarereconfigonpower: When set to no, the VMWare plugin will make no effort to\n".
|
||||
" push vm.cpus/vm.memory updates from xCAT to VMWare.\n\n".
|
||||
" persistkvmguests: Keep the kvm definition on the kvm hypervisor when you power off\n".
|
||||
" the kvm guest node. This is useful for you to manually change the \n".
|
||||
" kvm xml definition file in virsh for debugging. Set anything means\n".
|
||||
" enable.\n\n".
|
||||
" --------------------\n".
|
||||
"XCAT DAEMON ATTRIBUTES\n".
|
||||
" --------------------\n".
|
||||
|
@ -65,7 +65,7 @@ else { # the normal case of the user running the cmd - expand the noderange us
|
||||
SSL_cert_file=> xCAT::Utils->getHomeDir()."/.xcat/client-cred.pem",
|
||||
SSL_ca_file => xCAT::Utils->getHomeDir()."/.xcat/ca.pem",
|
||||
SSL_use_cert => 1,
|
||||
#SSL_verify_mode => 1,
|
||||
SSL_verify_mode => 1,
|
||||
);
|
||||
die "Connection failure: $!\n" unless ($client);
|
||||
my %cmdref = (command => 'noderange', noderange => $noderange);
|
||||
|
@ -123,6 +123,28 @@ Wake up the target nodes which is in B<suspend> state.
|
||||
|
||||
Don't try to run B<wake> against the 'on' state node, it would cause the node gets to 'off' state.
|
||||
|
||||
For some of xCAT hardware such as NeXtScale, it may need to enable S3 before using B<wake>. The following steps can be used to enable S3. Please reference L<pasu(1)|pasu.1> for "pasu" usage.
|
||||
|
||||
[root@xcatmn home]# echo "set Power.S3Enable Enable" > power-setting
|
||||
[root@xcatmn home]# pasu -b power-setting node01
|
||||
node01: Batch mode start.
|
||||
node01: [set Power.S3Enable Enable]
|
||||
node01: Power.S3Enable=Enable
|
||||
node01:
|
||||
node01: Beginning intermediate batch update.
|
||||
node01: Waiting for command completion status.
|
||||
node01: Command completed successfully.
|
||||
node01: Completed intermediate batch update.
|
||||
node01: Batch mode completed successfully.
|
||||
|
||||
[root@xcatmn home]# pasu node01 show all|grep -i s3
|
||||
node01: IMM.Community_HostIPAddress3.1=
|
||||
node01: IMM.Community_HostIPAddress3.2=
|
||||
node01: IMM.Community_HostIPAddress3.3=
|
||||
node01: IMM.DNS_IP_Address3=0.0.0.0
|
||||
node01: IMM.IPv6DNS_IP_Address3=::
|
||||
node01: Power.S3Enable=Enable
|
||||
|
||||
=item B<stat>|B<state>
|
||||
|
||||
Print the current power state/status.
|
||||
|
@ -660,6 +660,9 @@ sub esxipv6setup {
|
||||
return 'esxcfg-vmknic -i '.$v6addr.'/64 "Management Network"'." #ESXISTATICV6\n";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
sub kickstartnetwork {
|
||||
my $line = "network --onboot=yes --bootproto=";
|
||||
my $hoststab;
|
||||
@ -678,18 +681,26 @@ sub kickstartnetwork {
|
||||
} elsif ($::XCATSITEVALS{managedaddressmode} =~ /static/) {
|
||||
my ($ipaddr,$hostname,$gateway,$netmask)=xCAT::NetworkUtils->getNodeNetworkCfg($node);
|
||||
unless($ipaddr) { die "cannot resolve the network configuration of $node"; }
|
||||
|
||||
if($gateway eq '<xcatmaster>'){
|
||||
$gateway = xCAT::NetworkUtils->my_ip_facing($ipaddr);
|
||||
}
|
||||
|
||||
$line .="static --device=$suffix --ip=$ipaddr --netmask=$netmask --gateway=$gateway --hostname=$hostname ";
|
||||
|
||||
my $nrtab = xCAT::Table->new('noderes',-create=>0);
|
||||
unless ($nrtab) { die "noderes table should always exist prior to template processing"; }
|
||||
my $ent = $nrtab->getNodeAttribs($node,['nameservers'],prefetchcache=>1);
|
||||
unless ($ent and $ent->{nameservers}) { die "attribute nameservers not set for $node"; }
|
||||
my @nameserverARR=split (",",$ent->{nameservers});
|
||||
my %nameservers=%{xCAT::NetworkUtils->getNodeNameservers([$node])};
|
||||
my @nameserverARR=split (",",$nameservers{$node});
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my ($host,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
my $ip;
|
||||
if($_ eq '<xcatmaster>'){
|
||||
$ip = xCAT::NetworkUtils->my_ip_facing($gateway);
|
||||
}else{
|
||||
(undef,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
}
|
||||
push @nameserversIP, $ip;
|
||||
|
||||
}
|
||||
|
||||
if (scalar @nameserversIP) {
|
||||
@ -721,19 +732,27 @@ sub yast2network {
|
||||
my ($ipaddr,$hostname,$gateway,$netmask)=xCAT::NetworkUtils->getNodeNetworkCfg($node);
|
||||
unless($ipaddr) { die "cannot resolve the network configuration of $node"; }
|
||||
|
||||
my $nrtab = xCAT::Table->new('noderes',-create=>0);
|
||||
unless ($nrtab) { die "noderes table should always exist prior to template processing"; }
|
||||
my $ent = $nrtab->getNodeAttribs($node,['nameservers'],prefetchcache=>1);
|
||||
unless ($ent and $ent->{nameservers}) { die "attribute nameservers not set for $node"; }
|
||||
my @nameserverARR=split (",",$ent->{nameservers});
|
||||
if($gateway eq '<xcatmaster>'){
|
||||
$gateway = xCAT::NetworkUtils->my_ip_facing($ipaddr);
|
||||
}
|
||||
|
||||
my %nameservers=%{xCAT::NetworkUtils->getNodeNameservers([$node])};
|
||||
|
||||
my @nameserverARR=split (",",$nameservers{$node});
|
||||
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my ($host,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
my $ip;
|
||||
if($_ eq '<xcatmaster>'){
|
||||
$ip = xCAT::NetworkUtils->my_ip_facing($gateway);
|
||||
}else{
|
||||
(undef,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
}
|
||||
push @nameserversIP, $ip;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
# get the domains for each node - one call for all nodes in hosts file
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains([$node]);
|
||||
my %nodedomains = %$nd;
|
||||
@ -761,7 +780,7 @@ sub yast2network {
|
||||
'nameservers' => [
|
||||
{
|
||||
'config:type' => 'list',
|
||||
'nameserver' => @nameserversIP
|
||||
'nameserver' => [@nameserversIP]
|
||||
}
|
||||
],
|
||||
'hostname' => [
|
||||
@ -908,6 +927,7 @@ sub yast2network {
|
||||
$line=$xml->XMLout($networkhash);
|
||||
|
||||
}
|
||||
|
||||
return $line;
|
||||
}
|
||||
|
||||
|
@ -379,8 +379,7 @@ sub parse_attr_for_osimage{
|
||||
sub processArgs
|
||||
{
|
||||
my $gotattrs = 0;
|
||||
|
||||
if (defined(@{$::args})) {
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
@ARGV = @{$::args};
|
||||
} else {
|
||||
if ($::command eq "lsdef") {
|
||||
@ -391,8 +390,9 @@ sub processArgs
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
if ( scalar(@{$::args}) eq 1 and $::args->[0] eq '-S')
|
||||
{
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
if ( scalar(@{$::args}) eq 1 and $::args->[0] eq '-S')
|
||||
{
|
||||
if ($::command eq "lsdef") {
|
||||
push @ARGV, "-t";
|
||||
push @ARGV, "node";
|
||||
@ -400,6 +400,7 @@ sub processArgs
|
||||
} else {
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($::command eq "lsdef") {
|
||||
|
@ -232,8 +232,7 @@ sub parse_args
|
||||
my $args = $request->{arg};
|
||||
my $gotattrs = 0;
|
||||
my %opt =();
|
||||
|
||||
if (defined(@{$args})) {
|
||||
if ( defined ($args) && @{$args}) {
|
||||
@ARGV = @{$args};
|
||||
} else {
|
||||
return 2;
|
||||
|
@ -624,7 +624,7 @@ sub nimnodeset
|
||||
|
||||
my $Sname = xCAT::InstUtils->myxCATname();
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -1800,7 +1800,7 @@ sub chkosimage
|
||||
|
||||
my $image_name;
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -2267,7 +2267,7 @@ sub mknimimage
|
||||
my $dump_name;
|
||||
my $install_dir = xCAT::TableUtils->getInstallDir();
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -5705,7 +5705,7 @@ sub prermnimimage
|
||||
my @servicenodes = (); # pass back list of service nodes
|
||||
my %imagedef; # pass back image def hash
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -6215,7 +6215,7 @@ sub rmnimimage
|
||||
%allsn = %{$nodehash};
|
||||
}
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -7822,7 +7822,7 @@ sub prenimnodecust
|
||||
@nodelist = @$nodes;
|
||||
}
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -8060,7 +8060,7 @@ sub nimnodecust
|
||||
@nodelist = @$nodes;
|
||||
}
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -8217,7 +8217,7 @@ sub prenimnodeset
|
||||
my $subreq = shift;
|
||||
my $error = 0;
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -9944,7 +9944,7 @@ sub define_SN_resource
|
||||
}
|
||||
|
||||
my %attrs;
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -10983,7 +10983,7 @@ sub mkdsklsnode
|
||||
# - just set global for now
|
||||
$::callback = $callback;
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -12993,7 +12993,7 @@ sub make_SN_resource
|
||||
}
|
||||
|
||||
my %attrs;
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -13653,7 +13653,7 @@ sub prermdsklsnode
|
||||
{
|
||||
my $callback = shift;
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
@ -13763,7 +13763,7 @@ sub rmdsklsnode
|
||||
# - just set global for now
|
||||
$::callback = $callback;
|
||||
|
||||
if (defined(@{$::args}))
|
||||
if ( defined ($::args) && @{$::args} )
|
||||
{
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
|
@ -1382,8 +1382,10 @@ sub mkinstall
|
||||
}
|
||||
|
||||
if ($::XCATSITEVALS{managedaddressmode} =~ /static/){
|
||||
my($host,$ip)=xCAT::NetworkUtils->gethostnameandip($instserver);
|
||||
$instserver=$ip;
|
||||
unless($instserver eq '!myipfn!'){
|
||||
my($host,$ip)=xCAT::NetworkUtils->gethostnameandip($instserver);
|
||||
$instserver=$ip;
|
||||
}
|
||||
}
|
||||
my $httpprefix=$pkgdir;
|
||||
if ($installroot =~ /\/$/) {
|
||||
@ -1455,20 +1457,38 @@ sub mkinstall
|
||||
#to avoid multicast dhcp
|
||||
if($::XCATSITEVALS{managedaddressmode} =~ /static/){
|
||||
my ($ipaddr,$hostname,$gateway,$netmask)=xCAT::NetworkUtils->getNodeNetworkCfg($node);
|
||||
unless($ipaddr) { die "cannot resolve the network configuration of $node"; }
|
||||
unless($ipaddr) {
|
||||
$callback->(
|
||||
{
|
||||
error => [
|
||||
"cannot resolve the ip address of $node"
|
||||
],
|
||||
errorcode => [1]
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
if($gateway eq '<xcatmaster>'){
|
||||
$gateway = xCAT::NetworkUtils->my_ip_facing($ipaddr);
|
||||
}
|
||||
|
||||
$kcmdline .=" ip=$ipaddr netmask=$netmask gateway=$gateway hostname=$hostname ";
|
||||
my $nrtab = xCAT::Table->new('noderes',-create=>0);
|
||||
unless ($nrtab) { die "noderes table should always exist prior to template processing"; }
|
||||
my $ent = $nrtab->getNodeAttribs($node,['nameservers'],prefetchcache=>1);
|
||||
unless ($ent and $ent->{nameservers}) { die "attribute nameservers not set for $node"; }
|
||||
my @nameserverARR=split (",",$ent->{nameservers});
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my ($host,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
push @nameserversIP, $ip;
|
||||
}
|
||||
|
||||
|
||||
my %nameservers=%{xCAT::NetworkUtils->getNodeNameservers([$node])};
|
||||
my @nameserverARR=split (",",$nameservers{$node});
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my $ip;
|
||||
if($_ eq '<xcatmaster>'){
|
||||
$ip = xCAT::NetworkUtils->my_ip_facing($gateway);
|
||||
}else{
|
||||
(undef,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
}
|
||||
push @nameserversIP, $ip;
|
||||
|
||||
}
|
||||
|
||||
if(scalar @nameserversIP){
|
||||
$kcmdline .=" dns=".join(",",@nameserversIP);
|
||||
|
@ -51,7 +51,7 @@ sub getzonesfornet {
|
||||
die "Not supporting having a mask like $mask on an ipv6 network like $net";
|
||||
}
|
||||
my $netnum= getipaddr($net,GetNumber=>1);
|
||||
unless ($netnum) { return (); }
|
||||
unless ($netnum) { return (); }
|
||||
$netnum->brsft(128-$maskbits);
|
||||
my $prefix=$netnum->as_hex();
|
||||
my $nibbs=$maskbits/4;
|
||||
@ -229,7 +229,7 @@ sub process_request {
|
||||
}
|
||||
}
|
||||
if ($::XCATSITEVALS{externaldns}) {
|
||||
$external=1;
|
||||
$external=1;
|
||||
}
|
||||
|
||||
if ($help)
|
||||
@ -325,73 +325,73 @@ sub process_request {
|
||||
if ($allnodes) {
|
||||
#read all nodelist specified nodes
|
||||
} else {
|
||||
if (not $request->{node} and $deletemode) {
|
||||
#when this was permitted, it really ruined peoples' days
|
||||
xCAT::SvrUtils::sendmsg([1,"makedns -d without noderange or -a is not supported"],$callback);
|
||||
umask($oldmask);
|
||||
return;
|
||||
}
|
||||
my @contents;
|
||||
my $domain;
|
||||
if ($request->{node}) { #leverage makehosts code to flesh out the options
|
||||
require xCAT_plugin::hosts;
|
||||
my @content1;
|
||||
my @content2;
|
||||
xCAT_plugin::hosts::add_hosts_content(nodelist=>$request->{node},callback=>$callback,hostsref=>\@content1);
|
||||
xCAT_plugin::hosts::donics(nodes=>$request->{node},callback=>$callback,hostsref=>\@content2);
|
||||
if (not $request->{node} and $deletemode) {
|
||||
#when this was permitted, it really ruined peoples' days
|
||||
xCAT::SvrUtils::sendmsg([1,"makedns -d without noderange or -a is not supported"],$callback);
|
||||
umask($oldmask);
|
||||
return;
|
||||
}
|
||||
my @contents;
|
||||
my $domain;
|
||||
if ($request->{node}) { #leverage makehosts code to flesh out the options
|
||||
require xCAT_plugin::hosts;
|
||||
my @content1;
|
||||
my @content2;
|
||||
xCAT_plugin::hosts::add_hosts_content(nodelist=>$request->{node},callback=>$callback,hostsref=>\@content1);
|
||||
xCAT_plugin::hosts::donics(nodes=>$request->{node},callback=>$callback,hostsref=>\@content2);
|
||||
@contents = (@content1, @content2);
|
||||
} else {
|
||||
#legacy behavior, read from /etc/hosts
|
||||
my $hostsfile;
|
||||
open($hostsfile,"<","/etc/hosts");
|
||||
flock($hostsfile,LOCK_SH);
|
||||
@contents = <$hostsfile>;
|
||||
flock($hostsfile,LOCK_UN);
|
||||
close($hostsfile);
|
||||
}
|
||||
} else {
|
||||
#legacy behavior, read from /etc/hosts
|
||||
my $hostsfile;
|
||||
open($hostsfile,"<","/etc/hosts");
|
||||
flock($hostsfile,LOCK_SH);
|
||||
@contents = <$hostsfile>;
|
||||
flock($hostsfile,LOCK_UN);
|
||||
close($hostsfile);
|
||||
}
|
||||
my $addr;
|
||||
my $name;
|
||||
my $canonical;
|
||||
my $aliasstr;
|
||||
my @aliases;
|
||||
my $names;
|
||||
my @hosts;
|
||||
my %nodehash;
|
||||
|
||||
my @hosts;
|
||||
my %nodehash;
|
||||
|
||||
foreach (@contents) {
|
||||
chomp; #no newline
|
||||
s/#.*//; #strip comments;
|
||||
s/^[ \t\n]*//; #remove leading whitespace
|
||||
next unless ($_); #skip empty lines
|
||||
($addr,$names) = split /[ \t]+/,$_,2;
|
||||
chomp; #no newline
|
||||
s/#.*//; #strip comments;
|
||||
s/^[ \t\n]*//; #remove leading whitespace
|
||||
next unless ($_); #skip empty lines
|
||||
($addr,$names) = split /[ \t]+/,$_,2;
|
||||
|
||||
if ($addr !~ /^\d+\.\d+\.\d+\.\d+$/ and $addr !~ /^[abcdef0123456789:]+$/) {
|
||||
xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, address seems malformed.", $callback);
|
||||
next;
|
||||
}
|
||||
unless ($names =~ /^[a-z0-9\. \t\n-]+$/i) {
|
||||
xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, names $names contain invalid characters (valid characters include a through z, numbers and the '-', but not '_'", $callback);
|
||||
next;
|
||||
}
|
||||
|
||||
my ($host, $ip) = xCAT::NetworkUtils->gethostnameandip($addr);
|
||||
push @hosts, $host;
|
||||
$nodehash{$addr}{names}=$names;
|
||||
$nodehash{$addr}{host}=$host;
|
||||
}
|
||||
|
||||
if ($addr !~ /^\d+\.\d+\.\d+\.\d+$/ and $addr !~ /^[abcdef0123456789:]+$/) {
|
||||
xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, address seems malformed.", $callback);
|
||||
next;
|
||||
}
|
||||
unless ($names =~ /^[a-z0-9\. \t\n-]+$/i) {
|
||||
xCAT::SvrUtils::sendmsg(":Ignoring line $_ in /etc/hosts, names $names contain invalid characters (valid characters include a through z, numbers and the '-', but not '_'", $callback);
|
||||
next;
|
||||
}
|
||||
|
||||
my ($host, $ip) = xCAT::NetworkUtils->gethostnameandip($addr);
|
||||
push @hosts, $host;
|
||||
$nodehash{$addr}{names}=$names;
|
||||
$nodehash{$addr}{host}=$host;
|
||||
}
|
||||
|
||||
# get the domains for each node - one call for all nodes in hosts file
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@hosts);
|
||||
my %nodedomains = %$nd;
|
||||
|
||||
foreach my $n (keys %nodehash) {
|
||||
$addr=$n;
|
||||
$names=$nodehash{$n}{names};
|
||||
# - need domain for this node
|
||||
my $host = $nodehash{$n}{host};
|
||||
$domain=$nodedomains{$host};
|
||||
# remove the first . at domain name since it's not accepted by high dns parser
|
||||
if ($domain =~ /^\./) { $domain =~ s/^\.//;; }
|
||||
# get the domains for each node - one call for all nodes in hosts file
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@hosts);
|
||||
my %nodedomains = %$nd;
|
||||
|
||||
foreach my $n (keys %nodehash) {
|
||||
$addr=$n;
|
||||
$names=$nodehash{$n}{names};
|
||||
# - need domain for this node
|
||||
my $host = $nodehash{$n}{host};
|
||||
$domain=$nodedomains{$host};
|
||||
# remove the first . at domain name since it's not accepted by high dns parser
|
||||
if ($domain =~ /^\./) { $domain =~ s/^\.//;; }
|
||||
|
||||
($canonical,$aliasstr) = split /[ \t]+/,$names,2;
|
||||
if ($aliasstr) {
|
||||
@ -407,7 +407,7 @@ sub process_request {
|
||||
unless ($canonical =~ /$domain/) {
|
||||
$canonical.=".".$domain;
|
||||
}
|
||||
# for only the sake of comparison, ensure consistant dot suffix
|
||||
# for only the sake of comparison, ensure consistant dot suffix
|
||||
unless ($canonical =~ /\.\z/) { $canonical .= '.' }
|
||||
foreach my $alias (@aliases) {
|
||||
unless ($alias =~ /$domain/) {
|
||||
@ -419,13 +419,13 @@ sub process_request {
|
||||
if ($alias eq $canonical) {
|
||||
next;
|
||||
}
|
||||
# remember alias for CNAM records later
|
||||
# remember alias for CNAM records later
|
||||
$ctx->{aliases}->{$node}->{$alias}=1;
|
||||
}
|
||||
|
||||
|
||||
# exclude the nodes not belong to any nets defined in networks table
|
||||
# because only the nets defined in networks table will be add
|
||||
# zones later.
|
||||
# zones later.
|
||||
my $found = 0;
|
||||
foreach (@networks)
|
||||
{
|
||||
@ -508,13 +508,13 @@ sub process_request {
|
||||
|
||||
$ctx->{domain} =~ s/^\.//; # remove . if it's the first char of domain name
|
||||
$ctx->{zonestotouch}->{$ctx->{domain}}=1;
|
||||
foreach (@networks) {
|
||||
if ($_->{domain}) {
|
||||
$_->{domain} =~ s/^\.//; # remove . if it's the first char of domain name
|
||||
$ctx->{zonestotouch}->{$_->{domain}}=1;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (@networks) {
|
||||
if ($_->{domain}) {
|
||||
$_->{domain} =~ s/^\.//; # remove . if it's the first char of domain name
|
||||
$ctx->{zonestotouch}->{$_->{domain}}=1;
|
||||
}
|
||||
}
|
||||
|
||||
xCAT::SvrUtils::sendmsg("Getting reverse zones, this may take several minutes for a large cluster.", $callback);
|
||||
|
||||
foreach (@nodes) {
|
||||
@ -528,10 +528,10 @@ sub process_request {
|
||||
xCAT::SvrUtils::sendmsg("Completed getting reverse zones.", $callback);
|
||||
|
||||
if (1) {
|
||||
#TODO: function to detect and return 1 if the master server is
|
||||
# DNS SOA for all the zones we care about here, we are examining
|
||||
#TODO: function to detect and return 1 if the master server is
|
||||
# DNS SOA for all the zones we care about here, we are examining
|
||||
# files to assure that our key is in named.conf, the zones we
|
||||
# care about are there, and that if active directory is in use,
|
||||
# care about are there, and that if active directory is in use,
|
||||
# allow the domain controllers to update specific zones
|
||||
@entries = xCAT::TableUtils->get_site_attribute("directoryprovider");
|
||||
$site_entry = $entries[0];
|
||||
@ -541,13 +541,13 @@ sub process_request {
|
||||
if ( defined($site_entry)) {
|
||||
my @dservers = split /[ ,]/,$site_entry;
|
||||
$ctx->{adservers} = \@dservers;
|
||||
|
||||
############################
|
||||
# - should this include all domains?
|
||||
# - multi-domains not supported with activedirectory
|
||||
# - TODO in future release
|
||||
###################
|
||||
|
||||
|
||||
############################
|
||||
# - should this include all domains?
|
||||
# - multi-domains not supported with activedirectory
|
||||
# - TODO in future release
|
||||
###################
|
||||
|
||||
$ctx->{adzones} = {
|
||||
"_msdcs.". $ctx->{domain} => 1,
|
||||
"_sites.". $ctx->{domain} => 1,
|
||||
@ -556,51 +556,51 @@ sub process_request {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@entries = xCAT::TableUtils->get_site_attribute("dnsupdaters");
|
||||
$site_entry = $entries[0];
|
||||
if ( defined($site_entry) ) {
|
||||
my @nservers = split /[ ,]/,$site_entry;
|
||||
$ctx->{dnsupdaters} = \@nservers;
|
||||
my @nservers = split /[ ,]/,$site_entry;
|
||||
$ctx->{dnsupdaters} = \@nservers;
|
||||
}
|
||||
unless ($external) {
|
||||
if ($zapfiles || $slave) { #here, we unlink all the existing files to start fresh
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
system("/usr/bin/stopsrc -s $service");
|
||||
}
|
||||
else
|
||||
{
|
||||
system("service $service stop"); #named may otherwise hold on to stale journal filehandles
|
||||
}
|
||||
my $conf = get_conf();
|
||||
unlink $conf;
|
||||
my $DBDir = get_dbdir();
|
||||
foreach (<$DBDir/db.*>) {
|
||||
unlink $_;
|
||||
}
|
||||
}
|
||||
#We manipulate local namedconf
|
||||
$ctx->{dbdir} = get_dbdir();
|
||||
$ctx->{zonesdir} = get_zonesdir();
|
||||
chmod 0775, $ctx->{dbdir}; # assure dynamic dns can actually execute against the directory
|
||||
|
||||
update_namedconf($ctx, $slave);
|
||||
|
||||
unless ($slave)
|
||||
unless ($external) { # only generate the named.conf and zone files for xCAT dns when NOT using external dns
|
||||
if ($zapfiles || $slave) { #here, we unlink all the existing files to start fresh
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
update_zones($ctx);
|
||||
system("/usr/bin/stopsrc -s $service");
|
||||
}
|
||||
else
|
||||
{
|
||||
system("service $service stop"); #named may otherwise hold on to stale journal filehandles
|
||||
}
|
||||
my $conf = get_conf();
|
||||
unlink $conf;
|
||||
my $DBDir = get_dbdir();
|
||||
foreach (<$DBDir/db.*>) {
|
||||
unlink $_;
|
||||
}
|
||||
}
|
||||
#We manipulate local namedconf
|
||||
$ctx->{dbdir} = get_dbdir();
|
||||
$ctx->{zonesdir} = get_zonesdir();
|
||||
chmod 0775, $ctx->{dbdir}; # assure dynamic dns can actually execute against the directory
|
||||
|
||||
update_namedconf($ctx, $slave);
|
||||
|
||||
unless ($slave)
|
||||
{
|
||||
update_zones($ctx);
|
||||
}
|
||||
|
||||
if ($ctx->{restartneeded}) {
|
||||
xCAT::SvrUtils::sendmsg("Restarting $service", $callback);
|
||||
|
||||
if ($ctx->{restartneeded}) {
|
||||
xCAT::SvrUtils::sendmsg("Restarting $service", $callback);
|
||||
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
#try to stop named
|
||||
my $cmd = "/usr/bin/stopsrc -s $service";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
|
||||
|
||||
$cmd = "/usr/bin/startsrc -s $service";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
@ -624,7 +624,7 @@ sub process_request {
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$cmd = "service $service start";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
$outp = join('', @output);
|
||||
@ -636,56 +636,57 @@ sub process_request {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
xCAT::SvrUtils::sendmsg("Restarting named complete", $callback);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
xCAT::SvrUtils::sendmsg("Restarting named complete", $callback);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
unless ($ctx->{privkey}) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Unable to update DNS due to lack of credentials in passwd to communicate with remote server"], $callback);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($slave)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
# check if named is active before update dns records.
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
my $cmd = "/usr/bin/lssrc -s $service |grep active";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
unless ($external) { # only start xCAT local dns when NOT using external dns
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
$cmd = "/usr/bin/startsrc -s $service";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
my $cmd = "/usr/bin/lssrc -s $service |grep active";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
$cmd = "/usr/bin/startsrc -s $service";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service $service status|grep running";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
else
|
||||
{
|
||||
$cmd = "service $service start";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
my $cmd = "service $service status|grep running";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
$cmd = "service $service start";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -693,12 +694,12 @@ sub process_request {
|
||||
#now we stick to Net::DNS style updates, with TSIG if possible. TODO: kerberized (i.e. Windows) DNS server support, maybe needing to use nsupdate -g....
|
||||
if ($external)
|
||||
{
|
||||
# based on /etc/resolv.conf
|
||||
# based on /etc/resolv.conf
|
||||
$ctx->{resolver} = Net::DNS::Resolver->new();
|
||||
}
|
||||
else
|
||||
{
|
||||
# default to localhost
|
||||
# default to localhost
|
||||
$ctx->{resolver} = Net::DNS::Resolver->new(nameservers=>['127.0.0.1']);
|
||||
}
|
||||
|
||||
@ -716,9 +717,9 @@ sub get_zonesdir {
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("bindzones");
|
||||
my $site_entry = $entries[0];
|
||||
|
||||
if ( defined($site_entry) ) {
|
||||
$ZonesDir= $site_entry;
|
||||
}
|
||||
if ( defined($site_entry) ) {
|
||||
$ZonesDir= $site_entry;
|
||||
}
|
||||
|
||||
return "$ZonesDir";
|
||||
}
|
||||
@ -727,16 +728,16 @@ sub get_conf {
|
||||
my $conf="/etc/named.conf";
|
||||
|
||||
# is this ubuntu ?
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
$conf="/etc/bind/named.conf";
|
||||
}
|
||||
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("bindconf");
|
||||
my $site_entry = $entries[0];
|
||||
|
||||
if ( defined($site_entry) ) {
|
||||
$conf= $site_entry;
|
||||
}
|
||||
if ( defined($site_entry) ) {
|
||||
$conf= $site_entry;
|
||||
}
|
||||
|
||||
return "$conf";
|
||||
}
|
||||
@ -746,9 +747,9 @@ sub get_dbdir {
|
||||
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("binddir");
|
||||
my $site_entry = $entries[0];
|
||||
if ( defined($site_entry) ) {
|
||||
$DBDir = $site_entry;
|
||||
}
|
||||
if ( defined($site_entry) ) {
|
||||
$DBDir = $site_entry;
|
||||
}
|
||||
|
||||
if ( -d "$DBDir" ) {
|
||||
return "$DBDir"
|
||||
@ -789,13 +790,13 @@ sub update_zones {
|
||||
my $name = hostname;
|
||||
my $node = $name;
|
||||
|
||||
# get the domain for the node - which is the local hostname
|
||||
my ($host, $nip) = xCAT::NetworkUtils->gethostnameandip($node);
|
||||
my @hosts;
|
||||
push (@hosts, $host);
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@hosts);
|
||||
my %nodedomains = %$nd;
|
||||
my $domain = $nodedomains{$host};
|
||||
# get the domain for the node - which is the local hostname
|
||||
my ($host, $nip) = xCAT::NetworkUtils->gethostnameandip($node);
|
||||
my @hosts;
|
||||
push (@hosts, $host);
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@hosts);
|
||||
my %nodedomains = %$nd;
|
||||
my $domain = $nodedomains{$host};
|
||||
|
||||
xCAT::SvrUtils::sendmsg("Updating zones.", $callback);
|
||||
|
||||
@ -829,7 +830,7 @@ sub update_zones {
|
||||
my $serial = ($mday * 100) + (($mon + 1) * 10000) + (($year + 1900) * 1000000);
|
||||
|
||||
foreach $currzone (@neededzones) {
|
||||
my $zonefilename = $currzone;
|
||||
my $zonefilename = $currzone;
|
||||
if ($currzone =~ /IN-ADDR\.ARPA/) {
|
||||
$currzone =~ s/\.IN-ADDR\.ARPA.*//;
|
||||
my @octets = split/\./,$currzone;
|
||||
@ -853,7 +854,7 @@ sub update_zones {
|
||||
}
|
||||
flock($zonehdl,LOCK_UN);
|
||||
close($zonehdl);
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
chown(scalar(getpwnam('root')),scalar(getgrnam('bind')),$dbdir."/db.$zonefilename");
|
||||
}
|
||||
else{
|
||||
@ -889,7 +890,7 @@ sub update_namedconf {
|
||||
$gotoptions=1;
|
||||
my $skip=0;
|
||||
do {
|
||||
#push @newnamed,"\t\t//listen-on-v6 { any; };\n";
|
||||
#push @newnamed,"\t\t//listen-on-v6 { any; };\n";
|
||||
if ($ctx->{forwarders} and $line =~ /forwarders {/) {
|
||||
push @newnamed,"\tforwarders \{\n";
|
||||
$skip=1;
|
||||
@ -1005,11 +1006,11 @@ sub update_namedconf {
|
||||
}
|
||||
}
|
||||
unless ($gotoptions) {
|
||||
push @newnamed,"options {\n";
|
||||
push @newnamed,"options {\n";
|
||||
unless ($slave && xCAT::Utils->isLinux()) {
|
||||
push @newnamed,"\tdirectory \"".$ctx->{zonesdir}."\";\n";
|
||||
}
|
||||
push @newnamed,"\t\t//listen-on-v6 { any; };\n";
|
||||
push @newnamed,"\t\t//listen-on-v6 { any; };\n";
|
||||
if ($ctx->{forwarders}) {
|
||||
push @newnamed,"\tforwarders {\n";
|
||||
foreach (@{$ctx->{forwarders}}) {
|
||||
@ -1128,7 +1129,7 @@ sub update_namedconf {
|
||||
for my $l (@newnamed) { print $newnameconf $l; }
|
||||
flock($newnameconf,LOCK_UN);
|
||||
close($newnameconf);
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
chown (scalar(getpwnam('root')),scalar(getgrnam('bind')),$namedlocation);
|
||||
}
|
||||
else{
|
||||
@ -1156,9 +1157,9 @@ sub add_or_delete_records {
|
||||
$ctx->{nsmap} = {}; #will store a map to known NS records to avoid needless redundant queries to sort nodes into domains
|
||||
$ctx->{updatesbyzone}={}; #sort all updates into their respective zones for bulk update for fewer DNS transactions
|
||||
|
||||
# get node domains
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@{$ctx->{nodes}});
|
||||
my %nodedomains = %{$nd};
|
||||
# get node domains
|
||||
my $nd = xCAT::NetworkUtils->getNodeDomains(\@{$ctx->{nodes}});
|
||||
my %nodedomains = %{$nd};
|
||||
|
||||
foreach $node (@{$ctx->{nodes}}) {
|
||||
my $name = $node;
|
||||
@ -1168,8 +1169,8 @@ sub add_or_delete_records {
|
||||
next;
|
||||
}
|
||||
|
||||
my $domain = $nodedomains{$node};
|
||||
if ($domain =~ /^\./) { $domain =~ s/^\.//; } # remove . if it's the first char of domain name
|
||||
my $domain = $nodedomains{$node};
|
||||
if ($domain =~ /^\./) { $domain =~ s/^\.//; } # remove . if it's the first char of domain name
|
||||
|
||||
unless ($name =~ /$domain/) { $name .= ".".$domain } # $name needs to represent fqdn, but must preserve $node as a nodename for cfg lookup
|
||||
|
||||
@ -1177,9 +1178,9 @@ sub add_or_delete_records {
|
||||
@ips = ($ctx->{hoststab}->{$node}->[0]->{ip});
|
||||
} else {
|
||||
@ips = getipaddr($node,GetAllAddresses=>1);
|
||||
if (not @ips and keys %{$ctx->{nodeips}->{$node}}) {
|
||||
@ips = keys %{$ctx->{nodeips}->{$node}};
|
||||
}
|
||||
if (not @ips and keys %{$ctx->{nodeips}->{$node}}) {
|
||||
@ips = keys %{$ctx->{nodeips}->{$node}};
|
||||
}
|
||||
if (!defined($ips[0])) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Unable to find an IP for $node in hosts table or via system lookup (i.e. /etc/hosts)"], $callback);
|
||||
next;
|
||||
@ -1214,7 +1215,7 @@ sub add_or_delete_records {
|
||||
}
|
||||
my $zone;
|
||||
foreach $zone (keys %{$ctx->{updatesbyzone}}) {
|
||||
my $ip = xCAT::NetworkUtils->getipaddr($ctx->{nsmap}->{$zone});
|
||||
my $ip = xCAT::NetworkUtils->getipaddr($ctx->{nsmap}->{$zone});
|
||||
if( !defined $ip) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Please make sure $ctx->{nsmap}->{$zone} exist either in /etc/hosts or DNS."], $callback);
|
||||
return 1;
|
||||
@ -1296,9 +1297,9 @@ sub find_nameserver_for_dns {
|
||||
}
|
||||
|
||||
if (defined $ctx->{aliases}->{$node}) {
|
||||
foreach (keys %{$ctx->{aliases}->{$node}}) {
|
||||
push @rrcontent, "$_ IN CNAME $name";
|
||||
}
|
||||
foreach (keys %{$ctx->{aliases}->{$node}}) {
|
||||
push @rrcontent, "$_ IN CNAME $name";
|
||||
}
|
||||
}
|
||||
if ($ctx->{deletemode}) {
|
||||
push @rrcontent,"$name TXT";
|
||||
@ -1311,7 +1312,7 @@ sub find_nameserver_for_dns {
|
||||
unless (defined $ctx->{nsmap}->{$zone}) { #ok, we already thought about this zone and made a decision
|
||||
if ($zone =~ /^\.*192.IN-ADDR.ARPA\.*/ or $zone =~ /^\.*172.IN-ADDR.ARPA\.*/ or $zone =~ /127.IN-ADDR.ARPA\.*/ or $zone =~ /^\.*IN-ADDR.ARPA\.*/ or $zone =~ /^\.*ARPA\.*/) {
|
||||
$ctx->{nsmap}->{$zone} = 0; #ignore zones that are likely to appear, but probably not ours
|
||||
} elsif ($::XCATSITEVALS{ddnsserver}) {
|
||||
} elsif ($::XCATSITEVALS{ddnsserver}) {
|
||||
$ctx->{nsmap}->{$zone} = $::XCATSITEVALS{ddnsserver};
|
||||
} else {
|
||||
my $reply = $ctx->{resolver}->query($zone,'NS');
|
||||
@ -1392,9 +1393,9 @@ sub get_dns_slave
|
||||
foreach my $sn (@ents)
|
||||
{
|
||||
if ($sn->{'nameserver'} == 2)
|
||||
{
|
||||
{
|
||||
push @sns, $sn->{'node'};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@slaves = xCAT::NodeRange::noderange(join(',',@sns));
|
||||
|
@ -1332,7 +1332,7 @@ sub fpc_firmxfer_watch {
|
||||
return;
|
||||
}
|
||||
my $percent = 0;
|
||||
if ($rsp->{data} and (length(@{$rsp->{data}}) > 0)) {
|
||||
if ($rsp->{data} and (scalar(@{$rsp->{data}}) > 0)) {
|
||||
$percent = $rsp->{data}->[0];
|
||||
}
|
||||
#$callback->({sinfo=>"$percent%"});
|
||||
|
@ -3563,8 +3563,7 @@ sub create_error_response {
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
sub lskit_processargs {
|
||||
|
||||
if ( defined( @{$::args} ) ) {
|
||||
if ( defined ($::args) && @{$::args} ){
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
|
||||
@ -3665,7 +3664,7 @@ sub lskit_processargs {
|
||||
#-----------------------------------------------------------------------------
|
||||
sub lskitcomp_processargs {
|
||||
|
||||
if ( defined( @{$::args} ) ) {
|
||||
if ( defined ($::args) && @{$::args} ){
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
|
||||
@ -3758,7 +3757,7 @@ sub lskitcomp_processargs {
|
||||
#-----------------------------------------------------------------------------
|
||||
sub lskitdeployparam_processargs {
|
||||
|
||||
if ( defined( @{$::args} ) ) {
|
||||
if ( defined ($::args) && @{$::args} ){
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
|
||||
|
@ -192,7 +192,7 @@ sub lskmodules_usage {
|
||||
#-----------------------------------------------------------------------------
|
||||
sub processArgs {
|
||||
|
||||
if ( defined( @{$::args} ) ) {
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
|
||||
|
@ -470,26 +470,7 @@ sub build_diskstruct {
|
||||
my $currdev;
|
||||
my @suffixes=('a','b','d'..'zzz');
|
||||
my $suffidx=0;
|
||||
if ($cdloc) {
|
||||
my $cdhash;
|
||||
$cdhash->{device}='cdrom';
|
||||
if ($cdloc =~ /^\/dev/) {
|
||||
$cdhash->{type}='block';
|
||||
} else {
|
||||
$cdhash->{type}='file';
|
||||
}
|
||||
$cdhash->{source}->{file}=$cdloc;
|
||||
$cdhash->{readonly};
|
||||
$cdhash->{target}->{dev}='hdc';
|
||||
push @returns,$cdhash;
|
||||
} else { #give the VM an empty optical drive, to allow chvm live attach/remove
|
||||
my $cdhash;
|
||||
$cdhash->{device}='cdrom';
|
||||
$cdhash->{type}='file';
|
||||
$cdhash->{readonly};
|
||||
$cdhash->{target}->{dev}='hdc';
|
||||
push @returns,$cdhash;
|
||||
}
|
||||
my $storagemodel = $confdata->{vm}->{$node}->[0]->{storagemodel};
|
||||
my $cachemethod = "none";
|
||||
if ( $confdata->{vm}->{$node}->[0]->{storagecache}) {
|
||||
$cachemethod = $confdata->{vm}->{$node}->[0]->{storagecache};
|
||||
@ -506,7 +487,7 @@ sub build_diskstruct {
|
||||
my $model = $1;
|
||||
unless ($model) {
|
||||
#if not defined, model will stay undefined like above
|
||||
$model = $confdata->{vm}->{$node}->[0]->{storagemodel};
|
||||
$model = $storagemodel;
|
||||
unless ($model) { $model = 'ide'; } #if still not defined, ide
|
||||
}
|
||||
my $prefix='hd';
|
||||
@ -574,6 +555,34 @@ sub build_diskstruct {
|
||||
push @returns,$diskhash;
|
||||
}
|
||||
}
|
||||
my $cdprefix='hd';
|
||||
if ($storagemodel eq 'virtio') {
|
||||
$cdprefix='vd';
|
||||
} elsif ($storagemodel eq 'scsi') {
|
||||
$cdprefix='sd';
|
||||
}
|
||||
$suffidx += 1;
|
||||
if ($cdloc) {
|
||||
my $cdhash;
|
||||
$cdhash->{device}='cdrom';
|
||||
if ($cdloc =~ /^\/dev/) {
|
||||
$cdhash->{type}='block';
|
||||
} else {
|
||||
$cdhash->{type}='file';
|
||||
}
|
||||
$cdhash->{source}->{file}=$cdloc;
|
||||
$cdhash->{readonly};
|
||||
$cdhash->{target}->{dev}=$cdprefix.$suffixes[$suffidx];
|
||||
push @returns,$cdhash;
|
||||
} else { #give the VM an empty optical drive, to allow chvm live attach/remove
|
||||
my $cdhash;
|
||||
$cdhash->{device}='cdrom';
|
||||
$cdhash->{type}='file';
|
||||
$cdhash->{readonly};
|
||||
$cdhash->{target}->{dev}=$cdprefix.$suffixes[$suffidx];
|
||||
push @returns,$cdhash;
|
||||
}
|
||||
|
||||
return \@returns;
|
||||
}
|
||||
sub getNodeUUID {
|
||||
@ -654,10 +663,16 @@ sub build_xmldesc {
|
||||
my %args=@_;
|
||||
my $cdloc=$args{cd};
|
||||
my %xtree=();
|
||||
my $hypcpumodel = $confdata->{$confdata->{vm}->{$node}->[0]->{host}}->{cpumodel};
|
||||
$xtree{type}='kvm';
|
||||
$xtree{name}->{content}=$node;
|
||||
$xtree{uuid}->{content}=getNodeUUID($node);
|
||||
$xtree{os} = build_oshash();
|
||||
if (defined($hypcpumodel) and $hypcpumodel eq "ppc64") {
|
||||
$xtree{os}->{type}->{arch} = "ppc64";
|
||||
$xtree{os}->{type}->{machine} = "pseries";
|
||||
delete $xtree{os}->{bios};
|
||||
}
|
||||
if ($args{memory}) {
|
||||
$xtree{memory}->{content}=getUnits($args{memory},"M",1024);
|
||||
if ($confdata->{vm}->{$node}->[0]->{memory}) {
|
||||
@ -723,8 +738,12 @@ sub build_xmldesc {
|
||||
} else {
|
||||
$xtree{devices}->{graphics}->{password}=genpassword(20);
|
||||
}
|
||||
$xtree{devices}->{sound}->{model}='ac97';
|
||||
|
||||
if (defined($hypcpumodel) and $hypcpumodel eq 'ppc64') {
|
||||
$xtree{devices}->{emulator}->{content} = "/usr/bin/qemu-system-ppc64";
|
||||
} else {
|
||||
$xtree{devices}->{sound}->{model}='ac97';
|
||||
}
|
||||
|
||||
$xtree{devices}->{console}->{type}='pty';
|
||||
$xtree{devices}->{console}->{target}->{port}='1';
|
||||
return XMLout(\%xtree,RootName=>"domain");
|
||||
@ -2988,7 +3007,17 @@ sub dohyp {
|
||||
return 1,"General error establishing libvirt communication";
|
||||
}
|
||||
}
|
||||
if (($command eq 'mkvm' or $command eq 'chvm') and $hypconn) {
|
||||
my $nodeinfo = $hypconn->get_node_info();
|
||||
if (exists($nodeinfo->{model})) {
|
||||
$confdata->{$hyp}->{cpumodel} = $nodeinfo->{model};
|
||||
}
|
||||
}
|
||||
|
||||
foreach $node (sort (keys %{$hyphash{$hyp}->{nodes}})) {
|
||||
if ($confdata->{$hyp}->{cpumodel} and $confdata->{$hyp}->{cpumodel} =~ /ppc64/i) {
|
||||
$confdata->{vm}->{$node}->[0]->{storagemodel} = "scsi";
|
||||
}
|
||||
my ($rc,@output) = guestcmd($hyp,$node,$command,@$args);
|
||||
|
||||
foreach(@output) {
|
||||
|
@ -482,6 +482,8 @@ Usage:
|
||||
$warnstr = "Warning: failed to import some nodes.";
|
||||
setrsp_progress($warnstr);
|
||||
}
|
||||
# setup node provisioning status.
|
||||
xCAT::Utils->runxcmd({command=>["updatenodestat"], node=>\@nodelist, arg=>['defined']}, $request_command, -1, 2);
|
||||
|
||||
setrsp_progress("Configuring nodes...");
|
||||
my $retref = xCAT::Utils->runxcmd({command=>["kitnodeadd"], node=>\@nodelist, sequential=>[1], macflag=>[$mac_addr_mode]}, $request_command, 0, 2);
|
||||
@ -726,9 +728,6 @@ Usage:
|
||||
# Update nodes' attributes
|
||||
foreach (@$nodes) {
|
||||
$updatenodeshash{$_}{'groups'} .= $profile_groups;
|
||||
if ($profile_status){
|
||||
$updatenodeshash{$_}{'status'} = $profile_status;
|
||||
}
|
||||
}
|
||||
|
||||
#update DataBase.
|
||||
@ -737,6 +736,11 @@ Usage:
|
||||
$nodetab->setNodesAttribs(\%updatenodeshash);
|
||||
$nodetab->close();
|
||||
|
||||
#update node's status:
|
||||
if($profile_status eq "defined"){
|
||||
xCAT::Utils->runxcmd({command=>["updatenodestat"], node=>$nodes, arg=>['defined']}, $request_command, -1, 2);
|
||||
}
|
||||
|
||||
my $retref;
|
||||
my $retstrref;
|
||||
# Call update plugins first.
|
||||
@ -1154,17 +1158,7 @@ Usage:
|
||||
|
||||
# Update node's status.
|
||||
setrsp_progress("Updating node status...");
|
||||
my $nodelisttab = xCAT::Table->new('nodelist',-create=>1);
|
||||
my (
|
||||
$sec, $min, $hour, $mday, $mon,
|
||||
$year, $wday, $yday, $isdst
|
||||
) = localtime(time);
|
||||
my $currtime = sprintf("%02d-%02d-%04d %02d:%02d:%02d",
|
||||
$mon + 1, $mday, $year + 1900,
|
||||
$hour, $min, $sec);
|
||||
|
||||
$nodelisttab->setNodeAttribs($hostname, {status=>'defined', statustime=>$currtime});
|
||||
$nodelisttab->close();
|
||||
xCAT::Utils->runxcmd({command=>["updatenodestat"], node=>[$hostname], arg=>['defined']}, $request_command, -1, 2);
|
||||
|
||||
setrsp_progress("Updated MAC address.");
|
||||
}
|
||||
@ -1440,7 +1434,9 @@ Usage:
|
||||
my $mactab = xCAT::Table->new("mac");
|
||||
my $macsref = $mactab->getNodesAttribs(\@nodes, ['mac']);
|
||||
my $nodelisttab = xCAT::Table->new("nodelist");
|
||||
my $statusref = $nodelisttab->getNodesAttribs(\@nodes, ['status']);
|
||||
# Get node current provisioning status.
|
||||
my $provisionapp = "provision";
|
||||
my $provision_status = xCAT::TableUtils->getAppStatus(\@nodes,$provisionapp);
|
||||
|
||||
my $rspentry;
|
||||
my $i = 0;
|
||||
@ -1461,8 +1457,8 @@ Usage:
|
||||
}
|
||||
}
|
||||
|
||||
if ($statusref->{$_}->[0]){
|
||||
$rspentry->{node}->[$i]->{"status"} = $statusref->{$_}->[0]->{status};
|
||||
if ($provision_status->{$_}){
|
||||
$rspentry->{node}->[$i]->{"status"} = $provision_status->{$_};
|
||||
} else{
|
||||
$rspentry->{node}->[$i]->{"status"} = "defined";
|
||||
}
|
||||
@ -1626,6 +1622,8 @@ sub findme{
|
||||
}
|
||||
|
||||
my @nodelist = keys %hostinfo_dict;
|
||||
# setup node provisioning status.
|
||||
xCAT::Utils->runxcmd({command=>["updatenodestat"], node=>\@nodelist, arg=>['defined']}, $request_command, -1, 2);
|
||||
|
||||
# call makehosts to get the IP by resolving the name
|
||||
my $retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>\@nodelist, sequential=>[1]}, $request_command, 0, 2);
|
||||
|
@ -250,7 +250,7 @@ sub runrollupdate_usage {
|
||||
sub processArgs {
|
||||
my $gotattrs = 0;
|
||||
|
||||
if ( defined( @{$::args} ) ) {
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
@ARGV = @{$::args};
|
||||
}
|
||||
else {
|
||||
|
@ -1075,10 +1075,11 @@ sub mkinstall
|
||||
$netserver = $ent->{nfsserver};
|
||||
}
|
||||
|
||||
|
||||
if ($::XCATSITEVALS{managedaddressmode} =~ /static/){
|
||||
my($host,$ip)=xCAT::NetworkUtils->gethostnameandip($netserver);
|
||||
$netserver=$ip;
|
||||
unless($netserver eq '!myipfn!'){
|
||||
my($host,$ip)=xCAT::NetworkUtils->gethostnameandip($netserver);
|
||||
$netserver=$ip;
|
||||
}
|
||||
}
|
||||
|
||||
my $httpprefix = $pkgdir;
|
||||
@ -1149,20 +1150,36 @@ sub mkinstall
|
||||
#to avoid multicast dhcp
|
||||
if($::XCATSITEVALS{managedaddressmode} =~ /static/){
|
||||
my ($ipaddr,$hostname,$gateway,$netmask)=xCAT::NetworkUtils->getNodeNetworkCfg($node);
|
||||
unless($ipaddr) { die "cannot resolve the network configuration of $node"; }
|
||||
|
||||
$kcmdline .=" hostip=$ipaddr netmask=$netmask gateway=$gateway hostname=$hostname ";
|
||||
my $nrtab = xCAT::Table->new('noderes',-create=>0);
|
||||
unless ($nrtab) { die "noderes table should always exist prior to template processing"; }
|
||||
my $ent = $nrtab->getNodeAttribs($node,['nameservers'],prefetchcache=>1);
|
||||
unless ($ent and $ent->{nameservers}) { die "attribute nameservers not set for $node"; }
|
||||
my @nameserverARR=split (",",$ent->{nameservers});
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my ($host,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
push @nameserversIP, $ip;
|
||||
unless($ipaddr) {
|
||||
$callback->(
|
||||
{
|
||||
error => [
|
||||
"cannot resolve the ip address of $node"
|
||||
],
|
||||
errorcode => [1]
|
||||
}
|
||||
);
|
||||
}
|
||||
if($gateway eq '<xcatmaster>'){
|
||||
$gateway = xCAT::NetworkUtils->my_ip_facing($ipaddr);
|
||||
}
|
||||
$kcmdline .=" hostip=$ipaddr netmask=$netmask gateway=$gateway hostname=$hostname ";
|
||||
|
||||
|
||||
my %nameservers=%{xCAT::NetworkUtils->getNodeNameservers([$node])};
|
||||
my @nameserverARR=split (",",$nameservers{$node});
|
||||
my @nameserversIP;
|
||||
foreach (@nameserverARR)
|
||||
{
|
||||
my $ip;
|
||||
if($_ eq '<xcatmaster>'){
|
||||
$ip = xCAT::NetworkUtils->my_ip_facing($gateway);
|
||||
}else{
|
||||
(undef,$ip) = xCAT::NetworkUtils->gethostnameandip($_);
|
||||
}
|
||||
push @nameserversIP, $ip;
|
||||
|
||||
}
|
||||
|
||||
if(scalar @nameserversIP){
|
||||
$kcmdline .=" dns=".join(",",@nameserversIP);
|
||||
|
@ -199,7 +199,7 @@ sub prexcat2nim
|
||||
my @nodelist=(); # pass back list of nodes - if applicable
|
||||
my @servicenodes=(); # pass back list of service nodes - if applicable
|
||||
|
||||
if (defined(@{$::args})) {
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
@ARGV = @{$::args};
|
||||
} else {
|
||||
&xcat2nim_usage($callback);
|
||||
@ -359,7 +359,7 @@ sub processArgs
|
||||
|
||||
my $gotattrs = 0;
|
||||
|
||||
if (defined(@{$::args})) {
|
||||
if ( defined ($::args) && @{$::args} ) {
|
||||
@ARGV = @{$::args};
|
||||
} else {
|
||||
return 3;
|
||||
|
@ -67,7 +67,7 @@ cert_opt = ca_default # Certificate field options
|
||||
|
||||
default_days = 7300 # how long to certify for
|
||||
default_crl_days= 30 # how long before next CRL
|
||||
default_md = sha256 # which md to use.
|
||||
default_md = sha1 # which md to use.
|
||||
preserve = no # keep passed DN ordering
|
||||
|
||||
# A few difference way of specifying how similar the request should look
|
||||
@ -98,7 +98,6 @@ emailAddress = optional
|
||||
|
||||
####################################################################
|
||||
[ req ]
|
||||
default_md = sha256
|
||||
default_bits = 2048
|
||||
default_keyfile = private/ca-key.pem
|
||||
distinguished_name = req_distinguished_name
|
||||
|
@ -27,7 +27,7 @@ rootpw --iscrypted #CRYPT:passwd:key=system,username=root:password#
|
||||
|
||||
#partition / --ondisk=/dev/mapper/ibmpkvm_vg_root-ibmpkvm_lv_root
|
||||
partition / --ondisk=/dev/sda
|
||||
network --device eth0 --bootproto dhcp
|
||||
network --bootproto dhcp
|
||||
|
||||
%post
|
||||
touch "/startpost"
|
||||
|
@ -60,7 +60,7 @@ cd $XCATDIR/ca
|
||||
# - seems to be a problem with the use of the wildcard in the Makefile
|
||||
# - calling cmds directly instead - should be safe
|
||||
# make sign
|
||||
openssl ca -startdate 19600101010101Z -config openssl.cnf -in root.csr -out root.cert
|
||||
openssl ca -startdate 600101010101Z -config openssl.cnf -in root.csr -out root.cert
|
||||
if [ -f root.cert ]; then
|
||||
rm root.csr
|
||||
fi
|
||||
|
@ -33,7 +33,7 @@ cd $XCATDIR/ca
|
||||
# - call cmds directly instead - seems safe
|
||||
# make sign
|
||||
|
||||
openssl ca -startdate 19600101010101Z -config openssl.cnf -in `hostname`.csr -out `hostname`.cert -extensions server
|
||||
openssl ca -startdate 600101010101Z -config openssl.cnf -in `hostname`.csr -out `hostname`.cert -extensions server
|
||||
if [ -f `hostname`.cert ]; then
|
||||
rm `hostname`.csr
|
||||
fi
|
||||
|
@ -34,5 +34,5 @@ make init
|
||||
openssl genrsa -out private/ca-key.pem 2048
|
||||
chmod 600 private/ca-key.pem
|
||||
openssl req -new -key private/ca-key.pem -config openssl.cnf -out ca-req.csr -subj /CN="$CNA" -outform PEM
|
||||
openssl ca -selfsign -keyfile private/ca-key.pem -in ca-req.csr -startdate 19700101010101Z -days 7305 -extensions v3_ca -config openssl.cnf -out ca-cert.pem
|
||||
openssl ca -selfsign -keyfile private/ca-key.pem -in ca-req.csr -startdate 700101010101Z -days 7305 -extensions v3_ca -config openssl.cnf -out ca-cert.pem
|
||||
cd -
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -27,11 +27,10 @@ AutoReqProv: no
|
||||
BuildArch: noarch
|
||||
Requires: perl-IO-Socket-SSL perl-XML-Simple perl-XML-Parser
|
||||
Obsoletes: atftp-xcat
|
||||
%endif
|
||||
|
||||
%if %notpcm
|
||||
Requires: grub2-xcat
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%if %fsm
|
||||
# nothing needed here
|
||||
|
@ -1,135 +1,197 @@
|
||||
#!/bin/bash
|
||||
# IBM(c) 2014 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
#! /bin/sh
|
||||
|
||||
# Test driver for xcatws.cgi, pass 3 arguments to it: user, password, noderange
|
||||
# This test driver will create to dummy nodes, wstest1 and wstest2, so make sure those
|
||||
# names don't conflict with your nodes on this MN.
|
||||
# You also have to pass in a noderange of 2 real system x nodes that can be used
|
||||
# to test some of the r cmds, xdsh, xdcp, nodestat.
|
||||
|
||||
user=$1
|
||||
pw=$2
|
||||
nr=$3
|
||||
if [ -z "$3" ]; then
|
||||
echo "Usage: chkrc <user> <pw> <noderange>"
|
||||
exit
|
||||
fi
|
||||
# Get all the parameters
|
||||
for i in $@
|
||||
do
|
||||
if [ "$paramname" = "USER" ]; then
|
||||
USER=$i
|
||||
paramname=
|
||||
fi
|
||||
if [ "$paramname" = "PW" ]; then
|
||||
PW=$i
|
||||
paramname=
|
||||
fi
|
||||
if [ "$paramname" = "HOST" ]; then
|
||||
HOST=$i
|
||||
paramname=
|
||||
fi
|
||||
|
||||
format='format=json&pretty=1'
|
||||
ctype='-H Content-Type:application/json'
|
||||
if [ $i = '-u' ]; then
|
||||
paramname=USER
|
||||
fi
|
||||
if [ $i = '-p' ]; then
|
||||
paramname=PW
|
||||
fi
|
||||
if [ $i = '-h' ]; then
|
||||
paramname=HOST
|
||||
fi
|
||||
if [ $i = '-c' ]; then
|
||||
cert=yes
|
||||
fi
|
||||
if [ $i = '-t' ]; then
|
||||
token=yes
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
function chkrc
|
||||
{
|
||||
rc=$?
|
||||
{ set +x; } 2>/dev/null
|
||||
if [[ $1 == "not" ]]; then
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
echo "Test failed!"
|
||||
exit
|
||||
fi
|
||||
else
|
||||
if [[ $rc -gt 0 ]]; then
|
||||
echo "Test failed!"
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
echo ''
|
||||
set -x
|
||||
# display the usage message
|
||||
function usage {
|
||||
echo "Usage:"
|
||||
echo " xcatws-test.sh -u <USER> -p <pw> [-t]"
|
||||
echo " xcatws-test.sh -u <USER> -p <pw> -h <FQDN - Full hostname of server> [-c] [-t]"
|
||||
echo " -u The username of xCAT user which is used to access xCAT resource"
|
||||
echo " -p The password of username"
|
||||
echo " <FQDN of xCAT MN> The fully qualified hostname of xCAT management node. It can be an IP if using -k."
|
||||
echo " -c Check the server identity. The server certificate authentication must be enabled."
|
||||
echo " -t Using token authentication method."
|
||||
}
|
||||
|
||||
# pcregrep -M 'abc.*(\n|.)*efg' test.txt
|
||||
if [ "$USER" = "" ] || [ "$PW" = "" ]; then
|
||||
echo "Error: Miss username or password"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#todo: add a test case for every api call that is documented
|
||||
set -x
|
||||
# clean up from last time
|
||||
curl -# -X DELETE -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw" >/dev/null; echo ''
|
||||
if [ "$cert" = "yes" ] && [ "$HOST" = "" ]; then
|
||||
echo "Error: -c must be used with -h that user needs specify the FQDN of xCAT MN"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# create test nodes
|
||||
curl -# -X POST -k "https://127.0.0.1/xcatws/node/wstest1-wstest2?userName=$user&password=$pw&$format" $ctype --data '{"groups":"wstest","netboot":"xnba"}' \
|
||||
| grep -q '2 object definitions have been created'; chkrc
|
||||
|
||||
# list all nodes and make sure they are in the list
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node?userName=$user&password=$pw&$format" \
|
||||
| pcregrep -qM '"wstest1",\n\s*"wstest2"'; chkrc
|
||||
|
||||
# list all node's group and netboot attributes
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node?userName=$user&password=$pw&field=groups&field=netboot" \
|
||||
| grep -qE '"nodename":"wstest1".*"groups":"wstest"'; chkrc
|
||||
|
||||
# list all attributes of all nodes
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node?userName=$user&password=$pw&field=ALL" \
|
||||
| grep -qE '"nodename":"wstest1".*"groups":"wstest"'; chkrc
|
||||
|
||||
# list the noderange and make sure they are in the list
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&$format" \
|
||||
| pcregrep -qM '"wstest1",\n\s*"wstest2"'; chkrc
|
||||
|
||||
# list all node's group and netboot attributes
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&field=groups&field=netboot" \
|
||||
| grep -qE '"nodename":"wstest1".*"groups":"wstest"'; chkrc
|
||||
|
||||
# list all attributes of all nodes
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&field=ALL" \
|
||||
| grep -qE '"nodename":"wstest1".*"groups":"wstest"'; chkrc
|
||||
|
||||
# change some attributes
|
||||
curl -# -X PUT -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&$format" $ctype --data '{"room":"222","netboot":"pxe"}' \
|
||||
| grep -q '2 object definitions have been created or modified'; chkrc
|
||||
|
||||
# verify they got the new values
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&field=room&field=netboot" \
|
||||
| grep -qE '"nodename":"wstest1".*"room":"222"'; chkrc
|
||||
|
||||
# delete the nodes
|
||||
curl -# -X DELETE -k "https://127.0.0.1/xcatws/node/wstest?userName=$user&password=$pw&$format" \
|
||||
| grep -q '2 object definitions have been removed'; chkrc
|
||||
|
||||
# list all nodes and make sure they are not in the list
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node?userName=$user&password=$pw&$format" \
|
||||
| pcregrep -qM '"wstest1",\n\s*"wstest2"'; chkrc not
|
||||
|
||||
# list the power state of the noderange
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/$nr/power?userName=$user&password=$pw&$format" \
|
||||
| grep -q '"power":"on"'; chkrc
|
||||
|
||||
# list the nodestat state of the noderange
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/$nr/status?userName=$user&password=$pw&$format" \
|
||||
| grep -q '":"sshd"'; chkrc
|
||||
|
||||
# list the node inventory of the noderange
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/$nr/inventory?userName=$user&password=$pw&$format" \
|
||||
| grep -q '"Board manufacturer":"IBM"'; chkrc
|
||||
|
||||
# list the node vitals of the noderange
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/$nr/vitals?userName=$user&password=$pw&$format" \
|
||||
| grep -q '"Cooling Fault":"false"'; chkrc
|
||||
|
||||
# list the node energy settings of the noderange
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/node/$nr/energy?userName=$user&password=$pw&$format&field=cappingstatus&field=cappingmaxmin" \
|
||||
| grep -q '"cappingstatus":"off"'; chkrc
|
||||
|
||||
# run a cmd on the noderange
|
||||
curl -# -X POST -k "https://127.0.0.1/xcatws/node/$nr/dsh?userName=$user&password=$pw&$format" $ctype --data '{"command":"pwd"}' \
|
||||
| grep -q '"/root"'; chkrc
|
||||
|
||||
# copy a file to the noderange
|
||||
curl -# -X POST -k "https://127.0.0.1/xcatws/node/$nr/dcp?userName=$user&password=$pw&$format" $ctype --data '{"source":"/root/.bashrc","target":"/tmp/"}' \
|
||||
| grep -q '"errorcode":"0"'; chkrc
|
||||
|
||||
# test the table calls
|
||||
curl -# -X GET -k "https://127.0.0.1/xcatws/table/nodelist/wstest?userName=$user&password=$pw&$format"
|
||||
if [ "$HOST" = "" ]; then
|
||||
HOST="127.0.0.1"
|
||||
fi
|
||||
|
||||
|
||||
exit
|
||||
ctype='-H Content-Type:application/json'
|
||||
|
||||
# Perform the REST API request
|
||||
function REST {
|
||||
METHOD=$1 # it should be GET/PUT/POST/DELETE
|
||||
SRC=$2 # The resource path like /nodes/node1
|
||||
DATA=$3 # The operation data for PUT/POST/DELETE
|
||||
if [ "$DATA" != "" ]; then
|
||||
datamsg="$ctype -d $DATA"
|
||||
fi
|
||||
if [ "$cert" = "yes" ]; then
|
||||
if [ "$token" = "yes" ]; then
|
||||
CMD="curl -X $METHOD --cacert /tmp/ca-cert.pem -H X-Auth-Token:$TOKENID $datamsg https://$HOST/xcatws$SRC?pretty=1"
|
||||
else
|
||||
CMD="curl -X $METHOD --cacert /tmp/ca-cert.pem $datamsg https://$HOST/xcatws$SRC?pretty=1&userName=$USER&password=$PW"
|
||||
fi
|
||||
else
|
||||
if [ "$token" = "yes" ]; then
|
||||
CMD="curl -X $METHOD -k -H X-Auth-Token:$TOKENID $datamsg https://$HOST/xcatws$SRC?pretty=1"
|
||||
else
|
||||
CMD="curl -X $METHOD -k $datamsg https://$HOST/xcatws$SRC?pretty=1&userName=$USER&password=$PW"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "-------------------------------------------------------------------------------"
|
||||
echo "Run: [$RESTMSG]"
|
||||
echo " $CMD"
|
||||
echo "Output:"
|
||||
`$CMD 2>/dev/null >/tmp/xcatws-test.log`
|
||||
cat "/tmp/xcatws-test.log"
|
||||
echo ""
|
||||
|
||||
ERROR=`grep "errorcode" "/tmp/xcatws-test.log"`
|
||||
if [ "$ERROR" != "" ]; then
|
||||
echo "FAILED to continue. See the error message in 'error' section."
|
||||
echo ""
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
function PUT {
|
||||
SRC=$1
|
||||
}
|
||||
|
||||
# echo debug message
|
||||
echo "***********************************************************"
|
||||
echo "** Username: $USER"
|
||||
echo "** Password: $PW"
|
||||
echo "** Hostname: $HOST"
|
||||
|
||||
|
||||
#curl -X GET -k "https://127.0.0.1/xcatws/groups?userName=$user&password=$pw&$format"
|
||||
# get the CA of server certificate
|
||||
if [ "$cert" = "yes" ]; then
|
||||
rm -f /tmp/ca-cert.pem
|
||||
cd /tmp
|
||||
wget http://$HOST/install/postscripts/ca/ca-cert.pem 2>1 1>/dev/null
|
||||
echo "** Using CA /tmp/ca-cert.pem for server certificate checking"
|
||||
fi
|
||||
|
||||
#curl -X GET -k "https://127.0.0.1/xcatws/images?userName=$user&password=$pw&$format"
|
||||
#curl -X GET -k "https://127.0.0.1/xcatws/images?userName=$user&password=$pw&$format&field=osvers"
|
||||
#curl -X GET -k "https://127.0.0.1/xcatws/images/bp-netboot?userName=$user&password=$pw&$format"
|
||||
#curl -X GET -k "https://127.0.0.1/xcatws/images/bp-netboot?userName=$user&password=$pw&$format&field=osvers"
|
||||
# get a token
|
||||
if [ "$token" = "yes" ]; then
|
||||
TOKENID=$(curl -X POST -k "https://$HOST/xcatws/tokens?pretty=1" -H Content-Type:application/json --data "{\"userName\":\"$USER\",\"password\":\"$PW\"}" 2>/dev/null | grep '"id"' | awk -F: {'print $2'} | awk -F \" {'print $2'})
|
||||
echo "** Using Token: $TOKENID to authenticate"
|
||||
fi
|
||||
|
||||
echo "***********************************************************"
|
||||
echo ""
|
||||
|
||||
# clean the env
|
||||
rmdef -t node restapinode[1-9] 1>/dev/null 2>1
|
||||
rmdef -t group restapi 1>/dev/null 2>1
|
||||
|
||||
# get all resources
|
||||
RESTMSG="Get all available resource"
|
||||
REST GET "/"
|
||||
|
||||
# test global conf
|
||||
RESTMSG="Get all global configuration resource"
|
||||
REST GET "/globalconf"
|
||||
|
||||
RESTMSG="Change the global configuration domain to cluster.com"
|
||||
REST PUT "/globalconf/attrs/domain" '{"domain":"cluster.com"}'
|
||||
|
||||
RESTMSG="Get the global configuration domain"
|
||||
REST GET "/globalconf/attrs/domain"
|
||||
|
||||
# test node create/change/list/delete
|
||||
RESTMSG="Create node restapinode1"
|
||||
REST POST "/nodes/restapinode1" '{"groups":"restapi","arch":"x86_64","mgt":"ipmi","netboot":"xnba"}'
|
||||
|
||||
RESTMSG="Display the node restapinode1"
|
||||
REST GET "/nodes/restapinode1"
|
||||
|
||||
RESTMSG="Change the attributes for node restapinode1"
|
||||
REST PUT "/nodes/restapinode1" '{"mgt":"fsp","netboot":"yaboot"}'
|
||||
|
||||
RESTMSG="Display the node restapinode1"
|
||||
REST GET "/nodes/restapinode1"
|
||||
|
||||
RESTMSG="Delete node restapinode1"
|
||||
REST DELETE "/nodes/restapinode1"
|
||||
|
||||
# test multiple nodes manipulation
|
||||
RESTMSG="Create node restapinode1 and restapinode2"
|
||||
REST POST "/nodes/restapinode1,restapinode2" '{"groups":"restapi","arch":"x86_64","mgt":"ipmi","netboot":"xnba"}'
|
||||
|
||||
RESTMSG="Display the node restapinode1 and restapinode2"
|
||||
REST GET "/nodes/restapinode1,restapinode2"
|
||||
|
||||
RESTMSG="Change the attributes for node restapinode1 and restapinode2"
|
||||
REST PUT "/nodes/restapinode1,restapinode2" '{"mgt":"hmc","netboot":"grub2"}'
|
||||
|
||||
RESTMSG="Display the node restapinode1 and restapinode2"
|
||||
REST GET "/nodes/restapinode1,restapinode2"
|
||||
|
||||
RESTMSG="Display all the nodes in the cluster"
|
||||
REST GET "/nodes"
|
||||
|
||||
# test group
|
||||
RESTMSG="Display the group restapi"
|
||||
REST GET "/groups/restapi"
|
||||
|
||||
RESTMSG="Change attributes for group restapi"
|
||||
REST PUT "/groups/restapi" '{"os":"rh7"}'
|
||||
|
||||
RESTMSG="Display the group restapi"
|
||||
REST GET "/groups/restapi"
|
||||
|
||||
RESTMSG="Display the nodes in group restapi"
|
||||
REST GET "/nodes/restapi"
|
||||
|
||||
#todo: remove when these test cases are in xcatws-test.pl
|
||||
#./xcatws-test.pl -u "https://127.0.0.1/xcatws/node/test001?userName=$user&password=$pw" -m GET
|
||||
#./xcatws-test.pl -u "https://127.0.0.1/xcatws/node/test001?userName=$user&password=$pw" -m PUT "nodepos.room=foo"
|
||||
|
@ -25,7 +25,7 @@ cmd:copycds $$ISO
|
||||
check:rc==0
|
||||
cmd:genimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute
|
||||
check:rc==0
|
||||
cmd:packimage -o __GETNODEATTR($$CN,os)__ -p compute -a __GETNODEATTR($$CN,arch)__
|
||||
cmd:packimage __GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute
|
||||
check:rc==0
|
||||
cmd:nodeset $$CN osimage=__GETNODEATTR($$CN,os)__-__GETNODEATTR($$CN,arch)__-netboot-compute
|
||||
check:rc==0
|
||||
|
Loading…
x
Reference in New Issue
Block a user