Net-SNMP v5.9.3 with python 3.6.3. I'm not sure if this has only become an issue since the move of strings from bytes to Unicode in Python 3 but I cannot set an OID value to an octet string containing octets >=128. I am trying to set a MAC address in an OID.
macAddress = '\x02\0\0\0\x80\xff' varbind = netsnmp.Varbind(oidSvcMacNameAddr, iid, macAddress, 'OCTETSTR') The python bindings convert everything to strings in the Varbind object. class Varbind(object): def __init__(self, tag=None, iid=None, val=None, type_arg=None): self.tag = STR(tag) self.iid = STR(iid) self.val = STR(val) self.type = STR(type_arg) The result on the wire of the performing an SNMP set on using the values above is: variable-bindings: 2 items TIMETRA-GLOBAL-MIB::tmnxSRObjs.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49 (1.3.6.1.4.1.6527.3.1.2.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49): 02000000c280c3bf Object Name: 1.3.6.1.4.1.6527.3.1.2.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49 (TIMETRA-GLOBAL-MIB::tmnxSRObjs.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49) Value (OctetString): 02000000c280c3bf TIMETRA-GLOBAL-MIB::tmnxSRObjs.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49 (1.3.6.1.4.1.6527.3.1.2.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49): 020000007f55 Object Name: 1.3.6.1.4.1.6527.3.1.2.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49 (TIMETRA-GLOBAL-MIB::tmnxSRObjs.4.2.59.1.4.10.83.84.69.45.80.79.76.84.48.49) Value (OctetString): 020000007f55 As a result an error is returned because the octet string is 8 bytes rather than 6. Note: Setting values <0x80 works without issue. The second variable binding is using a macAddress = '\x02\0\0\0\x7f\x55' is correct and when used without the 1st binding sets the value. Within the library bindings, the val attribute is read using the function py_netsnmp_attr_string, which calls PyUnicode_AsUTF8AndSize function which returns a UTF8 encoded char buffer. The value sent on the wire is the UTF-8 encoded string. >>> macAddress = '\x02\0\0\0\x80\xff' >>> macAddress '\x02\x00\x00\x00\x80ΓΏ' >>> macAddress.encode('utf8') b'\x02\x00\x00\x00\xc2\x80\xc3\xbf' UTF8 encoding is probably a poor choice for encoding octet strings. I believe that if the string was encoded as latin-1 (which is the same as iso-8859-1) within the bindings the problem wouldn't occur. >>> macAddress.encode('latin-1') b'\x02\x00\x00\x00\x80\xff' Does anyone have any idea of how to cleverly work around this or failing that patch the bindings? The content of this email (including any attachments) is intended for the addressee only, is confidential and may be legally privileged. If you've received this email in error, you shouldn't read it - please contact me immediately, destroy it, and do not copy or use any of the content of this email . No confidentiality or privilege is waived or lost by any mis-transmission or error. This communication does not designate an information system for the purposes of Part 4 of the Contract and Commercial Law Act 2017. Although we have taken reasonable precautions to ensure no viruses are present in this email, we cannot accept responsibility for any loss or damage arising from the use of this email or its attachments.
_______________________________________________ Net-snmp-users mailing list Net-snmp-users@lists.sourceforge.net Please see the following page to unsubscribe or change other options: https://lists.sourceforge.net/lists/listinfo/net-snmp-users