1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5Command-line wrapper for the tracetool machinery. 6""" 7 8__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 9__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" 10__license__ = "GPL version 2 or (at your option) any later version" 11 12__maintainer__ = "Stefan Hajnoczi" 13__email__ = "stefanha@linux.vnet.ibm.com" 14 15 16import sys 17import getopt 18 19from tracetool import error_write, out 20import tracetool.backend 21import tracetool.format 22 23 24_SCRIPT = "" 25 26def error_opt(msg = None): 27 if msg is not None: 28 error_write("Error: " + msg + "\n") 29 30 backend_descr = "\n".join([ " %-15s %s" % (n, d) 31 for n,d in tracetool.backend.get_list() ]) 32 format_descr = "\n".join([ " %-15s %s" % (n, d) 33 for n,d in tracetool.format.get_list() ]) 34 error_write("""\ 35Usage: %(script)s --format=<format> --backends=<backends> [<options>] 36 37Backends: 38%(backends)s 39 40Formats: 41%(formats)s 42 43Options: 44 --help This help message. 45 --list-backends Print list of available backends. 46 --check-backends Check if the given backend is valid. 47 --binary <path> Full path to QEMU binary. 48 --target-type <type> QEMU emulator target type ('system' or 'user'). 49 --target-name <name> QEMU emulator target name. 50 --probe-prefix <prefix> Prefix for dtrace probe names 51 (default: qemu-<target-type>-<target-name>).\ 52""" % { 53 "script" : _SCRIPT, 54 "backends" : backend_descr, 55 "formats" : format_descr, 56 }) 57 58 if msg is None: 59 sys.exit(0) 60 else: 61 sys.exit(1) 62 63 64def main(args): 65 global _SCRIPT 66 _SCRIPT = args[0] 67 68 long_opts = ["backends=", "format=", "help", "list-backends", 69 "check-backends"] 70 long_opts += ["binary=", "target-type=", "target-name=", "probe-prefix="] 71 72 try: 73 opts, args = getopt.getopt(args[1:], "", long_opts) 74 except getopt.GetoptError as err: 75 error_opt(str(err)) 76 77 check_backends = False 78 arg_backends = [] 79 arg_format = "" 80 binary = None 81 target_type = None 82 target_name = None 83 probe_prefix = None 84 for opt, arg in opts: 85 if opt == "--help": 86 error_opt() 87 88 elif opt == "--backends": 89 arg_backends = arg.split(",") 90 elif opt == "--format": 91 arg_format = arg 92 93 elif opt == "--list-backends": 94 public_backends = tracetool.backend.get_list(only_public = True) 95 out(", ".join([ b for b,_ in public_backends ])) 96 sys.exit(0) 97 elif opt == "--check-backends": 98 check_backends = True 99 100 elif opt == "--binary": 101 binary = arg 102 elif opt == '--target-type': 103 target_type = arg 104 elif opt == '--target-name': 105 target_name = arg 106 elif opt == '--probe-prefix': 107 probe_prefix = arg 108 109 else: 110 error_opt("unhandled option: %s" % opt) 111 112 if len(arg_backends) == 0: 113 error_opt("no backends specified") 114 115 if check_backends: 116 for backend in arg_backends: 117 if not tracetool.backend.exists(backend): 118 sys.exit(1) 119 sys.exit(0) 120 121 if arg_format == "stap": 122 if binary is None: 123 error_opt("--binary is required for SystemTAP tapset generator") 124 if probe_prefix is None and target_type is None: 125 error_opt("--target-type is required for SystemTAP tapset generator") 126 if probe_prefix is None and target_name is None: 127 error_opt("--target-name is required for SystemTAP tapset generator") 128 129 if probe_prefix is None: 130 probe_prefix = ".".join(["qemu", target_type, target_name]) 131 132 try: 133 tracetool.generate(sys.stdin, arg_format, arg_backends, 134 binary=binary, probe_prefix=probe_prefix) 135 except tracetool.TracetoolError as e: 136 error_opt(str(e)) 137 138if __name__ == "__main__": 139 main(sys.argv) 140