Class: NETSNMP::Varbind

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

Overview

Abstracts the PDU variable structure into a ruby object

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(oid, value: nil, type: nil, **_opts) ⇒ Varbind

Returns a new instance of Varbind.



9
10
11
12
13
# File 'lib/netsnmp/varbind.rb', line 9

def initialize(oid, value: nil, type: nil, **_opts)
  @oid = OID.build(oid)
  @type = type
  @value = convert_val(value) if value
end

Instance Attribute Details

#oidObject (readonly)

Returns the value of attribute oid.



7
8
9
# File 'lib/netsnmp/varbind.rb', line 7

def oid
  @oid
end

#valueObject (readonly)

Returns the value of attribute value.



7
8
9
# File 'lib/netsnmp/varbind.rb', line 7

def value
  @value
end

Instance Method Details

#convert_application_asn(asn) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/netsnmp/varbind.rb', line 103

def convert_application_asn(asn)
  case asn.tag
  when 0 # IP Address
    IPAddr.new_ntoh(asn.value)
  when 1, # ASN counter 32
       2 # gauge
    val = asn.value
    val.prepend("\x00") while val.bytesize < 4
    asn.value.unpack("N*")[0] || 0
  when 3 # timeticks
    Timetick.new(asn.value.unpack("N*")[0] || 0)
    # when 4 # opaque
    # when 5 # NSAP
    # when 6 # ASN Counter 64
    # when 7 # ASN UInteger
  end
end

#convert_to_asn(typ, value) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/netsnmp/varbind.rb', line 76

def convert_to_asn(typ, value)
  asn_type = typ
  asn_val = value
  if typ.is_a?(Symbol)
    asn_type = case typ
               when :ipaddress then 0
               when :counter32
                 asn_val = [value].pack("N*")
                 asn_val = asn_val[1..-1] while asn_val.start_with?("\x00")
                 1
               when :gauge
                 asn_val = [value].pack("N*")
                 asn_val = asn_val[1..-1] while asn_val.start_with?("\x00")
                 2
               when :timetick
                 return Timetick.new(value).to_asn
               when :opaque then 4
               when :nsap then 5
               when :counter64 then 6
               when :uinteger then 7
               else
                 raise Error, "#{typ}: unsupported application type"
               end
  end
  OpenSSL::ASN1::ASN1Data.new(asn_val, asn_type, :APPLICATION)
end

#convert_val(asn_value) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/netsnmp/varbind.rb', line 48

def convert_val(asn_value)
  case asn_value
  when OpenSSL::ASN1::OctetString
    # yes, we are forcing all output to UTF-8
    # it's kind of common in snmp, some stuff can't be converted,
    # like Hexa Strings. Parse them into a readable format a la netsnmp
    val = asn_value.value
    begin
      val.encode("UTF-8")
    rescue Encoding::UndefinedConversionError,
           Encoding::ConverterNotFoundError,
           Encoding::InvalidByteSequenceError
      # hexdump me!
      val.unpack("H*")[0].upcase.scan(/../).join(" ")
    end
  when OpenSSL::ASN1::Primitive
    val = asn_value.value
    val = val.to_i if val.is_a?(OpenSSL::BN)
    val
  when OpenSSL::ASN1::ASN1Data
    # application data
    convert_application_asn(asn_value)
  # when OpenSSL::BN
  else
    asn_value # assume it's already primitive
  end
end

#to_asnObject



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

def to_asn
  asn_oid = OID.to_asn(@oid)
  asn_val = if @type
              convert_to_asn(@type, @value)
            else
              case @value
              when String
                OpenSSL::ASN1::OctetString.new(@value)
              when Integer
                OpenSSL::ASN1::Integer.new(@value)
              when true, false
                OpenSSL::ASN1::Boolean.new(@value)
              when nil
                OpenSSL::ASN1::Null.new(nil)
              when IPAddr
                OpenSSL::ASN1::ASN1Data.new(@value.hton, 0, :APPLICATION)
              when Timetick
                @value.to_asn
              else
                raise Error, "#{@value}: unsupported varbind type"
              end
            end
  OpenSSL::ASN1::Sequence.new([asn_oid, asn_val])
end

#to_derObject



19
20
21
# File 'lib/netsnmp/varbind.rb', line 19

def to_der
  to_asn.to_der
end

#to_sObject



15
16
17
# File 'lib/netsnmp/varbind.rb', line 15

def to_s
  "#<#{self.class}:0x#{object_id.to_s(16)} @oid=#{@oid} @value=#{@value}>"
end