All good things come in threes… consider the following code snippet that uses python-agentx:
axd.RegisterVar("a", 0) axd.RegisterVar("b", 1)
snmpwalk will show both a and b correctly. Now consider the following code:
snmpwalk will show a only. Which is a bug. Why?
python-agentx internally maintains “next OID” pointers with each registered variable, so it can tell clients using the SNMP “Get Next” command about the successor for a given OID. However, it always assumed that variables have not been registered before. Thus, the third
RegisterVar() call above, while not adding a second
a variable (not possible, because a Dictionary data structure is used underneath which enforces uniqueness among its keys), overwrote the first
a‘s “next OID” setting with the special value =None=. Thus, no reference to
b any more.
Obviously, the fix is to distinguish whether a variable has already been registered or not. In the first case, only its value needs updated, in the latter case the existing code.
You think registering a variable twice is a strange idea? Actually it’s not. Consider an API using stackable plugins: the first plugin registers a variable with a value “Unknown”, because it leaves the actual data retrieval to a more specialized second plugin, which registers the variable again, but with a proper value. Since the python-agentx API does not distinguish between registering and updating,
RegisterVar() needs the extension outlined above.
The patch can be found at Sourceforge Bug report #3519098.