version: 20.11-rc5
[dpdk.git] / usertools / dpdk-telemetry.py
1 #! /usr/bin/env python3
2 # SPDX-License-Identifier: BSD-3-Clause
3 # Copyright(c) 2020 Intel Corporation
4
5 """
6 Script to be used with V2 Telemetry.
7 Allows the user input commands and read the Telemetry response.
8 """
9
10 import socket
11 import os
12 import glob
13 import json
14 import readline
15
16 # global vars
17 TELEMETRY_VERSION = "v2"
18 CMDS = []
19
20
21 def read_socket(sock, buf_len, echo=True):
22     """ Read data from socket and return it in JSON format """
23     reply = sock.recv(buf_len).decode()
24     try:
25         ret = json.loads(reply)
26     except json.JSONDecodeError:
27         print("Error in reply: ", reply)
28         sock.close()
29         raise
30     if echo:
31         print(json.dumps(ret))
32     return ret
33
34
35 def handle_socket(path):
36     """ Connect to socket and handle user input """
37     sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
38     global CMDS
39     print("Connecting to " + path)
40     try:
41         sock.connect(path)
42     except OSError:
43         print("Error connecting to " + path)
44         sock.close()
45         return
46     json_reply = read_socket(sock, 1024)
47     output_buf_len = json_reply["max_output_len"]
48
49     # get list of commands for readline completion
50     sock.send("/".encode())
51     CMDS = read_socket(sock, output_buf_len, False)["/"]
52
53     # interactive prompt
54     text = input('--> ').strip()
55     while text != "quit":
56         if text.startswith('/'):
57             sock.send(text.encode())
58             read_socket(sock, output_buf_len)
59         text = input('--> ').strip()
60     sock.close()
61
62
63 def readline_complete(text, state):
64     """ Find any matching commands from the list based on user input """
65     all_cmds = ['quit'] + CMDS
66     if text:
67         matches = [c for c in all_cmds if c.startswith(text)]
68     else:
69         matches = all_cmds
70     return matches[state]
71
72
73 readline.parse_and_bind('tab: complete')
74 readline.set_completer(readline_complete)
75 readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
76
77 # Path to sockets for processes run as a root user
78 for f in glob.glob('/var/run/dpdk/*/dpdk_telemetry.%s' % TELEMETRY_VERSION):
79     handle_socket(f)
80 # Path to sockets for processes run as a regular user
81 for f in glob.glob('%s/dpdk/*/dpdk_telemetry.%s' %
82                    (os.environ.get('XDG_RUNTIME_DIR', '/tmp'), TELEMETRY_VERSION)):
83     handle_socket(f)