mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-08-22 03:00:26 +00:00
Merge pull request #2425 from chenglch/regular
Make nics attribute inhertable
This commit is contained in:
@@ -424,7 +424,6 @@ sub getobjdefs
|
||||
|
||||
# get the key to look for, for this object type
|
||||
my $objkey = $datatype->{'objkey'};
|
||||
|
||||
# go through the list of valid attrs
|
||||
foreach my $this_attr (@{ $datatype->{'attrs'} }) {
|
||||
my $ent;
|
||||
@@ -487,7 +486,6 @@ sub getobjdefs
|
||||
my $intabhash = 0;
|
||||
my $notsearched = 0;
|
||||
foreach my $lookup_attr (keys %{ $tabentry{'lookup_attrs'} }) {
|
||||
|
||||
# Check whether the attribute is already in %tabhash
|
||||
# The %tabhash is for performance considerations
|
||||
if (($lookup_attr eq 'node') && ($objtype eq 'node')) {
|
||||
@@ -513,7 +511,6 @@ sub getobjdefs
|
||||
# Not in tabhash,
|
||||
# Need to lookup the table
|
||||
if ($intabhash == 0 && $notsearched == 1) {
|
||||
|
||||
# look up attr values
|
||||
my @rows = xCAT::DBobjUtils->getDBtable($lookup_table);
|
||||
if (@rows) {
|
||||
@@ -2502,6 +2499,7 @@ sub judge_node
|
||||
|
||||
Arguments:
|
||||
nicsattr value, like niccsips=eth0!1.1.1.1|2.1.1.1,eth1!3.1.1.1|4.1.1.1
|
||||
node name, like frame10node10
|
||||
nicnames: only return the value for specific nics, like "eth0,eth1"
|
||||
Returns:
|
||||
expanded format, like:
|
||||
@@ -2524,8 +2522,8 @@ sub expandnicsattr()
|
||||
if (($nicstr) && ($nicstr =~ /xCAT::/)) {
|
||||
$nicstr = shift;
|
||||
}
|
||||
my $node = shift;
|
||||
my $nicnames = shift;
|
||||
|
||||
my $ret;
|
||||
|
||||
$nicstr =~ /^(.*?)=(.*?)$/;
|
||||
@@ -2547,7 +2545,6 @@ sub expandnicsattr()
|
||||
#$nicval Value: node(d+)|eth0!192.1.1.($1+10)
|
||||
if (($nicval) && ($nicval =~ /\|/)) {
|
||||
my ($str1, $str2) = split('\|', $nicval);
|
||||
|
||||
#$nivval Value: eth0!192.1.1.($1+10)
|
||||
$nicval = $str2;
|
||||
}
|
||||
@@ -2576,6 +2573,7 @@ sub expandnicsattr()
|
||||
}
|
||||
}
|
||||
|
||||
$nicv[1]= xCAT::Table::transRegexAttrs($node, $nicv[1]);
|
||||
# ignore the line that does not have nicname or value
|
||||
if ($nicv[0] && $nicv[1]) {
|
||||
$ret .= " $nicattr.$nicv[0]=$nicv[1]\n";
|
||||
@@ -2628,7 +2626,6 @@ sub collapsenicsattr()
|
||||
$nodeattrhash = shift;
|
||||
}
|
||||
my $objname = shift;
|
||||
|
||||
my %nicattrs = ();
|
||||
foreach my $nodeattr (keys %{$nodeattrhash}) {
|
||||
|
||||
|
@@ -2299,6 +2299,91 @@ $evalcpt->permit('require');
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
=head3 transRegexAttrs
|
||||
|
||||
Description: Transform the regular expression attribute to the target value
|
||||
based on the node name.
|
||||
|
||||
Arguments:
|
||||
Node
|
||||
Attribute value (may have regular expression)
|
||||
Returns:
|
||||
Attribute value
|
||||
undef
|
||||
Globals:
|
||||
|
||||
Error:
|
||||
|
||||
Example:
|
||||
if (defined($retval = transRegexAttrs($node, $datum->{$attrib}))) {
|
||||
$datum->{$attrib} = $retval;
|
||||
} else {
|
||||
delete $datum->{$attrib};
|
||||
}
|
||||
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
sub transRegexAttrs
|
||||
{
|
||||
my ($node, $attr) = @_;
|
||||
my $retval = $attr;
|
||||
if ($attr =~ /^\/[^\/]*\/[^\/]*\/$/) {
|
||||
my $exp = substr($attr, 1);
|
||||
chop $exp;
|
||||
my @parts = split('/', $exp, 2);
|
||||
$retval = $node;
|
||||
$retval =~ s/$parts[0]/$parts[1]/;
|
||||
} elsif ($attr =~ /^\|.*\|$/) {
|
||||
my $exp = substr($attr, 1);
|
||||
chop $exp;
|
||||
my @parts = split('\|', $exp, 2);
|
||||
my $arraySize = @parts;
|
||||
if ($arraySize < 2) { # easy regx, generate lhs from node
|
||||
my $lhs;
|
||||
my @numbers = $node =~ m/[\D0]*(\d+)/g;
|
||||
$lhs = '[\D0]*(\d+)' x scalar(@numbers);
|
||||
$lhs .= '.*$';
|
||||
unshift(@parts, $lhs);
|
||||
}
|
||||
my ($curr, $next, $prev);
|
||||
$retval = $parts[1];
|
||||
|
||||
($curr, $next, $prev) =
|
||||
extract_bracketed($retval, '()', qr/[^()]*/);
|
||||
unless ($curr) { #If there were no paramaters to save, treat this one like a plain regex
|
||||
undef $@; #extract_bracketed would have set $@ if it didn't return, undef $@
|
||||
$retval = $node;
|
||||
$retval =~ s/$parts[0]/$parts[1]/;
|
||||
}
|
||||
while ($curr)
|
||||
{
|
||||
my $value = $node;
|
||||
$value =~ s/$parts[0]/$curr/;
|
||||
$value = $evalcpt->reval('use integer;' . $value);
|
||||
$retval = $prev . $value . $next;
|
||||
($curr, $next, $prev) =
|
||||
extract_bracketed($retval, '()', qr/[^()]*/);
|
||||
}
|
||||
undef $@;
|
||||
|
||||
#At this point, $retval is the expression after being arithmetically contemplated, a generated regex, and therefore
|
||||
#must be applied in total
|
||||
my $answval = $node;
|
||||
$answval =~ s/$parts[0]/$retval/;
|
||||
$retval = $answval;
|
||||
}
|
||||
if ($retval =~ /^$/) {
|
||||
$retval = undef;
|
||||
}
|
||||
return $retval;
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
=head3 getNodeAttribs
|
||||
|
||||
Description: Retrieves the requested attribute
|
||||
@@ -2392,77 +2477,10 @@ sub getNodeAttribs
|
||||
#skip undefined values, save time
|
||||
next;
|
||||
}
|
||||
if ($datum->{$attrib} =~ /^\/[^\/]*\/[^\/]*\/$/)
|
||||
{
|
||||
my $exp = substr($datum->{$attrib}, 1);
|
||||
chop $exp;
|
||||
my @parts = split('/', $exp, 2);
|
||||
my $retval = $node;
|
||||
$retval =~ s/$parts[0]/$parts[1]/;
|
||||
my $retval;
|
||||
if (defined($retval = transRegexAttrs($node, $datum->{$attrib}))) {
|
||||
$datum->{$attrib} = $retval;
|
||||
}
|
||||
elsif ($datum->{$attrib} =~ /^\|.*\|$/)
|
||||
{
|
||||
|
||||
#Perform arithmetic and only arithmetic operations in bracketed issues on the right.
|
||||
#Tricky part: don't allow potentially dangerous code, only eval if
|
||||
#to-be-evaled expression is only made up of ()\d+-/%$
|
||||
#Futher paranoia? use Safe module to make sure I'm good
|
||||
my $exp = substr($datum->{$attrib}, 1);
|
||||
chop $exp;
|
||||
my @parts = split('\|', $exp, 2);
|
||||
my $arraySize = @parts;
|
||||
if ($arraySize < 2) { # easy regx, generate lhs from node
|
||||
my $lhs;
|
||||
my @numbers = $node =~ m/[\D0]*(\d+)/g;
|
||||
$lhs = '[\D0]*(\d+)' x scalar(@numbers);
|
||||
$lhs .= '.*$';
|
||||
unshift(@parts, $lhs);
|
||||
}
|
||||
my $curr;
|
||||
my $next;
|
||||
my $prev;
|
||||
my $retval = $parts[1];
|
||||
($curr, $next, $prev) =
|
||||
extract_bracketed($retval, '()', qr/[^()]*/);
|
||||
|
||||
unless ($curr) { #If there were no paramaters to save, treat this one like a plain regex
|
||||
undef $@; #extract_bracketed would have set $@ if it didn't return, undef $@
|
||||
$retval = $node;
|
||||
$retval =~ s/$parts[0]/$parts[1]/;
|
||||
$datum->{$attrib} = $retval;
|
||||
if ($datum->{$attrib} =~ /^$/) {
|
||||
|
||||
#If regex forces a blank, act like a normal blank does
|
||||
delete $datum->{$attrib};
|
||||
}
|
||||
next; #skip the redundancy that follows otherwise
|
||||
}
|
||||
while ($curr)
|
||||
{
|
||||
|
||||
#my $next = $comps[0];
|
||||
my $value = $node;
|
||||
$value =~ s/$parts[0]/$curr/;
|
||||
$value = $evalcpt->reval('use integer;' . $value);
|
||||
$retval = $prev . $value . $next;
|
||||
($curr, $next, $prev) =
|
||||
extract_bracketed($retval, '()', qr/[^()]*/);
|
||||
}
|
||||
undef $@;
|
||||
|
||||
#At this point, $retval is the expression after being arithmetically contemplated, a generated regex, and therefore
|
||||
#must be applied in total
|
||||
my $answval = $node;
|
||||
$answval =~ s/$parts[0]/$retval/;
|
||||
$datum->{$attrib} = $answval; #$retval;
|
||||
|
||||
#print Data::Dumper::Dumper(extract_bracketed($parts[1],'()',qr/[^()]*/));
|
||||
#use text::balanced extract_bracketed to parse earch atom, make sure nothing but arith operators, parans, and numbers are in it to guard against code execution
|
||||
}
|
||||
if ($datum->{$attrib} =~ /^$/) {
|
||||
|
||||
#If regex forces a blank, act like a normal blank does
|
||||
} else {
|
||||
delete $datum->{$attrib};
|
||||
}
|
||||
}
|
||||
|
@@ -2973,7 +2973,6 @@ sub setFINALattrs
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# $tmphash{nicips} = "eth0!1.1.1.1|1.2.1.1,eth1!2.1.1.1|2.2.1.1"
|
||||
foreach my $nicattr (keys %tmphash)
|
||||
{
|
||||
@@ -3189,7 +3188,6 @@ sub defls
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# if just provided type list then find all objects of these types
|
||||
if (!defined $::opt_template && $::objectsfrom_optt)
|
||||
{
|
||||
@@ -3845,11 +3843,11 @@ sub defls
|
||||
my $nicsstr;
|
||||
if ($nicnames)
|
||||
{
|
||||
$nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval, $nicnames);
|
||||
$nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval, $obj, $nicnames);
|
||||
}
|
||||
else
|
||||
{
|
||||
$nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval);
|
||||
$nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval, $obj);
|
||||
}
|
||||
|
||||
# Compress mode, format the output
|
||||
@@ -3902,7 +3900,7 @@ sub defls
|
||||
if ($showattr =~ /^nic/)
|
||||
{
|
||||
my $nicval = "$showattr=$attrval";
|
||||
my $nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval);
|
||||
my $nicsstr = xCAT::DBobjUtils->expandnicsattr($nicval, $obj);
|
||||
if ($nicsstr)
|
||||
{
|
||||
push(@{ $rsp_info->{data} }, "$nicsstr");
|
||||
|
Reference in New Issue
Block a user