#!/bin/python3
import argparse
import sys
from subprocess import call
class Colors:
purple = '\033[95m'
blue = '\033[94m'
green = '\033[92m'
yellow = '\033[93m'
red = '\033[91m'
grey = '\033[1;37m'
darkgrey = '\033[1;30m'
cyan = '\033[1;36m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
class ArgParser(object):
def __init__(self):
self.inputs = []
self.outputs = []
self.opts = []
self.copts = []
self.command = []
self.pretty = bool
parser = argparse.ArgumentParser()
parser.add_argument("-help", action='store_true', help="display the driver's help", default=False)
parser.add_argument("-f", "--file", type=str, help="run an action file")
parser.add_argument("-c", "--command", nargs="+", type=str, help="run a command")
parser.add_argument("-v", "--version", action='store_true', help="display version info", default=False)
parser.add_argument("-i", "--input", type=str, help="the input file(s)")
parser.add_argument("-o", "--output", type=str, help="the output file(s)")
parser.add_argument("-pp", "--print-pretty", action='store_true', help="print pretty simple text reports", default=False)
parser.add_argument("-t", "--test", type=str, help="runs the tests on the built executables")
parser.add_argument("-opts", "--options", type=str, help="pass clang options to the executables")
parser.add_argument("-copts", "--custom-options", type=str, help="runs the tests on the built executables")
self.args = parser.parse_args()
def run(self):
if self.args.file is not None:
self.parseActionFile(self.args.file)
self.runActionFile()
if self.args.command is not None:
self.runCommand(self.args.command)
def runTest(self):
pass
def parseActionFile(self, action_file_path):
line_number = int()
action_file = open(action_file_path)
self.inputs = str
self.outputs = str
self.opts = str
self.copts = str
self.command = str
self.logfile = str
self.pretty = bool
self.exename = str
self.endaction = str
self.action_name = str
for line in action_file:
line_number += 1
pos = line.find("action_name:", 0, len(line))
if pos == 0:
self.action_name = line[pos+len("action_name:"):-1]
print(Colors.green + "action name: " + Colors.cyan + self.action_name + Colors.ENDC)
pos = line.find("executable_name:", 0, len(line))
if pos == 0:
self.exename = line[pos+len("executable_name:"):-1]
print(Colors.green + "executable_name: " + Colors.cyan + self.exename + Colors.ENDC)
pos = line.find("exec_opts:", 0, len(line))
if pos == 0:
self.copts = line[pos+len("exec_opts:"):-1]
print(Colors.green + "exec options: " + Colors.cyan + self.copts + Colors.ENDC)
pos = line.find("in_files:", 0, len(line))
if pos == 0:
self.inputs = line[pos+len("in_files:"):-1]
print(Colors.green + "input files: " + Colors.cyan + self.inputs + Colors.ENDC)
pos = line.find("libtooling_options:", 0, len(line))
if pos == 0:
self.opts = line[pos+len("libtooling_options:"):-1]
print(Colors.green + "libtooling options: " + Colors.cyan + self.opts + Colors.ENDC)
pos = line.find("out_files:", 0, len(line))
if pos == 0:
self.outputs = line[pos+len("out_files:"):-1]
print(Colors.green + "output files: " + Colors.cyan + self.outputs + Colors.ENDC)
pos = line.find("log_files:", 0, len(line))
if pos == 0:
self.logfile = line[pos+len("log_files:"):-1]
print(Colors.green + "log files: " + Colors.cyan + self.logfile + Colors.ENDC)
pos = line.find("print_pretty:", 0, len(line))
if pos == 0:
if line[pos+len("print_pretty:"):-1] == "true": self.pretty = True
elif line[pos+len("print_pretty:"):-1] == "false": self.pretty = False
else: raise Exception(Colors.red + repr(line_number) + " : " + "invalid value for a boolean switch. should be true or false." + Colors.ENDC)
print(Colors.green + "pretty print: " + Colors.cyan + repr(self.pretty) + Colors.ENDC)
pos = line.find("end_action:", 0, len(line))
if pos == 0:
self.endaction = line[pos+len("end_action:"):-1]
print(Colors.green + "end action: " + Colors.cyan + self.endaction + Colors.ENDC)
def runActionFile(self):
pass
def printVersionInfo(self):
pass
def runCommand(self, command):
if command[0] == "clean":
call(["make", "clean"])
elif command[0] == "make":
call(["make", self.args.command[1]])
elif command[0] == "install":
call(["make", "install"])
elif command[0] == "format":
pass
elif command[0] == "test":
pass
elif command[0] == "buildall" or command[0] == "makeall":
call(["make"])
elif command[0] == "m0":
pass
elif command[0] == "m1":
pass
elif command[0] == "m2":
pass
elif command[0] == "bruiser":
pass
elif command[0] == "obfuscator":
pass
elif command[0] == "safercpp":
pass
else:
raise Exception(Colors.red + "unknown command. for a list of valid commands run with -h." + Colors.ENDC);
def main():
argparser = ArgParser()
argparser.run()
if __name__ == "__main__":
main()