# scapy server unit test\r
\r
import sys,os\r
+from nose.plugins.skip import SkipTest\r
+if sys.version_info.major == 3:\r
+ raise SkipTest("Python3 currently not supported")\r
scapy_server_path = os.path.abspath(os.path.join(os.pardir, 'trex_control_plane', 'stl', 'services','scapy_server'))\r
stl_pathname = os.path.abspath(os.path.join(os.pardir, os.pardir, 'trex_control_plane','stl'))\r
sys.path.append(scapy_server_path)\r
sys.path.append(stl_pathname)\r
\r
\r
-#import stl_path\r
import trex_stl_lib\r
from trex_stl_lib.api import *\r
from copy import deepcopy\r
self.all_protocols = self._build_lib()
self.protocol_tree = {'ALL':{'Ether':{'ARP':{},'IP':{'TCP':{'RAW':'payload'},'UDP':{'RAW':'payload'}}}}}
- def _protocol_struct(self,protocol=''):
+
+ def _all_protocol_structs(self):
+ old_stdout = sys.stdout
+ sys.stdout = mystdout = StringIO()
+ ls()
+ sys.stdout = old_stdout
+ all_protocol_data= mystdout.getvalue()
+ return all_protocol_data
+
+ def _protocol_struct(self,protocol):
if '_' in protocol:
return []
if not protocol=='':
if protocol not in self.all_protocols:
return 'protocol not supported'
- protocol = eval(protocol)
+ protocol = eval(protocol)
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
- if not protocol=='':
- ls(protocol)
- else:
- ls()
+ ls(protocol)
sys.stdout = old_stdout
protocol_data= mystdout.getvalue()
return protocol_data
def _build_lib(self):
- lib = self._protocol_struct()
- lib = lib.split('\n')
+ lib = self._all_protocol_structs()
+ lib = lib.splitlines()
all_protocols=[]
for entry in lib:
entry = entry.split(':')
for pro in self.all_protocols:
details = self._get_protocol_details(pro)
for i in range(0,len(details),1):
- if len(details[i]) is 3:
+ if len(details[i]) == 3:
fields.append(details[i][1])
- uniqeFields = list(set(fields))
+ uniqueFields = list(set(fields))
fieldDict = {}
- for f in uniqeFields:
+ for f in uniqueFields:
if f in self.regexDB:
fieldDict[f] = self.regexDB[f].stringRegex()
else:
return res_md5
def get_version(self):
- return {'built_by':'itraviv','version':'v1.0'}
+ return {'built_by':'itraviv','version':'v1.01'}
def supported_methods(self,method_name=''):
if method_name=='':
methods = {}
for f in dir(Scapy_service):
if inspect.ismethod(eval('Scapy_service.'+f)):
- methods[f] = inspect.getargspec(eval('Scapy_service.'+f))[0]
+ param_list = inspect.getargspec(eval('Scapy_service.'+f))[0]
+ del param_list[0] #deleting the parameter "self" that appears in every method
+ #because the server automatically operates on an instance,
+ #and this can cause confusion
+ methods[f] = (len(param_list), param_list)
return methods
if method_name in dir(Scapy_service):
return True
--- /dev/null
+\r
+\r
+import zmq\r
+import json\r
+\r
+\r
+class Scapy_server_wrapper():\r
+ def __init__(self,dest_scapy_port=5555,server_ip_address='localhost'):\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
+\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
+ request = json.dumps(json_rpc_req)\r
+ self.socket.send_string(request)\r
+ # Get the reply.\r
+ message = self.socket.recv_string()\r
+ message_parsed = json.loads(message)\r
+ if 'result' in message_parsed.keys():\r
+ result = message_parsed['result']\r
+ else:\r
+ result = {'error':message_parsed['error']}\r
+ return result\r
+\r
+ def get_all(self):\r
+ return self.call_method('get_all',[])\r
+\r
+ def check_update(self,db_md5,field_md5):\r
+ result = self.call_method('check_update',[db_md5,field_md5])\r
+ if result!=True:\r
+ if 'error' in result.keys():\r
+ if "Fields DB is not up to date" in result['error']['message:']:\r
+ raise Exception("Fields DB is not up to date")\r
+ if "Protocol DB is not up to date" in result['error']['message:']:\r
+ raise Exception("Protocol DB is not up to date")\r
+ return result\r
+\r
+ def build_pkt(self,pkt_descriptor):\r
+ return self.call_method('build_pkt',[pkt_descriptor])\r
+ \r
+ def _get_all_pkt_offsets(self,pkt_desc):\r
+ return self.call_method('_get_all_pkt_offsets',[pkt_desc])\r
def parse_req_msg(self,JSON_req):\r
try:\r
req = json.loads(JSON_req)\r
- req_id='null'\r
+ req_id=b'null'\r
if (type(req)!= type({})):\r
raise ParseException(req_id)\r
json_rpc_keys = ['jsonrpc','id','method']\r
def create_error_response(self,error_code,error_msg,req_id='null'):\r
return {"jsonrpc": "2.0", "error": {"code": error_code, "message:": error_msg}, "id": req_id}\r
\r
- def create_success_response(self,result,req_id='null'):\r
+ def create_success_response(self,result,req_id=b'null'):\r
return {"jsonrpc": "2.0", "result": result, "id": req_id }\r
\r
def get_exception(self):\r
\r
\r
def error_handler(self,e,req_id):\r
- print('exception message is %s' % e.message)\r
- print('exception type is: %s' % type(e))\r
try:\r
raise e\r
except ParseException as e:\r
response = self.create_error_response(-32603,'Invalid params',req_id)\r
except SyntaxError as e:\r
response = self.create_error_response(-32097,'SyntaxError',req_id)\r
- except BaseException as e:\r
- response = self.create_error_response(-32098,'Scapy Server: '+str(e.message),req_id)\r
- except:\r
- response = self.create_error_response(-32096,'Scapy Server: Unknown Error',req_id)\r
+ except Exception as e:\r
+ if hasattr(e,'message'):\r
+ response = self.create_error_response(-32098,'Scapy Server: '+str(e.message),req_id)\r
+ else:\r
+ response = self.create_error_response(-32096,'Scapy Server: Unknown Error',req_id) \r
finally:\r
- print(response)\r
return response\r
\r
class Scapy_server():\r
print ('Server IP address: %s' % self.IP_address)\r
try:\r
while True:\r
- message = self.socket.recv()\r
+ message = self.socket.recv_string()\r
try:\r
req_id = 'null'\r
method,params,req_id = self.scapy_wrapper.parse_req_msg(message)\r
finally:\r
json_response = json.dumps(response)\r
# Send reply back to client\r
- self.socket.send(json_response)\r
- if (method =='shut_down'):\r
+ self.socket.send_string(json_response)\r
+ if (method == 'shut_down'):\r
break\r
\r
except KeyboardInterrupt:\r
- print('Terminated By Ctrl+C')\r
+ print(b'Terminated By Ctrl+C')\r
\r
finally:\r
self.socket.close()\r