SNMP_Network_Interfaces fails when snmp returns MAC address in binary (SNMP STRING) format instead of the more typical HEX-STRING format
I've discovered an issue with the new SNMP_Network_Interfaces DataSource if it finds that a device returns MAC addresses in STRING (binary) format instead of the more typical HEX-STRING ("xx:xx:xx:xx:xx:xx") format. You can see the issue if you walk .1.3.6.1.2.1.2.2.1.6 and see MAC addresses that look like "Lr 3a#". We found this was happening to only a very few Cisco switches out of hundreds but when it happens the interface instance doesn't show up in LogicMonitor. I was able to add some code to the DataSource AD script to account for the problem as shown below. We have not yet implemented across everything yet but looks good so far. I did provide this over to LM Support.
It appears the LM snmp calls in groovy doesn't support forcing a particular outputs like hex-string. Also if anyone knows why Cisco equipment might not use hex-string in snmp queries for some almost-random ports I would be interested to know. Thanks!
<span class="pln">def extractInterfaces</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> options</span><span class="pun">,</span><span class="pln"> timeout</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
def ifTable </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[:]</span><span class="pln">
</span><span class="com">// Extract interfaces</span><span class="pln">
</span><span class="typ">Snmp</span><span class="pun">.</span><span class="pln">walkAsMap</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.2.2.1.6"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">,</span><span class="pln"> </span><span class="lit">160000</span><span class="pun">).</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> ifIndex</span><span class="pun">,</span><span class="pln"> mac </span><span class="pun">-></span><span class="pln">
def entry </span><span class="pun">=</span><span class="pln"> ifTable</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">ifIndex</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="str">"ifIndex"</span><span class="pun">:</span><span class="pln"> ifIndex</span><span class="pun">])</span><span class="pln">
</span><span class="com">//Check if we might have gotten the MAC in STRING (binary) format instead of HEX-STRING</span><span class="pln">
</span><span class="com">// and convert to hex format</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mac</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
byte</span><span class="pun">[]</span><span class="pln"> macByte </span><span class="pun">=</span><span class="pln"> mac
mac </span><span class="pun">=</span><span class="pln"> macByte</span><span class="pun">.</span><span class="pln">encodeHex</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">()</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
entry</span><span class="pun">.</span><span class="pln">mac </span><span class="pun">=</span><span class="pln"> mac
ifTable</span><span class="pun">[</span><span class="pln">ifIndex</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> entry
</span><span class="pun">}</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"type"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.2.2.1.3"</span><span class="pun">)</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"mtu"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.2.2.1.4"</span><span class="pun">)</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"highspeed"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.31.1.1.1.15"</span><span class="pun">)</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"description"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.2.2.1.2"</span><span class="pun">)</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"alias"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.31.1.1.1.18"</span><span class="pun">)</span><span class="pln">
getSnmpField</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> ifTable</span><span class="pun">,</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"1.3.6.1.2.1.2.2.1.2"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> ifTable
</span><span class="pun">}</span>