lualoader: Split cli bits out into a cli module
This module will, in the not-so-distant future, grow functionality for reducing boilerplate in functions that implement cli commands. It will likely also house most in-tree cli commands.
This commit is contained in:
parent
a33ba3dbde
commit
e37f4622df
@ -3,7 +3,8 @@
|
||||
.include <bsd.init.mk>
|
||||
|
||||
BINDIR= /boot/lua
|
||||
FILES= color.lua \
|
||||
FILES= cli.lua \
|
||||
color.lua \
|
||||
config.lua \
|
||||
core.lua \
|
||||
drawer.lua \
|
||||
|
113
stand/lua/cli.lua
Normal file
113
stand/lua/cli.lua
Normal file
@ -0,0 +1,113 @@
|
||||
--
|
||||
-- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
|
||||
-- All rights reserved.
|
||||
--
|
||||
-- Redistribution and use in source and binary forms, with or without
|
||||
-- modification, are permitted provided that the following conditions
|
||||
-- are met:
|
||||
-- 1. Redistributions of source code must retain the above copyright
|
||||
-- notice, this list of conditions and the following disclaimer.
|
||||
-- 2. Redistributions in binary form must reproduce the above copyright
|
||||
-- notice, this list of conditions and the following disclaimer in the
|
||||
-- documentation and/or other materials provided with the distribution.
|
||||
--
|
||||
-- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
-- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
-- SUCH DAMAGE.
|
||||
--
|
||||
-- $FreeBSD$
|
||||
--
|
||||
|
||||
local core = require('core')
|
||||
|
||||
local cli = {}
|
||||
|
||||
-- Internal function
|
||||
-- Parses arguments to boot and returns two values: kernel_name, argstr
|
||||
-- Defaults to nil and "" respectively.
|
||||
-- This will also parse arguments to autoboot, but the with_kernel argument
|
||||
-- will need to be explicitly overwritten to false
|
||||
local parse_boot_args = function(argv, with_kernel)
|
||||
if with_kernel == nil then
|
||||
with_kernel = true
|
||||
end
|
||||
if #argv == 0 then
|
||||
if with_kernel then
|
||||
return nil, ""
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
local kernel_name
|
||||
local argstr = ""
|
||||
|
||||
for k, v in ipairs(argv) do
|
||||
if with_kernel and v:sub(1,1) ~= "-" then
|
||||
kernel_name = v
|
||||
else
|
||||
argstr = argstr .. " " .. v
|
||||
end
|
||||
end
|
||||
if with_kernel then
|
||||
return kernel_name, argstr
|
||||
else
|
||||
return argstr
|
||||
end
|
||||
end
|
||||
|
||||
-- Globals
|
||||
|
||||
function boot(...)
|
||||
local argv = {...}
|
||||
local cmd_name = ""
|
||||
cmd_name, argv = core.popFrontTable(argv)
|
||||
local kernel, argstr = parse_boot_args(argv)
|
||||
if kernel ~= nil then
|
||||
loader.perform("unload")
|
||||
config.selectkernel(kernel)
|
||||
end
|
||||
core.boot(argstr)
|
||||
end
|
||||
|
||||
function autoboot(...)
|
||||
local argv = {...}
|
||||
local cmd_name = ""
|
||||
cmd_name, argv = core.popFrontTable(argv)
|
||||
local argstr = parse_boot_args(argv, false)
|
||||
core.autoboot(argstr)
|
||||
end
|
||||
|
||||
-- Declares a global function cli_execute that attempts to dispatch the
|
||||
-- arguments passed as a lua function. This gives lua a chance to intercept
|
||||
-- builtin CLI commands like "boot"
|
||||
function cli_execute(...)
|
||||
local argv = {...}
|
||||
-- Just in case...
|
||||
if #argv == 0 then
|
||||
loader.command(...)
|
||||
return
|
||||
end
|
||||
|
||||
local cmd_name = argv[1]
|
||||
local cmd = _G[cmd_name]
|
||||
if cmd ~= nil and type(cmd) == "function" then
|
||||
-- Pass argv wholesale into cmd. We could omit argv[0] since the
|
||||
-- traditional reasons for including it don't necessarily apply,
|
||||
-- it may not be totally redundant if we want to have one global
|
||||
-- handling multiple commands
|
||||
cmd(...)
|
||||
else
|
||||
loader.command(...)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return cli
|
@ -37,60 +37,6 @@ local compose_loader_cmd = function(cmd_name, argstr)
|
||||
return cmd_name
|
||||
end
|
||||
|
||||
-- Internal function
|
||||
-- Parses arguments to boot and returns two values: kernel_name, argstr
|
||||
-- Defaults to nil and "" respectively.
|
||||
-- This will also parse arguments to autoboot, but the with_kernel argument
|
||||
-- will need to be explicitly overwritten to false
|
||||
local parse_boot_args = function(argv, with_kernel)
|
||||
if with_kernel == nil then
|
||||
with_kernel = true
|
||||
end
|
||||
if #argv == 0 then
|
||||
if with_kernel then
|
||||
return nil, ""
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
local kernel_name
|
||||
local argstr = ""
|
||||
|
||||
for k, v in ipairs(argv) do
|
||||
if with_kernel and v:sub(1,1) ~= "-" then
|
||||
kernel_name = v
|
||||
else
|
||||
argstr = argstr .. " " .. v
|
||||
end
|
||||
end
|
||||
if with_kernel then
|
||||
return kernel_name, argstr
|
||||
else
|
||||
return argstr
|
||||
end
|
||||
end
|
||||
|
||||
-- Globals
|
||||
function boot(...)
|
||||
local argv = {...}
|
||||
local cmd_name = ""
|
||||
cmd_name, argv = core.popFrontTable(argv)
|
||||
local kernel, argstr = parse_boot_args(argv)
|
||||
if kernel ~= nil then
|
||||
loader.perform("unload")
|
||||
config.selectkernel(kernel)
|
||||
end
|
||||
core.boot(argstr)
|
||||
end
|
||||
|
||||
function autoboot(...)
|
||||
local argv = {...}
|
||||
local cmd_name = ""
|
||||
cmd_name, argv = core.popFrontTable(argv)
|
||||
local argstr = parse_boot_args(argv, false)
|
||||
core.autoboot(argstr)
|
||||
end
|
||||
|
||||
-- Module exports
|
||||
-- Commonly appearing constants
|
||||
core.KEY_BACKSPACE = 8
|
||||
|
@ -27,6 +27,7 @@
|
||||
-- $FreeBSD$
|
||||
--
|
||||
|
||||
local cli = require("cli")
|
||||
local config = require("config")
|
||||
local menu = require("menu")
|
||||
local password = require("password")
|
||||
@ -38,31 +39,6 @@ if result ~= nil then
|
||||
local_module = require("local")
|
||||
end
|
||||
|
||||
-- Declares a global function cli_execute that attempts to dispatch the
|
||||
-- arguments passed as a lua function. This gives lua a chance to intercept
|
||||
-- builtin CLI commands like "boot"
|
||||
function cli_execute(...)
|
||||
local argv = {...}
|
||||
-- Just in case...
|
||||
if #argv == 0 then
|
||||
loader.command(...)
|
||||
return
|
||||
end
|
||||
|
||||
local cmd_name = argv[1]
|
||||
local cmd = _G[cmd_name]
|
||||
if cmd ~= nil and type(cmd) == "function" then
|
||||
-- Pass argv wholesale into cmd. We could omit argv[0] since the
|
||||
-- traditional reasons for including it don't necessarily apply,
|
||||
-- it may not be totally redundant if we want to have one global
|
||||
-- handling multiple commands
|
||||
cmd(...)
|
||||
else
|
||||
loader.command(...)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
config.load()
|
||||
password.check()
|
||||
menu.run()
|
||||
|
Loading…
x
Reference in New Issue
Block a user