Class: SNMP::Message

Inherits:
Object
  • Object
show all
Extended by:
BER::Decode
Includes:
BER::Encode
Defined in:
lib/snmp/pdu.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from BER::Decode

assert_no_remainder, build_integer, decode_integer, decode_integer_value, decode_ip_address, decode_object_id, decode_object_id_value, decode_octet_string, decode_sequence, decode_timeticks, decode_tlv, decode_uinteger_value

Methods included from BER::Encode

#encode_exception, #encode_integer, #encode_length, #encode_null, #encode_object_id, #encode_octet_string, #encode_sequence, #encode_tagged_integer, #encode_tlv, #integer_to_octets

Constructor Details

#initialize(version, community, pdu) ⇒ Message

Returns a new instance of Message.



102
103
104
105
106
# File 'lib/snmp/pdu.rb', line 102

def initialize(version, community, pdu)
  @version = version
  @community = community
  @pdu = pdu
end

Instance Attribute Details

#communityObject (readonly)

Returns the value of attribute community.



46
47
48
# File 'lib/snmp/pdu.rb', line 46

def community
  @community
end

#pduObject (readonly)

Returns the value of attribute pdu.



47
48
49
# File 'lib/snmp/pdu.rb', line 47

def pdu
  @pdu
end

#versionObject (readonly)

Returns the value of attribute version.



45
46
47
# File 'lib/snmp/pdu.rb', line 45

def version
  @version
end

Class Method Details

.decode(data, mib = nil) ⇒ Object



50
51
52
53
54
55
56
57
58
# File 'lib/snmp/pdu.rb', line 50

def decode(data, mib=nil)
  message_data, remainder = decode_sequence(data)
  assert_no_remainder(remainder)
  version, remainder = decode_version(message_data)
  community, remainder = decode_octet_string(remainder)
  pdu, remainder = decode_pdu(version, remainder, mib)
  assert_no_remainder(remainder)
  Message.new(version, community, pdu)
end

.decode_pdu(version, data, mib = nil) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/snmp/pdu.rb', line 72

def decode_pdu(version, data, mib=nil)
  pdu_tag, pdu_data, remainder = decode_tlv(data)
  case pdu_tag
  when BER::GetRequest_PDU_TAG
    pdu = PDU.decode(GetRequest, pdu_data, mib)
  when BER::GetNextRequest_PDU_TAG
    pdu = PDU.decode(GetNextRequest, pdu_data, mib)
  when BER::Response_PDU_TAG
    pdu = PDU.decode(Response, pdu_data, mib)
  when BER::SetRequest_PDU_TAG
    pdu = PDU.decode(SetRequest, pdu_data, mib)
  when BER::SNMPv1_Trap_PDU_TAG
    raise InvalidPduTag, "SNMPv1-trap not valid for #{version.to_s}" if version != :SNMPv1
    pdu = SNMPv1_Trap.decode(pdu_data, mib)
  when BER::GetBulkRequest_PDU_TAG
    raise InvalidPduTag, "get-bulk not valid for #{version.to_s}" if version != :SNMPv2c
    pdu = PDU.decode(GetBulkRequest, pdu_data, mib)
  when BER::InformRequest_PDU_TAG
    raise InvalidPduTag, "inform not valid for #{version.to_s}" if version != :SNMPv2c
    pdu = PDU.decode(InformRequest, pdu_data, mib)
  when BER::SNMPv2_Trap_PDU_TAG
    raise InvalidPduTag, "SNMPv2c-trap not valid for #{version.to_s}" if version != :SNMPv2c
    pdu = PDU.decode(SNMPv2_Trap, pdu_data, mib)
  else
    raise UnsupportedPduTag, pdu_tag.to_s
  end
  return pdu, remainder
end

.decode_version(data) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/snmp/pdu.rb', line 60

def decode_version(data)
  version_data, remainder = decode_integer(data)
  if version_data == BER::SNMP_V1
    version = :SNMPv1
  elsif version_data == BER::SNMP_V2C
    version = :SNMPv2c
  else
    raise UnsupportedVersion, version_data.to_s
  end
  return version, remainder
end

Instance Method Details

#encodeObject



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

def encode
  data = encode_version(@version)
  data << encode_octet_string(@community)
  data << @pdu.encode
  encode_sequence(data)
end

#encode_version(version) ⇒ Object



112
113
114
115
116
117
118
119
120
# File 'lib/snmp/pdu.rb', line 112

def encode_version(version)
  if version == :SNMPv1
    encode_integer(BER::SNMP_V1)
  elsif version == :SNMPv2c
    encode_integer(BER::SNMP_V2C)
  else
    raise UnsupportedVersion, version.to_s
  end
end

#responseObject



108
109
110
# File 'lib/snmp/pdu.rb', line 108

def response
  Message.new(@version, @community, Response.from_pdu(@pdu))
end