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.