xref: /freebsd-13.1/stand/lua/menu.lua.8 (revision 4b3c64f7)
1*f520b4afSKyle Evans.\"
2*f520b4afSKyle Evans.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*f520b4afSKyle Evans.\"
4*f520b4afSKyle Evans.\" Copyright (c) 2018 Kyle Evans <[email protected]>
5*f520b4afSKyle Evans.\"
6*f520b4afSKyle Evans.\" Redistribution and use in source and binary forms, with or without
7*f520b4afSKyle Evans.\" modification, are permitted provided that the following conditions
8*f520b4afSKyle Evans.\" are met:
9*f520b4afSKyle Evans.\" 1. Redistributions of source code must retain the above copyright
10*f520b4afSKyle Evans.\"    notice, this list of conditions and the following disclaimer.
11*f520b4afSKyle Evans.\" 2. Redistributions in binary form must reproduce the above copyright
12*f520b4afSKyle Evans.\"    notice, this list of conditions and the following disclaimer in the
13*f520b4afSKyle Evans.\"    documentation and/or other materials provided with the distribution.
14*f520b4afSKyle Evans.\"
15*f520b4afSKyle Evans.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*f520b4afSKyle Evans.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*f520b4afSKyle Evans.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*f520b4afSKyle Evans.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*f520b4afSKyle Evans.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*f520b4afSKyle Evans.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*f520b4afSKyle Evans.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*f520b4afSKyle Evans.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*f520b4afSKyle Evans.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*f520b4afSKyle Evans.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*f520b4afSKyle Evans.\" SUCH DAMAGE.
26*f520b4afSKyle Evans.\"
27*f520b4afSKyle Evans.\" $FreeBSD$
28*f520b4afSKyle Evans.\"
29*f520b4afSKyle Evans.Dd February 23, 2018
30*f520b4afSKyle Evans.Dt MENU.LUA 8
31*f520b4afSKyle Evans.Os
32*f520b4afSKyle Evans.Sh NAME
33*f520b4afSKyle Evans.Nm menu.lua
34*f520b4afSKyle Evans.Nd FreeBSD dynamic menu boot module
35*f520b4afSKyle Evans.Sh DESCRIPTION
36*f520b4afSKyle Evans.Nm
37*f520b4afSKyle Evanscontains the main functionality required to build a dynamic menu system.
38*f520b4afSKyle EvansIt also contains definitions for the built-in menus, some of which are
39*f520b4afSKyle Evansinfluenced by
40*f520b4afSKyle Evans.Xr loader 8
41*f520b4afSKyle Evansenvironment variables.
42*f520b4afSKyle Evans.Pp
43*f520b4afSKyle EvansBefore hooking into the functionality provided by
44*f520b4afSKyle Evans.Nm ,
45*f520b4afSKyle Evansit must be included with a statement such as the following:
46*f520b4afSKyle Evans.Pp
47*f520b4afSKyle Evans.Dl local menu = require("menu")
48*f520b4afSKyle Evans.Ss MENU DEFINITIONS
49*f520b4afSKyle EvansMenus are represented in
50*f520b4afSKyle Evans.Nm
51*f520b4afSKyle Evansas a table.
52*f520b4afSKyle EvansThat table
53*f520b4afSKyle Evans.Sy must
54*f520b4afSKyle Evanscontain an
55*f520b4afSKyle Evans.Va entries
56*f520b4afSKyle Evanskey.
57*f520b4afSKyle Evans.Pp
58*f520b4afSKyle EvansIf the value of the
59*f520b4afSKyle Evans.Va entries
60*f520b4afSKyle Evanskey is itself a table, then each value in this table defines a single entry in
61*f520b4afSKyle Evansthis menu.
62*f520b4afSKyle EvansSee
63*f520b4afSKyle Evans.Sx MENU ITEM DEFINITIONS
64*f520b4afSKyle Evansfor the structure of each entry.
65*f520b4afSKyle Evans.Pp
66*f520b4afSKyle Evans.Va entries
67*f520b4afSKyle Evansmay also be a function.
68*f520b4afSKyle EvansThis function must return a table, each value of which defines a single entry
69*f520b4afSKyle Evansin this menu.
70*f520b4afSKyle EvansSee
71*f520b4afSKyle Evans.Sx MENU ITEM DEFINITIONS .
72*f520b4afSKyle Evans.Ss MENU ITEM DEFINITIONS
73*f520b4afSKyle EvansThe following keys may be defined for a menu item:
74*f520b4afSKyle Evans.Bl -tag -width disable-module_module -offset indent
75*f520b4afSKyle Evans.It Ic entry_type
76*f520b4afSKyle EvansThe type of this menu entry.
77*f520b4afSKyle EvansSee
78*f520b4afSKyle Evans.Sx MENU ITEM TYPES .
79*f520b4afSKyle Evans.It Ic carousel_id
80*f520b4afSKyle EvansA unique string id for this carousel.
81*f520b4afSKyle EvansA carousel is a menu entry that rotates through a selection of items.
82*f520b4afSKyle EvansUsed for storage of the carousel's current setting.
83*f520b4afSKyle Evans.It Ic visible
84*f520b4afSKyle EvansA lambda that returns
85*f520b4afSKyle Evans.Dv true
86*f520b4afSKyle Evansif this menu item should be visible and
87*f520b4afSKyle Evans.Dv false
88*f520b4afSKyle Evansif it should not be visible.
89*f520b4afSKyle Evans.It Ic items
90*f520b4afSKyle EvansA table (or a lambda that returns a table) of the possible choices for this
91*f520b4afSKyle Evanscarousel.
92*f520b4afSKyle Evans.It Ic name
93*f520b4afSKyle EvansA string (or a lambda that returns a string) containing the current name of this
94*f520b4afSKyle Evansitem.
95*f520b4afSKyle Evans.It Ic func
96*f520b4afSKyle EvansThe function executed when this entry is selected.
97*f520b4afSKyle EvansEvery type except for
98*f520b4afSKyle Evans.Ic core.MENU_SEPARATOR
99*f520b4afSKyle Evansmay have a
100*f520b4afSKyle Evans.Ic func .
101*f520b4afSKyle Evans.It Ic submenu
102*f520b4afSKyle EvansThe submenu menu definition to draw when this entry is selected.
103*f520b4afSKyle Evans.It Ic alias
104*f520b4afSKyle EvansA table of case-sensitive aliases for this menu entry.
105*f520b4afSKyle EvansAll menu entries that can be selected may have any number of
106*f520b4afSKyle Evans.Ic alias
107*f520b4afSKyle Evansentries.
108*f520b4afSKyle Evans.El
109*f520b4afSKyle Evans.Pp
110*f520b4afSKyle Evans.Ic entry_type
111*f520b4afSKyle Evansis the only required key for every entry type.
112*f520b4afSKyle Evans.Ic name
113*f520b4afSKyle Evansis required for all entry types except for
114*f520b4afSKyle Evans.Ic core.MENU_SEPARATOR .
115*f520b4afSKyle Evans.Ss MENU ITEM TYPES
116*f520b4afSKyle EvansThe menu item type constants are defined in
117*f520b4afSKyle Evans.Xr core.lua 8 .
118*f520b4afSKyle EvansThe following types are available:
119*f520b4afSKyle Evans.Bl -tag -width core.MENU_CAROUSEL_ENTRY -offset indent
120*f520b4afSKyle Evans.It Ic core.MENU_RETURN
121*f520b4afSKyle EvansReturn to the parent menu.
122*f520b4afSKyle EvansIf the current menu is the default menu,
123*f520b4afSKyle Evans.Nm
124*f520b4afSKyle Evanswill exit the menu and begin the autoboot sequence (if applicable).
125*f520b4afSKyle EvansThis type of menu entry may execute
126*f520b4afSKyle Evans.Ic func ,
127*f520b4afSKyle Evanswhen selected, and has a
128*f520b4afSKyle Evans.Ic name .
129*f520b4afSKyle Evans.It Ic core.MENU_ENTRY
130*f520b4afSKyle EvansA normal menu entry that executes
131*f520b4afSKyle Evans.Ic func
132*f520b4afSKyle Evanswhen selected, and has a
133*f520b4afSKyle Evans.Ic name .
134*f520b4afSKyle Evans.It Ic core.MENU_SEPARATOR
135*f520b4afSKyle EvansA menu entry that serves as a separator.
136*f520b4afSKyle EvansIt may have a
137*f520b4afSKyle Evans.Ic name .
138*f520b4afSKyle Evans.It Ic core.MENU_SUBMENU
139*f520b4afSKyle EvansA menu entry that opens
140*f520b4afSKyle Evans.Ic submenu
141*f520b4afSKyle Evanswhen selected.
142*f520b4afSKyle EvansIt may have a
143*f520b4afSKyle Evans.Ic name .
144*f520b4afSKyle Evans.It Ic core.MENU_CAROUSEL_ENTRY
145*f520b4afSKyle EvansA menu entry that rotates through
146*f520b4afSKyle Evans.Ic items
147*f520b4afSKyle Evanslike a carousel.
148*f520b4afSKyle Evans.Ic func
149*f520b4afSKyle Evansis executed when selected, and the callback is passed the choice index, name of
150*f520b4afSKyle Evansthe current choice, and the table of choices.
151*f520b4afSKyle Evans.El
152*f520b4afSKyle Evans.Ss EXPORTED MENUS
153*f520b4afSKyle EvansThe following menus are exported by
154*f520b4afSKyle Evans.Nm :
155*f520b4afSKyle Evans.Bl -tag -width menu.boot_environments -offset indent
156*f520b4afSKyle Evans.It Ic menu.default
157*f520b4afSKyle EvansThe default menu to draw.
158*f520b4afSKyle EvansSet to
159*f520b4afSKyle Evans.Ic menu.welcome
160*f520b4afSKyle Evansby default.
161*f520b4afSKyle Evans.It Ic menu.welcome
162*f520b4afSKyle EvansThe welcome menu.
163*f520b4afSKyle EvansContains single and multi user boot options, as well as entries to access other
164*f520b4afSKyle Evansmenus.
165*f520b4afSKyle Evans.It Ic menu.boot_options
166*f520b4afSKyle EvansThe "Boot Options" menu.
167*f520b4afSKyle Evans.It Ic menu.boot_environments
168*f520b4afSKyle EvansThe "Boot Environments" menu.
169*f520b4afSKyle EvansThis menu is only visible if the system is booted on a ZFS partition and more
170*f520b4afSKyle Evansthan one boot environment was detected at boot.
171*f520b4afSKyle Evans.El
172*f520b4afSKyle Evans.Sh EXAMPLES
173*f520b4afSKyle EvansTo replace the default boot menu with a simple boot menu:
174*f520b4afSKyle Evans.Pp
175*f520b4afSKyle Evans.Bd -literal -offset indent -compact
176*f520b4afSKyle Evanslocal core = require("core")
177*f520b4afSKyle Evanslocal menu = require("menu")
178*f520b4afSKyle Evans
179*f520b4afSKyle Evansmenu.default = {
180*f520b4afSKyle Evans	entries = {
181*f520b4afSKyle Evans		{
182*f520b4afSKyle Evans			entry_type = core.MENU_ENTRY,
183*f520b4afSKyle Evans			name = "Boot",
184*f520b4afSKyle Evans			func = core.boot,
185*f520b4afSKyle Evans		},
186*f520b4afSKyle Evans		{
187*f520b4afSKyle Evans			entry_type = core.MENU_CAROUSEL_ENTRY,
188*f520b4afSKyle Evans			carousel_id = "unique_boot_entry_name",
189*f520b4afSKyle Evans			items = {"NO", "YES"},
190*f520b4afSKyle Evans			name = function(_, choice, _)
191*f520b4afSKyle Evans				return "Option: " .. choice
192*f520b4afSKyle Evans			end,
193*f520b4afSKyle Evans			func = function(_, _, _)
194*f520b4afSKyle Evans				loader.setenv("some_envvar", "some_value")
195*f520b4afSKyle Evans			end,
196*f520b4afSKyle Evans		},
197*f520b4afSKyle Evans	},
198*f520b4afSKyle Evans}
199*f520b4afSKyle Evans.Ed
200*f520b4afSKyle Evans.Pp
201*f520b4afSKyle EvansTo add another option to the welcome menu:
202*f520b4afSKyle Evans.Pp
203*f520b4afSKyle Evans.Bd -literal -offset indent -compact
204*f520b4afSKyle Evanslocal core = require("core")
205*f520b4afSKyle Evanslocal menu = require("menu")
206*f520b4afSKyle Evans
207*f520b4afSKyle Evanslocal welcome_entries = menu.welcome.all_entries
208*f520b4afSKyle Evanswelcome_entries[#welcome_entries + 1] = {
209*f520b4afSKyle Evans	entry_type = core.MENU_CAROUSEL_ENTRY,
210*f520b4afSKyle Evans	carousel_id = "unique_boot_entry_name",
211*f520b4afSKyle Evans	items = {"NO", "YES"},
212*f520b4afSKyle Evans	name = function(_, choice, _)
213*f520b4afSKyle Evans		return "Option: " .. choice
214*f520b4afSKyle Evans	end,
215*f520b4afSKyle Evans	func = function(_, _, _)
216*f520b4afSKyle Evans		loader.setenv("some_envvar", "some_value")
217*f520b4afSKyle Evans	end,
218*f520b4afSKyle Evans}
219*f520b4afSKyle Evans.Ed
220*f520b4afSKyle Evans.Sh SEE ALSO
221*f520b4afSKyle Evans.Xr loader.conf 5 ,
222*f520b4afSKyle Evans.Xr core.lua 8 ,
223*f520b4afSKyle Evans.Xr loader 8
224*f520b4afSKyle Evans.Sh HISTORY
225*f520b4afSKyle EvansThe
226*f520b4afSKyle Evans.Nm
227*f520b4afSKyle Evansfile first appeared in
228*f520b4afSKyle Evans.Fx 12.0 .
229*f520b4afSKyle Evans.Sh AUTHORS
230*f520b4afSKyle EvansThe
231*f520b4afSKyle Evans.Nm
232*f520b4afSKyle Evansfile was originally written by
233*f520b4afSKyle Evans.An Pedro Souza Aq Mt [email protected] .
234*f520b4afSKyle EvansLater work and this manual page was done by
235*f520b4afSKyle Evans.An Kyle Evans Aq Mt [email protected] .
236