diff options
author | 2016-07-31 11:53:34 +0300 | |
---|---|---|
committer | 2016-07-31 11:53:34 +0300 | |
commit | abf329075bd14f5f41c3753d560260ac809ec4f3 (patch) | |
tree | d224ab9d306640376b5403c247e0b2dc6c5ebfaa /scripts/automation/trex_control_plane | |
parent | fb2b01538ee9ff03716c5546252e2825c1974198 (diff) |
scapy_server for GUI+test
Diffstat (limited to 'scripts/automation/trex_control_plane')
-rwxr-xr-x | scripts/automation/trex_control_plane/stl/examples/scapy_server.py | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/scripts/automation/trex_control_plane/stl/examples/scapy_server.py b/scripts/automation/trex_control_plane/stl/examples/scapy_server.py new file mode 100755 index 00000000..4762f1a6 --- /dev/null +++ b/scripts/automation/trex_control_plane/stl/examples/scapy_server.py @@ -0,0 +1,272 @@ +import stl_path +import trex_stl_lib +from trex_stl_lib.api import * +from copy import deepcopy +import sys +import tempfile +import md5 + +#print ls() + +from cStringIO import StringIO +import sys +""" +old_stdout = sys.stdout +sys.stdout = mystdout = StringIO() + +ls() + +sys.stdout = old_stdout + +a= mystdout.getvalue() + +f = open('scapy_supported_formats.txt','w') +f.write(a) +f.close() +""" +#-------------------------------------------------------TREE IMPLEMENTATION ------------------------ +class node(object): + def __init__(self, value):#, children = []): + self.value = value + self.children = [] + + def __str__(self, level=0): + ret = "\t"*level+repr(self.value)+"\n" + for child in self.children: + ret += child.__str__(level+1) + return ret +#---------------------------------------------------------------------------------------------------- + + +def build_lib(): + lib = protocol_struct() + lib = lib.split('\n') + all_protocols=[] + for entry in lib: + entry = entry.split(':') + all_protocols.append(entry[0].strip()) + del all_protocols[len(all_protocols)-1] + return all_protocols + +def protocol_struct(protocol=''): + if '_' in protocol: + return [] + if not protocol=='': + if protocol not in all_protocols: + return 'protocol not supported' + protocol = eval(protocol) + old_stdout = sys.stdout + sys.stdout = mystdout = StringIO() + if not protocol=='': + ls(protocol) + else: + ls() + sys.stdout = old_stdout + a= mystdout.getvalue() +# print a + return a + +def parse_description_line(line): + line_arr = [x.strip() for x in re.split(': | = ',line)] + return tuple(line_arr) + +def parse_entire_description(d): + d = d.split('\n') + description_list = [parse_description_line(x) for x in d] + del description_list[len(description_list)-1] + return description_list + +def get_protocol_details(p_name): + protocol_str = protocol_struct(p_name) + if protocol_str=='protocol not supported': + return 'protocol not supported' + if len(protocol_str) is 0: + return [] + tupled_protocol = parse_entire_description(protocol_str) + return tupled_protocol + + +class scapyRegex: + def __init__(self,FieldName,regex='empty'): + self.FieldName = FieldName + self.regex = regex + + def stringRegex(self): + return self.regex + +all_protocols = build_lib() + +Raw = {'Raw':''} +high_level_protocols = ['Raw'] +transport_protocols = {'TCP':Raw,'UDP':Raw} +network_protocols = {'IP':transport_protocols ,'ARP':''} +low_level_protocols = { 'Ether': network_protocols } +regexDB= {'MACField' : scapyRegex('MACField','^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$'), + 'IPField' : scapyRegex('IPField','^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$')} + + +def build_nodes(data,dictionary): + n = node(data) + if len(dictionary)==0: + n.children=[] + return n + for obj in dictionary.keys(): + if not (obj==''): + x = build_nodes(obj,dictionary[obj]) + n.children.append(x) + return n + +def build_tree(): + root = node('ALL') + root.children = [] + root = build_nodes('ALL',low_level_protocols) + return root + +protocol_tree = build_tree() + +def print_tree(root,level=0): + output = "\t"*level+str(root.value) + print output + if len(root.children)==0: + return + for child in root.children: + print_tree(child,level+1) + +def get_all_protocols(): + return json.dumps(all_protocols) + +def get_tree(): + old_stdout = sys.stdout + sys.stdout = mystdout = StringIO() + print_tree(t) + sys.stdout = old_stdout + a= mystdout.getvalue() + return json.dumps(a) + +def get_all_db(): + db = {} + for pro in all_protocols: + details = get_protocol_details(pro) + db[pro] = json.dumps(details) + return db + +def get_all_fields(): + fields = [] + for pro in all_protocols: + details = get_protocol_details(pro) + for i in range(0,len(details),1): + if len(details[i]) is 3: + fields.append(details[i][1]) + uniqeFields = list(set(fields)) + fieldDict = {} + for f in uniqeFields: + if f in regexDB: + fieldDict[f] = regexDB[f].stringRegex() + else: + fieldDict[f] = scapyRegex(f).stringRegex() + return fieldDict + + +class pktResult: + def __init__(self,result,errorCode,errorDesc): + self.result = result + self.errorCode = errorCode + self.errorDesc = errorDesc + + def convert2tuple(self): + return tuple([self.result,self.errorCode,self.errorDesc]) + + + +# pkt_descriptor in JSON format only! +# returned tuple in JSON format: (pktResultTuple , show2data, hexdump(buffer)) +# pktResultTuple is: ( result, errorCode, error description ) + +def build_pkt(pkt_descriptor): + try: + pkt = eval(json.loads(pkt_descriptor)) + old_stdout = sys.stdout + sys.stdout = mystdout = StringIO() + pkt.show2() + sys.stdout = old_stdout + show2data = mystdout.getvalue() #show2 data + bufferData = str(pkt) #pkt buffer + bufferData = bufferData.encode('base64') + pktRes = pktResult('Success',0,'None').convert2tuple() + res = [pktRes,json.dumps(show2data),json.dumps(bufferData)] + JSONres = json.dumps(res) + return JSONres + except: + pktRes = pktResult('Pkt build Failed',str(sys.exc_info()[0]),str(sys.exc_info()[1])).convert2tuple() + res = [pktRes,[],[]] + res = json.dumps(res) + return res + +#input: container +#output: md5 in json format encoded in base64 +def getMD5(container): + resMD5 = md5.new(json.dumps(container)) + resMD5 = json.dumps(resMD5.digest().encode('base64')) + return resMD5 + + +def get_all(): + fields=get_all_fields() + db=get_all_db() + fieldMD5 = getMD5(fields) + dbMD5 = getMD5(db) + res = {} + res['db'] = db + res['fields'] = fields + res['DB_md5'] = dbMD5 +# print dbMD5 + res['fields_md5'] = fieldMD5 + return json.dumps(res) + +#input in json string encoded base64 +def check_update(dbMD5,fieldMD5): + fields=get_all_fields() + db=get_all_db() + currentDBMD5 = json.loads(getMD5(db)) + currentFieldMD5 = json.loads(getMD5(fields)) + dbMD5_parsed = json.loads(dbMD5) + fieldMD5_parsed = json.loads(fieldMD5) + res = [] +# print 'this is current DB MD5: %s ' % currentDBMD5 +# print 'this is given DB MD5: %s ' % dbMD5_parsed + if fieldMD5_parsed == currentFieldMD5: + resField = pktResult('Success',0,'None').convert2tuple() + else: + resField = pktResult('Fail',0,'Field DB is not up to date').convert2tuple() + if dbMD5_parsed == currentDBMD5: + resDB = pktResult('Success',0,'None').convert2tuple() + else: + resDB = pktResult('Fail',0,'Protocol DB is not up to date').convert2tuple() + return json.dumps([resField,resDB]) + +#pkt_desc as json +#dictionary of offsets per protocol. tuple for each field: (name, offset, size) at json format +def get_all_pkt_offsets(pkt_desc): + pkt_desc= json.loads(pkt_desc) + pkt_protocols = pkt_desc.split('/') + scapy_pkt = eval(pkt_desc) + total_protocols = len(pkt_protocols) + res = {} + for i in range(total_protocols): + fields = [] + for field in scapy_pkt.fields_desc: + size = field.get_size_bytes() + if field.name is 'load': + size = len(scapy_pkt) + fields.append([field.name, field.offset, size]) + res[pkt_protocols[i]] = fields + scapy_pkt=scapy_pkt.payload + return json.dumps(res) + + + +def get_supported_cmds(): + + + + |