xref: /freebsd/stand/lua/menu.lua.8 (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
1f520b4afSKyle Evans.\"
2*4d846d26SWarner Losh.\" SPDX-License-Identifier: BSD-2-Clause
3f520b4afSKyle Evans.\"
4f520b4afSKyle Evans.\" Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
5f520b4afSKyle Evans.\"
6f520b4afSKyle Evans.\" Redistribution and use in source and binary forms, with or without
7f520b4afSKyle Evans.\" modification, are permitted provided that the following conditions
8f520b4afSKyle Evans.\" are met:
9f520b4afSKyle Evans.\" 1. Redistributions of source code must retain the above copyright
10f520b4afSKyle Evans.\"    notice, this list of conditions and the following disclaimer.
11f520b4afSKyle Evans.\" 2. Redistributions in binary form must reproduce the above copyright
12f520b4afSKyle Evans.\"    notice, this list of conditions and the following disclaimer in the
13f520b4afSKyle Evans.\"    documentation and/or other materials provided with the distribution.
14f520b4afSKyle Evans.\"
15f520b4afSKyle Evans.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16f520b4afSKyle Evans.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17f520b4afSKyle Evans.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18f520b4afSKyle Evans.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19f520b4afSKyle Evans.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20f520b4afSKyle Evans.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21f520b4afSKyle Evans.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22f520b4afSKyle Evans.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23f520b4afSKyle Evans.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24f520b4afSKyle Evans.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25f520b4afSKyle Evans.\" SUCH DAMAGE.
26f520b4afSKyle Evans.\"
27f520b4afSKyle Evans.\" $FreeBSD$
28f520b4afSKyle Evans.\"
29e7ccd5b4SWarner Losh.Dd March 31, 2021
30f520b4afSKyle Evans.Dt MENU.LUA 8
31f520b4afSKyle Evans.Os
32f520b4afSKyle Evans.Sh NAME
33f520b4afSKyle Evans.Nm menu.lua
34f520b4afSKyle Evans.Nd FreeBSD dynamic menu boot module
35f520b4afSKyle Evans.Sh DESCRIPTION
36f520b4afSKyle Evans.Nm
37f520b4afSKyle Evanscontains the main functionality required to build a dynamic menu system.
38f520b4afSKyle EvansIt also contains definitions for the built-in menus, some of which are
39f520b4afSKyle Evansinfluenced by
40f520b4afSKyle Evans.Xr loader 8
41f520b4afSKyle Evansenvironment variables.
42f520b4afSKyle Evans.Pp
43f520b4afSKyle EvansBefore hooking into the functionality provided by
44f520b4afSKyle Evans.Nm ,
45f520b4afSKyle Evansit must be included with a statement such as the following:
46f520b4afSKyle Evans.Pp
47f520b4afSKyle Evans.Dl local menu = require("menu")
48f520b4afSKyle Evans.Ss MENU DEFINITIONS
49f520b4afSKyle EvansMenus are represented in
50f520b4afSKyle Evans.Nm
51f520b4afSKyle Evansas a table.
52f520b4afSKyle EvansThat table
53f520b4afSKyle Evans.Sy must
54f520b4afSKyle Evanscontain an
55f520b4afSKyle Evans.Va entries
56f520b4afSKyle Evanskey.
57f520b4afSKyle Evans.Pp
58f520b4afSKyle EvansIf the value of the
59f520b4afSKyle Evans.Va entries
60f520b4afSKyle Evanskey is itself a table, then each value in this table defines a single entry in
61f520b4afSKyle Evansthis menu.
62f520b4afSKyle EvansSee
63f520b4afSKyle Evans.Sx MENU ITEM DEFINITIONS
64f520b4afSKyle Evansfor the structure of each entry.
65f520b4afSKyle Evans.Pp
66f520b4afSKyle Evans.Va entries
67f520b4afSKyle Evansmay also be a function.
68f520b4afSKyle EvansThis function must return a table, each value of which defines a single entry
69f520b4afSKyle Evansin this menu.
70f520b4afSKyle EvansSee
71f520b4afSKyle Evans.Sx MENU ITEM DEFINITIONS .
72f520b4afSKyle Evans.Ss MENU ITEM DEFINITIONS
73f520b4afSKyle EvansThe following keys may be defined for a menu item:
74f520b4afSKyle Evans.Bl -tag -width disable-module_module -offset indent
75f520b4afSKyle Evans.It Ic entry_type
76f520b4afSKyle EvansThe type of this menu entry.
77f520b4afSKyle EvansSee
78f520b4afSKyle Evans.Sx MENU ITEM TYPES .
79f520b4afSKyle Evans.It Ic carousel_id
80f520b4afSKyle EvansA unique string id for this carousel.
81f520b4afSKyle EvansA carousel is a menu entry that rotates through a selection of items.
82f520b4afSKyle EvansUsed for storage of the carousel's current setting.
83f520b4afSKyle Evans.It Ic visible
84f520b4afSKyle EvansA lambda that returns
85f520b4afSKyle Evans.Dv true
86f520b4afSKyle Evansif this menu item should be visible and
87f520b4afSKyle Evans.Dv false
88f520b4afSKyle Evansif it should not be visible.
89f520b4afSKyle Evans.It Ic items
90f520b4afSKyle EvansA table (or a lambda that returns a table) of the possible choices for this
91f520b4afSKyle Evanscarousel.
92f520b4afSKyle Evans.It Ic name
93f520b4afSKyle EvansA string (or a lambda that returns a string) containing the current name of this
94f520b4afSKyle Evansitem.
95f520b4afSKyle Evans.It Ic func
96f520b4afSKyle EvansThe function executed when this entry is selected.
97f520b4afSKyle EvansEvery type except for
98f520b4afSKyle Evans.Ic core.MENU_SEPARATOR
99f520b4afSKyle Evansmay have a
100f520b4afSKyle Evans.Ic func .
101f520b4afSKyle Evans.It Ic submenu
102f520b4afSKyle EvansThe submenu menu definition to draw when this entry is selected.
103f520b4afSKyle Evans.It Ic alias
104f520b4afSKyle EvansA table of case-sensitive aliases for this menu entry.
105f520b4afSKyle EvansAll menu entries that can be selected may have any number of
106f520b4afSKyle Evans.Ic alias
107f520b4afSKyle Evansentries.
108f520b4afSKyle Evans.El
109f520b4afSKyle Evans.Pp
110f520b4afSKyle Evans.Ic entry_type
111f520b4afSKyle Evansis the only required key for every entry type.
112f520b4afSKyle Evans.Ic name
113f520b4afSKyle Evansis required for all entry types except for
114f520b4afSKyle Evans.Ic core.MENU_SEPARATOR .
115f520b4afSKyle Evans.Ss MENU ITEM TYPES
116f520b4afSKyle EvansThe menu item type constants are defined in
117f520b4afSKyle Evans.Xr core.lua 8 .
118f520b4afSKyle EvansThe following types are available:
119f520b4afSKyle Evans.Bl -tag -width core.MENU_CAROUSEL_ENTRY -offset indent
120f520b4afSKyle Evans.It Ic core.MENU_RETURN
121f520b4afSKyle EvansReturn to the parent menu.
122f520b4afSKyle EvansIf the current menu is the default menu,
123f520b4afSKyle Evans.Nm
124f520b4afSKyle Evanswill exit the menu and begin the autoboot sequence (if applicable).
125f520b4afSKyle EvansThis type of menu entry may execute
126f520b4afSKyle Evans.Ic func ,
127f520b4afSKyle Evanswhen selected, and has a
128f520b4afSKyle Evans.Ic name .
129f520b4afSKyle Evans.It Ic core.MENU_ENTRY
130f520b4afSKyle EvansA normal menu entry that executes
131f520b4afSKyle Evans.Ic func
132f520b4afSKyle Evanswhen selected, and has a
133f520b4afSKyle Evans.Ic name .
134f520b4afSKyle Evans.It Ic core.MENU_SEPARATOR
135f520b4afSKyle EvansA menu entry that serves as a separator.
136f520b4afSKyle EvansIt may have a
137f520b4afSKyle Evans.Ic name .
138f520b4afSKyle Evans.It Ic core.MENU_SUBMENU
139f520b4afSKyle EvansA menu entry that opens
140f520b4afSKyle Evans.Ic submenu
141f520b4afSKyle Evanswhen selected.
142f520b4afSKyle EvansIt may have a
143f520b4afSKyle Evans.Ic name .
144f520b4afSKyle Evans.It Ic core.MENU_CAROUSEL_ENTRY
145f520b4afSKyle EvansA menu entry that rotates through
146f520b4afSKyle Evans.Ic items
147f520b4afSKyle Evanslike a carousel.
148f520b4afSKyle Evans.Ic func
149f520b4afSKyle Evansis executed when selected, and the callback is passed the choice index, name of
150f520b4afSKyle Evansthe current choice, and the table of choices.
151f520b4afSKyle Evans.El
152f520b4afSKyle Evans.Ss EXPORTED MENUS
153f520b4afSKyle EvansThe following menus are exported by
154f520b4afSKyle Evans.Nm :
155f520b4afSKyle Evans.Bl -tag -width menu.boot_environments -offset indent
156f520b4afSKyle Evans.It Ic menu.default
157f520b4afSKyle EvansThe default menu to draw.
158f520b4afSKyle EvansSet to
159f520b4afSKyle Evans.Ic menu.welcome
160f520b4afSKyle Evansby default.
161f520b4afSKyle Evans.It Ic menu.welcome
162f520b4afSKyle EvansThe welcome menu.
163f520b4afSKyle EvansContains single and multi user boot options, as well as entries to access other
164f520b4afSKyle Evansmenus.
165f520b4afSKyle Evans.It Ic menu.boot_options
166f520b4afSKyle EvansThe "Boot Options" menu.
167f520b4afSKyle Evans.It Ic menu.boot_environments
168f520b4afSKyle EvansThe "Boot Environments" menu.
169f520b4afSKyle EvansThis menu is only visible if the system is booted on a ZFS partition and more
170f520b4afSKyle Evansthan one boot environment was detected at boot.
171f520b4afSKyle Evans.El
172f520b4afSKyle Evans.Sh EXAMPLES
173f520b4afSKyle EvansTo replace the default boot menu with a simple boot menu:
174f520b4afSKyle Evans.Pp
175f520b4afSKyle Evans.Bd -literal -offset indent -compact
176f520b4afSKyle Evanslocal core = require("core")
177f520b4afSKyle Evanslocal menu = require("menu")
178f520b4afSKyle Evans
179f520b4afSKyle Evansmenu.default = {
180f520b4afSKyle Evans	entries = {
181f520b4afSKyle Evans		{
182f520b4afSKyle Evans			entry_type = core.MENU_ENTRY,
183f520b4afSKyle Evans			name = "Boot",
184f520b4afSKyle Evans			func = core.boot,
185f520b4afSKyle Evans		},
186f520b4afSKyle Evans		{
187f520b4afSKyle Evans			entry_type = core.MENU_CAROUSEL_ENTRY,
188f520b4afSKyle Evans			carousel_id = "unique_boot_entry_name",
189f520b4afSKyle Evans			items = {"NO", "YES"},
190f520b4afSKyle Evans			name = function(_, choice, _)
191f520b4afSKyle Evans				return "Option: " .. choice
192f520b4afSKyle Evans			end,
193f520b4afSKyle Evans			func = function(_, _, _)
194f520b4afSKyle Evans				loader.setenv("some_envvar", "some_value")
195f520b4afSKyle Evans			end,
196f520b4afSKyle Evans		},
197f520b4afSKyle Evans	},
198f520b4afSKyle Evans}
199f520b4afSKyle Evans.Ed
200f520b4afSKyle Evans.Pp
201f520b4afSKyle EvansTo add another option to the welcome menu:
202f520b4afSKyle Evans.Pp
203f520b4afSKyle Evans.Bd -literal -offset indent -compact
204f520b4afSKyle Evanslocal core = require("core")
205f520b4afSKyle Evanslocal menu = require("menu")
206f520b4afSKyle Evans
207e7ccd5b4SWarner Loshlocal my_entry = {
208e7ccd5b4SWarner Losh	entry_type = core.MENU_ENTRY,
209e7ccd5b4SWarner Losh	name = "Fancy Boot",
210e7ccd5b4SWarner Losh	func = core.boot,
211e7ccd5b4SWarner Losh},
212e7ccd5b4SWarner Losh
213e7ccd5b4SWarner Loshlocal stock_entries = menu.welcome.entries
214e7ccd5b4SWarner Loshfunction menu.welcome.entries()
215e7ccd5b4SWarner Losh	local ents = stock_entries()
216e7ccd5b4SWarner Losh	ents[#ents + 1] = my_entry
217e7ccd5b4SWarner Losh	return ents
218e7ccd5b4SWarner Loshend
219e7ccd5b4SWarner Losh.Ed
220e7ccd5b4SWarner Losh.Pp
221e7ccd5b4SWarner LoshTo create a vendor submenu or other vendor menu option,
222e7ccd5b4SWarner Loshoverride
223e7ccd5b4SWarner Losh.Ic menu.welcome.all_entires.vendor
224e7ccd5b4SWarner Loshlike so:
225e7ccd5b4SWarner Losh.Pp
226e7ccd5b4SWarner Losh.Bd -literal -offset indent -compact
227e7ccd5b4SWarner Loshlocal core = require("core")
228e7ccd5b4SWarner Loshlocal menu = require("menu")
229e7ccd5b4SWarner Losh
230e7ccd5b4SWarner Losh-- Fill in with vendor specific entries
231e7ccd5b4SWarner Loshlocal vendor_options = {
232e7ccd5b4SWarner Losh	entries = {
233e7ccd5b4SWarner Losh	...
234e7ccd5b4SWarner Losh	},
235e7ccd5b4SWarner Losh}
236e7ccd5b4SWarner Losh
237f520b4afSKyle Evanslocal welcome_entries = menu.welcome.all_entries
238e7ccd5b4SWarner Loshwelcome_entries.vendor = {
239e7ccd5b4SWarner Losh        entry_type = core.MENU_SUBMENU,
240e7ccd5b4SWarner Losh        name = color.highlight("V") .. "endor Options",
241e7ccd5b4SWarner Losh        submenu = vendor_options,
242e7ccd5b4SWarner Losh        alias = {"v", "V"},
243556e66b7SWarner Losh	visible = function()
244556e66b7SWarner Losh		return true
245556e66b7SWarner Losh	end,
246f520b4afSKyle Evans}
247f520b4afSKyle Evans.Ed
248e7ccd5b4SWarner LoshIn the above example,
249e7ccd5b4SWarner Losh.Ic vendor_options
250e7ccd5b4SWarner Loshis a local variable that defines the vendor submenu.
251e7ccd5b4SWarner Losh.Pp
252e7ccd5b4SWarner LoshTo add an additional option, change the
253e7ccd5b4SWarner Losh.Ic menu.boot_options.entries
254e7ccd5b4SWarner Losharray.
255e7ccd5b4SWarner LoshThe following illustrates this concept:
256e7ccd5b4SWarner Losh.Pp
257e7ccd5b4SWarner Losh.Bd -literal -offset indent -compact
258e7ccd5b4SWarner Losh-- This is a silly example that rotates local_option through the values
259e7ccd5b4SWarner Losh-- 0 to 4.  local_option would still need to be used elsewhere.
260e7ccd5b4SWarner Loshlocal local_option = 0
261e7ccd5b4SWarner Losh
262e7ccd5b4SWarner Losh-- The `entries` of a menu may either be a table or a function.  In this
263e7ccd5b4SWarner Losh-- example we're augmenting a menu that just has a static table, but if we
264e7ccd5b4SWarner Losh-- wanted to be more robust then we would need to instead check the type
265e7ccd5b4SWarner Losh-- of `stock_options` here to determine our next move.
266e7ccd5b4SWarner Losh--
267e7ccd5b4SWarner Losh-- If `entries` is a table, then the stock menu system won't be changing it
268e7ccd5b4SWarner Losh-- so we can just add our menu option as we do below.
269e7ccd5b4SWarner Losh--
270e7ccd5b4SWarner Losh-- If `entries` is a function, then we would need to provide a new function to
271e7ccd5b4SWarner Losh-- replace `entries` that does a core.deepCopyTable() of the result and adds
272e7ccd5b4SWarner Losh-- the below item to it.  The deep copy is necessary to avoid duplicating our
273e7ccd5b4SWarner Losh-- new menu item and allowing the menu to alter its behavior however it pleases.
274e7ccd5b4SWarner Loshlocal stock_options = menu.boot_options.entries
275e7ccd5b4SWarner Loshstock_options[#stock_options + 1] = {
276e7ccd5b4SWarner Losh	entry_type = core.MENU_ENTRY,
277e7ccd5b4SWarner Losh	name = function()
278e7ccd5b4SWarner Losh		return color.highlight('L') ..
279e7ccd5b4SWarner Losh		    "ocal Option     : " .. local_option
280e7ccd5b4SWarner Losh	end,
281e7ccd5b4SWarner Losh	func = function()
282e7ccd5b4SWarner Losh		local_option = (local_option + 1) % 5
283e7ccd5b4SWarner Losh	end,
284e7ccd5b4SWarner Losh	alias= {"l", "L"}
285e7ccd5b4SWarner Losh}
286f520b4afSKyle Evans.Sh SEE ALSO
287f520b4afSKyle Evans.Xr loader.conf 5 ,
288f520b4afSKyle Evans.Xr core.lua 8 ,
289f520b4afSKyle Evans.Xr loader 8
290f520b4afSKyle Evans.Sh HISTORY
291f520b4afSKyle EvansThe
292f520b4afSKyle Evans.Nm
293f520b4afSKyle Evansfile first appeared in
294f520b4afSKyle Evans.Fx 12.0 .
295f520b4afSKyle Evans.Sh AUTHORS
296f520b4afSKyle EvansThe
297f520b4afSKyle Evans.Nm
298f520b4afSKyle Evansfile was originally written by
299f520b4afSKyle Evans.An Pedro Souza Aq Mt pedrosouza@FreeBSD.org .
300f520b4afSKyle EvansLater work and this manual page was done by
301f520b4afSKyle Evans.An Kyle Evans Aq Mt kevans@FreeBSD.org .
302