22
SNMP::Class Athanasios Douitsis

Snmp class

Embed Size (px)

Citation preview

Page 1: Snmp class

SNMP::Class!Athanasios Douitsis

Page 2: Snmp class

Very Brief SNMP Intro

•  SNMP agent (daemon - responding to requests) •  SNMP management station (making of requests) •  UDP, port 161  •  SNMP PDUs: SNMP GET , GET-NEXT, GETBULK,

notifications, SNMP-SET, etc o  Basic Encoding Rules (BER)

•  Structure of Management Information (SMIv2, ASN.1 subset) o  Types (integer, string, etc) o  MIBs (standard, vendor-specific)

 Managed Object Semantics   Managed Object Hierarchy

     2 SNMP::Class

Page 3: Snmp class

Very Brief SNMP Intro Example

Piece of knowledge:  .1.3.6.1.2.1.2.2.1.5.15 = 100000000 (k-v pair)

•  Object ID (OID): .1.3.6.1.2.1.2.2.1.5.15  o  Object: .1.3.6.1.2.1.2.2.1.5 or .iso(1).org(3).dod(6).internet

(1).mgmt(2).mib-2(1).interfaces(2).ifTable(2).ifEntry(1).ifSpeed(5) or simply ifSpeed  Semantics: "the speed of an interface"   Type: Gauge32 (32-bit integer)

o  Instance: .15 (row 15 in interface table)

•  Value: 100.000.000 (100M) === 100Mbps for ifSpeed 

3 SNMP::Class

Page 4: Snmp class

Writing network management tools

Network management tools using SNMP:

•  Small complexity, i.e. a nagios plugin

•  Medium complexity, i.e. a topology discovery tool

•  (Very) High complexity, i.e. a Network Management System (NMS) (mostly commercial systems)

Burden of using SNMP properly for small or medium size software

4 SNMP::Class

Page 5: Snmp class

Problem Statement

•  Perl : Availability of high performance, high quality libraries for SNMP o  Net-SNMP: SNMP.pm (XS, very fast, used by

SNMP::Class) o  Net::SNMP (pure Perl)

•  Usage of SNMP libraries for querying managed devices (routers, switches, servers, etc)

•  Typical network management tool: 1. retrieval of info from device(s) by library 2. organization of library returned data into suitable

structure 3. Conversions of data as necessary 4. Processing, calculations on data

5 SNMP::Class

Page 6: Snmp class

Problem Statement (2) Impedance mismatch between the programming language (not just Perl) and the SNMP-SMI world

Issues: •  OIDs returned in various forms (ifType, .1.3.6...)   •  Data types of values returned not always directly usable

o  IP addresses, Mac addresses, Gauges, Enumerations o  Varying between libraries

•  Error codes from library (end of mib, timeout, etc) •  SNMP agents

o  Bugs in older implementations   missing OIDs  broken loops, etc

o  Difference between GET-NEXT and GET-BULK •   Usability of structure of returned data (array, hash, etc) --->

considerable effort 6 SNMP::Class

Page 7: Snmp class

Problem Statemement (3) Some examples of cumbersomeness:

my ($instance) = ($key =~ /^ifSpeed.(\d+)$/)my ($instance) = ($key =~ /^\.1\.3\.6\.1\.2\.1\.2\.2\.1\.5\.(\d+)$/)

my $bridge_id = uc join(':',(unpack 'n(H2)*',$value)[1..6]);

for my $key (%kv) {    if ($key =~ /^ifDescr.(\d+)$/) {        $descriptions{$1} = $kv{$key};    }}for my $key (%kv) {    if ($key =~ /^ifType.(\d+)$/) {        say "interface ".$descriptions{$1}." is a ".$kv{$key}    }}

7 SNMP::Class

Page 8: Snmp class

SNMP::Class goals 

•  Usage of existing excellent libraries for Perl •  Minimization of programmer-required knowledge of SNMP

esoteric (and arcane) details •  Brief syntax for clarity and brevity, DWIM as much as

possible •  Easy connection setup with agents, provision of sensible

defaults •  Automatic optimization of communication with agents,

automatic handling of agent bugs •  Orthogonal error reporting, proper usage of exceptions  •  Effortless navigation/querying of structure of returned data

from agents •  Automatic encapsulation of values, taking into account

OID semantics, type (MIB and PDU), display-hint •  Ultimately, complete encapsulation of SNMP

8 SNMP::Class

Page 9: Snmp class

Library Overview - Connection Setup

my $c = SNMP::Class->new('myrouter.mydomain');

•  Probing of SNMP version (try 2, then 1) •  Querying of sysName.0

9 SNMP::Class

Page 10: Snmp class

Library Overview - OIDs •  OID: A series of integers

o  representable by a label (example: 'ifType') •  Complete encapsulation of the OID (creation, addition,

comparing, etc)

my $oid1 = SNMP::Class::OID->new('.1.3.6.1.4.1');

my $oid2 = SNMP::Class::OID->new('interfaces');

$oid2->contains('ifDescr'); #true

my $oid3 = SNMP::Class::OID->new('ifDescr')->add(15); #ifDescr.15

•  Also, automatic separation of instance when possible

$oid3->get_instance_oid; #returns a .15 oid

10 SNMP::Class

Page 11: Snmp class

Library Overview - Varbinds •  Varbind: An OID with a value (SNMP::Class::Varbind) •  Value connected with the specific OID semantically! •  Attribute raw_value for all varbinds

o  Just the bytes, completely unprocessed •  Method value for most varbinds

o  What is expected by a human •  Varbind enhancement methods

•  depending on OID semantics •  Automatically available

Examples: $iftype->raw_value #6$iftype->value #'ethernetCsmacd', enum of 6

$designated_bridge->raw_value; #8 bytes,unprintable $bridge_id->value; # '80:00:00:06:28:84:D7:40'$bridge_id->mac_address #'00:06:28:84:D7:40'$bridge_id->priority #32768

11 SNMP::Class

Page 12: Snmp class

Library Overview - Querying of agent

$c->add('system','interfaces');

•  Walking of system and intefaces trees on agent o  If SNMPv2 available, usage of GETBULK

•  Query result storage inside $c (separate result objects possible as well) o  $c: connection object and result object

12 SNMP::Class

Page 13: Snmp class

Library Overview - The ResultSet ResultSet -  a set of OID-value pairs (varbinds) •  Filtering of set through methods

$rs->filter_label('ifSpeed'); #keep only ifSpeed OIDs

•  Method chaining (returning of new ResultSets)

$rs->filter_label('ifSpeed')->filter_instance(3)

•  Method autoloading with OID label names

$rs->ifSpeed(3) #same as previous, more clear•  Generic filter (grep) available: $rs->filter(sub {     return 1 if $_->get_label eq 'ifSpeed';    return});

13 SNMP::Class

Page 14: Snmp class

Library Overview - The ResultSet (2)

•  More advanced filtering 

#Find speed of interface 'eth0'say $rs->filter_label('ifSpeed')->filter_instance($rs->filter_label('ifDescr')->filter_value('eth0')->get_instance_oid)->value;#the same, much more clearly and briefly:say $rs->find('ifDescr' => 'eth0')->ifSpeed->value;#Keep the instance for which the ifDescr equals 'eth0', then keep only the ifSpeed. 

14 SNMP::Class

Page 15: Snmp class

Library Overview - The ResultSet (3) •  Iteration over contents, detection of list context

#print the description of each interfacefor($rs->ifDescr) {     say $_->value }•  Filter and map methods

o  Used exactly as list grep and map with BLOCK

my $new_rs = $rs->filter(sub { ..... });my $new_rs = $rs->map(sub { ..... });    

15 SNMP::Class

Page 16: Snmp class

Library Overview - The ResultSet (4)

•  Final touch: Resultset with 1 varbind:

$rs->ifDescr(3)->item(0)->value;#the same:$rs->ifDescr(3)->value;Varbind methods valid on 1-item ResultSets.

•  Overloading also possible, but: o  Awkward behavior when using list context o  Awkward behavior when using operators like '.'

16 SNMP::Class

Page 17: Snmp class

Library Implementation (so far) Built using Moose.pm  Class & Role Hierarchy: •  Classes:

o  SNMP::Class - Session object (mostly empty, gaining functionality from Role::ResultSet and Role::Implementation::Net-SNMP)

o  SNMP::Class::ResultSet - Results object (ditto) o  SNMP::Class::OID - An OID 

  SNMP::Class::Varbind - A varbind (OID+value) •  Roles:

o  SNMP::Class::Role::ResultSet - resultset behavior o  SNMP::Class::Role::Implementation - SNMP Instrumentation (abstract

part, not usable by itself)   SNMP::Class::Role::Implementation::NetSNMP  - Instrumentation

lower part using Net-SNMP (applied to SNMP::Class objects)   SNMP::Class::Role::Implementation::Dummy - Another

instrumentation, dummy this time o  SNMP::Class::Varbind::XXXXX - Varbind enhancement roles, (application

to plain varbinds)

17 SNMP::Class

Page 18: Snmp class

Library Roles (2) SNMP::Class is-a: •  SNMP::Class::Role::Implementation::NetSNMP •  SNMP::Class::Role::ResultSet

Hence, full usability (SNMP Session + Result) available through a single object. my $s = SNMP::Class->new('myhost');$s->add('system');say $s->sysName->value;#orsay SNMP::Class->new('myhost')->add('system')->sysName->value;

18 SNMP::Class

Page 19: Snmp class

Varbind Enhancement Roles  Added functionality (new methods or override methods) for SNMP::Class::Varbind objects through SNMP::Class::Varbind:: roles Example:

#coming from SNMP::Class::Varbind$bridge_id->raw_value; #8 bytes,unprintable $bridge_id->value; # '80:00:00:06:28:84:D7:40'#coming from SNMP::Class::Varbind::BridgeId$bridge_id->mac_address #'00:06:28:84:D7:40'$bridge_id->priority #32768  •  Applying of role at runtime, trigger when OID and value of Varbind

are known __PACKAGE__->meta->apply($_[0]);•  Applying of multiple roles possible •  Default Varbind 'value' method and other methods overridable by

roles 19 SNMP::Class

Page 20: Snmp class

Code!

https://github.com/aduitsis/snmp-class

•  Stuff in current presentation almost fully implemented •  Many many varbind enhancement roles missing

(implementation on a need basis) •  Only instrumentation so far from Net-SNMP •  MIB parsing also from Net-SNMP •  Obviously, bugs present •  Built with Moose •  Usage of Log::Log4Perl for logging •  Test suite - but not 100% coverage

20 SNMP::Class

Page 21: Snmp class

Future Directions

•  Second instrumentation wrapper from Net::SNMP (Pure Perl)

•  MIB parser other than from Net-SNMP •  More Varbind enhancement roles •  More performance fixes •  Fix any bugs observed •  Need to address snmpset functionality •  Encapsulation of entire MIBs, hide SNMP completely.

o  (also see the very good SNMP::Info module on CPAN) 

21 SNMP::Class

Page 22: Snmp class

Thank you for your attention

[email protected]