1 #! /usr/bin/env python3
2 # SPDX-License-Identifier: BSD-3-Clause
3 # Copyright(c) 2020 Intel Corporation
6 Script to be used with V2 Telemetry.
7 Allows the user input commands and read the Telemetry response.
18 TELEMETRY_VERSION = "v2"
22 def read_socket(sock, buf_len, echo=True):
23 """ Read data from socket and return it in JSON format """
24 reply = sock.recv(buf_len).decode()
26 ret = json.loads(reply)
27 except json.JSONDecodeError:
28 print("Error in reply: ", reply)
32 print(json.dumps(ret))
36 def get_app_name(pid):
37 """ return the app name for a given PID, for printing """
38 proc_cmdline = os.path.join('/proc', str(pid), 'cmdline')
40 with open(proc_cmdline) as f:
41 argv0 = f.read(1024).split('\0')[0]
42 return os.path.basename(argv0)
44 # ignore file not found errors
45 if e.errno != errno.ENOENT:
50 def handle_socket(path):
51 """ Connect to socket and handle user input """
52 sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
54 print("Connecting to " + path)
58 print("Error connecting to " + path)
61 json_reply = read_socket(sock, 1024)
62 output_buf_len = json_reply["max_output_len"]
63 app_name = get_app_name(json_reply["pid"])
65 print('Connected to application: "%s"' % app_name)
67 # get list of commands for readline completion
68 sock.send("/".encode())
69 CMDS = read_socket(sock, output_buf_len, False)["/"]
73 text = input('--> ').strip()
75 if text.startswith('/'):
76 sock.send(text.encode())
77 read_socket(sock, output_buf_len)
78 text = input('--> ').strip()
85 def readline_complete(text, state):
86 """ Find any matching commands from the list based on user input """
87 all_cmds = ['quit'] + CMDS
89 matches = [c for c in all_cmds if c.startswith(text)]
95 def get_dpdk_runtime_dir(fp):
96 """ Using the same logic as in DPDK's EAL, get the DPDK runtime directory
97 based on the file-prefix and user """
98 if (os.getuid() == 0):
99 return os.path.join('/var/run/dpdk', fp)
100 return os.path.join(os.environ.get('XDG_RUNTIME_DIR', '/tmp'), 'dpdk', fp)
103 readline.parse_and_bind('tab: complete')
104 readline.set_completer(readline_complete)
105 readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
107 parser = argparse.ArgumentParser()
108 parser.add_argument('-f', '--file-prefix', default='rte',
109 help='Provide file-prefix for DPDK runtime directory')
110 args = parser.parse_args()
111 rd = get_dpdk_runtime_dir(args.file_prefix)
112 handle_socket(os.path.join(rd, 'dpdk_telemetry.{}'.format(TELEMETRY_VERSION)))