Skip site navigation (1)Skip section navigation (2)
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>