+++ /dev/null
---
--- 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