-- -- This file is part of SmartSNMP -- Copyright (C) 2014, Credo Semiconductor Inc. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License along -- with this program; if not, write to the Free Software Foundation, Inc., -- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -- local mib = require "smartsnmp" local uci = require "uci" -- System config local context = uci.cursor("/etc/config", "/tmp/.uci") -- scalar index local sysDesc = 1 local sysObjectID = 2 local sysUpTime = 3 local sysContact = 4 local sysName = 5 local sysLocation = 6 local sysServices = 7 local sysORLastChange = 8 -- table index local sysORTable = 9 -- entry index local sysOREntry = 1 -- list index local sysORIndex = 1 local sysORID = 2 local sysORDesc = 3 local sysORUpTime = 4 local startup_time = 0 local or_last_changed_time = 0 local function mib_system_startup(time) startup_time = time or_last_changed_time = time end mib_system_startup(os.time()) local sysGroup = {} local or_oid_cache = {} local or_index_cache = {} local or_table_cache = {} local or_table_reg = function (oid, desc) local row = {} row['oid'] = {} for i in string.gmatch(oid, "%d") do table.insert(row['oid'], tonumber(i)) end row['desc'] = desc row['uptime'] = os.time() table.insert(or_table_cache, row) or_last_changed_time = os.time() or_oid_cache[oid] = #or_table_cache or_index_cache = {} for i in ipairs(or_table_cache) do table.insert(or_index_cache, i) end end local or_table_unreg = function (oid) local or_idx = or_oid_cache[oid] if or_table_cache[or_idx] ~= nil then table.remove(or_table_cache, or_idx) or_last_changed_time = os.time() or_index_cache = {} for i in ipairs(or_table_cache) do table.insert(or_index_cache, i) end end end local last_load_time = os.time() local function need_to_reload() if os.difftime(os.time(), last_load_time) < 3 then return false else last_load_time = os.time() return true end end local function load_config() if need_to_reload() == true then context:load("smartsnmpd") end end context:load("smartsnmpd") local sysMethods = { ["or_table_reg"] = or_table_reg, ["or_table_unreg"] = or_table_unreg } mib.module_method_register(sysMethods) sysGroup = { rocommunity = 'public', [sysDesc] = mib.ConstString(function () load_config() return mib.sh_call("uname -a") end), [sysObjectID] = mib.ConstOid(function () load_config() local oid local objectid context:foreach("smartsnmpd", "smartsnmpd", function (s) objectid = s.objectid end) if objectid ~= nil then oid = {} for i in string.gmatch(objectid, "%d+") do table.insert(oid, tonumber(i)) end end return oid end), [sysUpTime] = mib.ConstTimeticks(function () load_config() return os.difftime(os.time(), startup_time) * 100 end), [sysContact] = mib.ConstString(function () load_config() local contact context:foreach("smartsnmpd", "smartsnmpd", function (s) contact = s.contact end) return contact end), [sysName] = mib.ConstString(function () load_config() return mib.sh_call("uname -n") end), [sysLocation] = mib.ConstString(function () load_config() local location context:foreach("smartsnmpd", "smartsnmpd", function (s) location = s.location end) return location end), [sysServices] = mib.ConstInt(function () load_config() local services context:foreach("smartsnmpd", "smartsnmpd", function (s) services = tonumber(s.services) end) return services end), [sysORLastChange] = mib.ConstTimeticks(function () load_config() return os.difftime(os.time(), or_last_changed_time) * 100 end), [sysORTable] = { [sysOREntry] = { [sysORIndex] = mib.UnaIndex(function () load_config() return or_index_cache end), [sysORID] = mib.ConstOid(function (i) load_config() return or_table_cache[i].oid end), [sysORDesc] = mib.ConstString(function (i) load_config() return or_table_cache[i].desc end), [sysORUpTime] = mib.ConstTimeticks(function (i) load_config() return os.difftime(os.time(), or_table_cache[i].uptime) * 100 end), } } } return sysGroup