// command: shexy (shellexec) v0.4.2
// Changelog
// * Minor changes
// * Concentrate on commandline, build and instant exec of src
// * Added more DEBUG msg
// * Introduced error msg
// * Added clean function for cache
DebugOn = false
BinaryOn = true
filepath = ""
allowimport = true
cachepath = home_dir+"/"+"Cache"+"/"+"shexy"
tocolor = function(color)
return "<color="+color+">"+self.str+"</color>"
end function
convert = function(text)
obj = {}
obj.str = str(text)
obj.tocolor = @tocolor
return obj
end function
debug = function(msg)
if DebugOn then
current = current_date
date = current.split(" - ")[0].split("/")
time = current.split(" - ")[1].split(":")
stamp = "("+date[1]+" "+date[0]+" "+time[0]+":"+time[1]+")"
print( convert(stamp+" [DEBUG] "+msg).tocolor("purple") )
end if
end function
error = function(msg)
current = current_date
date = current.split(" - ")[0].split("/")
time = current.split(" - ")[1].split(":")
stamp = "("+date[1]+" "+date[0]+" "+time[0]+":"+time[1]+")"
exit( convert(stamp+" [ERROR] "+msg).tocolor("red") )
end function
help = function()
helptext = []
sl = []
sl.push(convert("Help Text:"+char(9)).tocolor("#5E6EBBFF"))
sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
sl.push(convert("help").tocolor("#B1B629FF"))
helptext.push(sl.join(char(9)))
sl = []
sl.push(convert("Run Source:"+char(9)).tocolor("#5E6EBBFF"))
sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
sl.push(convert("[source] [args]").tocolor("#B1B629FF"))
helptext.push(sl.join(char(9)))
sl = []
sl.push(convert("Build Source:").tocolor("#5E6EBBFF"))
sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
sl.push(convert("build [source]").tocolor("#B1B629FF"))
helptext.push(sl.join(char(9)))
sl = []
sl.push(convert("Clean Cache:").tocolor("#5E6EBBFF"))
sl.push(convert(launch_path.split("/")[-1]).tocolor("#6FAD69FF"))
sl.push(convert("clean").tocolor("#B1B629FF"))
helptext.push(sl.join(char(9)))
for line in helptext
print(line)
end for
end function
mkdirparent = function(dirpath)
if typeof(get_shell.host_computer.File(dirpath)) != "file" then
debug(dirpath+" doesn't exist. Creating.")
pth = []
for index in dirpath.split("/")
if index == "" then continue
pth.push(index)
debug("Check: "+"/"+pth.join("/"))
if typeof(get_shell.host_computer.File("/"+pth.join("/"))) != "file" then
debug("/"+pth.join("/")+" doesn't exist.")
if get_shell.host_computer.File(parent_path("/"+pth.join("/"))).has_permission("w") then
debug("Create folder: "+"/"+pth.join("/"))
get_shell.host_computer.create_folder(parent_path("/"+pth.join("/")),pth[-1])
else if not get_shell.host_computer.File(parent_path("/"+pth.join("/"))).has_permission("w") then
error("Cannot create folder "+"/"+pth.join("/"))
end if
else if typeof(get_shell.host_computer.File("/"+pth.join("/"))) == "file" then
debug("/"+pth.join("/")+" exists.")
end if
end for
end if
end function
commandline = function()
filename = "tmp.src"
fullpath = cachepath+"/"+filename
mkdirparent(cachepath)
get_shell.host_computer.touch(cachepath,filename)
clear_screen
print(convert("~ Shexy - Command Line ~").tocolor("#5E6EBBFF"))
print(convert("Here you can run GreyHackCode instantly. Exit with [q|quit].").tocolor("#96528CFF"))
while true
input = user_input("> ",false,false)
if input == "quit" or "q" then exit
get_shell.host_computer.File(fullpath).set_content(input)
get_shell.build(fullpath,cachepath,false)
get_shell.launch(cachepath+"/"+filename.remove(".src"))
end while
end function
compile = function()
Path = current_path
Filename = params[1]
Source = Path+"/"+Filename
Target = Path
get_shell.build(Source,Target,allowimport)
end function
cleanup = function()
for file in get_shell.host_computer.File(cachepath).get_files
if file.has_permission("w") then
file.delete
end if
end for
end function
if params.len == 0 then commandline
for parm in params
if parm == "help" then
help()
exit
end if
if parm == "build" then
compile()
exit
end if
if parm == "clean" then
cleanup()
exit
end if
check_path = function(input)
for x in input
NewPath = x
Object = get_shell.host_computer.File(NewPath)
Type = typeof(Object)
if Type != "file" and Type == "null" then
debug(NewPath+" is a "+Type+" object")
continue
else if Type == "file" and Type != "null" then
debug(NewPath+" is a "+Type+" object")
output = NewPath
return output
break
end if
end for
end function
Paths = []
Paths.push(parent_path(launch_path)+"/"+parm)
Paths.push(parent_path(program_path)+"/"+parm)
Paths.push(current_path+"/"+parm)
Paths.push(parm)
filepath = check_path(Paths)
args = params[1:].join(" ")
debug("Arguments: "+args)
end for
debug("Path: "+filepath)
if filepath == "" then error("No valid path")
source = get_shell.host_computer.File(filepath)
if not source.has_permission("r") then
debug(source.path+" has no read permissions.")
exit
end if
if filepath.indexOf(".src") and not get_shell.host_computer.File(filepath).is_binary then
if source != null then
mkdirparent(cachepath)
src = get_shell.host_computer.File(current_path+"/"+params[0])
md5sum = md5(get_shell.host_computer.File(filepath).get_content)
BinName = filepath.split("/")[-1].remove(".src")
program = cachepath+"/"+BinName+"-"+md5sum
for file in get_shell.host_computer.File(cachepath).get_files
if file.name == "tmp" or "tmp.src" then continue
FileName = file.name.split("-")[0]
FileSum = file.name.split("-")[1]
debug(FileName+"-"+FileSum)
if FileSum != md5sum and FileName == BinName then
file.delete
continue
end if
if FileSum == md5sum and FileName == BinName then
debug("Run: "+cachepath+"/"+FileName+"-"+FileSum)
get_shell.launch(file.path, args)
OnlyRuntime = round(time,2)
debug("Run Time => "+str(OnlyRuntime)+" sec")
exit
end if
end for
debug("Source file: "+filepath)
debug("Target Path: "+cachepath)
get_shell.build(filepath,cachepath,false)
BinPath = get_shell.host_computer.File(cachepath+"/"+BinName)
if BinPath != null then
get_shell.host_computer.File(cachepath+"/"+BinName).rename(BinName+"-"+md5sum)
BuildTime = round(time,2)
debug("Build Time => "+str(BuildTime)+" sec")
else
exit("File not compiled")
end if
get_shell.launch(cachepath+"/"+BinName+"-"+md5sum, args)
RunTime = time
RunTime = round(RunTime - BuildTime,2)
debug("Run Time => "+str(RunTime)+" sec")
exit
end if
else if get_shell.host_computer.File(filepath).is_binary and BinaryOn then
get_shell.launch(filepath)
end if