Date: Wed, 21 Feb 2018 16:50:41 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r329731 - head/stand/lua Message-ID: <201802211650.w1LGofal069075@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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"}, }, }, }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802211650.w1LGofal069075>