Temporarily add go-agentx (w/ fixes to lexico ordering)
This commit is contained in:
96
go-agentx/pdu/object_identifier.go
Normal file
96
go-agentx/pdu/object_identifier.go
Normal file
@ -0,0 +1,96 @@
|
||||
// Copyright 2018 The agentx authors
|
||||
// Licensed under the LGPLv3 with static-linking exception.
|
||||
// See LICENCE file for details.
|
||||
|
||||
package pdu
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
|
||||
"github.com/posteo/go-agentx/value"
|
||||
)
|
||||
|
||||
// ObjectIdentifier defines the pdu object identifier packet.
|
||||
type ObjectIdentifier struct {
|
||||
Prefix uint8
|
||||
Include byte
|
||||
Subidentifiers []uint32
|
||||
}
|
||||
|
||||
// SetInclude sets the include field.
|
||||
func (o *ObjectIdentifier) SetInclude(value bool) {
|
||||
if value {
|
||||
o.Include = 0x01
|
||||
} else {
|
||||
o.Include = 0x00
|
||||
}
|
||||
}
|
||||
|
||||
// GetInclude returns true if the include field ist set, false otherwise.
|
||||
func (o *ObjectIdentifier) GetInclude() bool {
|
||||
if o.Include == 0x00 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// SetIdentifier set the subidentifiers by the provided oid string.
|
||||
func (o *ObjectIdentifier) SetIdentifier(oid value.OID) {
|
||||
o.Subidentifiers = make([]uint32, 0)
|
||||
|
||||
if len(oid) > 4 && oid[0] == 1 && oid[1] == 3 && oid[2] == 6 && oid[3] == 1 {
|
||||
o.Subidentifiers = append(o.Subidentifiers, uint32(1), uint32(3), uint32(6), uint32(1), uint32(oid[4]))
|
||||
oid = oid[5:]
|
||||
}
|
||||
|
||||
o.Subidentifiers = append(o.Subidentifiers, oid...)
|
||||
}
|
||||
|
||||
// GetIdentifier returns the identifier as an oid string.
|
||||
func (o *ObjectIdentifier) GetIdentifier() value.OID {
|
||||
var oid value.OID
|
||||
if o.Prefix != 0 {
|
||||
oid = append(oid, 1, 3, 6, 1, uint32(o.Prefix))
|
||||
}
|
||||
return append(oid, o.Subidentifiers...)
|
||||
}
|
||||
|
||||
// ByteSize returns the number of bytes, the binding would need in the encoded version.
|
||||
func (o *ObjectIdentifier) ByteSize() int {
|
||||
return 4 + len(o.Subidentifiers)*4
|
||||
}
|
||||
|
||||
// MarshalBinary returns the pdu packet as a slice of bytes.
|
||||
func (o *ObjectIdentifier) MarshalBinary() ([]byte, error) {
|
||||
buffer := bytes.NewBuffer([]byte{byte(len(o.Subidentifiers)), o.Prefix, o.Include, 0x00})
|
||||
|
||||
for _, subidentifier := range o.Subidentifiers {
|
||||
binary.Write(buffer, binary.LittleEndian, &subidentifier)
|
||||
}
|
||||
|
||||
return buffer.Bytes(), nil
|
||||
}
|
||||
|
||||
// UnmarshalBinary sets the packet structure from the provided slice of bytes.
|
||||
func (o *ObjectIdentifier) UnmarshalBinary(data []byte) error {
|
||||
count := data[0]
|
||||
o.Prefix = data[1]
|
||||
o.Include = data[2]
|
||||
|
||||
o.Subidentifiers = make([]uint32, 0)
|
||||
buffer := bytes.NewBuffer(data[4:])
|
||||
for index := byte(0); index < count; index++ {
|
||||
var subidentifier uint32
|
||||
if err := binary.Read(buffer, binary.LittleEndian, &subidentifier); err != nil {
|
||||
return err
|
||||
}
|
||||
o.Subidentifiers = append(o.Subidentifiers, subidentifier)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o ObjectIdentifier) String() string {
|
||||
return o.GetIdentifier().String()
|
||||
}
|
Reference in New Issue
Block a user