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