+--
+-- 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