svn commit: r329731 - head/stand/lua
Kyle Evans
kevans at FreeBSD.org
Wed Feb 21 16:50:42 UTC 2018
Author: kevans
Date: Wed Feb 21 16:50:41 2018
New Revision: 329731
URL: https://svnweb.freebsd.org/changeset/base/329731
Log:
lualoader: Add boot environment support
This looks a little bit differently than the forth version for the time
being, just to get off the ground- rather than a paging system, it's
implemented as a simple carousel like the kernel selector.
Reviewed by: cem
Differential Revision: https://reviews.freebsd.org/D14436
Modified:
head/stand/lua/core.lua
head/stand/lua/menu.lua
Modified: head/stand/lua/core.lua
==============================================================================
--- head/stand/lua/core.lua Wed Feb 21 16:36:44 2018 (r329730)
+++ head/stand/lua/core.lua Wed Feb 21 16:50:41 2018 (r329731)
@@ -242,6 +242,41 @@ function core.kernelList()
return kernels
end
+function core.bootenvDefault()
+ return loader.getenv("zfs_be_active")
+end
+
+function core.bootenvList()
+ local bootenv_count = tonumber(loader.getenv("bootenvs_count"))
+ local bootenvs = {}
+ local curenv
+ local curenv_idx = 0
+ local envcount = 0
+ local unique = {}
+
+ if bootenv_count == nil or bootenv_count <= 0 then
+ return bootenvs
+ end
+
+ -- Currently selected bootenv is always first/default
+ curenv = core.bootenvDefault()
+ if curenv ~= nil then
+ envcount = envcount + 1
+ bootenvs[envcount] = curenv
+ unique[curenv] = true
+ end
+
+ for curenv_idx = 0, bootenv_count - 1 do
+ curenv = loader.getenv("bootenvs[" .. curenv_idx .. "]")
+ if curenv ~= nil and unique[curenv] == nil then
+ envcount = envcount + 1
+ bootenvs[envcount] = curenv
+ unique[curenv] = true
+ end
+ end
+ return bootenvs
+end
+
function core.setDefaults()
core.setACPI(core.getACPIPresent(true))
core.setSafeMode(false)
@@ -262,6 +297,15 @@ end
function core.isSingleUserBoot()
local single_user = loader.getenv("boot_single")
return single_user ~= nil and single_user:lower() == "yes"
+end
+
+function core.isZFSBoot()
+ local c = loader.getenv("currdev")
+
+ if c ~= nil then
+ return c:match("^zfs:") ~= nil
+ end
+ return false
end
function core.isSerialBoot()
Modified: head/stand/lua/menu.lua
==============================================================================
--- head/stand/lua/menu.lua Wed Feb 21 16:36:44 2018 (r329730)
+++ head/stand/lua/menu.lua Wed Feb 21 16:50:41 2018 (r329731)
@@ -50,6 +50,12 @@ local OnOff = function(str, b)
end
end
+local bootenvSet = function(env)
+ loader.setenv("vfs.root.mountfrom", env)
+ loader.setenv("currdev", env .. ":")
+ config.reload()
+end
+
-- Module exports
menu.handlers = {
-- Menu handlers take the current menu and selected entry as parameters,
@@ -89,6 +95,58 @@ menu.handlers = {
}
-- loader menu tree is rooted at menu.welcome
+menu.boot_environments = {
+ entries = {
+ -- return to welcome menu
+ {
+ entry_type = core.MENU_RETURN,
+ name = "Back to main menu" ..
+ color.highlight(" [Backspace]"),
+ },
+ {
+ entry_type = core.MENU_CAROUSEL_ENTRY,
+ carousel_id = "be_active",
+ items = core.bootenvList,
+ name = function(idx, choice, all_choices)
+ if #all_choices == 0 then
+ return "Active: "
+ end
+
+ local is_default = (idx == 1)
+ local bootenv_name = ""
+ local name_color
+ if is_default then
+ name_color = color.escapef(color.GREEN)
+ else
+ name_color = color.escapef(color.BLUE)
+ end
+ bootenv_name = bootenv_name .. name_color ..
+ choice .. color.default()
+ return color.highlight("A").."ctive: " ..
+ bootenv_name .. " (" .. idx .. " of " ..
+ #all_choices .. ")"
+ end,
+ func = function(idx, choice, all_choices)
+ bootenvSet(choice)
+ end,
+ alias = {"a", "A"},
+ },
+ {
+ entry_type = core.MENU_ENTRY,
+ name = function()
+ return color.highlight("b") .. "ootfs: " ..
+ core.bootenvDefault()
+ end,
+ func = function()
+ -- Reset active boot environment to the default
+ config.setCarouselIndex("be_active", 1)
+ bootenvSet(core.bootenvDefault())
+ end,
+ alias = {"b", "B"},
+ },
+ },
+}
+
menu.boot_options = {
entries = {
-- return to welcome menu
@@ -269,6 +327,17 @@ menu.welcome = {
name = "Boot " .. color.highlight("O") .. "ptions",
submenu = menu.boot_options,
alias = {"o", "O"}
+ },
+ -- boot environments
+ {
+ entry_type = core.MENU_SUBMENU,
+ visible = function()
+ return core.isZFSBoot() and
+ #core.bootenvList() > 1
+ end,
+ name = "Boot " .. color.highlight("E") .. "nvironments",
+ submenu = menu.boot_environments,
+ alias = {"e", "E"},
},
},
}
More information about the svn-src-all
mailing list