Thursday, July 22, 2010
An update to a quick note on embedding languages within languages
In making this comment I came across this old post of mine from 2007 where I lament the amount of code required to query SNMP values in C. I took one look at the code I wanted:
OID sys = SNMPv2-MIB::sysObjectID.0; if (sys == SNMPv2-SMI::enterprises.5567.1.1) /* riverstone */ { IpAddress destination[] = IP-MIB::ip.24.4.1.1; IpAddress mask[] = IP-MIB::ip.24.4.1.2; IpAddress nexthop[] = IP-MIB::ip.24.4.1.4; int protocol[] = IP-MIB::ip.24.4.1.7; int age[] = IP-MIB::ip.24.4.1.8; int metric[] = IP-MIB::ip.24.4.1.11; int type[] = IP-MIB::ip.24.4.1.6; } else if (sys == SNMPv2-SMI::enterprises.9.1) /* cisco */ { IpAddress destination[] = RFC1213-MIB::ipRouteDest; IpAddress mask[] = RFC1213-MIB::ipRouteMask; IpAddress nexthop[] = RFC1213-MIB::ipRouteNextHop; int protocol[] = RFC1213-MIB::ipRouteProto; int age[] = RFC1213-MIB::ipRouteAge; int metric[] = RFC1213-MIB::ipRouteMetric1; int type[] = RFC1213-MIB::ipRouteType; } for (i = 0 ; i < destination.length; i++) { print( destination[i], mask[i], nexthop[i], snmp.protocol(protocol[i]), metric[i], age[i] ); }
and remembered—I did that!
Yup. Back in September of 2009 when I first started playing around with Lua. I installed the SNMP bindings for Lua and wrote the following:
#!/usr/local/bin/lua -- http://luasnmp.luaforge.net/snmp.html snmp = require "snmp" OID = snmp.mib.oid routeprotos = { "other ", "local ", "netmgmt ", "redirect ", "egp ", "ggp ", "hello ", "rip ", "is-is ", "es-is ", "igrp ", "bbnspf ", "ospf ", "bgp " } print(" Dest Mask NextHop Proto Metric Age") print("-------------------------------------------------------------------------------") router = assert(snmp.open{ peer = arg[1] or "XXXXXXXXXXXXXXXXXXXXXXXXX" , community = arg[2] or "XXXXXXXXX" }) cisco = OID "SNMPv2-SMI::enterprises.9.1" riverstone = OID "SNMPv2-SMI::enterprises.5567.1.1" sysid = router["SNMPv2-MIB::sysObjectID.0"] if string.find(sysid,cisco,1,true) then shouldbe = OID "RFC1213-MIB::ipRouteDest" result = { { oid = "RFC1213-MIB::ipRouteDest" } , { oid = "RFC1213-MIB::ipRouteMask" } , { oid = "RFC1213-MIB::ipRouteNextHop" } , { oid = "RFC1213-MIB::ipRouteProto" } , { oid = "RFC1213-MIB::ipRouteMetric1" } , { oid = "RFC1213-MIB::ipRouteAge" } , } elseif string.find(sysid,riverstone,1,true) then shouldbe = OID "IP-MIB::ip.24.4.1.1" result = { { oid = "IP-MIB::ip.24.4.1.1" } , { oid = "IP-MIB::ip.24.4.1.2" } , { oid = "IP-MIB::ip.24.4.1.4" } , { oid = "IP-MIB::ip.24.4.1.7" } , { oid = "IP-MIB::ip.24.4.1.11" } , { oid = "IP-MIB::ip.24.4.1.8" } , } end repeat result,err = snmp.getnext(router,result); if result ~= nil then if string.find(result[1].oid,shouldbe,1,true) == nil then break end print(string.format("%-16s",result[1].value) .. string.format("%-16s",result[2].value) .. string.format("%-16s",result[3].value) .. routeprotos[result[4].value] .. string.format("%-6d",result[5].value) .. string.format("%-6d",result[6].value) ) end until false os.exit(0)