summaryrefslogtreecommitdiffhomepage
path: root/libs/uci
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2010-10-12 05:28:49 +0000
committerJo-Philipp Wich <jow@openwrt.org>2010-10-12 05:28:49 +0000
commit5c2000a1572afd0df74339775dfa8b61e287a53e (patch)
treed6d7648afe87f9c128a497f2590a0399fa9abbb0 /libs/uci
parent2472cd5613cf5dfc5760c084c8094bead7ddb507 (diff)
libs: merge libs/uci into libs/core
Diffstat (limited to 'libs/uci')
-rw-r--r--libs/uci/luasrc/model/uci.lua345
-rw-r--r--libs/uci/luasrc/model/uci/bind.lua173
-rw-r--r--libs/uci/root/etc/config/ucitrack48
-rwxr-xr-xlibs/uci/root/sbin/luci-reload40
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"