summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDan Klein <danklei@cisco.com>2015-08-24 17:28:17 +0300
committerDan Klein <danklei@cisco.com>2015-08-24 17:28:17 +0300
commit7d3be8c612e295820649779335288c197b80ccb2 (patch)
tree78e9636bc8780dedc919c30378a621f425e1cbfc /src
parentdab741a80699f86e86c91718872a052cca9bbb25 (diff)
Changes location of console and fixed dependencies
Diffstat (limited to 'src')
-rwxr-xr-xsrc/console/trex_console.py252
-rw-r--r--src/console/trex_rpc_client.py180
-rwxr-xr-xsrc/console/trex_status.py212
3 files changed, 0 insertions, 644 deletions
diff --git a/src/console/trex_console.py b/src/console/trex_console.py
deleted file mode 100755
index 1cb8194d..00000000
--- a/src/console/trex_console.py
+++ /dev/null
@@ -1,252 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-import cmd
-import json
-import ast
-import argparse
-import sys
-
-from trex_rpc_client import RpcClient
-import trex_status
-
-class TrexConsole(cmd.Cmd):
- """Trex Console"""
-
- def __init__(self, rpc_client):
- cmd.Cmd.__init__(self)
-
- self.rpc_client = rpc_client
-
- self.do_connect("")
-
- self.intro = "\n-=TRex Console V1.0=-\n"
- self.intro += "\nType 'help' or '?' for supported actions\n"
-
- self.verbose = False
-
- self.postcmd(False, "")
-
-
- # a cool hack - i stole this function and added space
- def completenames(self, text, *ignored):
- dotext = 'do_'+text
- return [a[3:]+' ' for a in self.get_names() if a.startswith(dotext)]
-
- # set verbose on / off
- def do_verbose (self, line):
- '''shows or set verbose mode\n'''
- if line == "":
- print "\nverbose is " + ("on\n" if self.verbose else "off\n")
-
- elif line == "on":
- self.verbose = True
- self.rpc_client.set_verbose(True)
- print "\nverbose set to on\n"
-
- elif line == "off":
- self.verbose = False
- self.rpc_client.set_verbose(False)
- print "\nverbose set to off\n"
-
- else:
- print "\nplease specify 'on' or 'off'\n"
-
- # query the server for registered commands
- def do_query_server(self, line):
- '''query the RPC server for supported remote commands\n'''
-
- rc, msg = self.rpc_client.query_rpc_server()
- if not rc:
- print "\n*** " + msg + "\n"
- return
-
- print "\nRPC server supports the following commands: \n\n"
- for func in msg:
- if func:
- print func
- print "\n"
-
- def do_ping (self, line):
- '''Pings the RPC server\n'''
-
- print "\n-> Pinging RPC server"
-
- rc, msg = self.rpc_client.ping_rpc_server()
- if rc:
- print "[SUCCESS]\n"
- else:
- print "\n*** " + msg + "\n"
- return
-
- def do_connect (self, line):
- '''Connects to the server\n'''
-
- if line == "":
- rc, msg = self.rpc_client.connect()
- else:
- sp = line.split()
- if (len(sp) != 2):
- print "\n[usage] connect [server] [port] or without parameters\n"
- return
-
- rc, msg = self.rpc_client.connect(sp[0], sp[1])
-
- if rc:
- print "[SUCCESS]\n"
- else:
- print "\n*** " + msg + "\n"
- return
-
- rc, msg = self.rpc_client.query_rpc_server()
-
- if rc:
- self.supported_rpc = [str(x) for x in msg if x]
-
- def do_rpc (self, line):
- '''Launches a RPC on the server\n'''
-
- if line == "":
- print "\nUsage: [method name] [param dict as string]\n"
- print "Example: rpc test_add {'x': 12, 'y': 17}\n"
- return
-
- sp = line.split(' ', 1)
- method = sp[0]
-
- params = None
- bad_parse = False
- if len(sp) > 1:
-
- try:
- params = ast.literal_eval(sp[1])
- if not isinstance(params, dict):
- bad_parse = True
-
- except ValueError as e1:
- bad_parse = True
- except SyntaxError as e2:
- bad_parse = True
-
- if bad_parse:
- print "\nValue should be a valid dict: '{0}'".format(sp[1])
- print "\nUsage: [method name] [param dict as string]\n"
- print "Example: rpc test_add {'x': 12, 'y': 17}\n"
- return
-
- rc, msg = self.rpc_client.invoke_rpc_method(method, params)
- if rc:
- print "\nServer Response:\n\n" + json.dumps(msg) + "\n"
- else:
- print "\n*** " + msg + "\n"
- #print "Please try 'reconnect' to reconnect to server"
-
-
- def complete_rpc (self, text, line, begidx, endidx):
- return [x for x in self.supported_rpc if x.startswith(text)]
-
- def do_status (self, line):
- '''Shows a graphical console\n'''
-
- self.do_verbose('off')
- trex_status.show_trex_status(self.rpc_client)
-
- def do_quit(self, line):
- '''exit the client\n'''
- return True
-
- def do_disconnect (self, line):
- '''Disconnect from the server\n'''
- if not self.rpc_client.is_connected():
- print "Not connected to server\n"
- return
-
- rc, msg = self.rpc_client.disconnect()
- if rc:
- print "[SUCCESS]\n"
- else:
- print msg + "\n"
-
- def postcmd(self, stop, line):
- if self.rpc_client.is_connected():
- self.prompt = "TRex > "
- else:
- self.supported_rpc = None
- self.prompt = "TRex (offline) > "
-
- return stop
-
- def default(self, line):
- print "'{0}' is an unrecognized command. type 'help' or '?' for a list\n".format(line)
-
- def do_help (self, line):
- '''Shows This Help Screen\n'''
- if line:
- try:
- func = getattr(self, 'help_' + line)
- except AttributeError:
- try:
- doc = getattr(self, 'do_' + line).__doc__
- if doc:
- self.stdout.write("%s\n"%str(doc))
- return
- except AttributeError:
- pass
- self.stdout.write("%s\n"%str(self.nohelp % (line,)))
- return
- func()
- return
-
- print "\nSupported Console Commands:"
- print "----------------------------\n"
-
- cmds = [x[3:] for x in self.get_names() if x.startswith("do_")]
- for cmd in cmds:
- if cmd == "EOF":
- continue
-
- try:
- doc = getattr(self, 'do_' + cmd).__doc__
- if doc:
- help = str(doc)
- else:
- help = "*** Undocumented Function ***\n"
- except AttributeError:
- help = "*** Undocumented Function ***\n"
-
- print "{:<30} {:<30}".format(cmd + " - ", help)
-
-
- # aliasing
- do_exit = do_EOF = do_q = do_quit
-
-def setParserOptions ():
- parser = argparse.ArgumentParser(prog="trex_console.py")
-
- parser.add_argument("-s", "--server", help = "T-Rex Server [default is localhost]",
- default = "localhost",
- type = str)
-
- parser.add_argument("-p", "--port", help = "T-Rex Server Port [default is 5050]\n",
- default = 5050,
- type = int)
-
- return parser
-
-def main ():
- parser = setParserOptions()
- options = parser.parse_args(sys.argv[1:])
-
- # RPC client
- rpc_client = RpcClient(options.server, options.port)
-
- # console
- try:
- console = TrexConsole(rpc_client)
- console.cmdloop()
- except KeyboardInterrupt as e:
- print "\n\n*** Caught Ctrl + C... Exiting...\n\n"
- return
-
-if __name__ == '__main__':
- main()
-
diff --git a/src/console/trex_rpc_client.py b/src/console/trex_rpc_client.py
deleted file mode 100644
index 77d5fe1c..00000000
--- a/src/console/trex_rpc_client.py
+++ /dev/null
@@ -1,180 +0,0 @@
-
-import zmq
-import json
-from time import sleep
-import random
-
-class RpcClient():
-
- def __init__ (self, default_server, default_port):
- self.verbose = False
- self.connected = False
-
- # default values
- self.port = default_port
- self.server = default_server
-
- def get_connection_details (self):
- rc = {}
- rc['server'] = self.server
- rc['port'] = self.port
-
- return rc
-
- def pretty_json (self, json_str):
- return json.dumps(json.loads(json_str), indent = 4, separators=(',', ': '), sort_keys = True)
-
- def verbose_msg (self, msg):
- if not self.verbose:
- return
-
- print "[verbose] " + msg
-
-
- def create_jsonrpc_v2 (self, method_name, params = {}, id = None):
- msg = {}
- msg["jsonrpc"] = "2.0"
- msg["method"] = method_name
-
- msg["params"] = params
-
- msg["id"] = id
-
- return json.dumps(msg)
-
- def invoke_rpc_method (self, method_name, params = {}, block = False):
- rc, msg = self._invoke_rpc_method(method_name, params, block)
- if not rc:
- self.disconnect()
-
- return rc, msg
-
- def _invoke_rpc_method (self, method_name, params = {}, block = False):
- if not self.connected:
- return False, "Not connected to server"
-
- id = random.randint(1, 1000)
- msg = self.create_jsonrpc_v2(method_name, params, id = id)
-
- self.verbose_msg("Sending Request To Server:\n\n" + self.pretty_json(msg) + "\n")
-
- if block:
- self.socket.send(msg)
- else:
- try:
- self.socket.send(msg, flags = zmq.NOBLOCK)
- except zmq.error.ZMQError:
- return False, "Failed To Get Send Message"
-
- got_response = False
-
- if block:
- response = self.socket.recv()
- got_response = True
- else:
- for i in xrange(0 ,10):
- try:
- response = self.socket.recv(flags = zmq.NOBLOCK)
- got_response = True
- break
- except zmq.error.Again:
- sleep(0.2)
-
- if not got_response:
- return False, "Failed To Get Server Response"
-
- self.verbose_msg("Server Response:\n\n" + self.pretty_json(response) + "\n")
-
- # decode
- response_json = json.loads(response)
-
- if (response_json.get("jsonrpc") != "2.0"):
- return False, "Malfromed Response ({0})".format(str(response))
-
- if (response_json.get("id") != id):
- return False, "Server Replied With Bad ID ({0})".format(str(response))
-
- # error reported by server
- if ("error" in response_json):
- return True, response_json["error"]["message"]
-
- # if no error there should be a result
- if ("result" not in response_json):
- return False, "Malfromed Response ({0})".format(str(response))
-
- return True, response_json["result"]
-
-
- def ping_rpc_server (self):
-
- return self.invoke_rpc_method("ping", block = False)
-
- def get_rpc_server_status (self):
- return self.invoke_rpc_method("get_status")
-
- def query_rpc_server (self):
- return self.invoke_rpc_method("get_reg_cmds")
-
-
- def set_verbose (self, mode):
- self.verbose = mode
-
- def disconnect (self):
- if self.connected:
- self.socket.close(linger = 0)
- self.context.destroy(linger = 0)
- self.connected = False
- return True, ""
- else:
- return False, "Not connected to server"
-
- def connect (self, server = None, port = None):
- if self.connected:
- self.disconnect()
-
- self.context = zmq.Context()
-
- self.server = (server if server else self.server)
- self.port = (port if port else self.port)
-
- # Socket to talk to server
- self.transport = "tcp://{0}:{1}".format(self.server, self.port)
-
- print "\nConnecting To RPC Server On {0}".format(self.transport)
-
- self.socket = self.context.socket(zmq.REQ)
- try:
- self.socket.connect(self.transport)
- except zmq.error.ZMQError as e:
- return False, "ZMQ Error: Bad server or port name: " + str(e)
-
-
- self.connected = True
-
- # ping the server
- rc, err = self.ping_rpc_server()
- if not rc:
- self.disconnect()
- return rc, err
-
- return True, ""
-
- def reconnect (self):
- # connect using current values
- return self.connect()
-
- if not self.connected:
- return False, "Not connected to server"
-
- # reconnect
- return self.connect(self.server, self.port)
-
- def is_connected (self):
- return self.connected
-
- def __del__ (self):
- print "Shutting down RPC client\n"
- self.context.destroy(linger = 0)
-
-
-
diff --git a/src/console/trex_status.py b/src/console/trex_status.py
deleted file mode 100755
index 8ee669b5..00000000
--- a/src/console/trex_status.py
+++ /dev/null
@@ -1,212 +0,0 @@
-from time import sleep
-
-import os
-
-import curses
-from curses import panel
-import random
-import collections
-import operator
-import datetime
-
-g_curses_active = False
-
-#
-def percentage (a, total):
- x = int ((float(a) / total) * 100)
- return str(x) + "%"
-
-# panel object
-class TrexStatusPanel():
- def __init__ (self, h, l, y, x, headline):
- self.h = h
- self.l = l
- self.y = y
- self.x = x
- self.headline = headline
-
- self.win = curses.newwin(h, l, y, x)
- self.win.erase()
- self.win.box()
-
- self.win.addstr(1, 2, headline, curses.A_UNDERLINE)
- self.win.refresh()
-
- panel.new_panel(self.win)
- self.panel = panel.new_panel(self.win)
- self.panel.top()
-
- def clear (self):
- self.win.erase()
- self.win.box()
- self.win.addstr(1, 2, self.headline, curses.A_UNDERLINE)
-
- def getwin (self):
- return self.win
-
-def float_to_human_readable (size, suffix = "bps"):
- for unit in ['','K','M','G']:
- if abs(size) < 1024.0:
- return "%3.1f %s%s" % (size, unit, suffix)
- size /= 1024.0
- return "NaN"
-
-# status object
-class TrexStatus():
- def __init__ (self, stdscr, rpc_client):
- self.stdscr = stdscr
- self.log = []
- self.rpc_client = rpc_client
-
- self.get_server_info()
-
- def get_server_info (self):
- rc, msg = self.rpc_client.get_rpc_server_status()
-
- if rc:
- self.server_status = msg
- else:
- self.server_status = None
-
- def add_log_event (self, msg):
- self.log.append("[{0}] {1}".format(str(datetime.datetime.now().time()), msg))
-
- def add_panel (self, h, l, y, x, headline):
- win = curses.newwin(h, l, y, x)
- win.erase()
- win.box()
-
- win.addstr(1, 2, headline)
- win.refresh()
-
- panel.new_panel(win)
- panel1 = panel.new_panel(win)
- panel1.top()
-
- return win, panel1
-
- # static info panel
- def update_info (self):
- if self.server_status == None:
- return
-
- self.info_panel.clear()
-
- connection_details = self.rpc_client.get_connection_details()
-
- self.info_panel.getwin().addstr(3, 2, "{:<30} {:30}".format("Server:", connection_details['server'] + ":" + str(connection_details['port'])))
- self.info_panel.getwin().addstr(4, 2, "{:<30} {:30}".format("Version:", self.server_status["general"]["version"]))
- self.info_panel.getwin().addstr(5, 2, "{:<30} {:30}".format("Build:",
- self.server_status["general"]["build_date"] + " @ " + self.server_status["general"]["build_time"] + " by " + self.server_status["general"]["version_user"]))
-
- self.info_panel.getwin().addstr(6, 2, "{:<30} {:30}".format("Server Uptime:", self.server_status["general"]["uptime"]))
-
- # general stats
- def update_general (self, gen_stats):
- pass
-
- # control panel
- def update_control (self):
- self.control_panel.clear()
-
- self.control_panel.getwin().addstr(1, 2, "'f' - freeze, 'c' - clear stats, 'p' - ping server, 'q' - quit")
-
- index = 3
-
- cut = len(self.log) - 4
- if cut < 0:
- cut = 0
-
- for l in self.log[cut:]:
- self.control_panel.getwin().addstr(index, 2, l)
- index += 1
-
- def generate_layout (self):
- self.max_y = self.stdscr.getmaxyx()[0]
- self.max_x = self.stdscr.getmaxyx()[1]
-
- # create cls panel
- self.main_panel = TrexStatusPanel(int(self.max_y * 0.8), self.max_x / 2, 0,0, "Trex Activity:")
-
- self.general_panel = TrexStatusPanel(int(self.max_y * 0.6), self.max_x / 2, 0, self.max_x /2, "General Statistics:")
-
- self.info_panel = TrexStatusPanel(int(self.max_y * 0.2), self.max_x / 2, int(self.max_y * 0.6), self.max_x /2, "Server Info:")
-
- self.control_panel = TrexStatusPanel(int(self.max_y * 0.2), self.max_x , int(self.max_y * 0.8), 0, "")
-
- panel.update_panels(); self.stdscr.refresh()
-
- def wait_for_key_input (self):
- ch = self.stdscr.getch()
-
- if (ch != curses.ERR):
- # stop/start status
- if (ch == ord('f')):
- self.update_active = not self.update_active
- self.add_log_event("Update continued" if self.update_active else "Update stopped")
-
- elif (ch == ord('p')):
- self.add_log_event("Pinging RPC server")
- rc, msg = self.rpc_client.ping_rpc_server()
- if rc:
- self.add_log_event("Server replied: '{0}'".format(msg))
- else:
- self.add_log_event("Failed to get reply")
-
- # c - clear stats
- elif (ch == ord('c')):
- self.add_log_event("Statistics cleared")
-
- elif (ch == ord('q')):
- return False
- else:
- self.add_log_event("Unknown key pressed {0}".format("'" + chr(ch) + "'" if chr(ch).isalpha() else ""))
-
- return True
-
- # main run entry point
- def run (self):
- try:
- curses.curs_set(0)
- except:
- pass
-
- curses.use_default_colors()
- self.stdscr.nodelay(1)
- curses.nonl()
- curses.noecho()
-
- self.generate_layout()
-
- self.update_active = True
- while (True):
-
- rc = self.wait_for_key_input()
- if not rc:
- break
-
- self.update_control()
- self.update_info()
-
- panel.update_panels();
- self.stdscr.refresh()
- sleep(0.1)
-
-
-def show_trex_status_internal (stdscr, rpc_client):
- trex_status = TrexStatus(stdscr, rpc_client)
- trex_status.run()
-
-def show_trex_status (rpc_client):
-
- try:
- curses.wrapper(show_trex_status_internal, rpc_client)
- except KeyboardInterrupt:
- curses.endwin()
-
-def cleanup ():
- try:
- curses.endwin()
- except:
- pass
-