updates to dhcp.pm and makedhcp man page for makedhcp query

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@16303 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
jwsimpson 2013-05-15 20:36:34 +00:00
parent 688aec431a
commit 322fde4ed9
2 changed files with 208 additions and 28 deletions

View File

@ -14,6 +14,8 @@ B<makedhcp> B<-d> I<noderange> [B<-l>|B<--localonly>]
B<makedhcp> I<noderange> [B<-s> I<statements>] [B<-l>|B<--localonly>]
B<makedhcp> B<-q> I<noderange>
B<makedhcp> [I<-h|--help>]
=head1 DESCRIPTION
@ -87,6 +89,10 @@ Delete all node entries, that were added by xCAT, from the DHCP server configura
Configure dhcpd on the local machine only. Without this option, makedhcp will also send this
operation to any service nodes that service the nodes in the noderange.
=item B<-q> I<noderange>
Query the node entries from the DHCP server configuration. On AIX, any entries created by NIM will not be listed.
=item B<-h|--help>
Display usage message.
@ -123,6 +129,13 @@ Will cause dhcp on the next request to set root-path appropriately for only node
makedhcp node5 -s 'option root-path \"172.16.0.1:/install/freebsd6.2/x86_64\";'
=item 4.
Query a node from the DHCP server.
# makedhcp -q node01
node01: ip-address = 91.214.34.156, hardware-address = 00:00:c9:c6:6c:42
=back
=head1 FILES

View File

@ -7,6 +7,7 @@ BEGIN
use lib "$::XCATROOT/lib/perl";
use strict;
use IPC::Open2;
use xCAT::Table;
use Data::Dumper;
use MIME::Base64;
@ -120,6 +121,122 @@ sub handled_commands
return {makedhcp => "dhcp",};
}
sub listnode
{
my $node = shift;
my $callback = shift;
my $lines;
my $ipaddr = "";
my $hwaddr;
my $nname;
my $rsp;
my ($OMOUT,$OMIN,$OMOUT6,$OMIN6);
my $usingipv6;
my $omapiuser;
my $omapikey;
# Collect the omapi user and key from the passwd table
my $pwtab = xCAT::Table->new("passwd");
my @pws = $pwtab->getAllAttribs('key','username','password','cryptmethod','authdomain','comments','disable');
foreach (@pws) {
if ($_->{key} =~ "omapi") { #omapi key
$omapiuser = $_->{username};
$omapikey = $_->{password};
}
}
# Look through the networks table for networks with IPv6 format for address
my $nettab = xCAT::Table->new("networks");
my @vnets = $nettab->getAllAttribs('net','mgtifname','mask','dynamicrange','nameservers','ddnsdomain', 'domain');
foreach (@vnets) {
if ($_->{net} =~ /:/) { #IPv6 detected
$usingipv6=1;
}
}
# open ipv4 omshell file handles
open2($OMOUT,$OMIN,"/usr/bin/omshell ");
print $OMIN "key "
. $omapiuser . " \""
. $omapikey . "\"\n";
print $OMIN "connect\n";
print $OMIN "new host\n";
print $OMIN "set name = \"$node\"\n";
print $OMIN "open\n";
print $OMIN "close\n";
close ($OMIN);
my $name = 0;
while (<$OMOUT>) { # now read the output of sort(1)
chomp $_;
if ($_ =~ $node) {
if ($name) {
$nname = $_;
$nname =~ s/name = //;
$nname =~ s/"//g;
}
$name =1;
}
if ($_ =~ 'hardware-address') {
$hwaddr = $_;
}
elsif ($_ =~ 'ip-address') {
my ($ipname,$ip) = split /= /,$_;
chomp($ip);
my ($p1, $p2, $p3, $p4) = split(/\:/, $ip);
my $dp1 = hex($p1);
my $dp2 = hex($p2);
my $dp3 = hex($p3);
my $dp4 = hex($p4);
$ipaddr = "ip-address = $dp1.$dp2.$dp3.$dp4";
}
}
if ($ipaddr) {
push @{$rsp->{data}}, "$nname: $ipaddr, $hwaddr";
xCAT::MsgUtils->message("I", $rsp, $callback);
}
close ($OMOUT);
if ($usingipv6) {
open2($OMOUT6,$OMIN6,"/usr/bin/omshell ");
print $OMOUT6 "port 7912\n";
print $OMOUT6 "connect\n";
print $OMIN6 "key "
. $omapiuser . " \""
. $omapikey . "\"\n";
print $OMIN6 "connect\n";
print $OMIN6 "new host\n";
print $OMIN6 "set name = \"$node\"\n";
print $OMIN6 "open\n";
print $OMIN6 "close\n";
close ($OMIN6);
$name = 0;
$ipaddr = "";
while (<$OMOUT6>) { # now read the output of sort(1)
chomp $_;
if ($_ =~ $node) {
if ($name) {
$nname = $_;
$nname =~ s/name = //;
$nname =~ s/"//g;
}
$name =1;
}
if ($_ =~ 'hardware-address') {
$hwaddr = $_;
}
elsif ($_ =~ 'ip-address') {
my ($ipname,$ipaddr) = split /= /,$_;
chomp($ipaddr);
}
}
if ($ipaddr) {
push @{$rsp->{data}}, "$nname: $ipaddr, $hwaddr";
xCAT::MsgUtils->message("I", $rsp, $callback);
}
close ($OMOUT6);
}
}
sub delnode
{
my $node = shift;
@ -695,46 +812,88 @@ sub delnode_aix
sub preprocess_request
{
my $req = shift;
$callback = shift;
my $callback = shift;
my $rc = 0;
my $localonly;
#Exit if the packet has been preprocessed
Getopt::Long::Configure("bundling");
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure("no_pass_through");
# Exit if the packet has been preprocessed
if ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; }
if (ref $req->{arg}) {
@ARGV = @{$req->{arg}};
GetOptions('l' => \$localonly);
# Save the arguements in ARGV for GetOptions
if ($req && $req->{arg}) { @ARGV = @{$req->{arg}}; }
else { @ARGV = (); }
# define usage statement
my $usage="Usage: makedhcp -n\n\tmakedhcp -a\n\tmakedhcp -a -d\n\tmakedhcp -d noderange\n\tmakedhcp <noderange> [-s statements]\n\tmakedhcp -q\n\tmakedhcp [-h|--help]";
# Parse the options for makedhcp
if (!GetOptions(
'h|help' => \$::opt_h,
'a' => \$::opt_a,
'd' => \$::opt_d,
'l|localonly' => \$localonly,
'n' => \$::opt_n,
'r' => \$::opt_r,
's' => \$::opt_r,
'q' => \$::opt_q
))
{
# If the arguements do not pass GetOptions then issue error message and return
my $rsp = {};
$rsp->{data}->[0] = $usage;
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
return 1;
}
if(grep /-h/,@{$req->{arg}}) {
my $usage="Usage: makedhcp -n\n\tmakedhcp -a\n\tmakedhcp -a -d\n\tmakedhcp -d noderange\n\tmakedhcp <noderange> [-s statements]\n\tmakedhcp [-h|--help]";
$callback->({data => [$usage]});
return;
}
# display the usage if -h
if ($::opt_h)
{
my $rsp = {};
$rsp->{data}->[0] = $usage;
xCAT::MsgUtils->message("I", $rsp, $callback, 1);
return 0;
}
# check to see if -q is listed with any other options which is not allowed
if ($::opt_q and ($::opt_a || $::opt_d || $::opt_n || $::opt_r || $::opt_l || $::opt_s)) {
my $rsp = {};
$rsp->{data}->[0] = "The -q option cannot be used with other options.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
return 1;
}
unless (($req->{arg} and (@{$req->{arg}}>0)) or $req->{node})
{
my $usage="Usage: makedhcp -n\n\tmakedhcp -a\n\tmakedhcp -a -d\n\tmakedhcp -d noderange\n\tmakedhcp <noderange> [-s statements]\n\tmakedhcp [-h|--help]";
$callback->({data => [$usage]});
my $rsp = {};
$rsp->{data}->[0] = $usage;
xCAT::MsgUtils->message("I", $rsp, $callback, 1);
return;
}
my $snonly=0;
my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps");
my $t_entry = $entries[0];
if (defined($t_entry)) {
$snonly=$t_entry;
}
my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps");
my $t_entry = $entries[0];
if (defined($t_entry)) {
$snonly=$t_entry;
}
my @requests=();
my $hasHierarchy=0;
my @nodes=();
if (! grep /-n/,@{$req->{arg}}) {
# if the network option is specified
if (!$::opt_n) {
if ($req->{node}) {
@nodes=@{$req->{node}};
}
elsif(grep /-a/,@{$req->{arg}}) {
if (grep /-d$/, @{$req->{arg}})
# if option all
elsif($::opt_a) {
# if option delete - Delete all node entries, that were added by xCAT, from the DHCP server configuration.
if ($::opt_d)
{
my $nodelist = xCAT::Table->new('nodelist');
my @entries = ($nodelist->getAllNodeAttribs([qw(node)]));
@ -743,6 +902,7 @@ sub preprocess_request
push @nodes, $_->{node};
}
}
# Delete not specified so only add - Define all nodes to the DHCP server
else
{
my $mactab = xCAT::Table->new('mac');
@ -787,8 +947,7 @@ sub preprocess_request
}
}
if (($snonly == 1) && (! grep /-n/,@{$req->{arg}})) {
if (($snonly == 1) && (!$::opt_n)) {
if (@nodes > 0) {
my $sn_hash =xCAT::ServiceNodeUtils->getSNformattedhash(\@nodes,"xcat","MN");
if ($localonly) {
@ -818,7 +977,7 @@ sub preprocess_request
}
}
}
} elsif (@nodes > 0 or grep /-n/,@{$req->{arg}}) { #send the request to every dhservers
} elsif (@nodes > 0 or $::opt_n) { #send the request to every dhservers
$req->{'node'}=\@nodes;
@requests = ({%$req}); #Start with a straight copy to reflect local instance
unless ($localonly) {
@ -863,7 +1022,15 @@ sub process_request
$restartdhcp=0;
my $req = shift;
$callback = shift;
my $rsp;
#print Dumper($req);
if ($::opt_q)
{
foreach my $node ( @{$req->{node}} ) {
listnode($node,$callback);
}
return;
}
#if current node is a servicenode, make sure that it is also a dhcpserver
my $isok=1;
@ -985,7 +1152,7 @@ sub process_request
open($dhcplockfd,">","/tmp/xcat/dhcplock");
flock($dhcplockfd,LOCK_EX);
if ($::XCATSITEVALS{externaldhcpservers}) { #do nothing if remote dhcpservers at this point
} elsif (grep /^-n$/, @{$req->{arg}})
} elsif ($::opt_n)
{
if (-e $dhcpconffile)
{
@ -1268,9 +1435,9 @@ sub process_request
$req->{node} = \@validnodes;
}
if ((!$req->{node}) && (grep /^-a$/, @{$req->{arg}}))
if ((!$req->{node}) && ($::opt_a))
{
if (grep /-d$/, @{$req->{arg}}) #delete all entries
if ($::opt_d) #delete all entries
{
$req->{node} = [];
my $nodelist = xCAT::Table->new('nodelist');
@ -1431,7 +1598,7 @@ sub process_request
$vpdhash = $vpdtab->getNodesAttribs($req->{node},['uuid']);
foreach (@{$req->{node}})
{
if (grep /^-d$/, @{$req->{arg}})
if ($::opt_d)
{
if ( $^O eq 'aix')
{