summaryrefslogtreecommitdiff
path: root/stand/lua/config.lua
AgeCommit message (Collapse)Author
2025-03-16stand: lines with comments a '"' in loader.conf are ignoredCyrus Rahman
So the problem is that the lua parser in /boot/lua/config.lua is splitting the line on the '=', sending the first match to the key and the second to the value. In the problem case, the value is: '"test b" # This is "test_directive_b"' Then the value gets matched against QVALEXPR = '"(.*)"'. This cleans up the value by removing the first and last '"', but in this case turns it into: test b" # This is "test_directive_b which then gets rejected in processEnvVar() with MSG_FAILSYN_QUOTE, since values aren't allowed to contain '"'. Changing QVALEXPR to '([-%w_]+)' fixes this problem. Since the value is explicitly prevented from containing quotes, it's not unreasonable to load it from an expression that excludes them. The only other place this is used is in the 'exec="command"' expression, which also should not contain '"' in the command value. PR: 265001 Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D35975
2024-07-29Revert "loader/lua: Remove workaround for command_error"Warner Losh
This reverts commit 552f3072af54820cf1805f712e2567bc1b7f046d. loader.command_error was added just after 11.2, but appears to not have been back ported to 11.x. 11.0 was the first lua loader release, so keep this compat shim until we sort out what to do. MFC After: 3 days Sponsored by: Netflix Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D45883
2024-02-29loader/lua: Remove workaround for command_errorWarner Losh
loader.command_error was available prior to stable/12 branching. No need to check if it is available or not. Sponsored by: Netflix Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D44144
2024-02-02stand/lua: always allow overriding with local config filesStéphane Rochoy
Loader now also read configuration files listed in local_loader_conf_files. Files listed here are the last ones read. And /boot/loader.conf.local was moved from loader_conf_files to local_loader_conf_files leaving only loader.conf and device.hints in loader_conf_files by default. The idea is to ensure local_loader_conf_files, i.e., /boot/loader.conf.local, can always be used to override other user defined settings. So the sequencing is now as follow: 1. Bootstrap: /boot/defaults/loader.conf 2. Read loader_conf_files files: /boot/device.hints /boot/loader.conf 3. Read loader_conf_dirs files: /boot/loader.conf.d/*.conf 4. And finally, rread local_loader_conf_files files: /boot/loader.conf.local Reviewed by: imp, kevans Pull Request: https://github.com/freebsd/freebsd-src/pull/759
2024-02-02stand/lua: per-product conf if requested via product_varsStéphane Rochoy
If product_vars is set, it must be a space separated list of environment variable names to walk through to guess the product. Each time a product can be guessed (i.e., the corresponding variable is defined), prepend /boot/loader.conf.d/PRODUCT/ to loader_conf_dirs. It can be typically used as follow: smbios.system.planar.maker="PLANAR_MAKER" smbios.system.planar.product="PLANAR_PRODUCT" smbios.system.product="PRODUCT" uboot.m_product="M_PRODUCT" product_vars="smbios.system.planar.maker smbios.system.planar.product smbios.system.product uboot.m_product" to read files found in the following directories, in that order: /boot/loader.conf.d/PLANAR_MAKER /boot/loader.conf.d/PLANAR_PRODUCT /boot/loader.conf.d/PRODUCT /boot/loader.conf.d/M_PRODUCT Reviewed by: imp, kevans Pull Request: https://github.com/freebsd/freebsd-src/pull/759
2024-02-02Revert "stand/lua: per-product conf if requested via product_vars"Warner Losh
This reverts commit 754cac4b283eb024a3a6a194130199c860e32ebf. No mail went out and commit message was wrong. Sponsored by: Netflix
2024-02-02Revert "stand/lua: always allow overriding with local config files"Warner Losh
This reverts commit d3d0b735571d9562812ce5b343a6e91f7a795dbe. no mail sent out, and the commit message was wrong. Sponsored by: Netflix
2024-02-02stand/lua: always allow overriding with local config filesStéphane Rochoy
Loader now also read configuration files listed in local_loader_conf_files. Files listed here are the last ones read. And /boot/loader.conf.local was moved from loader_conf_files to local_loader_conf_files leaving only loader.conf and device.hints in loader_conf_files by default. The idea is to ensure local_loader_conf_files, i.e., /boot/loader.conf.local, can always be used to override other user defined settings. So the sequencing is now as follow: 1. Bootstrap: /boot/defaults/loader.conf 2. Read loader_conf_files files: /boot/device.hints /boot/loader.conf 3. Read loader_conf_dirs files: /boot/loader.conf.d/*.conf 4. And finally, rread local_loader_conf_files files: /boot/loader.conf.local
2024-02-02stand/lua: per-product conf if requested via product_varsStéphane Rochoy
If product_vars is set, it must be a space separated list of environment variable names to walk through to guess the product. Each time a product can be guessed (i.e., the corresponding variable is defined), prepend /boot/loader.conf.d/PRODUCT/ to loader_conf_dirs. It can be typically used as follow: smbios.system.planar.maker="PLANAR_MAKER" smbios.system.planar.product="PLANAR_PRODUCT" smbios.system.product="PRODUCT" uboot.m_product="M_PRODUCT" product_vars="smbios.system.planar.maker smbios.system.planar.product smbios.system.product uboot.m_product" to read files found in the following directories, in that order: /boot/loader.conf.d/PLANAR_MAKER /boot/loader.conf.d/PLANAR_PRODUCT /boot/loader.conf.d/PRODUCT /boot/loader.conf.d/M_PRODUCT
2023-09-04stand: lua: module names should permit moreKyle Evans
The module entries should generally allow whatever is allowed as an env_var in the pattern table. Notably, we're missing periods which would allow proper entries for .dtb files in loader.conf that don't need to specify a module_name entry for it. %d in this expression is actually redundant as %w is actually "all alphanumerics," but I've included it for now to match the env_var entry. We should really remove it from both. Reported by: "aribi" on the forums via allanjude@ MFC after: 1 week
2023-08-16Remove $FreeBSD$: two-line lua tagWarner Losh
Remove /^--\n--\s*\$FreeBSD\$.*$\n/
2023-05-12spdx: The BSD-2-Clause-FreeBSD identifier is obsolete, drop -FreeBSDWarner Losh
The SPDX folks have obsoleted the BSD-2-Clause-FreeBSD identifier. Catch up to that fact and revert to their recommended match of BSD-2-Clause. Discussed with: pfg MFC After: 3 days Sponsored by: Netflix
2023-05-10lualoader: add support for .lua configuration filesKyle Evans
If a file is specified in loader_conf_files that ends in '.lua', lualoader will now load and execute that file. These may be used in place of a traditional loader.conf to use more complicated logic, where some values may be set based on others or based on the environment that the C bits has left us with. Lua scripts are run in a limited environment. In particular, it does not get access to any modules or, in-fact, anything except environment variable. A config.buildenv hook has been added so that a local module can add whatever it may need to to the environment. When a global var is set in the lua script, it does not immediately alter the loader environment. Instead, the script's environment is initially empty and processed only if the whole script executes successfully. Effectively, a lua configuration file either takes effect or it does not, an error will not leave it in a half-baked state. Reviewed by: bcr (manpages), imp Differential Revision: https://reviews.freebsd.org/D28450
2023-02-09lua: Export loaded modules env vars via environmentWarner Losh
To make auditing and debugging easier, export foo_load=XXX foo_name=yyy etc to the loader env that we export to the kernel. Original by: dhw Sponsored by: Netflix Discussed with: kevans Differential Revsion: https://reviews.freebsd.org/D38466
2021-01-31lualoader: position hyphens at the beginning of character classesKyle Evans
According to the Lua 5.4 manual section 6.4.1 ("Patterns"), the interaction between ranges and classes is not defined and hyphens must be specified at either the beginning or the end of a set if they are not escaped. Move all such occurrences to the beginning. Reported-by: _parv (twitter) MFC-after: 3 days
2021-01-24lualoader: improve loader.conf var processingKyle Evans
lualoader was previously not processing \ as escapes; this commit fixes that and does better error checking on the value as well. Additionally, loader.conf had some odd restrictions on values that make little sense. Previously, lines like: kernel=foo Would simply be discarded with a malformed line complaint you might not see unless you disable beastie. lualoader tries to process these as well as it can and manipulates the environment, while forthloader did minimal processing and constructed a `set` command to do the heavy lifting instead. The lua approach was re-envisioned from building a `set` command so that we can appropriately reset the environment when, for example, boot environments change. Lift the previous restrictions to allow unquoted values on the right hand side of an expression. Note that an unquoted value is effectively: [A-Za-z0-9-][A-Za-z0-9-_.]* This commit also stops trying to weirdly limit what it can handle in a quoted value. Previously it only allowed spaces, alphanumeric, and punctuation, which is kind of weird. Change it here to grab as much as it can between two sets of quotes, then let processEnvVar() do the needful and complain if it finds something malformed looking. My extremely sophisticated test suite is as follows: <<EOF X_01_simple_string="simple" X_02_escaped_string="s\imple" X_03_unquoted_val=3 X_04_unquoted_strval=simple_test X_05_subval="${X_03_unquoted_val}" X_06_escaped_subval="\${X_03_unquoted_val}" X_07_embedded="truth${X_03_unquoted_val}" X_08_escaped_embedded="truth\${X_03_unquoted_val}" X_09_unknown="${unknown_val}" X_10_unknown_embedded="truth${unknown_val}" X_11_crunchy="crunch$unknown_val crunch" X_12_crunchy="crunch${unknown_val}crunch" Y_01_badquote="te"lol" Y_02_eolesc="lol\" Y_02_noteolesc="lol\\" Y_03_eolvar="lol$" Y_03_noteolvar="lol\$" Y_04_badvar="lol${" exec="echo Done!" EOF Future work may provide a stub loader module in userland so that we can formally test the loader scripts rather than sketchy setups like the above in conjunction with the lua-* tools in ^/tools/boot.
2020-12-31lualoader: add loader_conf_dirs support (loader.conf.d)Kyle Evans
loader_conf_dirs is the supporting mechanism for the included /boot/loader.conf.d directory. When lualoader finishes processing all of the loader_conf_files it finds after walking /boot/defaults/loader.conf, it will now check any and all loader_conf_dirs and process files ending in ".conf" as if they were a loader.conf. Note that loader_conf_files may be specified in a loader.conf.d config file, but loader_conf_dirs may *not*. It will only be processed as specified in /boot/defaults/loader.conf and any loader_conf_files that were loaded from there. Reviewed by: allanjude, freqlabs, rpokala, tsoome Includes suggestion from: imp Relnotes: yes Differential Revision: https://reviews.freebsd.org/D25608
2020-12-17lualoader: cli: provide a show-module-options loader commandKyle Evans
This effectively dumps everything lualoader knows about to the console using the libsa pager; that particular lua interface was added in r368591. A pager stub implementation has been added that just dumps the output as-is as a compat shim for older loader binaries that do not have lpager. This stub should be moved into a more appropriate .lua file if we add anything else that needs the pager. Notes: svn path=/head/; revision=368728
2020-12-12lualoader: config: fix module enabled checkKyle Evans
A last minute rewrite left this logically wrong; if it's present in modules_blacklist, then we do not load it. Notes: svn path=/head/; revision=368579
2020-12-12lualoader: provide module-manipulation commandsKyle Evans
Specifically, we have: - enable-module - disable-module - toggle-module These can be used to add/remove modules to be loaded or force modules to be loaded in spite of modules_blacklist. In the typical case, a user is expected to use them to recover an issue happening due to a module directive they've added to their loader.conf or because they discover that they've under-specified what to load. MFC after: 1 week Notes: svn path=/head/; revision=368575
2020-09-21loader: zfs should support bootonce an nextbootToomas Soome
bootonce feature is temporary, one time boot, activated by "bectl activate -t BE", "bectl activate -T BE" will reset the bootonce flag. By default, the bootonce setting is reset on attempt to boot and the next boot will use previously active BE. By setting zfs_bootonce_activate="YES" in rc.conf, the bootonce BE will be set permanently active. bootonce dataset name is recorded in boot pool labels, bootenv area. in case of nextboot, the nextboot_enable boolean variable is recorded in freebsd:nvstore nvlist, also stored in boot pool label bootenv area. On boot, the loader will process /boot/nextboot.conf if nextboot_enable is "YES", and will set nextboot_enable to "NO", preventing /boot/nextboot.conf processing on next boot. bootonce and nextboot features are usable in both UEFI and BIOS boot. To use bootonce/nextboot features, the boot loader needs to be updated on disk; if loader.efi is stored on ESP, then ESP needs to be updated and for BIOS boot, stage2 (zfsboot or gptzfsboot) needs to be updated (gpart or other tools). At this time, only lua loader is updated. Sponsored by: Netflix, Klara Inc. Differential Revision: https://reviews.freebsd.org/D25512 Notes: svn path=/head/; revision=365938
2020-04-30lualoader: config: improve readConfFiles, rename to readConfKyle Evans
The previous interface was pretty bad, and required the caller to get some implementation details correct that it really shouldn't need to (e.g. loader_conf_files handling) and pass in an empty table for it to use. The new and much improved interface, readConf, is much less of a hack; hiding these implementation details and just doing the right thing. config.lua will now use it to process /boot/defaults/loader.conf and the subsequent loader_conf_files from there, and read-conf will also use it. This improvement submitted by Olivier (cited below), loader_conf_files handling from the original patch was changed to just clobber it before processing and not bother restoring it after the fact following r360505 where it's now guaranteed to evade the loader environment. PR: 244640 Submitted by: Olivier Certner (olivier freebsd free fr> Notes: svn path=/head/; revision=360506
2020-04-30lualoader: config: add a table for restricted environment varsKyle Evans
This new table should be used for transient values that don't need to end up in the loader environment. Generally, these will be things that are internal details that really aren't needed or interesting outside of the config module (e.g. if we changed how ${module}_* directives work, they might use this instead). To start, populate it with loader_conf_files. Any specific value of loader_conf_files isn't all that interesting; if we're going to export it, we should really instead export a loader_conf_files that indicates all of the configuration files we processed. This will be used to reduce bookkeeping overhead in a future commit that cleans up readConfFiles. Notes: svn path=/head/; revision=360505
2020-04-28lualoader: config: start exporting readConfFilesKyle Evans
In the process, change it slightly: readConfFiles will take a string like loader_conf_files in addition to the loaded_files table that it normally takes. This is to facilitate the addition of a read-conf CLI command, which will just pass in the single file to read and an empty table. MFC after: 3 days Notes: svn path=/head/; revision=360421
2020-04-28lualoader config: don't call loader.getenv() as muchKyle Evans
We don't actually need to fetch loader_conf_files as much as we do; we've already fetched it once at the beginning, we only really need to fetch it again after each file we've processed. If it changes, then we can stash that off into our local prefiles. While here, drop a note about the recursion so that I stop trying to change it. It may very well make redundant some of the work we're doing, but that's OK. MFC after: 3 days Notes: svn path=/head/; revision=360420
2020-03-18Fixup line lost from previous commit (r359072)Ryan Moeller
Reviewed by: kevans Approved by: mav (mentor) MFC after: 1 week Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D24115 Notes: svn path=/head/; revision=359073
2020-03-18loader: Add a "kernel.loaded" hookRyan Moeller
This hook can be useful, for example to run a local function to choose different modules to load when a user has picked a different kernel from the menu. Reviewed by: kevans Approved by: mav (mentor) MFC after: 1 week Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D24115 Notes: svn path=/head/; revision=359072
2020-01-25lua: add modules.loaded hookKyle Evans
This may be used for the local module to hook in and load any additional modules that it wants, since it can't modify the modules table internal to config. We may consider adding API to do so at a later time, but I suspect it will be more complicated to use with little return. status is captured but ignored for the purpose of loading the hook. status will be false if *any* module failed to load, but we typically don't let that halt the boot so there's no reason to let it halt hooks. Some vendors or setups may have expected fails that would be actively thwarted by checking it. We may, at a later date, consider adding an API for letting non-config modules check which modules have successfully (or not) loaded in case an unexpected failure *should* halt whatever they are doing. MFC after: 3 days Notes: svn path=/head/; revision=357104
2019-09-26Further normalize copyright noticesKyle Evans
- s/C/c/ where I've been inconsistent about it - +SPDX tags - Remove "All rights reserved" where possible Requested by: rgrimes (all rights reserved) Notes: svn path=/head/; revision=352757
2019-03-26lualoader: Fix up some luacheck concernsKyle Evans
- Garbage collect an unused (removed because it was useless) constant - Don't bother with vararg notation if args will not be used MFC after: 1 week Notes: svn path=/head/; revision=345518
2018-10-27lualoader: Always return a proper dictionary for blacklistKyle Evans
If module_blacklist isn't specified, we have an empty blacklist; effectively the same as if module_blacklist="" were specified in loader.conf(5). This was reported when switching to a BE that predated the module_blacklist introduction, but the problem is valid all the same and likely to be tripped over in other scenarios. Reported by: bwidawsk MFC after: 3 days Notes: svn path=/head/; revision=339805
2018-10-25lualoader: Improve module loading diagnosticsKyle Evans
Some fixes: - Maintain historical behavior more accurately w.r.t verbose_loading; verbose_loading strictly prints "${module_name...}" and later "failed!" or "ok" based on load success - With or without verbose_loading, dump command_errbuf on load failure. This usually happens prior to ok/failed if we're verbose_loading Reviewed by: imp MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D17694 Notes: svn path=/head/; revision=339702
2018-10-07lualoader: Create a module blacklist, add DRM modules to itKyle Evans
This is a step in the process of easing migration into the new world order of DRM drivers. Strongly encourage users towards loading DRM modules via rc.conf(5) instead of loader.conf(5) by failing the load from loader(8). Users so inclined may wipe out the blacklist via module_blacklist="" in loader.conf(5), and it is expected that these modules will eventually be removed from the blacklist. They may still be loaded as dependencies of other modules or explicitly via the loader prompt, but this should not be a major problem. Approved by: re (rgrimes) Relnotes: yes Differential Revision: https://reviews.freebsd.org/D16914 Notes: svn path=/head/; revision=339218
2018-08-25lualoader: Fix override of module_path on loader promptKyle Evans
Earlier changes setup a config.module_path variable that was populated upon reading of loader.conf(5) and used for restoring module_path to pristine condition if multiple kernels are attempted. This broke the ability to override module_path at the loader prompt in case of emergency. Approved by: re (rgrimes) Notes: svn path=/head/; revision=338309
2018-08-23lualoader: Accept that people use unquoted values in loader.confKyle Evans
While loader.conf(5) suggests that all values should be quoted, reality is that this was never strictly enforced and it is used. We already make some concession to this in number values, which aren't strictly quoted either. The compromise here is that multi-word values must be quoted. This lets things like `foo_load=YES` work, while denying more complex expressions on the right hand side. This likely catches the vast majority of current usage. A bit of a kludge is needed to accomplish this since Lua regex doesn't support branching. I had considered splitting up expressions and generating the right-hand side of the expressions completely in config.parse, but deemed this too large of an overhaul to take given the current timing. This should be re-worked shortly after the thaw. Reported by: royger Notes: svn path=/head/; revision=338259
2018-08-23lualoader: Fix (add) Xen supportKyle Evans
lualoader was not respecting the 'xen_kernel' environment variable, which hints to the interpreter that it should load a Xen kernel prior to loading any other kernel that might be specified. If a Xen kernel is specified and we fail to load it, we should not proceed to boot. Reported by: royger Tested by: royger Notes: svn path=/head/; revision=338255
2018-08-22lualoader: Fix loader.conf(5) EOL validation for 'exec' linesKyle Evans
This includes some light rework to simplify the line parsing, as well. If we hit a line match, we'll always either use the line and move on to the next line, or we'll spew out malformed line errors. We had multiple spots to output the error and set the status based on whether we had a non-nil first capture group or failed EOL validation, but it was always the same error. Light rework entails a small label jump to skip error handling and elimination of 'found' local. Notes: svn path=/head/; revision=338173
2018-08-21lualoader: Refactor config line expressionsKyle Evans
A couple of issues addressed: 1.) Modules with - in the name were not recognized as modules 2.) The module regex was repeated for each place a module name may appear 3.) The 'strip leading space' bits were repeated for each expression 4.) The trailing 'comment validation' stuff was repeated every expression #4 still has some more work to be done. exec lines, for instance, don't capture a 'value' -- there's only one capture pattern. This throws off the 'c' value that we match, so the trailing bits aren't *actually* being validated. This isn't a new issue, though, so a future comit will address this. Notes: svn path=/head/; revision=338168
2018-08-13lualoader: Fix parsing of negative number loader.conf(5) variablesKyle Evans
They would previously cause errors, as the regex for these did not tolerate a leading negative sign, and the variable would simply not parse. Notes: svn path=/head/; revision=337711
2018-07-27lualoader: "nextboot_file" should be spelled "nextboot_conf"Kyle Evans
See: /boot/defaults/loader.conf Reported by: gtetlow (inadvertently) Notes: svn path=/head/; revision=336759
2018-06-19lualoader: Correct kernel_options handlingKyle Evans
`kernel_options` were being passed as flags to load, rather than to the kernel being loaded. This is the kernel_options counterpart to r335009. Notes: svn path=/head/; revision=335371
2018-06-12lualoader: Match Forth module-loading behavior w.r.t flagsKyle Evans
Also as documented in loader.conf(5), ${module}_flags are actually flags to be passed to the module, not to `load` as was done thus far. Notes: svn path=/head/; revision=335009
2018-06-10lualoader: Support variable substitution in env var settingsKyle Evans
We support both of the following cases of substitution: bar="y" foo="${bar}" foo="$bar" The latter substitution syntax is, of course, not recommended- all punctuation must be considered potential variable names, and we do not go through the effort of searching the different combinations of, for instance, "$x.y.z" to determine if the variable is $x, $x.y, or $x.y.z. This is not officially documented as supported, but it has worked in forthloader for what is most likely a long time as `evaluate` is used to process the right hand side of the assignment. Notes: svn path=/head/; revision=334912
2018-06-10lualoader: Process loader_conf_files properlyKyle Evans
loader.conf(5) documents loader_conf_files to mean "additional configuration files to be processed right after the present file." However, lualoader ignored loader_conf_files after processing /boot/defaults/loader.conf. Rewrite these bits to process loader_conf_files after each loaded file. Notes: svn path=/head/; revision=334907
2018-06-06lualoader: Add a loaded hook for others to execute upon config loadKyle Evans
This will not be executed on reload, though later work could allow for that. It's intended/expected that later work won't generally need to happen on every config load, just once (for, e.g., menu initialization) or just when config is reloaded but not upon the initial load. Notes: svn path=/head/; revision=334723
2018-04-01lualoader: Simplify some expressionsKyle Evans
- No need for a 'goto' when our entire loop body is then wrapped in a conditional. - No need to leave commented out prints laying around - If an expression is clearly going to be either nil or an expression that isn't likely to be a boolean, we might as well use `or` to specify a default value for the expression. e.g. `loader.getenv(...) or "no"` Notes: svn path=/head/; revision=331857
2018-03-31lualoader: revert whitespace change that snuck inKyle Evans
Notes: svn path=/head/; revision=331856
2018-03-31lualoader: Don't assume that {module}_load is setKyle Evans
The previous iteration of this assumed that {module}_load was set. In the old world order of default loader.conf(5), this was probably a safe assumption given that we had almost every module explicitly not-loaded in it. In the new world order, this is no longer the case, so one could delete a _load line inadvertently while leaving a _name, _type, _flags, _before, _after, or _error. This would have caused a confusing Lua error and borked module loading. Notes: svn path=/head/; revision=331855
2018-03-31lualoader: Do case-insensitive comparison of "yes"Kyle Evans
Notes: svn path=/head/; revision=331854
2018-03-24lualoader: Privatize some more config.lua bitsKyle Evans
These functions are also not quite suitable for a public API, so privatize them to config. Notes: svn path=/head/; revision=331477