+++ /dev/null
-#
-# Copyright (C) 2014 OpenWrt.org
-#
-# This is free software, licensed under the GNU General Public License v2.
-# See /LICENSE for more information.
-#
-
-include $(TOPDIR)/rules.mk
-
-PKG_NAME:=smartsnmpd
-PKG_VERSION:=2015-02-22
-PKG_RELEASE:=2
-
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/credosemi/smartsnmp
-PKG_SOURCE_VERSION:=ca1d455fd06748caa629fe7ad16a47cec8877b93
-PKG_MIRROR_HASH:=fda89ec37944b4f800eb3c0147678745b57f08c87f10d246d3c9d165a43418b4
-
-PKG_MAINTAINER:=Xiongfei Guo <xfguo@credosemi.com>
-PKG_LICENSE:=GPL-2.0-or-later
-PKG_LICENSE_FILES:=LICENSE
-
-PKG_BUILD_DEPENDS:=scons/host
-
-include $(INCLUDE_DIR)/package.mk
-include ../../devel/scons/scons.mk
-
-define Package/smartsnmpd
- SECTION:=net
- CATEGORY:=Network
- DEPENDS+=+lua +liblua +libubox +libuci-lua +libubus-lua
- TITLE:=Smart-SNMP (Agent)
- URL:=https://github.com/credosemi/smartsnmp
-endef
-
-define Package/smartsnmpd/description
-smartsnmpd is an implementation of SNMP Agent. Its goal is "Easily
-writing boring SNMP MIB with Lua". This package add native support
-for OpenWrt. Include using ubus and uci to get system info/status.
-And, it use libubox/uloop as low level event-driven library.
-endef
-
-ifeq ($(CONFIG_BIG_ENDIAN),y)
- TARGET_CFLAGS += -DBIG_ENDIAN
-else
- TARGET_CFLAGS += -DLITTLE_ENDIAN
-endif
-
-SCONS_OPTIONS += --transport=uloop
-
-define Build/Configure
- (cd $(PKG_BUILD_DIR); \
- $(SCONS_VARS) \
- CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
- scons \
- prefix=/usr \
- $(SCONS_OPTIONS) \
- )
-endef
-
-define Package/smartsnmpd/conffiles
-/etc/config/smartsnmpd
-endef
-
-define Package/smartsnmpd/install
- $(INSTALL_DIR) $(1)/usr/sbin
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/smartsnmpd $(1)/usr/sbin/smartsnmpd
-
- $(INSTALL_DIR) $(1)/usr/lib/lua/smartsnmp
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/smartsnmp/core.so $(1)/usr/lib/lua/smartsnmp/core.so
- $(INSTALL_BIN) $(PKG_BUILD_DIR)/lualib/smartsnmp/*.lua $(1)/usr/lib/lua/smartsnmp/
-
- $(INSTALL_DIR) $(1)/usr/lib/lua/smartsnmp/mibs
- $(INSTALL_BIN) ./files/mibs/*.lua $(1)/usr/lib/lua/smartsnmp/mibs/
-
- $(INSTALL_DIR) $(1)/etc/config
- $(INSTALL_DATA) ./files/smartsnmpd.conf $(1)/etc/config/smartsnmpd
-
- $(INSTALL_DIR) $(1)/etc/init.d
- $(INSTALL_BIN) ./files/smartsnmpd.init $(1)/etc/init.d/smartsnmpd
-endef
-
-$(eval $(call BuildPackage,smartsnmpd))
-
+++ /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 dummy = {}
-
-return dummy
+++ /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"
-require "ubus"
-require "uloop"
-
-uloop.init()
-
-local conn = ubus.connect()
-if not conn then
- error("Failed to connect to ubusd")
-end
-
-local if_cache = {}
-local if_status_cache = {}
-local if_index_cache = {}
-
-local last_load_time = os.time()
-local function need_to_reload()
- if os.time() - last_load_time >= 3 then
- last_load_time = os.time()
- return true
- else
- return false
- end
-end
-
-local function load_config()
- if need_to_reload() == true then
- if_cache = {}
- if_status_cache = {}
- if_index_cache = {}
-
- -- if description
- for k, v in pairs(conn:call("network.device", "status", {})) do
- if_status_cache[k] = {}
- end
-
- for name_ in pairs(if_status_cache) do
- for k, v in pairs(conn:call("network.device", "status", { name = name_ })) do
- if k == 'mtu' then
- if_status_cache[name_].mtu = v
- elseif k == 'macaddr' then
- if_status_cache[name_].macaddr = v
- elseif k == 'up' then
- if v == true then
- if_status_cache[name_].up = 1
- else
- if_status_cache[name_].up = 2
- end
- elseif k == 'statistics' then
- for item, stat in pairs(v) do
- if item == 'rx_bytes' then
- if_status_cache[name_].in_octet = stat
- elseif item == 'tx_bytes' then
- if_status_cache[name_].out_octet = stat
- elseif item == 'rx_errors' then
- if_status_cache[name_].in_errors = stat
- elseif item == 'tx_errors' then
- if_status_cache[name_].out_errors = stat
- elseif item == 'rx_dropped' then
- if_status_cache[name_].in_discards = stat
- elseif item == 'tx_dropped' then
- if_status_cache[name_].out_discards = stat
- end
- end
- end
- end
- end
-
- if_cache['desc'] = {}
- for name, status in pairs(if_status_cache) do
- table.insert(if_cache['desc'], name)
- for k, v in pairs(status) do
- if if_cache[k] == nil then if_cache[k] = {} end
- table.insert(if_cache[k], v)
- end
- end
-
- -- if index
- for i in ipairs(if_cache['desc']) do
- table.insert(if_index_cache, i)
- end
- end
-end
-
-mib.module_methods.or_table_reg("1.3.6.1.2.1.2", "The MIB module for managing Interfaces implementations")
-
-local ifGroup = {
- [1] = mib.ConstInt(function () load_config() return #if_index_cache end),
- [2] = {
- [1] = {
- [1] = mib.ConstIndex(function () load_config() return if_index_cache end),
- [2] = mib.ConstString(function (i) load_config() return if_cache['desc'][i] end),
- [4] = mib.ConstInt(function (i) load_config() return if_cache['mtu'][i] end),
- [6] = mib.ConstString(function (i) load_config() return if_cache['macaddr'][i] end),
- [8] = mib.ConstInt(function (i) load_config() return if_cache['up'][i] end),
- [10] = mib.ConstCount(function (i) load_config() return if_cache['in_octet'][i] end),
- [13] = mib.ConstCount(function (i) load_config() return if_cache['in_discards'][i] end),
- [14] = mib.ConstCount(function (i) load_config() return if_cache['in_errors'][i] end),
- [16] = mib.ConstCount(function (i) load_config() return if_cache['out_octet'][i] end),
- [19] = mib.ConstCount(function (i) load_config() return if_cache['out_discards'][i] end),
- [20] = mib.ConstCount(function (i) load_config() return if_cache['out_errors'][i] end),
- }
- }
-}
-
-return ifGroup
+++ /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
+++ /dev/null
-config smartsnmpd
- option port '161'
- option ro_community 'public'
- option rw_community 'private'
- option mib_module_path 'mibs'
- option objectid '1.2.3.4'
- option contact 'Me <me@example.org>'
- option location 'Shanghai'
- option services '72'
-
-config smartsnmpd_module
- option oid "1.3.6.1.2.1.1"
- option module 'system'
-
-config smartsnmpd_module
- option oid "1.3.6.1.2.1.2"
- option module 'interfaces'
-
-config smartsnmpd_module
- option oid "1.3.6.1.1"
- option module 'dummy'
+++ /dev/null
-#!/bin/sh /etc/rc.common
-# Copyright (C) 2014 OpenWrt.org
-
-START=97
-
-USE_PROCD=1
-PROG=/usr/sbin/smartsnmpd
-CONFIGFILE=/etc/smartsnmpd.conf
-
-smartsnmpd_mib_module() {
- local cfg="$1"
- config_get OID "$cfg" oid
- config_get MODULE "$cfg" module
- echo " ['$OID'] = '$MODULE'," >> $CONFIGFILE
-}
-
-start_service() {
- include /lib/functions
-
- config_load smartsnmpd
-
- procd_open_instance
- procd_set_param command $PROG -c $CONFIGFILE
- procd_set_param file $CONFIGFILE
- procd_set_param respawn
- procd_close_instance
-
- # before we can call xappend
- mkdir -p "$(dirname $CONFIGFILE)"
-
- echo "-- auto-generated config file from /etc/config/smartsnmpd" > $CONFIGFILE
-
- {
- config_get PORT smartsnmpd port 161
- echo "port = $PORT"
-
- config_get RO_COMMUNITY smartsnmpd ro_community 'public'
- config_get RW_COMMUNITY smartsnmpd rw_community 'private'
- echo "ro_community = '$RO_COMMUNITY'"
- echo "rw_community = '$RW_COMMUNITY'"
-
- config_get MIB_MODULE_PATH smartsnmpd mib_module_path '/usr/lib/lua/smartsnmp/mibs/'
- echo "mib_module_path = '$MIB_MODULE_PATH'"
-
- echo "mib_modules = {"
- config_foreach smartsnmpd_mib_module smartsnmpd_module
- echo "}"
- } >> $CONFIGFILE
-}
+++ /dev/null
---- a/SConstruct
-+++ b/SConstruct
-@@ -133,21 +133,21 @@ env = Environment(
- )
-
- # handle options/environment varibles.
--if os.environ.has_key('CC'):
-+if 'CC' in os.environ:
- env.Replace(CC = os.environ['CC'])
-
- # CFLAGS
- if GetOption("cflags") != "":
- env.Append(CFLAGS = GetOption("cflags"))
--elif os.environ.has_key('CFLAGS'):
-+elif 'CFLAGS' in os.environ:
- env.Append(CFLAGS = os.environ['CFLAGS'])
-
- # LDFLAGS
- if GetOption("ldflags") != "":
- env.Replace(LINKFLAGS = GetOption("ldflags"))
--elif os.environ.has_key('LDFLAGS'):
-+elif 'LDFLAGS' in os.environ:
- env.Replace(LINKFLAGS = os.environ['LDFLAGS'])
--elif os.environ.has_key('LINKFLAGS'):
-+elif 'LINKFLAGS' in os.environ:
- env.Replace(LINKFLAGS = os.environ['LINKFLAGS'])
-
- # LIBS
-@@ -183,10 +183,10 @@ elif GetOption("transport") == 'built-in' or GetOption("transport") == '':
- elif GetOption("evloop") == 'select' or GetOption("evloop") == '':
- pass
- else:
-- print "Error: Not the right event driving type"
-+ print("Error: Not the right event driving type")
- Exit(1)
- else:
-- print "Error: Transport not found!"
-+ print("Error: Transport not found!")
- Exit(1)
-
- # autoconf
-@@ -205,18 +205,18 @@ else:
- if GetOption("transport") == 'built-in' or GetOption("transport") == '':
- if GetOption("evloop") == 'epoll':
- if not conf.CheckEpoll():
-- print "Error: epoll failed"
-+ print("Error: epoll failed")
- Exit(1)
- elif GetOption("evloop") == 'kqueue':
- if not conf.CheckKqueue():
-- print "Error: Kqueue failed"
-+ print("Error: Kqueue failed")
- Exit(1)
- elif GetOption("evloop") == 'select' or GetOption("evloop") == '':
- if not conf.CheckSelect():
-- print "Error: select failed"
-+ print("Error: select failed")
- Exit(1)
- else:
-- print "Error: Not the right event driving type"
-+ print("Error: Not the right event driving type")
- Exit(1)
-
- # CFLAGS
-@@ -232,7 +232,7 @@ if conf.CheckLib('lua'):
- elif conf.CheckLib('lua5.1'):
- env.Append(LIBS = ['lua5.1'])
- else:
-- print "Error: liblua or liblua5.1 not found!"
-+ print("Error: liblua or liblua5.1 not found!")
- Exit(1)
-
- # find lua header files
-@@ -241,7 +241,7 @@ if conf.CheckCHeader('lua.h'):
- elif conf.CheckCHeader('lua5.1/lua.h'):
- env.Append(CFLAGS = ['-I/usr/include/lua5.1'])
- else:
-- print "Error: lua.h not found"
-+ print("Error: lua.h not found")
- Exit(1)
-
- env = conf.Finish()
+++ /dev/null
---- a/SConstruct
-+++ b/SConstruct
-@@ -134,21 +134,21 @@ env = Environment(
-
- # handle options/environment varibles.
- if 'CC' in os.environ:
-- env.Replace(CC = os.environ['CC'])
-+ env.Replace(CC = Split(os.environ['CC']))
-
- # CFLAGS
- if GetOption("cflags") != "":
- env.Append(CFLAGS = GetOption("cflags"))
- elif 'CFLAGS' in os.environ:
-- env.Append(CFLAGS = os.environ['CFLAGS'])
-+ env.Append(CFLAGS = Split(os.environ['CFLAGS']))
-
- # LDFLAGS
- if GetOption("ldflags") != "":
- env.Replace(LINKFLAGS = GetOption("ldflags"))
- elif 'LDFLAGS' in os.environ:
-- env.Replace(LINKFLAGS = os.environ['LDFLAGS'])
-+ env.Replace(LINKFLAGS = Split(os.environ['LDFLAGS']))
- elif 'LINKFLAGS' in os.environ:
-- env.Replace(LINKFLAGS = os.environ['LINKFLAGS'])
-+ env.Replace(LINKFLAGS = Split(os.environ['LINKFLAGS']))
-
- # LIBS
- if GetOption("libs") != "":
-@@ -192,15 +192,6 @@ else:
- # autoconf
- conf = Configure(env, custom_tests = {'CheckEpoll' : CheckEpoll, 'CheckSelect' : CheckSelect, 'CheckKqueue' : CheckKqueue, 'CheckEndian' : CheckEndian})
-
--# Endian check
--endian = conf.CheckEndian()
--if endian == 'Big':
-- env.Append(CFLAGS = ["-DBIG_ENDIAN"])
--elif endian == 'Little':
-- env.Append(CFLAGS = ["-DLITTLE_ENDIAN"])
--else:
-- raise SConfError("Error when testing the endian.")
--
- # built-in event loop check
- if GetOption("transport") == 'built-in' or GetOption("transport") == '':
- if GetOption("evloop") == 'epoll':