Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MENU.LUA(8)		     System Manager's Manual		     MENU.LUA(8)

NAME
     menu.lua -- bootloader dynamic menu module

DESCRIPTION
     menu.lua  contains  the main functionality required to build a dynamic menu
     system.  It also contains definitions for the built-in menus, some of which
     are influenced by loader(8) environment variables.

     Before hooking into the functionality provided by menu.lua, it must be  in-
     cluded with a statement such as the following:

	   local menu = require("menu")

   MENU DEFINITIONS
     Menus  are  represented in menu.lua as a table.  That table must contain an
     entries key.

     If the value of the entries key is itself a table, then each value in  this
     table defines a single entry in this menu.  See "MENU ITEM DEFINITIONS" for
     the structure of each entry.

     entries  may  also  be a function.  This function must return a table, each
     value of which defines a  single  entry  in  this	menu.	See  "MENU  ITEM
     DEFINITIONS".

   MENU ITEM DEFINITIONS
     The following keys may be defined for a menu item:

	   entry_type		  The  type  of this menu entry.  See "MENU ITEM
				  TYPES".

	   carousel_id		  A unique  string  id	for  this  carousel.   A
				  carousel  is a menu entry that rotates through
				  a selection of items.  Used for storage of the
				  carousel's current setting.

	   visible		  A lambda that returns true if this  menu  item
				  should  be  visible and false if it should not
				  be visible.

	   items		  A table (or a lambda that returns a table)  of
				  the possible choices for this carousel.

	   name 		  A  string  (or a lambda that returns a string)
				  containing the current name of this item.

	   func 		  The function executed when this entry  is  se-
				  lected.      Every	 type	  except     for
				  core.MENU_SEPARATOR may have a func.

	   submenu		  The submenu menu definition to draw when  this
				  entry is selected.

	   alias		  A  table  of	case-sensitive	aliases for this
				  menu entry.  All menu entries that can be  se-
				  lected may have any number of alias entries.

     entry_type is the only required key for every entry type.	name is required
     for all entry types except for core.MENU_SEPARATOR.

   MENU ITEM TYPES
     The  menu	item  type  constants are defined in core.lua(8).  The following
     types are available:

	   core.MENU_RETURN	     Return to the parent menu.  If the  current
				     menu  is  the  default  menu, menu.lua will
				     exit the menu and begin  the  autoboot  se-
				     quence  (if applicable).  This type of menu
				     entry may execute func, when selected,  and
				     has a name.

	   core.MENU_ENTRY	     A normal menu entry that executes func when
				     selected, and has a name.

	   core.MENU_SEPARATOR	     A	menu  entry  that serves as a separator.
				     It may have a name.

	   core.MENU_SUBMENU	     A menu entry that opens  submenu  when  se-
				     lected.  It may have a name.

	   core.MENU_CAROUSEL_ENTRY  A	menu  entry  that  rotates through items
				     like a carousel.  func is executed when se-
				     lected, and  the  callback  is  passed  the
				     choice  index,  name of the current choice,
				     and the table of choices.

   EXPORTED MENUS
     The following menus are exported by menu.lua:

	   menu.default 	   The	 default   menu   to   draw.	Set   to
				   menu.welcome by default.

	   menu.welcome 	   The	welcome menu.  Contains single and multi
				   user boot options, as well as entries to  ac-
				   cess other menus.

	   menu.boot_options	   The "Boot Options" menu.

	   menu.boot_environments  The	"Boot  Environments" menu.  This menu is
				   only visible if the system is booted on a ZFS
				   partition and more than one boot  environment
				   was detected at boot.

EXAMPLES
     To replace the default boot menu with a simple boot menu:

	   local core = require("core")
	   local menu = require("menu")

	   menu.default = {
		   entries = {
			   {
				   entry_type = core.MENU_ENTRY,
				   name = "Boot",
				   func = core.boot,
			   },
			   {
				   entry_type = core.MENU_CAROUSEL_ENTRY,
				   carousel_id = "unique_boot_entry_name",
				   items = {"NO", "YES"},
				   name = function(_, choice, _)
					   return "Option: " .. choice
				   end,
				   func = function(_, _, _)
					   loader.setenv("some_envvar", "some_value")
				   end,
			   },
		   },
	   }

     To add another option to the welcome menu:

	   local core = require("core")
	   local menu = require("menu")

	   local my_entry = {
		   entry_type = core.MENU_ENTRY,
		   name = "Fancy Boot",
		   func = core.boot,
	   },

	   local stock_entries = menu.welcome.entries
	   function menu.welcome.entries()
		   local ents = stock_entries()
		   ents[#ents + 1] = my_entry
		   return ents
	   end

     To   create  a  vendor  submenu  or  other  vendor  menu  option,	override
     menu.welcome.all_entires.vendor like so:

	   local core = require("core")
	   local menu = require("menu")

	   -- Fill in with vendor specific entries
	   local vendor_options = {
		   entries = {
		   ...
		   },
	   }

	   local welcome_entries = menu.welcome.all_entries
	   welcome_entries.vendor = {
		   entry_type = core.MENU_SUBMENU,
		   name = color.highlight("V") .. "endor Options",
		   submenu = vendor_options,
		   alias = {"v", "V"},
		   visible = function()
			   return true
		   end,
	   }
     In the above example, vendor_options is a local variable that  defines  the
     vendor submenu.

     To  add  an  additional option, change the menu.boot_options.entries array.
     The following illustrates this concept:

	   -- This is a silly example that rotates local_option through the values
	   -- 0 to 4.  local_option would still need to be used elsewhere.
	   local local_option = 0

	   -- The `entries` of a menu may either be a table or a function.  In this
	   -- example we're augmenting a menu that just has a static table, but if we
	   -- wanted to be more robust then we would need to instead check the type
	   -- of `stock_options` here to determine our next move.
	   --
	   -- If `entries` is a table, then the stock menu system won't be changing it
	   -- so we can just add our menu option as we do below.
	   --
	   -- If `entries` is a function, then we would need to provide a new function to
	   -- replace `entries` that does a core.deepCopyTable() of the result and adds
	   -- the below item to it.  The deep copy is necessary to avoid duplicating our
	   -- new menu item and allowing the menu to alter its behavior however it pleases.
	   local stock_options = menu.boot_options.entries
	   stock_options[#stock_options + 1] = {
		   entry_type = core.MENU_ENTRY,
		   name = function()
			   return color.highlight('L') ..
			       "ocal Option	: " .. local_option
		   end,
		   func = function()
			   local_option = (local_option + 1) % 5
		   end,
		   alias= {"l", "L"}
	   }

SEE ALSO
     loader.conf(5), core.lua(8), loader(8)

HISTORY
     The menu.lua file first appeared in FreeBSD 12.0.

AUTHORS
     The  menu.lua  file  was	originally   written   by   Pedro   Souza   <pe-
     drosouza@FreeBSD.org>.  Later work and this manual page was done by
     Kyle Evans <kevans@FreeBSD.org>.

FreeBSD ports 15.quarterly	 March 29, 2025 		     MENU.LUA(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=menu.lua&sektion=8&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help