| #!/usr/bin/env python3 | 
 | # -*- coding: utf-8 -*- | 
 |  | 
 | """ | 
 | Command-line wrapper for the tracetool machinery. | 
 | """ | 
 |  | 
 | __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>" | 
 | __copyright__  = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" | 
 | __license__    = "GPL version 2 or (at your option) any later version" | 
 |  | 
 | __maintainer__ = "Stefan Hajnoczi" | 
 | __email__      = "stefanha@redhat.com" | 
 |  | 
 |  | 
 | import sys | 
 | import getopt | 
 |  | 
 | from tracetool import error_write, out, out_open | 
 | import tracetool.backend | 
 | import tracetool.format | 
 |  | 
 |  | 
 | _SCRIPT = "" | 
 |  | 
 | def error_opt(msg = None): | 
 |     if msg is not None: | 
 |         error_write("Error: " + msg + "\n") | 
 |  | 
 |     backend_descr = "\n".join([ "    %-15s %s" % (n, d) | 
 |                                 for n,d in tracetool.backend.get_list() ]) | 
 |     format_descr = "\n".join([ "    %-15s %s" % (n, d) | 
 |                                for n,d in tracetool.format.get_list() ]) | 
 |     error_write("""\ | 
 | Usage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output> | 
 |  | 
 | Backends: | 
 | %(backends)s | 
 |  | 
 | Formats: | 
 | %(formats)s | 
 |  | 
 | Options: | 
 |     --help                   This help message. | 
 |     --list-backends          Print list of available backends. | 
 |     --check-backends         Check if the given backend is valid. | 
 |     --binary <path>          Full path to QEMU binary (required for 'stap' backend). | 
 |     --group <name>           Name of the event group. | 
 |     --probe-prefix <prefix>  Prefix for dtrace probe names (required for 'stap' backend). | 
 | """ % { | 
 |             "script" : _SCRIPT, | 
 |             "backends" : backend_descr, | 
 |             "formats" : format_descr, | 
 |             }) | 
 |  | 
 |     if msg is None: | 
 |         sys.exit(0) | 
 |     else: | 
 |         sys.exit(1) | 
 |  | 
 | def main(args): | 
 |     global _SCRIPT | 
 |     _SCRIPT = args[0] | 
 |  | 
 |     long_opts = ["backends=", "format=", "help", "list-backends", | 
 |                  "check-backends", "group="] | 
 |     long_opts += ["binary=", "probe-prefix="] | 
 |  | 
 |     try: | 
 |         opts, args = getopt.getopt(args[1:], "", long_opts) | 
 |     except getopt.GetoptError as err: | 
 |         error_opt(str(err)) | 
 |  | 
 |     check_backends = False | 
 |     arg_backends = [] | 
 |     arg_format = "" | 
 |     arg_group = None | 
 |     binary = None | 
 |     probe_prefix = None | 
 |     for opt, arg in opts: | 
 |         if opt == "--help": | 
 |             error_opt() | 
 |  | 
 |         elif opt == "--backends": | 
 |             arg_backends = arg.split(",") | 
 |         elif opt == "--group": | 
 |             arg_group = arg | 
 |         elif opt == "--format": | 
 |             arg_format = arg | 
 |  | 
 |         elif opt == "--list-backends": | 
 |             public_backends = tracetool.backend.get_list(only_public = True) | 
 |             out(", ".join([ b for b,_ in public_backends ])) | 
 |             sys.exit(0) | 
 |         elif opt == "--check-backends": | 
 |             check_backends = True | 
 |  | 
 |         elif opt == "--binary": | 
 |             binary = arg | 
 |         elif opt == '--probe-prefix': | 
 |             probe_prefix = arg | 
 |  | 
 |         else: | 
 |             error_opt("unhandled option: %s" % opt) | 
 |  | 
 |     if len(arg_backends) == 0: | 
 |         error_opt("no backends specified") | 
 |  | 
 |     if check_backends: | 
 |         for backend in arg_backends: | 
 |             if not tracetool.backend.exists(backend): | 
 |                 sys.exit(1) | 
 |         sys.exit(0) | 
 |  | 
 |     if arg_group is None: | 
 |         error_opt("group name is required") | 
 |  | 
 |     if arg_format == "stap": | 
 |         if binary is None: | 
 |             error_opt("--binary is required for SystemTAP tapset generator") | 
 |         if probe_prefix is None: | 
 |             error_opt("--probe-prefix is required for SystemTAP tapset generator") | 
 |  | 
 |     if len(args) < 2: | 
 |         error_opt("missing trace-events and output filepaths") | 
 |     events = [] | 
 |     for arg in args[:-1]: | 
 |         with open(arg, "r") as fh: | 
 |             events.extend(tracetool.read_events(fh, arg)) | 
 |  | 
 |     out_open(args[-1]) | 
 |  | 
 |     try: | 
 |         tracetool.generate(events, arg_group, arg_format, arg_backends, | 
 |                            binary=binary, probe_prefix=probe_prefix) | 
 |     except tracetool.TracetoolError as e: | 
 |         error_opt(str(e)) | 
 |  | 
 | if __name__ == "__main__": | 
 |     main(sys.argv) |