support Netdisco device_ip instances in match thing
This commit is contained in:
@@ -26,10 +26,10 @@ subroutines.
|
||||
|
||||
=head1 EXPORT_OK
|
||||
|
||||
=head2 check_acl_no( $ip | $device, $setting_name )
|
||||
=head2 check_acl_no( $ip | $instance, $setting_name )
|
||||
|
||||
Given the IP address of a device, returns true if the configuration setting
|
||||
C<$setting_name> matches that device, else returns false. If the setting is
|
||||
Given an IP address or object instance, returns true if the configuration
|
||||
setting C<$setting_name> matches, else returns false. If the setting is
|
||||
undefined or empty, then C<check_acl_no> also returns false.
|
||||
|
||||
See L<App::Netdisco::Manual::Configuration> for details of what
|
||||
@@ -43,10 +43,10 @@ sub check_acl_no {
|
||||
return check_acl($thing, setting($setting_name));
|
||||
}
|
||||
|
||||
=head2 check_acl_only( $ip | $device, $setting_name )
|
||||
=head2 check_acl_only( $ip | $instance, $setting_name )
|
||||
|
||||
Given the IP address of a device, returns true if the configuration setting
|
||||
C<$setting_name> matches that device, else returns false. If the setting is
|
||||
Given an IP address or object instance, returns true if the configuration
|
||||
setting C<$setting_name> matches, else returns false. If the setting is
|
||||
undefined or empty, then C<check_acl_only> also returns true.
|
||||
|
||||
See L<App::Netdisco::Manual::Configuration> for details of what
|
||||
@@ -64,11 +64,14 @@ sub check_acl_only {
|
||||
return check_acl($thing, $config);
|
||||
}
|
||||
|
||||
=head2 check_acl( $ip | $device, $configitem | \@config )
|
||||
=head2 check_acl( $ip | $instance, $configitem | \@config )
|
||||
|
||||
Given a Device or IP address, compares it to the items in C<< \@config >> then
|
||||
returns true or false. You can control whether any item must match or all must
|
||||
match, and items can be negated to invert the match logic.
|
||||
Given an IP address or object instance, compares it to the items in C<<
|
||||
\@config >> then returns true or false. You can control whether any item must
|
||||
match or all must match, and items can be negated to invert the match logic.
|
||||
|
||||
Accepts instances of classes representing Netdisco Devices, Netdisco Device
|
||||
IPs, and L<NetAddr::IP> family objects.
|
||||
|
||||
There are several options for what C<< \@config >> can contain. See
|
||||
L<App::Netdisco::Manual::Configuration> for the details.
|
||||
@@ -79,13 +82,16 @@ sub check_acl {
|
||||
my ($thing, $config) = @_;
|
||||
return 0 unless defined $thing and defined $config;
|
||||
|
||||
my $real_ip = (
|
||||
(blessed $thing and $thing->can('ip')) ? $thing->ip : (
|
||||
(blessed $thing and $thing->can('addr')) ? $thing->addr : $thing ));
|
||||
my $real_ip = $thing;
|
||||
if (blessed $thing) {
|
||||
$real_ip = ($thing->can('alias') ? $thing->alias : (
|
||||
$thing->can('ip') ? $thing->ip : (
|
||||
$thing->can('addr') ? $thing->addr : $thing )));
|
||||
}
|
||||
return 0 if blessed $real_ip; # class we do not understand
|
||||
|
||||
$config = [$config] if ref [] ne ref $config;
|
||||
my $addr = NetAddr::IP::Lite->new($real_ip);
|
||||
my $addr = NetAddr::IP::Lite->new($real_ip) or return 0;
|
||||
my $all = (scalar grep {m/^op:and$/} @$config);
|
||||
my $name = undef; # only look up once, and only if qr// is used
|
||||
|
||||
@@ -122,11 +128,11 @@ sub check_acl {
|
||||
my $prop = $1;
|
||||
my $match = $2;
|
||||
|
||||
# if not in storage, we can't do much with device properties
|
||||
next INLIST unless blessed $thing and $thing->in_storage;
|
||||
# if not an object, we can't do much with properties
|
||||
next INLIST unless blessed $thing;
|
||||
|
||||
# lazy version of vendor: and model:
|
||||
if ($neg xor ($thing->can($prop) and defined $thing->$prop
|
||||
if ($neg xor ($thing->can($prop) and defined eval { $thing->$prop }
|
||||
and $thing->$prop =~ m/^$match$/)) {
|
||||
return 1 if not $all;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user