13d004a37SPhilippe Mathieu-Daudé#!/usr/bin/env python3 2650ab98dSLluís Vilanova# -*- coding: utf-8 -*- 3650ab98dSLluís Vilanova 4650ab98dSLluís Vilanova""" 5650ab98dSLluís VilanovaCommand-line wrapper for the tracetool machinery. 6650ab98dSLluís Vilanova""" 7650ab98dSLluís Vilanova 8650ab98dSLluís Vilanova__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 95b808275SLluís Vilanova__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" 10650ab98dSLluís Vilanova__license__ = "GPL version 2 or (at your option) any later version" 11650ab98dSLluís Vilanova 12650ab98dSLluís Vilanova__maintainer__ = "Stefan Hajnoczi" 13f892b494SPhilippe Mathieu-Daudé__email__ = "stefanha@redhat.com" 14650ab98dSLluís Vilanova 15650ab98dSLluís Vilanova 16650ab98dSLluís Vilanovaimport sys 17650ab98dSLluís Vilanovaimport getopt 18650ab98dSLluís Vilanova 19c05012a3SStefan Hajnoczifrom tracetool import error_write, out, out_open 20650ab98dSLluís Vilanovaimport tracetool.backend 21650ab98dSLluís Vilanovaimport tracetool.format 22650ab98dSLluís Vilanova 23650ab98dSLluís Vilanova 24650ab98dSLluís Vilanova_SCRIPT = "" 25650ab98dSLluís Vilanova 26650ab98dSLluís Vilanovadef error_opt(msg = None): 27650ab98dSLluís Vilanova if msg is not None: 28650ab98dSLluís Vilanova error_write("Error: " + msg + "\n") 29650ab98dSLluís Vilanova 30650ab98dSLluís Vilanova backend_descr = "\n".join([ " %-15s %s" % (n, d) 31650ab98dSLluís Vilanova for n,d in tracetool.backend.get_list() ]) 32650ab98dSLluís Vilanova format_descr = "\n".join([ " %-15s %s" % (n, d) 33650ab98dSLluís Vilanova for n,d in tracetool.format.get_list() ]) 34650ab98dSLluís Vilanova error_write("""\ 35c05012a3SStefan HajnocziUsage: %(script)s --format=<format> --backends=<backends> [<options>] <trace-events> ... <output> 36650ab98dSLluís Vilanova 37650ab98dSLluís VilanovaBackends: 38650ab98dSLluís Vilanova%(backends)s 39650ab98dSLluís Vilanova 40650ab98dSLluís VilanovaFormats: 41650ab98dSLluís Vilanova%(formats)s 42650ab98dSLluís Vilanova 43650ab98dSLluís VilanovaOptions: 44650ab98dSLluís Vilanova --help This help message. 45650ab98dSLluís Vilanova --list-backends Print list of available backends. 465b808275SLluís Vilanova --check-backends Check if the given backend is valid. 47081340d1SDaniel P. Berrangé --binary <path> Full path to QEMU binary (required for 'stap' backend). 48081340d1SDaniel P. Berrangé --group <name> Name of the event group. 49081340d1SDaniel P. Berrangé --probe-prefix <prefix> Prefix for dtrace probe names (required for 'stap' backend). 50650ab98dSLluís Vilanova""" % { 51650ab98dSLluís Vilanova "script" : _SCRIPT, 52650ab98dSLluís Vilanova "backends" : backend_descr, 53650ab98dSLluís Vilanova "formats" : format_descr, 54650ab98dSLluís Vilanova }) 55650ab98dSLluís Vilanova 56650ab98dSLluís Vilanova if msg is None: 57650ab98dSLluís Vilanova sys.exit(0) 58650ab98dSLluís Vilanova else: 59650ab98dSLluís Vilanova sys.exit(1) 60650ab98dSLluís Vilanova 61650ab98dSLluís Vilanovadef main(args): 62650ab98dSLluís Vilanova global _SCRIPT 63650ab98dSLluís Vilanova _SCRIPT = args[0] 64650ab98dSLluís Vilanova 655b808275SLluís Vilanova long_opts = ["backends=", "format=", "help", "list-backends", 662098c56aSDaniel P. Berrange "check-backends", "group="] 67081340d1SDaniel P. Berrangé long_opts += ["binary=", "probe-prefix="] 68650ab98dSLluís Vilanova 69650ab98dSLluís Vilanova try: 70650ab98dSLluís Vilanova opts, args = getopt.getopt(args[1:], "", long_opts) 7186b227d9SMarkus Armbruster except getopt.GetoptError as err: 72650ab98dSLluís Vilanova error_opt(str(err)) 73650ab98dSLluís Vilanova 745b808275SLluís Vilanova check_backends = False 755b808275SLluís Vilanova arg_backends = [] 76650ab98dSLluís Vilanova arg_format = "" 772098c56aSDaniel P. Berrange arg_group = None 7852ef093aSLluís Vilanova binary = None 7952ef093aSLluís Vilanova probe_prefix = None 80650ab98dSLluís Vilanova for opt, arg in opts: 81650ab98dSLluís Vilanova if opt == "--help": 82650ab98dSLluís Vilanova error_opt() 83650ab98dSLluís Vilanova 845b808275SLluís Vilanova elif opt == "--backends": 855b808275SLluís Vilanova arg_backends = arg.split(",") 862098c56aSDaniel P. Berrange elif opt == "--group": 872098c56aSDaniel P. Berrange arg_group = arg 88650ab98dSLluís Vilanova elif opt == "--format": 89650ab98dSLluís Vilanova arg_format = arg 90650ab98dSLluís Vilanova 91650ab98dSLluís Vilanova elif opt == "--list-backends": 9293fba161SLluís Vilanova public_backends = tracetool.backend.get_list(only_public = True) 9393fba161SLluís Vilanova out(", ".join([ b for b,_ in public_backends ])) 94650ab98dSLluís Vilanova sys.exit(0) 955b808275SLluís Vilanova elif opt == "--check-backends": 965b808275SLluís Vilanova check_backends = True 97650ab98dSLluís Vilanova 9852ef093aSLluís Vilanova elif opt == "--binary": 9952ef093aSLluís Vilanova binary = arg 10052ef093aSLluís Vilanova elif opt == '--probe-prefix': 10152ef093aSLluís Vilanova probe_prefix = arg 10252ef093aSLluís Vilanova 103650ab98dSLluís Vilanova else: 104650ab98dSLluís Vilanova error_opt("unhandled option: %s" % opt) 105650ab98dSLluís Vilanova 1065b808275SLluís Vilanova if len(arg_backends) == 0: 1075b808275SLluís Vilanova error_opt("no backends specified") 108650ab98dSLluís Vilanova 1095b808275SLluís Vilanova if check_backends: 1105b808275SLluís Vilanova for backend in arg_backends: 1115b808275SLluís Vilanova if not tracetool.backend.exists(backend): 112650ab98dSLluís Vilanova sys.exit(1) 1135b808275SLluís Vilanova sys.exit(0) 114650ab98dSLluís Vilanova 1152098c56aSDaniel P. Berrange if arg_group is None: 1162098c56aSDaniel P. Berrange error_opt("group name is required") 1172098c56aSDaniel P. Berrange 11852ef093aSLluís Vilanova if arg_format == "stap": 11952ef093aSLluís Vilanova if binary is None: 12052ef093aSLluís Vilanova error_opt("--binary is required for SystemTAP tapset generator") 12152ef093aSLluís Vilanova if probe_prefix is None: 122081340d1SDaniel P. Berrangé error_opt("--probe-prefix is required for SystemTAP tapset generator") 12352ef093aSLluís Vilanova 124c05012a3SStefan Hajnoczi if len(args) < 2: 125c05012a3SStefan Hajnoczi error_opt("missing trace-events and output filepaths") 1260ab8ed18SDaniel P. Berrange events = [] 127c05012a3SStefan Hajnoczi for arg in args[:-1]: 1280ab8ed18SDaniel P. Berrange with open(arg, "r") as fh: 12986b5aacfSDaniel P. Berrangé events.extend(tracetool.read_events(fh, arg)) 1309096b78aSDaniel P. Berrange 131c05012a3SStefan Hajnoczi out_open(args[-1]) 132c05012a3SStefan Hajnoczi 133650ab98dSLluís Vilanova try: 1342098c56aSDaniel P. Berrange tracetool.generate(events, arg_group, arg_format, arg_backends, 13552ef093aSLluís Vilanova binary=binary, probe_prefix=probe_prefix) 13686b227d9SMarkus Armbruster except tracetool.TracetoolError as e: 137650ab98dSLluís Vilanova error_opt(str(e)) 138650ab98dSLluís Vilanova 139650ab98dSLluís Vilanovaif __name__ == "__main__": 140650ab98dSLluís Vilanova main(sys.argv) 141