102 lines
2.4 KiB
Text
102 lines
2.4 KiB
Text
|
local bRunning = true
|
||
|
local tCommandHistory = {}
|
||
|
local tEnv = {
|
||
|
["exit"] = function()
|
||
|
bRunning = false
|
||
|
end,
|
||
|
["_echo"] = function( ... )
|
||
|
return ...
|
||
|
end,
|
||
|
}
|
||
|
|
||
|
if not security.getSU() then
|
||
|
exception.throw("RestrictedOpsException")
|
||
|
return
|
||
|
end
|
||
|
|
||
|
setmetatable( tEnv, { __index = _ENV } )
|
||
|
|
||
|
local label = os.getComputerLabel() or os.getComputerID()
|
||
|
|
||
|
print( "lsh - The Lua interpreter shell" )
|
||
|
print("Call exit() to quit.")
|
||
|
term.setTextColour( colours.white )
|
||
|
|
||
|
while bRunning do
|
||
|
if security.getActiveUserStatus() then
|
||
|
term.setTextColour( colours.lime )
|
||
|
else
|
||
|
term.setTextColour( colours.orange )
|
||
|
end
|
||
|
write( _activeUser )
|
||
|
term.setTextColour( colours.lightGrey )
|
||
|
write( "@" )
|
||
|
term.setTextColour( colours.lightBlue )
|
||
|
write( label )
|
||
|
term.setTextColour( colours.lightGrey )
|
||
|
write( "/" )
|
||
|
term.setTextColour( colours.lightBlue )
|
||
|
write( shell.dir() )
|
||
|
if security.getActiveUserStatus() then
|
||
|
term.setTextColour( colours.lime )
|
||
|
else
|
||
|
term.setTextColour( colours.orange )
|
||
|
end
|
||
|
write( " % " )
|
||
|
|
||
|
term.setTextColour( colours.white )
|
||
|
|
||
|
local s = read( nil, tCommandHistory, function( sLine )
|
||
|
local nStartPos = string.find( sLine, "[a-zA-Z0-9_%.]+$" )
|
||
|
if nStartPos then
|
||
|
sLine = string.sub( sLine, nStartPos )
|
||
|
end
|
||
|
if #sLine > 0 then
|
||
|
return textutils.complete( sLine, tEnv )
|
||
|
end
|
||
|
return nil
|
||
|
end )
|
||
|
term.setTextColour( colours.lightGrey )
|
||
|
table.insert( tCommandHistory, s )
|
||
|
|
||
|
local nForcePrint = 0
|
||
|
local func, e = load( s, "lua", "t", tEnv )
|
||
|
local func2, e2 = load( "return _echo("..s..");", "lua", "t", tEnv )
|
||
|
if not func then
|
||
|
if func2 then
|
||
|
func = func2
|
||
|
e = nil
|
||
|
nForcePrint = 1
|
||
|
end
|
||
|
else
|
||
|
if func2 then
|
||
|
func = func2
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if func then
|
||
|
local tResults = { pcall( func ) }
|
||
|
if tResults[1] then
|
||
|
local n = 1
|
||
|
while (tResults[n + 1] ~= nil) or (n <= nForcePrint) do
|
||
|
local value = tResults[ n + 1 ]
|
||
|
if type( value ) == "table" then
|
||
|
local ok, serialised = pcall( textutils.serialise, value )
|
||
|
if ok then
|
||
|
print( serialised )
|
||
|
else
|
||
|
print( tostring( value ) )
|
||
|
end
|
||
|
else
|
||
|
print( tostring( value ) )
|
||
|
end
|
||
|
n = n + 1
|
||
|
end
|
||
|
else
|
||
|
printError( tResults[2] )
|
||
|
end
|
||
|
else
|
||
|
printError( e )
|
||
|
end
|
||
|
|
||
|
end
|