summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-base/luasrc/model
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-09-13 23:50:12 +0200
committerJo-Philipp Wich <jo@mein.io>2022-10-25 01:03:37 +0200
commit673f38246ac3548caefec41183e3dd7477d9f6f6 (patch)
treeb3b7682b14d8a81286f8b7fe2aa5239e5dfbf4b7 /modules/luci-base/luasrc/model
parentded8ccf93ec5163be35c41501869110e5dab30d1 (diff)
treewide: separate Lua runtime resources
Move classes required for Lua runtime support into a new `luci-lua-runtime` package. Also replace the `luci.http` and `luci.util` classes in `luci-lib-base` with stubbed versions interacting with the ucode based runtime environment. Finally merge `luci-base-ucode` into the remainders of `luci-base`. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'modules/luci-base/luasrc/model')
-rw-r--r--modules/luci-base/luasrc/model/uci.lua508
-rw-r--r--modules/luci-base/luasrc/model/uci.luadoc369
2 files changed, 0 insertions, 877 deletions
diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua
deleted file mode 100644
index 816f6f2053..0000000000
--- a/modules/luci-base/luasrc/model/uci.lua
+++ /dev/null
@@ -1,508 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local os = require "os"
-local util = require "luci.util"
-local table = require "table"
-
-
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
-local require, getmetatable, assert = require, getmetatable, assert
-local error, pairs, ipairs, select = error, pairs, ipairs, select
-local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
-
--- 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 daemons etc. are
--- reloaded.
-module "luci.model.uci"
-
-local ERRSTR = {
- "Invalid command",
- "Invalid argument",
- "Method not found",
- "Entry not found",
- "No data",
- "Permission denied",
- "Timeout",
- "Not supported",
- "Unknown error",
- "Connection failed"
-}
-
-local session_id = nil
-
-local function call(cmd, args)
- if type(args) == "table" and session_id then
- args.ubus_rpc_session = session_id
- end
- return util.ubus("uci", cmd, args)
-end
-
-
-function cursor()
- return _M
-end
-
-function cursor_state()
- return _M
-end
-
-function substate(self)
- return self
-end
-
-
-function get_confdir(self)
- return "/etc/config"
-end
-
-function get_savedir(self)
- return "/tmp/.uci"
-end
-
-function get_session_id(self)
- return session_id
-end
-
-function set_confdir(self, directory)
- return false
-end
-
-function set_savedir(self, directory)
- return false
-end
-
-function set_session_id(self, id)
- session_id = id
- return true
-end
-
-
-function load(self, config)
- return true
-end
-
-function save(self, config)
- return true
-end
-
-function unload(self, config)
- return true
-end
-
-
-function changes(self, config)
- local rv, err = call("changes", { config = config })
-
- if type(rv) == "table" and type(rv.changes) == "table" then
- return rv.changes
- elseif err then
- return nil, ERRSTR[err]
- else
- return { }
- end
-end
-
-
-function revert(self, config)
- local _, err = call("revert", { config = config })
- return (err == nil), ERRSTR[err]
-end
-
-function commit(self, config)
- local _, err = call("commit", { config = config })
- return (err == nil), ERRSTR[err]
-end
-
-function apply(self, rollback)
- local _, err
-
- if rollback then
- local sys = require "luci.sys"
- local conf = require "luci.config"
- local timeout = tonumber(conf and conf.apply and conf.apply.rollback or 90) or 0
-
- _, err = call("apply", {
- timeout = (timeout > 90) and timeout or 90,
- rollback = true
- })
-
- if not err then
- local now = os.time()
- local token = sys.uniqueid(16)
-
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = {
- rollback = {
- token = token,
- session = session_id,
- timeout = now + timeout
- }
- }
- })
-
- return token
- end
- else
- _, err = call("changes", {})
-
- if not err then
- if type(_) == "table" and type(_.changes) == "table" then
- local k, v
- for k, v in pairs(_.changes) do
- _, err = call("commit", { config = k })
- if err then
- break
- end
- end
- end
- end
-
- if not err then
- _, err = call("apply", { rollback = false })
- end
- end
-
- return (err == nil), ERRSTR[err]
-end
-
-function confirm(self, token)
- local is_pending, time_remaining, rollback_sid, rollback_token = self:rollback_pending()
-
- if is_pending then
- if token ~= rollback_token then
- return false, "Permission denied"
- end
-
- local _, err = util.ubus("uci", "confirm", {
- ubus_rpc_session = rollback_sid
- })
-
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = { rollback = {} }
- })
- end
-
- return (err == nil), ERRSTR[err]
- end
-
- return false, "No data"
-end
-
-function rollback(self)
- local is_pending, time_remaining, rollback_sid = self:rollback_pending()
-
- if is_pending then
- local _, err = util.ubus("uci", "rollback", {
- ubus_rpc_session = rollback_sid
- })
-
- if not err then
- util.ubus("session", "set", {
- ubus_rpc_session = "00000000000000000000000000000000",
- values = { rollback = {} }
- })
- end
-
- return (err == nil), ERRSTR[err]
- end
-
- return false, "No data"
-end
-
-function rollback_pending(self)
- local rv, err = util.ubus("session", "get", {
- ubus_rpc_session = "00000000000000000000000000000000",
- keys = { "rollback" }
- })
-
- local now = os.time()
-
- if type(rv) == "table" and
- type(rv.values) == "table" and
- type(rv.values.rollback) == "table" and
- type(rv.values.rollback.token) == "string" and
- type(rv.values.rollback.session) == "string" and
- type(rv.values.rollback.timeout) == "number" and
- rv.values.rollback.timeout > now
- then
- return true,
- rv.values.rollback.timeout - now,
- rv.values.rollback.session,
- rv.values.rollback.token
- end
-
- return false, ERRSTR[err]
-end
-
-
-function foreach(self, config, stype, callback)
- if type(callback) == "function" then
- local rv, err = call("get", {
- config = config,
- type = stype
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- local sections = { }
- local res = false
- local index = 1
-
- local _, section
- for _, section in pairs(rv.values) do
- section[".index"] = section[".index"] or index
- sections[index] = section
- index = index + 1
- end
-
- table.sort(sections, function(a, b)
- return a[".index"] < b[".index"]
- end)
-
- for _, section in ipairs(sections) do
- local continue = callback(section)
- res = true
- if continue == false then
- break
- end
- end
- return res
- else
- return false, ERRSTR[err] or "No data"
- end
- else
- return false, "Invalid argument"
- end
-end
-
-local function _get(self, operation, config, section, option)
- if section == nil then
- return nil
- elseif type(option) == "string" and option:byte(1) ~= 46 then
- local rv, err = call(operation, {
- config = config,
- section = section,
- option = option
- })
-
- if type(rv) == "table" then
- return rv.value or nil
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
- elseif option == nil then
- local values = self:get_all(config, section)
- if values then
- return values[".type"], values[".name"]
- else
- return nil
- end
- else
- return false, "Invalid argument"
- end
-end
-
-function get(self, ...)
- return _get(self, "get", ...)
-end
-
-function get_state(self, ...)
- return _get(self, "state", ...)
-end
-
-function get_all(self, config, section)
- local rv, err = call("get", {
- config = config,
- section = section
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- return rv.values
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
-end
-
-function get_bool(self, ...)
- local val = self:get(...)
- return (val == "1" or val == "true" or val == "yes" or val == "on")
-end
-
-function get_first(self, config, stype, option, default)
- local rv = default
-
- self:foreach(config, stype, function(s)
- local val = not option and s[".name"] or s[option]
-
- if type(default) == "number" then
- val = tonumber(val)
- elseif type(default) == "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 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 { }
-end
-
-
-function section(self, config, stype, name, values)
- local rv, err = call("add", {
- config = config,
- type = stype,
- name = name,
- values = values
- })
-
- if type(rv) == "table" then
- return rv.section
- elseif err then
- return false, ERRSTR[err]
- else
- return nil
- end
-end
-
-
-function add(self, config, stype)
- return self:section(config, stype)
-end
-
-function set(self, config, section, option, ...)
- if select('#', ...) == 0 then
- local sname, err = self:section(config, option, section)
- return (not not sname), err
- else
- local _, err = call("set", {
- config = config,
- section = section,
- values = { [option] = select(1, ...) }
- })
- return (err == nil), ERRSTR[err]
- end
-end
-
-function set_list(self, config, section, option, value)
- if section == nil or option == nil then
- return false
- elseif value == nil or (type(value) == "table" and #value == 0) then
- return self:delete(config, section, option)
- elseif type(value) == "table" then
- return self:set(config, section, option, value)
- else
- return self:set(config, section, option, { value })
- end
-end
-
-function tset(self, config, section, values)
- local _, err = call("set", {
- config = config,
- section = section,
- values = values
- })
- return (err == nil), ERRSTR[err]
-end
-
-function reorder(self, config, section, index)
- local sections
-
- if type(section) == "string" and type(index) == "number" then
- local pos = 0
-
- sections = { }
-
- self:foreach(config, nil, function(s)
- if pos == index then
- pos = pos + 1
- end
-
- if s[".name"] ~= section then
- pos = pos + 1
- sections[pos] = s[".name"]
- else
- sections[index + 1] = section
- end
- end)
- elseif type(section) == "table" then
- sections = section
- else
- return false, "Invalid argument"
- end
-
- local _, err = call("order", {
- config = config,
- sections = sections
- })
-
- return (err == nil), ERRSTR[err]
-end
-
-
-function delete(self, config, section, option)
- local _, err = call("delete", {
- config = config,
- section = section,
- option = option
- })
- return (err == nil), ERRSTR[err]
-end
-
-function delete_all(self, config, stype, comparator)
- local _, err
- if type(comparator) == "table" then
- _, err = call("delete", {
- config = config,
- type = stype,
- match = comparator
- })
- elseif type(comparator) == "function" then
- local rv = call("get", {
- config = config,
- type = stype
- })
-
- if type(rv) == "table" and type(rv.values) == "table" then
- local sname, section
- for sname, section in pairs(rv.values) do
- if comparator(section) then
- _, err = call("delete", {
- config = config,
- section = sname
- })
- end
- end
- end
- elseif comparator == nil then
- _, err = call("delete", {
- config = config,
- type = stype
- })
- else
- return false, "Invalid argument"
- end
-
- return (err == nil), ERRSTR[err]
-end
diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc
deleted file mode 100644
index 0189d49aa1..0000000000
--- a/modules/luci-base/luasrc/model/uci.luadoc
+++ /dev/null
@@ -1,369 +0,0 @@
----[[
-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 daemons etc. are
-reloaded.
-@cstyle instance
-]]
-module "luci.model.uci"
-
----[[
-Create a new UCI-Cursor.
-
-@class function
-@name cursor
-@return UCI-Cursor
-]]
-
----[[
-Create a new Cursor initialized to the state directory.
-
-@class function
-@name cursor_state
-@return UCI cursor
-]]
-
----[[
-Applies UCI configuration changes.
-
-If the rollback parameter is set to true, the apply function will invoke the
-rollback mechanism which causes the configuration to be automatically reverted
-if no confirm() call occurs within a certain timeout.
-
-The current default timeout is 30s and can be increased using the
-"luci.apply.timeout" uci configuration key.
-
-@class function
-@name Cursor.apply
-@param rollback Enable rollback mechanism
-@return Boolean whether operation succeeded
-]]
-
----[[
-Confirms UCI apply process.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-this function confirms the process and cancels the pending rollback timer.
-
-If no apply with rollback session is active, the function has no effect and
-returns with a "No data" error.
-
-@class function
-@name Cursor.confirm
-@return Boolean whether operation succeeded
-]]
-
----[[
-Cancels UCI apply process.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-this function cancels the process and rolls back the configuration to the
-pre-apply state.
-
-If no apply with rollback session is active, the function has no effect and
-returns with a "No data" error.
-
-@class function
-@name Cursor.rollback
-@return Boolean whether operation succeeded
-]]
-
----[[
-Checks whether a pending rollback is scheduled.
-
-If a previous UCI apply with rollback has been invoked using apply(true),
-and has not been confirmed or rolled back yet, this function returns true
-and the remaining time until rollback in seconds. If no rollback is pending,
-the function returns false. On error, the function returns false and an
-additional string describing the error.
-
-@class function
-@name Cursor.rollback_pending
-@return Boolean whether rollback is pending
-@return Remaining time in seconds
-]]
-
----[[
-Delete all sections of a given type that match certain criteria.
-
-@class function
-@name Cursor.delete_all
-@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)
-]]
-
----[[
-Create a new section and initialize it with data.
-
-@class function
-@name Cursor.section
-@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
-]]
-
----[[
-Updated the data of a section using data from a table.
-
-@class function
-@name Cursor.tset
-@param config UCI config
-@param section UCI section name (optional)
-@param values Table of key - value pairs to update the section with
-]]
-
----[[
-Get a boolean option and return it's value as true or false.
-
-@class function
-@name Cursor.get_bool
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@return Boolean
-]]
-
----[[
-Get an option or list and return values as table.
-
-@class function
-@name Cursor.get_list
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@return table. If the option was not found, you will simply get an empty
- table.
-]]
-
----[[
-Get the given option from the first section with the given type.
-
-@class function
-@name Cursor.get_first
-@param config UCI config
-@param type UCI section type
-@param option UCI option (optional)
-@param default Default value (optional)
-@return UCI value
-]]
-
----[[
-Set given values as list. Setting a list option to an empty list
-has the same effect as deleting the option.
-
-@class function
-@name Cursor.set_list
-@param config UCI config
-@param section UCI section name
-@param option UCI option
-@param value Value or table. Non-table values will be set as single
- item UCI list.
-@return Boolean whether operation succeeded
-]]
-
----[[
-Create a sub-state of this cursor.
-
-The sub-state is tied to the parent cursor, means it the parent unloads or
-loads configs, the sub state will do so as well.
-
-@class function
-@name Cursor.substate
-@return UCI state cursor tied to the parent cursor
-]]
-
----[[
-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.
-
-When invoked with three arguments `config`, `sectionname`, `sectiontype`,
-then a named section of the given type is created.
-
-When invoked with four arguments `config`, `sectionname`, `optionname` and
-`optionvalue` then the value of the specified option is set to the given value.
-
-@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 nothing 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
-]]
-
----[[
-Get the effective session ID.
-
-@class function
-@name Cursor.get_session_id
-@return String containing the session ID
-]]
-
----[[
-Set the configuration directory.
-
-@class function
-@name Cursor.set_confdir
-@param directory UCI configuration directory
-@return Boolean whether operation succeeded
-]]
-
----[[
-Set the directory for uncommitted changes.
-
-@class function
-@name Cursor.set_savedir
-@param directory UCI changes directory
-@return Boolean whether operation succeeded
-]]
-
----[[
-Set the effective session ID.
-
-@class function
-@name Cursor.set_session_id
-@param id String containing the session ID to set
-@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
-]]
-