summaryrefslogtreecommitdiff
path: root/stand
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2020-12-12 05:57:42 +0000
committerKyle Evans <kevans@FreeBSD.org>2020-12-12 05:57:42 +0000
commit4634bb1f4052ff5f1c0a423fd8cce11396ca7fd2 (patch)
tree57f00844aec1e92fe199b59d3ee33c8ec6e3a9a4 /stand
parentdd1ce6c7f19ad7ccd2eb9be78655238ae1b4ea5e (diff)
downloadsrc-test-4634bb1f4052ff5f1c0a423fd8cce11396ca7fd2.tar.gz
src-test-4634bb1f4052ff5f1c0a423fd8cce11396ca7fd2.zip
lualoader: provide module-manipulation commands
Specifically, we have: - enable-module - disable-module - toggle-module These can be used to add/remove modules to be loaded or force modules to be loaded in spite of modules_blacklist. In the typical case, a user is expected to use them to recover an issue happening due to a module directive they've added to their loader.conf or because they discover that they've under-specified what to load. MFC after: 1 week
Notes
Notes: svn path=/head/; revision=368575
Diffstat (limited to 'stand')
-rw-r--r--stand/lua/cli.lua39
-rw-r--r--stand/lua/cli.lua.838
-rw-r--r--stand/lua/config.lua41
-rw-r--r--stand/lua/config.lua.821
4 files changed, 129 insertions, 10 deletions
diff --git a/stand/lua/cli.lua b/stand/lua/cli.lua
index 904c57bb37604..caf7d6476a46b 100644
--- a/stand/lua/cli.lua
+++ b/stand/lua/cli.lua
@@ -65,6 +65,14 @@ local function parseBootArgs(argv, with_kernel)
end
end
+local function setModule(module, loading)
+ if loading and config.enableModule(module) then
+ print(module .. " will be loaded")
+ elseif not loading and config.disableModule(module) then
+ print(module .. " will not be loaded")
+ end
+end
+
-- Declares a global function cli_execute that attempts to dispatch the
-- arguments passed as a lua function. This gives lua a chance to intercept
-- builtin CLI commands like "boot"
@@ -134,6 +142,37 @@ cli['reload-conf'] = function()
config.reload()
end
+cli["enable-module"] = function(...)
+ local _, argv = cli.arguments(...)
+ if #argv == 0 then
+ print("usage error: enable-module module")
+ return
+ end
+
+ setModule(argv[1], true)
+end
+
+cli["disable-module"] = function(...)
+ local _, argv = cli.arguments(...)
+ if #argv == 0 then
+ print("usage error: disable-module module")
+ return
+ end
+
+ setModule(argv[1], false)
+end
+
+cli["toggle-module"] = function(...)
+ local _, argv = cli.arguments(...)
+ if #argv == 0 then
+ print("usage error: toggle-module module")
+ return
+ end
+
+ local module = argv[1]
+ setModule(module, not config.isModuleEnabled(module))
+end
+
-- Used for splitting cli varargs into cmd_name and the rest of argv
function cli.arguments(...)
local argv = {...}
diff --git a/stand/lua/cli.lua.8 b/stand/lua/cli.lua.8
index ac9ed3580448c..0fafec9add4af 100644
--- a/stand/lua/cli.lua.8
+++ b/stand/lua/cli.lua.8
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 13, 2019
+.Dd December 12, 2020
.Dt CLI.LUA 8
.Os
.Sh NAME
@@ -77,14 +77,26 @@ This function may be invoked by a user at the loader prompt by simply typing
.Ic foo .
Arguments may be passed to it as usual, space-delimited.
.Ss Default Commands
-As of present, the
+The
.Nm
-module by default provides commands for
-.Ic autoboot ,
-.Ic boot ,
-.Ic boot-conf ,
-and
-.Ic reload-conf .
+module provides the following default commands:
+.Bl -bullet
+.\"-width toggle-module -offset indent
+.It
+.Ic autoboot
+.It
+.Ic boot
+.It
+.Ic boot-conf
+.It
+.Ic reload-conf
+.It
+.Ic enable-module
+.It
+.Ic disable-module
+.It
+.Ic toggle-module
+.El
.Pp
For
.Ic autoboot ,
@@ -103,6 +115,16 @@ The
command will reload the configuration from disk.
This is useful if you have manually changed currdev and would like to easily
reload the configuration from the new device.
+.Pp
+The
+.Ic enable-module ,
+.Ic disable-module ,
+and
+.Ic toggle-module
+commands manipulate the list of modules to be loaded along with the kernel.
+Modules blacklisted are considered disabled by
+.Ic toggle-module .
+These commands will override any such restriction as needed.
.Ss Exported Functions
The following functions are exported from
.Nm :
diff --git a/stand/lua/config.lua b/stand/lua/config.lua
index 6a898ce8cfb56..702543569c412 100644
--- a/stand/lua/config.lua
+++ b/stand/lua/config.lua
@@ -312,7 +312,7 @@ local function loadModule(mod, silent)
for k, v in pairs(mod) do
if v.load ~= nil and v.load:lower() == "yes" then
local module_name = v.name or k
- if blacklist[module_name] ~= nil then
+ if not v.force and blacklist[module_name] ~= nil then
if not silent then
print(MSG_MODBLACKLIST:format(module_name))
end
@@ -682,6 +682,45 @@ function config.loadelf()
return status
end
+function config.enableModule(modname)
+ if modules[modname] == nil then
+ modules[modname] = {}
+ elseif modules[modname].load == "YES" then
+ modules[modname].force = true
+ return true
+ end
+
+ modules[modname].load = "YES"
+ modules[modname].force = true
+ return true
+end
+
+function config.disableModule(modname)
+ if modules[modname] == nil then
+ return false
+ elseif modules[modname].load ~= "YES" then
+ return true
+ end
+
+ modules[modname].load = "NO"
+ modules[modname].force = nil
+ return true
+end
+
+function config.isModuleEnabled(modname)
+ local mod = modules[modname]
+ if not mod or mod.load ~= "YES" then
+ return false
+ end
+
+ if mod.force then
+ return true
+ end
+
+ local blacklist = getBlacklist()
+ return blacklist[modname]
+end
+
hook.registerType("config.loaded")
hook.registerType("config.reloaded")
hook.registerType("kernel.loaded")
diff --git a/stand/lua/config.lua.8 b/stand/lua/config.lua.8
index 098b607271f72..059cc49fe42a4 100644
--- a/stand/lua/config.lua.8
+++ b/stand/lua/config.lua.8
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 30, 2020
+.Dd December 12, 2020
.Dt CONFIG.LUA 8
.Os
.Sh NAME
@@ -184,6 +184,25 @@ This will be called by the Lua intercepted
and
.Ic boot
commands.
+.It Fn config.enableModule modname
+Marks a module named
+.Fa modname
+to be loaded during
+.Fn config.loadelf .
+If the module was previously blacklisted, then it will be forcefully allowed to
+load.
+.It Fn config.disableModule modname
+Marks a module named
+.Fa modname
+to not be loaded during
+.Fn config.loadelf .
+.It Fn config.isModuleEnabled modname
+Checks if the module named
+.Fa modname
+will be loaded during
+.Fn config.loadelf .
+It checks both that the module is marked for loading and that it is either
+forced or not blacklisted.
.El
.Ss Defined Hooks
The following hooks are defined in