luci-base: do not assume a fixed host address in delegated prefix (#1484)
[project/luci.git] / modules / luci-base / luasrc / model / uci.lua
index a394563047c37e2567325d4fee0d75c08e491ab2..577c6cde08eaa6e10887c97b26fed000f3289070 100644 (file)
@@ -1,28 +1,6 @@
---[[
-LuCI - UCI model
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
 
-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"
@@ -34,26 +12,18 @@ local require, getmetatable = require, getmetatable
 local error, pairs, ipairs = error, pairs, ipairs
 local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
 
---- 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
@@ -64,9 +34,6 @@ 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)
        if command then
@@ -78,10 +45,6 @@ function Cursor.apply(self, configlist, command)
 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 = {}
@@ -112,12 +75,6 @@ function Cursor.delete_all(self, config, stype, comparator)
        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
@@ -134,10 +91,6 @@ function Cursor.section(self, config, type, name, values)
        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
@@ -148,35 +101,19 @@ function Cursor.tset(self, config, section, values)
        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
+       return {}
 end
 
---- Get the given option from the first section with the given type.
--- @param config       UCI config
--- @param type         UCI section type
--- @param option       UCI option (optional)
--- @param default      Default value (optional)
--- @return                     UCI value
 function Cursor.get_first(self, conf, stype, opt, def)
        local rv = def
 
@@ -200,14 +137,11 @@ function Cursor.get_first(self, conf, stype, opt, def)
        return rv
 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
+               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 } )
@@ -260,10 +194,8 @@ function Cursor._affected(self, configlist)
        return reloadlist
 end
 
---- Create a sub-state of this cursor. The sub-state is tied to the parent
 -- curser, means it the parent unloads or loads configs, the sub state will
 -- do so as well.
--- @return                     UCI state cursor tied to the parent cursor
 function Cursor.substate(self)
        Cursor._substates = Cursor._substates or { }
        Cursor._substates[self] = Cursor._substates[self] or cursor_state()
@@ -287,118 +219,18 @@ function Cursor.unload(self, ...)
 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+