1#!/usr/bin/env python3 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@redhat.com" 14 15 16import sys 17import getopt 18 19from tracetool import error_write, out, out_open 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>] <trace-events> ... <output> 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 --group <name> Name of the event group 51 --probe-prefix <prefix> Prefix for dtrace probe names 52 (default: qemu-<target-type>-<target-name>).\ 53""" % { 54 "script" : _SCRIPT, 55 "backends" : backend_descr, 56 "formats" : format_descr, 57 }) 58 59 if msg is None: 60 sys.exit(0) 61 else: 62 sys.exit(1) 63 64def main(args): 65 global _SCRIPT 66 _SCRIPT = args[0] 67 68 long_opts = ["backends=", "format=", "help", "list-backends", 69 "check-backends", "group="] 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 arg_group = None 81 binary = None 82 target_type = None 83 target_name = None 84 probe_prefix = None 85 for opt, arg in opts: 86 if opt == "--help": 87 error_opt() 88 89 elif opt == "--backends": 90 arg_backends = arg.split(",") 91 elif opt == "--group": 92 arg_group = arg 93 elif opt == "--format": 94 arg_format = arg 95 96 elif opt == "--list-backends": 97 public_backends = tracetool.backend.get_list(only_public = True) 98 out(", ".join([ b for b,_ in public_backends ])) 99 sys.exit(0) 100 elif opt == "--check-backends": 101 check_backends = True 102 103 elif opt == "--binary": 104 binary = arg 105 elif opt == '--target-type': 106 target_type = arg 107 elif opt == '--target-name': 108 target_name = arg 109 elif opt == '--probe-prefix': 110 probe_prefix = arg 111 112 else: 113 error_opt("unhandled option: %s" % opt) 114 115 if len(arg_backends) == 0: 116 error_opt("no backends specified") 117 118 if check_backends: 119 for backend in arg_backends: 120 if not tracetool.backend.exists(backend): 121 sys.exit(1) 122 sys.exit(0) 123 124 if arg_group is None: 125 error_opt("group name is required") 126 127 if arg_format == "stap": 128 if binary is None: 129 error_opt("--binary is required for SystemTAP tapset generator") 130 if probe_prefix is None and target_type is None: 131 error_opt("--target-type is required for SystemTAP tapset generator") 132 if probe_prefix is None and target_name is None: 133 error_opt("--target-name is required for SystemTAP tapset generator") 134 135 if probe_prefix is None: 136 probe_prefix = ".".join(["qemu", target_type, target_name]) 137 138 if len(args) < 2: 139 error_opt("missing trace-events and output filepaths") 140 events = [] 141 for arg in args[:-1]: 142 with open(arg, "r") as fh: 143 events.extend(tracetool.read_events(fh, arg)) 144 145 out_open(args[-1]) 146 147 try: 148 tracetool.generate(events, arg_group, arg_format, arg_backends, 149 binary=binary, probe_prefix=probe_prefix) 150 except tracetool.TracetoolError as e: 151 error_opt(str(e)) 152 153if __name__ == "__main__": 154 main(sys.argv) 155