- Added munge_port_list()

- Added modify_port_list()
- Added set_multi() to enable a SNMP set command on several new values in the one request.
This commit is contained in:
Eric Miller
2007-12-20 04:01:17 +00:00
parent 2ffa82aff9
commit d0061b4ec9

171
Info.pm
View File

@@ -2520,6 +2520,25 @@ sub munge_i_up {
return $i_up; return $i_up;
} }
=item munge_port_list
Takes an octet string representing a set of ports and returns a reference
to an array of binary values each array element representing a port.
If the element has a value of '1', then that port is included in the set of
ports; the port is not included if it has a value of '0'.
=cut
sub munge_port_list {
my $oct = shift;
return unless defined $oct;
my $list = [ split(//, unpack("B*", $oct)) ];
return $list;
}
=back =back
=head2 Internaly Used Functions =head2 Internaly Used Functions
@@ -2774,11 +2793,15 @@ sub _global{
return $val; return $val;
} }
=item $info->_set(attr,val,iid) =item $info->_set(attr,val,iid,type)
Used internally by AUTOLOAD to run an SNMP set command for dynamic methods Used internally by AUTOLOAD to run an SNMP set command for dynamic methods
listed in either %GLOBALS or %FUNCS or a valid mib leaf from a loaded MIB. listed in either %GLOBALS or %FUNCS or a valid mib leaf from a loaded MIB or
Clears attr cache on sucessful set. the set_multi() method to set multiple varible in one command. When run
clears attr cache.
Attr is passed as either a scalar for dynamic methods or a reference to an
array or array of arrays when used with set_multi().
Example: $info->set_name('dog',3) uses autoload to resolve to Example: $info->set_name('dog',3) uses autoload to resolve to
$info->_set('name','dog',3); $info->_set('name','dog',3);
@@ -2786,11 +2809,19 @@ $info->_set('name','dog',3);
=cut =cut
sub _set { sub _set {
my ($self,$attr,$val,$iid) = @_; my ($self,$attr,$val,$iid,$type) = @_;
my $varbind_list_ref;
$iid = defined $iid ? $iid : '.0'; if (!ref($attr)) {
# prepend dot if necessary to $iid $varbind_list_ref = [[$attr, $iid, $val, $type]];
$iid = ".$iid" unless $iid =~ /^\./; }
elsif (ref($attr) =~ /ARRAY/) {
$varbind_list_ref = [$attr];
$varbind_list_ref = $attr if ref($$attr[0]) =~ /ARRAY/;
}
else {
$self->error_throw("SNMP::Info::_set($attr,$val) - Failed. Invalid argument for attr.");
}
my $sess = $self->session(); my $sess = $self->session();
return undef unless defined $sess; return undef unless defined $sess;
@@ -2798,40 +2829,94 @@ sub _set {
my $funcs = $self->funcs(); my $funcs = $self->funcs();
my $globals = $self->globals(); my $globals = $self->globals();
# Check if this method is from a sub or from the tables. foreach my $var_list (@$varbind_list_ref) {
if ($self->can($attr)){ my $list_attr = $var_list->[0];
$self->error_throw("SNMP::Info::_set($attr,$val) - Failed. $attr is generated in a sub(). set_$attr sub required."); my $list_iid = $var_list->[1];
# if sub set_attr() existed, we wouldn't have gotten this far. my $list_val = $var_list->[2];
return undef;
# Get rid of non-printable chars in $list_val for debug statements
$list_val =~ s/\W//;
# Instance is 0 for scalars without a supplied instance
$var_list->[1] = $list_iid = defined $list_iid ? $list_iid : '0';
# Check if this method is from a sub or from the tables.
if ($self->can($list_attr)){
$self->error_throw("SNMP::Info::_set($list_attr,$list_val) - Failed. $list_attr is generated in a sub(). set_$list_attr sub required.");
# if sub set_attr() existed, we wouldn't have gotten this far.
return undef;
}
# Lookup oid
my $oid = undef;
$oid = $list_attr if SNMP::translateObj($list_attr);
$oid = $globals->{$list_attr} if defined $globals->{$list_attr};
$oid = $funcs->{$list_attr} if defined $funcs->{$list_attr};
unless (defined $oid) {
$self->error_throw("SNMP::Info::_set($list_attr,$list_val) - Failed to find $list_attr in \%GLOBALS or \%FUNCS or loaded MIB.");
return undef;
}
# Check for fully qualified attr
if ($oid =~ /__/) {
$oid =~ s/__/::/;
$oid =~ s/_/-/g;
}
$var_list->[0] = $oid;
$self->debug() and print "SNMP::Info::_set $list_attr.$list_iid ($oid.$list_iid) = $list_val\n";
delete $self->{"_$list_attr"};
} }
# Lookup oid my $rv = $sess->set($varbind_list_ref);
my $oid = undef;
$oid = $attr if SNMP::translateObj($attr);
$oid = $globals->{$attr} if defined $globals->{$attr};
$oid = $funcs->{$attr} if defined $funcs->{$attr};
unless (defined $oid) {
$self->error_throw("SNMP::Info::_set($attr,$val) - Failed to find $attr in \%GLOBALS or \%FUNCS or loaded MIB.");
return undef;
}
$oid .= $iid;
$oid = &SNMP::translateObj($oid);
$self->debug() and print "SNMP::Info::_set $attr$iid ($oid) = $val\n";
my $rv = $sess->set($oid,$val);
if ($sess->{ErrorStr}){ if ($sess->{ErrorStr}){
$self->error_throw("SNMP::Info::_set $attr$iid $sess->{ErrorStr}"); $self->error_throw("SNMP::Info::_set $sess->{ErrorStr}");
return undef; return undef;
} }
delete $self->{"_$attr"};
return $rv; return $rv;
} }
=item $info->set_multi(arrayref)
Used to run an SNMP set command on several new values in the one request.
Returns the result of $info->_set(method).
Pass either a reference to a 4 element array [<obj>, <iid>, <val>, <type>] or
a reference to an array of 4 element arrays to specify multiple values.
<obj> - One of the following forms:
1) leaf identifier (e.g., 'sysContact')
2) An entry in either %FUNCS, %GLOBALS (e.g., 'contact')
<iid> - The dotted-decimal, instance identifier. For scalar MIB objects use '0'
<val> - The SNMP data value being set (e.g., 'netdisco')
<type> - Optional as the MIB should be loaded.
If one of the set assigments is invalid, then the request will be rejected
without applying any of the new values - regardless of the order they appear
in the list.
Example:
my $vlan_set = [
['qb_v_untagged',"$old_vlan_id","$old_untagged_portlist"],
['qb_v_egress',"$new_vlan_id","$new_egress_portlist"],
['qb_v_egress',"$old_vlan_id","$old_egress_portlist"],
['qb_v_untagged',"$new_vlan_id","$new_untagged_portlist"],
['qb_i_vlan',"$port","$new_vlan_id"],
];
$info->set_multi($vlan_set);
=cut
sub set_multi {
my $self = shift;
return $self->_set( @_);
}
=item $info->load_all() =item $info->load_all()
Debugging routine. This does not include any overriden method or method implemented Debugging routine. This does not include any overriden method or method implemented
@@ -3093,7 +3178,7 @@ sub _show_attr {
return $store->{$attr}; return $store->{$attr};
} }
=item $info->snmp_connect_ip() =item $info->snmp_connect_ip(ip)
Returns true or false based upon snmp connectivity to an IP. Returns true or false based upon snmp connectivity to an IP.
@@ -3133,6 +3218,28 @@ sub snmp_connect_ip {
} }
=item modify_port_list(portlist,offset,replacement)
Replaces the specified bit in a port_list array and
returns the packed bitmask
=cut
sub modify_port_list {
my ($self, $portlist, $offset, $replacement) = @_;
print "Original port list: @$portlist \n" if $self->debug();
@$portlist[$offset] = $replacement;
# Some devices do not populate the portlist with all possible ports.
# If we have lengthened the list fill all undefined elements with zero.
foreach my $item (@$portlist) {
$item = '0' unless (defined($item));
}
print "Modified port list: @$portlist \n" if $self->debug();
return pack("B*", join('', @$portlist));
}
=back =back
=head2 AUTOLOAD =head2 AUTOLOAD