summaryrefslogtreecommitdiffstats
path: root/src/spdk/dpdk/usertools/dpdk-telemetry.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-21 11:54:28 +0000
commite6918187568dbd01842d8d1d2c808ce16a894239 (patch)
tree64f88b554b444a49f656b6c656111a145cbbaa28 /src/spdk/dpdk/usertools/dpdk-telemetry.py
parentInitial commit. (diff)
downloadceph-e6918187568dbd01842d8d1d2c808ce16a894239.tar.xz
ceph-e6918187568dbd01842d8d1d2c808ce16a894239.zip
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/spdk/dpdk/usertools/dpdk-telemetry.py')
-rwxr-xr-xsrc/spdk/dpdk/usertools/dpdk-telemetry.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/spdk/dpdk/usertools/dpdk-telemetry.py b/src/spdk/dpdk/usertools/dpdk-telemetry.py
new file mode 100755
index 000000000..afbf01b19
--- /dev/null
+++ b/src/spdk/dpdk/usertools/dpdk-telemetry.py
@@ -0,0 +1,83 @@
+#! /usr/bin/python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2020 Intel Corporation
+
+"""
+Script to be used with V2 Telemetry.
+Allows the user input commands and read the Telemetry response.
+"""
+
+import socket
+import os
+import glob
+import json
+import readline
+
+# global vars
+TELEMETRY_VERSION = "v2"
+CMDS = []
+
+
+def read_socket(sock, buf_len, echo=True):
+ """ Read data from socket and return it in JSON format """
+ reply = sock.recv(buf_len).decode()
+ try:
+ ret = json.loads(reply)
+ except json.JSONDecodeError:
+ print("Error in reply: ", reply)
+ sock.close()
+ raise
+ if echo:
+ print(json.dumps(ret))
+ return ret
+
+
+def handle_socket(path):
+ """ Connect to socket and handle user input """
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+ global CMDS
+ print("Connecting to " + path)
+ try:
+ sock.connect(path)
+ except OSError:
+ print("Error connecting to " + path)
+ sock.close()
+ return
+ json_reply = read_socket(sock, 1024)
+ output_buf_len = json_reply["max_output_len"]
+
+ # get list of commands for readline completion
+ sock.send("/".encode())
+ CMDS = read_socket(sock, output_buf_len, False)["/"]
+
+ # interactive prompt
+ text = input('--> ').strip()
+ while text != "quit":
+ if text.startswith('/'):
+ sock.send(text.encode())
+ read_socket(sock, output_buf_len)
+ text = input('--> ').strip()
+ sock.close()
+
+
+def readline_complete(text, state):
+ """ Find any matching commands from the list based on user input """
+ all_cmds = ['quit'] + CMDS
+ if text:
+ matches = [c for c in all_cmds if c.startswith(text)]
+ else:
+ matches = all_cmds
+ return matches[state]
+
+
+readline.parse_and_bind('tab: complete')
+readline.set_completer(readline_complete)
+readline.set_completer_delims(readline.get_completer_delims().replace('/', ''))
+
+# Path to sockets for processes run as a root user
+for f in glob.glob('/var/run/dpdk/*/dpdk_telemetry.%s' % TELEMETRY_VERSION):
+ handle_socket(f)
+# Path to sockets for processes run as a regular user
+for f in glob.glob('/run/user/%d/dpdk/*/dpdk_telemetry.%s' %
+ (os.getuid(), TELEMETRY_VERSION)):
+ handle_socket(f)