65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
from commands import registered_cmds
|
|
from raw_commands import RawCommand
|
|
from formatters import Printer
|
|
from example_cmd import example_cmd, echo
|
|
|
|
import os
|
|
import os.path
|
|
import shlex
|
|
|
|
for path in os.environ['PATH'].split(':'):
|
|
if os.path.exists(path):
|
|
binaries = os.listdir(path)
|
|
for binary in binaries:
|
|
if binary not in globals():
|
|
globals()[binary] = RawCommand(binary)
|
|
|
|
|
|
def parse_cmd(potential_cmd):
|
|
"""Evaluates a potential command. If it exists in the list of
|
|
registered commands, we return a string that would call the
|
|
constructor for that command. If it does not exist, we wrap the
|
|
name of the command with the RawCommand class.
|
|
|
|
:return: A string that when evaluated by Python's `eval` feature
|
|
would build an object of the correct type
|
|
"""
|
|
args = potential_cmd.strip().split(' ')
|
|
cmd_name = args[0]
|
|
if args:
|
|
args = args[1:]
|
|
if cmd_name not in registered_cmds:
|
|
return "RawCommand({})".format(shlex.split(potential_cmd))
|
|
else:
|
|
return "{0}({1})".format(cmd_name,str(args))
|
|
|
|
|
|
def parse_cmds(raw):
|
|
potential_cmds = raw.split('|')
|
|
cmds = [parse_cmd(cmd) for cmd in potential_cmds]
|
|
return cmds
|
|
|
|
|
|
def handle_input(prompt=""):
|
|
raw = input(prompt)
|
|
if raw[0] == '>':
|
|
return raw[1:]
|
|
else:
|
|
cmds = parse_cmds(raw)
|
|
cmds.append("Printer()")
|
|
mangled_input = cmds[0]
|
|
for cmd in cmds[1:]:
|
|
mangled_input += ".chain(" + cmd + ")"
|
|
mangled_input += ".call()"
|
|
print("[DEBUG]: evaluating Python: ", mangled_input)
|
|
return mangled_input
|
|
|
|
|
|
def main():
|
|
import code
|
|
code.interact("Augmented Unix Userland", handle_input, globals())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|