diff --git a/libs/lua-simple-uci/Makefile b/libs/lua-simple-uci/Makefile new file mode 100644 index 0000000..445c481 --- /dev/null +++ b/libs/lua-simple-uci/Makefile @@ -0,0 +1,28 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=lua-simple-uci +PKG_VERSION:=1 + +PKG_LICENSE:=APL2 + +include $(INCLUDE_DIR)/package.mk + +define Package/lua-simple-uci + SECTION:=libs + CATEGORY:=Libraries + TITLE:=Useful functions for accessing uci using lua + DEPENDS:=+libuci-lua +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/lua-simple-uci/install + $(INSTALL_DIR) $(1)/usr/lib/lua + $(INSTALL_DATA) src/simple-uci.lua $(1)/usr/lib/lua/ +endef + +$(eval $(call BuildPackage,lua-simple-uci)) diff --git a/libs/lua-simple-uci/src/simple-uci.lua b/libs/lua-simple-uci/src/simple-uci.lua new file mode 100644 index 0000000..094f968 --- /dev/null +++ b/libs/lua-simple-uci/src/simple-uci.lua @@ -0,0 +1,141 @@ +-- Copyright 2008 Steven Barth +-- Copyright 2015 Nils Schneider +-- Licensed to the public under the Apache License 2.0. +-- +-- This is basically everything useful from luci.model.uci +-- without any luci dependency. + +local uci = require "uci" +local table = require "table" + +local getmetatable = getmetatable +local next, pairs, ipairs = next, pairs, ipairs +local type, tonumber = type, tonumber + +module "simple-uci" + +cursor = uci.cursor + +APIVERSION = uci.APIVERSION + +local Cursor = getmetatable(cursor()) + + +local uciset = Cursor.set + +function Cursor:set(config, section, option, value) + if value ~= nil then + if type(value) == 'boolean' then + value = value and '1' or '0' + end + + return uciset(self, config, section, option, value) + else + return uciset(self, config, section, option) + end +end + +-- returns a boolean whether to delete the current section (optional) +function Cursor:delete_all(config, stype, comparator) + local del = {} + + if type(comparator) == "table" then + local tbl = comparator + comparator = function(section) + for k, v in pairs(tbl) do + if section[k] ~= v then + return false + end + end + return true + end + end + + local function helper (section) + + if not comparator or comparator(section) then + del[#del+1] = section[".name"] + end + end + + self:foreach(config, stype, helper) + + for i, j in ipairs(del) do + self:delete(config, j) + end +end + +function Cursor:section(config, type, name, values) + local stat = true + if name then + stat = self:set(config, name, type) + else + name = self:add(config, type) + stat = name and true + end + + if stat and values then + stat = self:tset(config, name, values) + end + + return stat and name +end + +function Cursor:tset(config, section, values) + local stat = true + for k, v in pairs(values) do + if k:sub(1, 1) ~= "." then + stat = stat and self:set(config, section, k, v) + end + end + return stat +end + +function Cursor:get_bool(...) + local val = self:get(...) + return ( val == "1" or val == "true" or val == "yes" or val == "on" ) +end + +function Cursor:get_list(config, section, option) + if config and section and option then + local val = self:get(config, section, option) + return ( type(val) == "table" and val or { val } ) + end + return {} +end + +function Cursor:get_first(conf, stype, opt, def) + local rv = def + + self:foreach(conf, stype, + function(s) + local val = not opt and s['.name'] or s[opt] + + if type(def) == "number" then + val = tonumber(val) + elseif type(def) == "boolean" then + val = (val == "1" or val == "true" or + val == "yes" or val == "on") + end + + if val ~= nil then + rv = val + return false + end + end) + + return rv +end + +function Cursor:set_list(config, section, option, value) + if config and section and option then + if not value or #value == 0 then + return self:delete(config, section, option) + end + return self:set( + config, section, option, + (type(value) == "table" and value or { value }) + ) + end + return false +end