#!/usr/bin/python3 import sys import classad import htcondor def makeClassAd(adString, from_file=False): # If we're looking at the output from `condor_[q|status] -long:new`, # make it parseable by throwing away the opening '{\n'. The ClassAd # constructor already ignores any ad past the first. if from_file and adString.startswith('{\n') and adString.endswith('\n}\n'): adString = adString[2:] try: return classad.ClassAd(adString) except SyntaxError: modifiedAdString = "[" + adString + "]" return classad.ClassAd(modifiedAdString) def usage(path): print("Usage: {0} [options] [ ]*".format(path)) print(""); print("Evaluate ClassAd expressions.") print("Assignments modify the ClassAd context."); print("") print("Where [options] is one of") print("\t-[my-]file \tA file containing the initial ClassAd context"); print("\t-target-file \tA file containing the target ClassAd"); print("\t-debug \tEnable debug mode" ); print("\t-help \tPrint this screen and exit"); print("") print("Flags may replace expressions or assignments:") print("\t-quiet \tDon't print the ClassAd context after this flag"); def evaluateAndPrint(argv): i = 1 quiet = False updated = True targetAd = None myAd = classad.ClassAd() while i < len(argv): arg = argv[i] if arg == '-quiet': quiet = True elif arg == "-file" or arg == "-my-file": i += 1 if i >= len(argv): print("{0}: {1} requires an argument".format(argv[0], arg), file=sys.stderr) return -1 adStringFileName = argv[i] adString = open(adStringFileName).read() try: myAd = makeClassAd(adString, from_file=True) except SyntaxError: sys.exit("Unable to turn file '" + adStringFileName + "' into a ClassAd.") elif arg == '-target-file': i += 1 if i >= len(argv): print("{0}: {1} requires an argument".format(argv[0], arg), file=sys.stderr) return -1 adStringFileName = argv[i] adString = open(adStringFileName).read() try: targetAd = makeClassAd(adString, from_file=True) except SyntaxError: sys.exit("Unable to turn file '" + adStringFileName + "' into a ClassAd.") elif arg == "-debug": htcondor.enable_debug() elif arg == "-help": usage(argv[0]) return -1 else: try: newAd = makeClassAd(arg) myAd.update(newAd) updated = True except SyntaxError: try: if updated: updated = False if not quiet: print(repr(myAd)) expr = classad.ExprTree(arg) except SyntaxError: sys.exit("Unable to turn '" + arg + "' into a ClassAd or an expression.") result = expr.simplify(myAd, targetAd) print(repr(result)) i += 1 return 0 def main(): return evaluateAndPrint(sys.argv) if __name__ == "__main__": exit(main())