numam-dpdk/usertools/dpdk-telemetry.py
Ciara Power 3b4c9d7bd6 usertools: fix telemetry user socket path
The path to the socket when running the script as a regular user needed
to be updated to match the logic in EAL.

Fixes: 6a2967c112 ("usertools: add new telemetry script")
Cc: stable@dpdk.org

Signed-off-by: Ciara Power <ciara.power@intel.com>
Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
2020-06-25 01:10:12 +02:00

84 lines
2.2 KiB
Python
Executable File

#! /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('%s/dpdk/*/dpdk_telemetry.%s' %
(os.environ.get('XDG_RUNTIME_DIR', '/tmp'), TELEMETRY_VERSION)):
handle_socket(f)