Class: NETSNMP::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/netsnmp/client.rb

Overview

Main Entity, provides the user-facing API to communicate with SNMP Agents

Under the hood it creates a “session” (analogous to the net-snmp C session), which will be used to proxy all the communication to the agent. the Client ensures that you only write pure ruby and read pure ruby, not concerning with snmp-speak like PDUs, varbinds and the like.

Constant Summary collapse

RETRIES =
5

Instance Method Summary collapse

Constructor Details

#initialize(version: nil, **options) {|client| ... } ⇒ Client

Returns a new instance of Client.

Examples:

Yielding a clinet

NETSNMP::Client.new(host: "241.232.22.12") do |client|
  puts client.get(oid: "1.3.6.1.2.1.1.5.0")
end

Parameters:

  • options (Hash)

    the options to needed to enable the SNMP client.

Options Hash (**options):

  • :version (String, Integer, nil)

    the version of the protocol (defaults to 3). also accepts common known declarations like :v3, “v2c”, etc

  • :retries (Integer)

    number of retries for each failed PDU (after which it raise timeout error. Defaults to RETRIES retries)

Yields:

  • (client)

    the instantiated client, after which it closes it for use.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/netsnmp/client.rb', line 26

def initialize(version: nil, **options)
  version = case version
            when Integer then version # assume the use know what he's doing
            when /v?1/ then 0
            when /v?2c?/ then 1
            when /v?3/ then 3
            else 3 # rubocop:disable Lint/DuplicateBranch
            end

  @retries = options.fetch(:retries, RETRIES).to_i
  @session ||= version == 3 ? V3Session.new(**options) : Session.new(version: version, **options)
  return unless block_given?

  begin
    yield self
  ensure
    close
  end
end

Instance Method Details

#closeObject

Closes the inner section



47
48
49
# File 'lib/netsnmp/client.rb', line 47

def close
  @session.close
end

#get(*oid_opts) {|response| ... } ⇒ Object

Performs an SNMP GET Request

Yields:

  • (response)

See Also:

  • NETSNMP::Client.{NETSNMP{NETSNMP::Varbind{NETSNMP::Varbind#new}


55
56
57
58
59
60
61
# File 'lib/netsnmp/client.rb', line 55

def get(*oid_opts)
  request = @session.build_pdu(:get, *oid_opts)
  response = handle_retries { @session.send(request) }
  yield response if block_given?
  values = response.varbinds.map(&:value)
  values.size > 1 ? values : values.first
end

#get_next(*oid_opts) {|response| ... } ⇒ Object

Performs an SNMP GETNEXT Request

Yields:

  • (response)

See Also:

  • NETSNMP::Client.{NETSNMP{NETSNMP::Varbind{NETSNMP::Varbind#new}


67
68
69
70
71
72
73
# File 'lib/netsnmp/client.rb', line 67

def get_next(*oid_opts)
  request = @session.build_pdu(:getnext, *oid_opts)
  response = handle_retries { @session.send(request) }
  yield response if block_given?
  values = response.varbinds.map { |v| [v.oid, v.value] }
  values.size > 1 ? values : values.first
end

#inform(*oid_opts) {|response| ... } ⇒ Object

Perform a SNMP INFORM Request

Yields:

  • (response)

See Also:

  • NETSNMP::Client.{NETSNMP{NETSNMP::Varbind{NETSNMP::Varbind#new}


143
144
145
146
147
148
149
# File 'lib/netsnmp/client.rb', line 143

def inform(*oid_opts)
  request = @session.build_pdu(:inform, *oid_opts)
  response = handle_retries { @session.send(request) }
  yield response if block_given?
  values = response.varbinds.map(&:value)
  values.size > 1 ? values : values.first
end

#set(*oid_opts) {|response| ... } ⇒ Object

Perform a SNMP SET Request

Yields:

  • (response)

See Also:

  • NETSNMP::Client.{NETSNMP{NETSNMP::Varbind{NETSNMP::Varbind#new}


131
132
133
134
135
136
137
# File 'lib/netsnmp/client.rb', line 131

def set(*oid_opts)
  request = @session.build_pdu(:set, *oid_opts)
  response = handle_retries { @session.send(request) }
  yield response if block_given?
  values = response.varbinds.map(&:value)
  values.size > 1 ? values : values.first
end

#walk(oid:) ⇒ Enumerator

Perform a SNMP Walk (issues multiple subsequent GENEXT requests within the subtree rooted on an OID)

Parameters:

  • oid (String)

    the root oid from the subtree

Returns:

  • (Enumerator)

    the enumerator-collection of the oid-value pairs



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/netsnmp/client.rb', line 81

def walk(oid:)
  walkoid = OID.build(oid)
  Enumerator.new do |y|
    code = walkoid
    first_response_code = nil
    catch(:walk) do
      loop do
        get_next(oid: code) do |response|
          response.varbinds.each do |varbind|
            code = varbind.oid
            if !OID.parent?(walkoid, code) ||
               varbind.value.eql?(:endofmibview) ||
               (code == first_response_code)
              throw(:walk)
            else
              y << [code, varbind.value]
            end
            first_response_code ||= code
          end
        end
      end
    end
  end
end