fixing bug 3815: don't use global variables which doest work well in hierarchy system.

This commit is contained in:
wanghuaz 2013-12-30 10:56:57 +08:00
parent 2e1d048dee
commit 9403878ade

View File

@ -9,7 +9,7 @@ use lib "$::XCATROOT/lib/perl";
use strict;
use IPC::Open2;
use xCAT::Table;
use Data::Dumper;
#use Data::Dumper;
use MIME::Base64;
use Getopt::Long;
Getopt::Long::Configure("bundling");
@ -66,6 +66,10 @@ if ( $^O ne 'aix' and -d "/etc/dhcp" ) {
}
my $usingipv6;
# 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]";
# is this ubuntu ?
if ( $distro =~ /ubuntu.*/ ){
if (-e '/etc/dhcp/') {
@ -861,45 +865,16 @@ sub delnode_aix
sub check_options
{
my $req = shift;
my $opt = shift;
my $callback = shift;
my $rc = 0;
Getopt::Long::Configure("bundling");
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure("no_pass_through");
# Exit if the packet has been preprocessed
# Comment this line to make sure check_options can be processed on service node.
#if ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; }
# 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=s' => \$statements, # $statements is declared globally
'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 ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; }
# display the usage if -h
if ($::opt_h)
if ($opt->{h})
{
my $rsp = {};
$rsp->{data}->[0] = $usage;
@ -908,7 +883,7 @@ sub check_options
}
# 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 || $statements)) {
if ($opt->{q} and ($opt->{a} || $opt->{d} || $opt->{n} || $opt->{r} || $opt->{l} || $statements)) {
my $rsp = {};
$rsp->{data}->[0] = "The -q option cannot be used with other options.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
@ -916,7 +891,7 @@ sub check_options
}
# check to see if -n is listed with any other options which is not allowed
if ($::opt_n and ($::opt_a || $::opt_d || $::opt_q || $::opt_r || $::opt_l || $statements)) {
if ($opt->{n} and ($opt->{a} || $opt->{d} || $opt->{q} || $opt->{r} || $opt->{l} || $statements)) {
my $rsp = {};
$rsp->{data}->[0] = "The -n option cannot be used with other options.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
@ -944,12 +919,44 @@ sub preprocess_request
my $callback = shift;
my $rc = 0;
# check the syntax
$rc = check_options($req,$callback);
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]; }
# Save the arguements in ARGV for GetOptions
if ($req && $req->{arg}) { @ARGV = @{$req->{arg}}; }
else { @ARGV = (); }
my %opt;
# 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=s' => \$statements, # $statements is declared globally
'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;
}
# check the syntax
$rc = check_options($req, \%opt,$callback);
if ( $rc ) {
return [];
}
my $snonly=0;
my @entries = xCAT::TableUtils->get_site_attribute("disjointdhcps");
my $t_entry = $entries[0];
@ -961,15 +968,15 @@ sub preprocess_request
my @nodes=();
# if the new option is not specified
if (!$::opt_n) {
if (!$opt{n}) {
# save the node names specified
if ($req->{node}) {
@nodes=@{$req->{node}};
}
# if option all
elsif($::opt_a) {
elsif($opt{a}) {
# if option delete - Delete all node entries, that were added by xCAT, from the DHCP server configuration.
if ($::opt_d)
if ($opt{d})
{
my $nodelist = xCAT::Table->new('nodelist');
my @entries = ($nodelist->getAllNodeAttribs([qw(node)]));
@ -1027,7 +1034,7 @@ sub preprocess_request
}
# If service node and not -n option
if (($snonly == 1) && (!$::opt_n)) {
if (($snonly == 1) && (!$opt{n})) {
# if a list of nodes are specified
if (@nodes > 0) {
# get the hash of service nodes
@ -1066,7 +1073,7 @@ sub preprocess_request
# if new specified or there are nodes
} # end if service node only and NOT -n option
# if -n option or nodes were specified
elsif (@nodes > 0 or $::opt_n) { #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
# if not localonly - get list of service nodes and create requests
@ -1120,17 +1127,47 @@ sub process_request
my $rsp;
#print Dumper($req);
Getopt::Long::Configure("bundling");
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure("no_pass_through");
# Save the arguements in ARGV for GetOptions
if ($req && $req->{arg}) { @ARGV = @{$req->{arg}}; }
else { @ARGV = (); }
my %opt;
# 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=s' => \$statements, # $statements is declared globally
'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;
}
# Check options again in case we are called from plugin and options have not been processed
my $rc = 0;
$rc = check_options($req, \%opt,$callback);
$rc = check_options($req,$callback);
if ( $rc ) {
return [];
}
# if option is query then call listnode for each node and return
if ($::opt_q)
if ($opt{q})
{
# call listnode for each node requested
foreach my $node ( @{$req->{node}} ) {
@ -1259,7 +1296,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 ($::opt_n)
} elsif ($opt{n})
{
if (-e $dhcpconffile)
{
@ -1553,9 +1590,9 @@ sub process_request
$req->{node} = \@validnodes;
}
if ((!$req->{node}) && ($::opt_a))
if ((!$req->{node}) && ($opt{a}))
{
if ($::opt_d) #delete all entries
if ($opt{d}) #delete all entries
{
$req->{node} = [];
my $nodelist = xCAT::Table->new('nodelist');
@ -1712,7 +1749,7 @@ sub process_request
$vpdhash = $vpdtab->getNodesAttribs($req->{node},['uuid']);
foreach (@{$req->{node}})
{
if ($::opt_d)
if ($opt{d})
{
if ( $^O eq 'aix')
{