scapy_service:
authoritraviv <[email protected]>
Sun, 21 Aug 2016 15:00:29 +0000 (18:00 +0300)
committeritraviv <[email protected]>
Sun, 21 Aug 2016 15:00:29 +0000 (18:00 +0300)
supported_methods now returns all functions when invoked with parameter 'all'

zmq_client:
added simple console to interact with server

scapy_zmq_server:
added verbosity feature

scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_service.py
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_client.py
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_server.py

index 9b05c4e..11a9db4 100755 (executable)
@@ -269,8 +269,8 @@ class Scapy_service(Scapy_service_api):
     def get_version(self):
         return {'built_by':'itraviv','version':'v1.01'}
 
-    def supported_methods(self,method_name=''):
-        if method_name=='':
+    def supported_methods(self,method_name='all'):
+        if method_name=='all':
             methods = {}
             for f in dir(Scapy_service):
                 if inspect.ismethod(eval('Scapy_service.'+f)):
index 24e1593..18d3227 100644 (file)
@@ -1,15 +1,22 @@
 \r
+import sys\r
+import os\r
+python2_zmq_path = os.path.abspath(os.path.join(os.pardir,os.pardir,os.pardir,os.pardir,\r
+                                                os.pardir,'external_libs','pyzmq-14.5.0','python2','fedora18','64bit'))\r
+sys.path.append(python2_zmq_path)\r
 \r
 import zmq\r
 import json\r
-\r
+from argparse import *\r
+from pprint import pprint\r
 \r
 class Scapy_server_wrapper():\r
     def __init__(self,dest_scapy_port=5555,server_ip_address='localhost'):\r
+        self.server_ip_address = server_ip_address\r
         self.context = zmq.Context()\r
         self.socket = self.context.socket(zmq.REQ)\r
         self.dest_scapy_port =dest_scapy_port\r
-        self.socket.connect("tcp://"+str(server_ip_address)+":"+str(self.dest_scapy_port)) #ip address of csi-trex-11\r
+        self.socket.connect("tcp://"+str(self.server_ip_address)+":"+str(self.dest_scapy_port)) \r
 \r
     def call_method(self,method_name,method_params):\r
         json_rpc_req = { "jsonrpc":"2.0","method": method_name ,"params": method_params, "id":"1"}\r
@@ -42,3 +49,68 @@ class Scapy_server_wrapper():
         \r
     def _get_all_pkt_offsets(self,pkt_desc):\r
         return self.call_method('_get_all_pkt_offsets',[pkt_desc])\r
+\r
+    def _activate_console(self):\r
+        context = zmq.Context()\r
+        #  Socket to talk to server\r
+        print 'Connecting:'\r
+        socket = context.socket(zmq.REQ)\r
+        socket.connect("tcp://"+str(self.server_ip_address)+":"+str(self.dest_scapy_port)) \r
+        try:\r
+            print('This is a simple console to communicate with Scapy server.\nInvoke supported_methods (with 1 parameter = all) to see supported commands\n')\r
+            while True:\r
+                command = raw_input("enter RPC command [enter quit to exit]:\n")\r
+                if (command == 'quit'):\r
+                    break      \r
+                parameter_num = 0\r
+                params = []\r
+                while True:\r
+                    try:\r
+                        parameter_num = int(raw_input('Enter number of parameters to command:\n'))\r
+                        break\r
+                    except Exception:\r
+                        print('Invalid input. Try again')\r
+                for i in range(1,parameter_num+1,1):\r
+                    print "input parameter %d:" % i\r
+                    user_parameter = raw_input()\r
+                    params.append(user_parameter)\r
+                pprint_output = raw_input('pprint the output [y/n]? ')\r
+                while ((pprint_output!= 'y')  and (pprint_output!='n')):\r
+                    pprint_output = raw_input('pprint the output [y/n]? ')\r
+                json_rpc_req = { "jsonrpc":"2.0","method": command ,"params":params, "id":"1"}\r
+                request = json.dumps(json_rpc_req)\r
+                print("Sending request in json format %s " % request)\r
+                socket.send(request)\r
+\r
+                #  Get the reply.\r
+                message = socket.recv()\r
+                print ('received reply:')\r
+                parsed_message = json.loads(message)\r
+                if (pprint_output == 'y'):\r
+                    pprint(parsed_message)\r
+                else:\r
+                    print message\r
+        except KeyboardInterrupt:\r
+                        print('Terminated By Ctrl+C')\r
+        finally:\r
+            socket.close()\r
+            context.destroy()\r
+\r
+\r
+\r
+if __name__=='__main__':\r
+    parser = ArgumentParser(description='Example of client module for Scapy server ')\r
+    parser.add_argument('-p','--dest-scapy-port',type=int, default = 4507, dest='dest_scapy_port',\r
+                        help='Select port to which this Scapy Server client will send to.\n default is 4507\n',action='store')\r
+    parser.add_argument('-s','--server',type=str, default = 'localhost', dest='dest_scapy_ip',\r
+                        help='Remote server IP address .\n default is localhost\n',action='store')\r
+    parser.add_argument('-c','--console',\r
+                        help='Run simple client console for Scapy server.\nrun with \'-s\' and \'-p\' to determine IP and port of the server\n',\r
+                        action='store_true',default = False)\r
+    args = parser.parse_args()\r
+    if (args.console):\r
+        s = Scapy_server_wrapper(args.dest_scapy_port,args.dest_scapy_ip)\r
+        sys.exit(s._activate_console())\r
+    else:\r
+        print('Scapy client: for interactive console re-run with \'-c\', else import as seperate module.')\r
+\r
index 0b88668..3f0bf3c 100755 (executable)
@@ -73,6 +73,7 @@ class Scapy_wrapper:
 \r
 \r
     def error_handler(self,e,req_id):\r
+        response = []\r
         try:\r
             raise e\r
         except ParseException as e:\r
@@ -108,7 +109,11 @@ class Scapy_server():
         try:\r
             while True:\r
                 message = self.socket.recv_string()\r
+                if args.verbose:\r
+                    print('Received Message: %s \n' % message)\r
                 try:\r
+                    params = []\r
+                    method=''\r
                     req_id = 'null'\r
                     method,params,req_id = self.scapy_wrapper.parse_req_msg(message)\r
                     if (method == 'shut_down'):\r
@@ -121,6 +126,8 @@ class Scapy_server():
                     response = self.scapy_wrapper.error_handler(e,req_id)\r
                 finally:\r
                     json_response = json.dumps(response)\r
+                    if args.verbose:\r
+                        print('Sending Message: %s \n' % json_response)\r
                 #  Send reply back to client\r
                     self.socket.send_string(json_response)\r
                     if (method == 'shut_down'):\r
@@ -145,6 +152,7 @@ if __name__=='__main__':
         parser = ArgumentParser(description=' Runs Scapy Server ')\r
         parser.add_argument('-s','--scapy-port',type=int, default = 4507, dest='scapy_port',\r
                             help='Select port to which Scapy Server will listen to.\n default is 4507\n',action='store')\r
+        parser.add_argument('-v','--verbose',help='Print Client-Server Request-Reply logging',action='store_true',default = False)\r
         args = parser.parse_args()\r
         port = args.scapy_port\r
         sys.exit(main(port))\r