#!/usr/bin/env python # -*- coding: utf-8 -*- """ Command-line wrapper for the tracetool machinery. """ __author__ = "Lluís Vilanova " __copyright__ = "Copyright 2012, Lluís Vilanova " __license__ = "GPL version 2 or (at your option) any later version" __maintainer__ = "Stefan Hajnoczi" __email__ = "stefanha@linux.vnet.ibm.com" import sys import getopt from tracetool import error_write, out 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= --backend= [] Backends: %(backends)s Formats: %(formats)s Options: --help This help message. --list-backends Print list of available backends. --check-backend Check if the given backend is valid. --binary Full path to QEMU binary. --target-type QEMU emulator target type ('system' or 'user'). --target-arch QEMU emulator target arch. --probe-prefix Prefix for dtrace probe names (default: qemu--).\ """ % { "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 = [ "backend=", "format=", "help", "list-backends", "check-backend" ] long_opts += [ "binary=", "target-type=", "target-arch=", "probe-prefix=" ] try: opts, args = getopt.getopt(args[1:], "", long_opts) except getopt.GetoptError, err: error_opt(str(err)) check_backend = False arg_backend = "" arg_format = "" binary = None target_type = None target_arch = None probe_prefix = None for opt, arg in opts: if opt == "--help": error_opt() elif opt == "--backend": arg_backend = arg elif opt == "--format": arg_format = arg elif opt == "--list-backends": backends = tracetool.backend.get_list() out(", ".join([ b for b,_ in backends ])) sys.exit(0) elif opt == "--check-backend": check_backend = True elif opt == "--binary": binary = arg elif opt == '--target-type': target_type = arg elif opt == '--target-arch': target_arch = arg elif opt == '--probe-prefix': probe_prefix = arg else: error_opt("unhandled option: %s" % opt) if arg_backend is None: error_opt("backend not set") if check_backend: if tracetool.backend.exists(arg_backend): sys.exit(0) else: sys.exit(1) if arg_format == "stap": if binary is None: error_opt("--binary is required for SystemTAP tapset generator") if probe_prefix is None and target_type is None: error_opt("--target-type is required for SystemTAP tapset generator") if probe_prefix is None and target_arch is None: error_opt("--target-arch is required for SystemTAP tapset generator") if probe_prefix is None: probe_prefix = ".".join([ "qemu", target_type, target_arch ]) try: tracetool.generate(sys.stdin, arg_format, arg_backend, binary = binary, probe_prefix = probe_prefix) except tracetool.TracetoolError, e: error_opt(str(e)) if __name__ == "__main__": main(sys.argv)