SNMP server #
Create a user library named snmphandler
.
Edit the oids
table and supply required OIDs and group address pairs. Base OID must match the configured OID in the resident script conf
.
Make sure that all mapped group addresses exist.
local oids = {
{ oid = '.1.3.6.1.4.1.53864.1.1.1.0', addr = '1/1/1' },
{ oid = '.1.3.6.1.4.1.53864.1.1.2.1.2.1', addr = '1/1/2' },
{ oid = '.1.3.6.1.4.1.53864.1.1.2.1.3.1', addr = '1/1/4' },
{ oid = '.1.3.6.1.4.1.53864.1.1.3.0', addr = '1/1/5' },
{ oid = '.1.3.6.1.4.1.53864.1.1.4.0', addr = '1/1/6' },
{ oid = '.1.3.6.1.4.1.53864.1.1.5.0', addr = '1/1/7' },
{ oid = '.1.3.6.1.4.1.53864.1.1.6.0', addr = '1/1/8' },
}
require('genohm-scada')
db = require('dbenv').new()
local req, oid = assert(arg[ 1 ]), assert(arg[ 2 ])
local function get(item)
if not item then
return
end
local obj = grp.find(item.addr)
if not obj then
return
end
local value = obj.value
local objtype = 'integer'
if type(value) == 'boolean' then
value = value and 1 or 0
elseif type(value) == 'number' then
value = math.round(value)
elseif type(value) ~= 'string' then
value = require('json').encode(value)
end
print(item.oid)
print(type(value) == 'number' and 'integer' or 'string')
print(value)
end
-- get
if req == '-g' then
for i, item in ipairs(oids) do
if item.oid == oid then
get(item)
break
end
end
-- next
elseif req == '-n' then
for i, item in ipairs(oids) do
if item.oid == oid then
get(oids[ i + 1 ])
break
elseif item.oid:find(oid, 1, true) == 1 then
get(item)
break
end
end
-- set
elseif req == '-s' then
local objtype, value = assert(arg[ 3 ]), assert(arg[ 4 ])
if objtype ~= 'string' then
value = tonumber(value)
end
for i, item in ipairs(oids) do
if item.oid == oid then
grp.write(item.addr, value)
end
end
end
Create a resident script with sleep time set to 5. Edit conf
variable as needed. In this example remote host is 192.168.1.230
, base OID is .1.3.6.1.4.1.53864.1.1
local conf = [[
rocommunity public 192.168.1.230
rwcommunity private 192.168.1.230
pass .1.3.6.1.4.1.53864.1.1 /usr/bin/lua /tmp/snmp.lua
]]
local script = [[
require('user.snmphandler')
]]
io.writefile('/tmp/snmpd.conf', conf)
io.writefile('/tmp/snmp.lua', script)
os.execute('killall snmpd; snmpd -c /tmp/snmpd.conf -f')
Note that disabling the script does not stop the snmp daemon. Either reboot or stop the snmpd
process in System config > Status > Running processes.