diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2010-10-12 05:28:49 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2010-10-12 05:28:49 +0000 |
commit | 5c2000a1572afd0df74339775dfa8b61e287a53e (patch) | |
tree | d6d7648afe87f9c128a497f2590a0399fa9abbb0 /libs/uci | |
parent | 2472cd5613cf5dfc5760c084c8094bead7ddb507 (diff) |
libs: merge libs/uci into libs/core
Diffstat (limited to 'libs/uci')
-rw-r--r-- | libs/uci/luasrc/model/uci.lua | 345 | ||||
-rw-r--r-- | libs/uci/luasrc/model/uci/bind.lua | 173 | ||||
-rw-r--r-- | libs/uci/root/etc/config/ucitrack | 48 | ||||
-rwxr-xr-x | libs/uci/root/sbin/luci-reload | 40 |
4 files changed, 0 insertions, 606 deletions
diff --git a/libs/uci/luasrc/model/uci.lua b/libs/uci/luasrc/model/uci.lua deleted file mode 100644 index 66bd0a026..000000000 --- a/libs/uci/luasrc/model/uci.lua +++ /dev/null @@ -1,345 +0,0 @@ ---[[ -LuCI - UCI model - -Description: -Generalized UCI model - -FileId: -$Id$ - -License: -Copyright 2008 Steven Barth <steven@midlink.org> - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- -local os = require "os" -local uci = require "uci" -local util = require "luci.util" -local table = require "table" - - -local setmetatable, rawget, rawset = setmetatable, rawget, rawset -local error, pairs, ipairs, tostring = error, pairs, ipairs, tostring -local require, getmetatable, type = require, getmetatable, type - ---- LuCI UCI model library. --- The typical workflow for UCI is: Get a cursor instance from the --- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), --- save the changes to the staging area via Cursor.save and finally --- Cursor.commit the data to the actual config files. --- LuCI then needs to Cursor.apply the changes so deamons etc. are --- reloaded. --- @cstyle instance -module "luci.model.uci" - ---- Create a new UCI-Cursor. --- @class function --- @name cursor --- @return UCI-Cursor -cursor = uci.cursor - -APIVERSION = uci.APIVERSION - ---- Create a new Cursor initialized to the state directory. --- @return UCI cursor -function cursor_state() - return cursor(nil, "/var/state") -end - - -inst = cursor() -inst_state = cursor_state() - -local Cursor = getmetatable(inst) - ---- Applies UCI configuration changes --- @param configlist List of UCI configurations --- @param command Don't apply only return the command -function Cursor.apply(self, configlist, command) - configlist = self:_affected(configlist) - local reloadcmd = "/sbin/luci-reload " .. table.concat(configlist, " ") - - return command and reloadcmd or os.execute(reloadcmd .. " >/dev/null 2>&1") -end - - ---- Delete all sections of a given type that match certain criteria. --- @param config UCI config --- @param type UCI section type --- @param comparator Function that will be called for each section and --- returns a boolean whether to delete the current section (optional) -function Cursor.delete_all(self, 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 - ---- Create a new section and initialize it with data. --- @param config UCI config --- @param type UCI section type --- @param name UCI section name (optional) --- @param values Table of key - value pairs to initialize the section with --- @return Name of created section -function Cursor.section(self, 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 - ---- Updated the data of a section using data from a table. --- @param config UCI config --- @param section UCI section name (optional) --- @param values Table of key - value pairs to update the section with -function Cursor.tset(self, 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 - ---- Get a boolean option and return it's value as true or false. --- @param config UCI config --- @param section UCI section name --- @param option UCI option --- @return Boolean -function Cursor.get_bool(self, ...) - local val = self:get(...) - return ( val == "1" or val == "true" or val == "yes" or val == "on" ) -end - ---- Get an option or list and return values as table. --- @param config UCI config --- @param section UCI section name --- @param option UCI option --- @return UCI value -function Cursor.get_list(self, 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 nil -end - ---- Set given values as list. --- @param config UCI config --- @param section UCI section name --- @param option UCI option --- @param value UCI value --- @return Boolean whether operation succeeded -function Cursor.set_list(self, config, section, option, value) - if config and section and option then - return self:set( - config, section, option, - ( type(value) == "table" and value or { value } ) - ) - end - return false -end - --- Return a list of initscripts affected by configuration changes. -function Cursor._affected(self, configlist) - configlist = type(configlist) == "table" and configlist or {configlist} - - local c = cursor() - c:load("ucitrack") - - -- Resolve dependencies - local reloadlist = {} - - local function _resolve_deps(name) - local reload = {name} - local deps = {} - - c:foreach("ucitrack", name, - function(section) - if section.affects then - for i, aff in ipairs(section.affects) do - deps[#deps+1] = aff - end - end - end) - - for i, dep in ipairs(deps) do - for j, add in ipairs(_resolve_deps(dep)) do - reload[#reload+1] = add - end - end - - return reload - end - - -- Collect initscripts - for j, config in ipairs(configlist) do - for i, e in ipairs(_resolve_deps(config)) do - if not util.contains(reloadlist, e) then - reloadlist[#reloadlist+1] = e - end - end - end - - return reloadlist -end - - ---- Add an anonymous section. --- @class function --- @name Cursor.add --- @param config UCI config --- @param type UCI section type --- @return Name of created section - ---- Get a table of saved but uncommitted changes. --- @class function --- @name Cursor.changes --- @param config UCI config --- @return Table of changes --- @see Cursor.save - ---- Commit saved changes. --- @class function --- @name Cursor.commit --- @param config UCI config --- @return Boolean whether operation succeeded --- @see Cursor.revert --- @see Cursor.save - ---- Deletes a section or an option. --- @class function --- @name Cursor.delete --- @param config UCI config --- @param section UCI section name --- @param option UCI option (optional) --- @return Boolean whether operation succeeded - ---- Call a function for every section of a certain type. --- @class function --- @name Cursor.foreach --- @param config UCI config --- @param type UCI section type --- @param callback Function to be called --- @return Boolean whether operation succeeded - ---- Get a section type or an option --- @class function --- @name Cursor.get --- @param config UCI config --- @param section UCI section name --- @param option UCI option (optional) --- @return UCI value - ---- Get all sections of a config or all values of a section. --- @class function --- @name Cursor.get_all --- @param config UCI config --- @param section UCI section name (optional) --- @return Table of UCI sections or table of UCI values - ---- Manually load a config. --- @class function --- @name Cursor.load --- @param config UCI config --- @return Boolean whether operation succeeded --- @see Cursor.save --- @see Cursor.unload - ---- Revert saved but uncommitted changes. --- @class function --- @name Cursor.revert --- @param config UCI config --- @return Boolean whether operation succeeded --- @see Cursor.commit --- @see Cursor.save - ---- Saves changes made to a config to make them committable. --- @class function --- @name Cursor.save --- @param config UCI config --- @return Boolean whether operation succeeded --- @see Cursor.load --- @see Cursor.unload - ---- Set a value or create a named section. --- @class function --- @name Cursor.set --- @param config UCI config --- @param section UCI section name --- @param option UCI option or UCI section type --- @param value UCI value or nil if you want to create a section --- @return Boolean whether operation succeeded - ---- Get the configuration directory. --- @class function --- @name Cursor.get_confdir --- @return Configuration directory - ---- Get the directory for uncomitted changes. --- @class function --- @name Cursor.get_savedir --- @return Save directory - ---- Set the configuration directory. --- @class function --- @name Cursor.set_confdir --- @param directory UCI configuration directory --- @return Boolean whether operation succeeded - ---- Set the directory for uncommited changes. --- @class function --- @name Cursor.set_savedir --- @param directory UCI changes directory --- @return Boolean whether operation succeeded - ---- Discard changes made to a config. --- @class function --- @name Cursor.unload --- @param config UCI config --- @return Boolean whether operation succeeded --- @see Cursor.load --- @see Cursor.save diff --git a/libs/uci/luasrc/model/uci/bind.lua b/libs/uci/luasrc/model/uci/bind.lua deleted file mode 100644 index 9472dabeb..000000000 --- a/libs/uci/luasrc/model/uci/bind.lua +++ /dev/null @@ -1,173 +0,0 @@ ---[[ -LuCI - UCI utilities for model classes - -Copyright 2009 Jo-Philipp Wich <xm@subsignal.org> - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- - -local assert, pairs, type = assert, pairs, type -local utl = require "luci.util" - -module "luci.model.uci.bind" - -bind = utl.class() - -function bind.__init__(self, config, cursor) - assert(config, "call to bind() without config file") - self.cfg = config - self.uci = cursor -end - -function bind.init(self, cursor) - assert(cursor, "call to init() without uci cursor") - self.uci = cursor -end - -function bind.section(self, stype) - local x = utl.class(bsection) - x.__init__ = function(inst, sid) - assert(self.uci:get(self.cfg, sid) == stype, - "attempt to instantiate bsection(%q) of wrong type, expected %q" - % { sid, stype }) - - inst.bind = self - inst.stype = stype - inst.sid = sid - - if inst._init then - inst:_init(sid) - end - end - return x -end - -function bind.usection(self, stype) - local x = utl.class(bsection) - x.__init__ = function(inst) - inst.bind = self - inst.stype = stype - inst.sid = true - end - return x() -end - -function bind.list(self, list, add, rem) - local lookup = { } - - if type(list) == "string" then - local item - for item in list:gmatch("%S+") do - lookup[item] = true - end - - elseif type(list) == "table" then - local item - for _, item in pairs(list) do - lookup[item] = true - end - end - - if add then lookup[add] = true end - if rem then lookup[rem] = nil end - - return utl.keys(lookup) -end - -function bind.bool(self, v) - return ( v == "1" or v == "true" or v == "yes" or v == "on" ) -end - - -bsection = utl.class() - -function bsection.uciop(self, op, ...) - assert(self.bind and self.bind.uci, - "attempt to use unitialized binding") - - if op then - return self.bind.uci[op](self.bind.uci, self.bind.cfg, ...) - else - return self.bind.uci - end -end - -function bsection.get(self, k, c) - local v - if type(c) == "string" then - v = self:uciop("get", c, k) - else - self:uciop("foreach", self.stype, - function(s) - if type(c) == "table" then - local ck, cv - for ck, cv in pairs(c) do - if s[ck] ~= cv then return true end - end - end - if k ~= nil then - v = s[k] - else - v = s - end - return false - end) - end - return v -end - -function bsection.set(self, k, v, c) - local stat - if type(c) == "string" then - if type(v) == "table" and #v == 0 then - stat = self:uciop("delete", c, k) - else - stat = self:uciop("set", c, k, v) - end - else - self:uciop("foreach", self.stype, - function(s) - if type(c) == "table" then - local ck, cv - for ck, cv in pairs(c) do - if s[ck] ~= cv then return true end - end - end - stat = self:uciop("set", c, k, v) - return false - end) - end - return stat or false -end - -function bsection.property(self, k, n) - self[n or k] = function(c, val) - if val == nil then - return c:get(k, c.sid) - else - return c:set(k, val, c.sid) - end - end -end - -function bsection.property_bool(self, k, n) - self[n or k] = function(c, val) - if val == nil then - return bind:bool(c:get(k, c.sid)) - else - return c:set(k, bind:bool(val) and "1" or "0", c.sid) - end - end -end - diff --git a/libs/uci/root/etc/config/ucitrack b/libs/uci/root/etc/config/ucitrack deleted file mode 100644 index 7b47cc8d5..000000000 --- a/libs/uci/root/etc/config/ucitrack +++ /dev/null @@ -1,48 +0,0 @@ -config network - option init network - list affects dhcp - -config wireless - list affects network - -config firewall - option init firewall - list affects luci-splash - list affects qos - -config olsr - option init olsrd - -config dhcp - option init dnsmasq - -config dropbear - option init dropbear - -config httpd - option init httpd - -config fstab - option init fstab - -config qos - option init qos - -config system - option init led - list affects luci_statistics - -config luci_splash - option init luci_splash - -config upnpd - option init miniupnpd - -config ntpclient - option init ntpclient - -config samba - option init samba - -config tinyproxy - option init tinyproxy diff --git a/libs/uci/root/sbin/luci-reload b/libs/uci/root/sbin/luci-reload deleted file mode 100755 index 24cf76064..000000000 --- a/libs/uci/root/sbin/luci-reload +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh -. /etc/functions.sh - -apply_config() { - config_get init "$1" init - config_get exec "$1" exec - config_get test "$1" test - - echo "$2" > "/var/run/luci-reload-status" - - [ -n "$init" ] && reload_init "$2" "$init" "$test" - [ -n "$exec" ] && reload_exec "$2" "$exec" "$test" -} - -reload_exec() { - [ -x $2 ] && { - echo "Reloading $1... " - $2 >/dev/null 2>&1 - [ -n "$3" -a "$?" != "$3" ] && echo '!!! Failed to reload' $1 '!!!' - } -} - -reload_init() { - [ -x /etc/init.d/$2 ] && /etc/init.d/$2 enabled && { - echo "Reloading $1... " - /etc/init.d/$2 reload >/dev/null 2>&1 - [ -n "$3" -a "$?" != "$3" ] && echo '!!! Failed to reload' $1 '!!!' - } -} - -lock "/var/run/luci-reload" - -config_load ucitrack - -for i in $*; do - config_foreach apply_config $i $i -done - -rm -f "/var/run/luci-reload-status" -lock -u "/var/run/luci-reload" |