Class: Net::SNMP::OID

Inherits:
Object
  • Object
show all
Extended by:
Debug
Includes:
Debug
Defined in:
lib/net/snmp/oid.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Debug

debug, error, fatal, info, print_packet, time, warn

Constructor Details

#initialize(oid) ⇒ OID

Returns a new instance of OID.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/net/snmp/oid.rb', line 56

def initialize(oid)
  @oid = oid
  @pointer = FFI::MemoryPointer.new(Net::SNMP::OID.oid_size * Constants::MAX_OID_LEN)
  @length_pointer = FFI::MemoryPointer.new(:size_t)
  @length_pointer.write_int(Constants::MAX_OID_LEN)
  if @oid =~ /^[\d\.]*$/
    if Wrapper.read_objid(@oid, @pointer, @length_pointer) == 0
      Wrapper.snmp_perror(@oid)
    end
  else
    if Wrapper.get_node(@oid, @pointer, @length_pointer) == 0
      raise "No such node: #{oid}"
    end
    @oid = to_s
  end
end

Instance Attribute Details

#length_pointerObject (readonly)

Returns the value of attribute length_pointer.



7
8
9
# File 'lib/net/snmp/oid.rb', line 7

def length_pointer
  @length_pointer
end

#oidObject (readonly)

Returns the value of attribute oid.



7
8
9
# File 'lib/net/snmp/oid.rb', line 7

def oid
  @oid
end

#pointerObject (readonly)

Returns the value of attribute pointer.



7
8
9
# File 'lib/net/snmp/oid.rb', line 7

def pointer
  @pointer
end

Class Method Details

.determine_oid_sizeObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/net/snmp/oid.rb', line 22

def self.determine_oid_size
  if Net::SNMP.initialized?
    oid_ptr = FFI::MemoryPointer.new(:ulong, 8)
    length_ptr = FFI::MemoryPointer.new(:size_t, 1)
    length_ptr.write_int(oid_ptr.total)

    Wrapper.read_objid('1.1', oid_ptr, length_ptr)
    oid_str = oid_ptr.read_array_of_uint8(oid_ptr.total).map{|byte| byte.to_s(2).rjust(8, '0') }.join('')

    @oid_size = (oid_str[/10*1/].length - 1) / 8
  else
    @oid_size = FFI::MemoryPointer.new(:ulong).total
    warn "SNMP not initialized\n" + <<-WARNING
      Cannot determine OID sub-id size, assuming common case of sizeof(ulong)
      On this platform, sizeof(ulong) = #{@oid_size} bytes
      To avoid this warning, call `Net::SNMP.init`
      WARNING
  end
end

.from_pointer(ptr, sub_id_count) ⇒ Object



11
12
13
# File 'lib/net/snmp/oid.rb', line 11

def self.from_pointer(ptr, sub_id_count)
  OID.new(OID.read_pointer(ptr, sub_id_count))
end

.oid_sizeObject



15
16
17
18
19
20
# File 'lib/net/snmp/oid.rb', line 15

def self.oid_size
  unless @oid_size
    determine_oid_size
  end
  @oid_size
end

.read_pointer(pointer, sub_id_count) ⇒ Object



42
43
44
45
46
47
# File 'lib/net/snmp/oid.rb', line 42

def self.read_pointer(pointer, sub_id_count)
  unless @sub_id_bit_width
    @sub_id_bit_width = OID.oid_size * 8
  end
  pointer.send("read_array_of_uint#{@sub_id_bit_width}", sub_id_count).join('.')
end

Instance Method Details

#<=>(o) ⇒ Object



116
117
118
119
120
# File 'lib/net/snmp/oid.rb', line 116

def <=>(o)
  a = self._packed
  b = o._packed
  a <=> b
end

#_packedObject



122
123
124
125
126
127
# File 'lib/net/snmp/oid.rb', line 122

def _packed
  i = self.to_s.dup
  i.sub!(/^\./,'')
  i.gsub!(/ /, '.0')
  i.replace(i.split('.').map(&:to_i).pack('N*'))
end

#indexObject

The instance index string Note that some MIB nodes specify the instance implicitly, like sysUpTimeInstance. So, this may be an empty string.



104
105
106
107
108
109
# File 'lib/net/snmp/oid.rb', line 104

def index
  # Strip the name
  index = oid.sub(node.oid.name, '')
  # Strip any leading dot
  index.sub(/^\./, '')
end

#labelObject

The label for the this OID. Includes any instance indexes.



112
113
114
# File 'lib/net/snmp/oid.rb', line 112

def label
  "#{node.label}#{index.length > 0 ? "." + index : ""}"
end

#lengthObject



77
78
79
# File 'lib/net/snmp/oid.rb', line 77

def length
  @length_pointer.read_int
end

#nameObject



85
86
87
# File 'lib/net/snmp/oid.rb', line 85

def name
  @oid
end

#nodeObject

Gets the MIB node corresponding to this OID. Note that if this OID represents a MIB node, like ‘1.3’, then ‘oid.to_s == oid.node.oid.to_s`. However, if there are indices on this oid, then `oid.to_s.start_with?(oid.node.oid.to_s)`



97
98
99
# File 'lib/net/snmp/oid.rb', line 97

def node
  MIB::Node.get_node(oid)
end

#parent_of?(o) ⇒ Boolean

Returns:

  • (Boolean)


129
130
131
# File 'lib/net/snmp/oid.rb', line 129

def parent_of?(o)
  o.to_s =~ /^#{self.to_s}\./
end

#sizeObject



73
74
75
# File 'lib/net/snmp/oid.rb', line 73

def size
  @length_pointer.read_int * Net::SNMP::OID.oid_size
end

#to_sObject



89
90
91
# File 'lib/net/snmp/oid.rb', line 89

def to_s
  OID.read_pointer(@pointer, length)
end

#write_to_buffer(buffer) ⇒ Object



49
50
51
52
53
54
# File 'lib/net/snmp/oid.rb', line 49

def write_to_buffer(buffer)
  unless @sub_id_bit_width
    @sub_id_bit_width = OID.oid_size * 8
  end
  buffer.send("write_array_of_uint#{@sub_id_bit_width}", self.to_s.split('.').map{ |subid| subid.to_i })
end