66@author: Blake Pagon
77"""
88
9+ # TODO: https://github.com/PyCQA/bandit/issues/333 for bandit false positive on subprocess.
10+
911import argparse
1012import datetime
1113import ipaddress
@@ -27,13 +29,26 @@ def ipaddress_fields(json_fields):
2729 ipas .add (str (ipa ))
2830 return ipas
2931
32+ def pcap_name_with_layers (pcap_filename , pcap_layers , pcap_suffix ):
33+ pcap_basename = os .path .basename (pcap_filename )
34+ pcap_basename = pcap_basename .replace (pcap_suffix , '' )
35+ layers_str = '-' .join (pcap_layers )
36+ layers_pcap_filename = pcap_filename .replace (
37+ pcap_basename , '-' .join ((pcap_basename , layers_str )))
38+ return layers_pcap_filename
39+
3040def proto_annotate_pcaps (pcap_dir ):
31- pap_filenames = [
32- pcap .path for pcap in os .scandir (pcap_dir )
33- if pcap .is_file () and pcap .path .endswith ('pcap' )]
41+ pcap_suffix = '.pcap'
42+ try :
43+ pap_filenames = [
44+ pcap .path for pcap in os .scandir (pcap_dir )
45+ if pcap .is_file () and pcap .path .endswith (pcap_suffix )]
46+ except FileNotFoundError as err :
47+ print (err )
48+ return
3449 for pcap_filename in pap_filenames :
3550 try :
36- response = subprocess .check_output (shlex .split (' ' .join (
51+ response = subprocess .check_output (shlex .split (' ' .join ( # nosec
3752 ['./tshark' , '-T' , 'json' , '-c' , str (10 ), '-r' , pcap_filename ])))
3853 pcap_json = json .loads (response .decode ("utf-8" ))
3954 except (json .decoder .JSONDecodeError , subprocess .CalledProcessError ) as e :
@@ -52,10 +67,7 @@ def proto_annotate_pcaps(pcap_dir):
5267 packet_layers = list (ipas ) + list (layers_json .keys ())
5368 if len (packet_layers ) > len (pcap_layers ):
5469 pcap_layers = packet_layers
55- pcap_basename = os .path .basename (pcap_filename )
56- layers_str = '-' .join (pcap_layers )
57- layers_pcap_filename = pcap_filename .replace (
58- pcap_basename , '-' .join ((layers_str , pcap_basename )))
70+ layers_pcap_filename = pcap_name_with_layers (pcap_filename , pcap_layers , pcap_suffix )
5971 os .rename (pcap_filename , layers_pcap_filename )
6072
6173def connect_rabbit (host = 'messenger' , port = 5672 , queue = 'task_queue' ):
@@ -98,43 +110,42 @@ def run_tool(path, protoannotate):
98110
99111 # need to make directories to store results from pcapsplitter
100112 base_dir = path .rsplit ('/' , 1 )[0 ]
101- timestamp = ""
102- try :
103- timestamp = '-' .join (str (datetime .datetime .now ()).split (' ' )) + '-UTC'
104- timestamp = timestamp .replace (':' , '_' )
105- except Exception as e : # pragma: no cover
106- print ("couldn't create output directory with unique timestamp" )
113+ timestamp = '-' .join (str (datetime .datetime .now ()).split (' ' )) + '-UTC'
114+ timestamp = timestamp .replace (':' , '_' )
107115 # make directory for tool name recognition of piping to other tools
108116 output_dir = os .path .join (base_dir , 'pcap-node-splitter' + '-' + timestamp )
109- try :
110- os .mkdir (output_dir )
111- os .mkdir (output_dir + '/clients' )
112- os .mkdir (output_dir + '/servers' )
113- except OSError : # pragma: no cover
114- print ("couldn't make directories for output of this tool" )
115117 clients_dir = os .path .join (output_dir , 'clients' )
116118 servers_dir = os .path .join (output_dir , 'servers' )
119+ for new_dir in (output_dir , clients_dir , servers_dir ):
120+ try :
121+ os .mkdir (new_dir )
122+ except OSError as err :
123+ print ("couldn't make directory %s for output of this tool: %s" % (new_dir , err ))
117124
118- try :
119- subprocess .check_call (shlex .split ("./PcapSplitter -f " +
120- path + " -o " + clients_dir + " -m client-ip" ))
121-
122- subprocess .check_call (shlex .split ("./PcapSplitter -f " +
123- path + " -o " + servers_dir + " -m server-ip" ))
124- except Exception as e :
125- print (str (e ))
125+ for tool_cmd in (
126+ " " .join (("./PcapSplitter -f" , path , "-o" , clients_dir , "-m client-ip" )),
127+ " " .join (("./PcapSplitter -f" , path , "-o" , servers_dir , "-m server-ip" ))):
128+ try :
129+ subprocess .check_call (shlex .split (tool_cmd )) # nosec
130+ except Exception as err :
131+ print ("%s: %s" % (tool_cmd , err ))
126132
127133 if protoannotate :
128134 for pcap_dir in (clients_dir , servers_dir ):
129135 proto_annotate_pcaps (pcap_dir )
130136
131- return output_dir + '/clients'
137+ return clients_dir
132138
133- if __name__ == '__main__' : # pragma: no cover
134- parser = argparse . ArgumentParser ()
135- parser . add_argument ( '--protoannotate' , help = 'use tshark to annotate pcaps with protocol' , action = 'store_true' )
139+ def parse_args ( parser ):
140+ parser . add_argument ( '--protoannotate' , help = 'use tshark to annotate pcaps with protocol' ,
141+ action = 'store_true' , default = True )
136142 parser .add_argument ('paths' , nargs = '*' )
137143 args = parser .parse_args ()
144+ return args
145+
146+
147+ if __name__ == '__main__' : # pragma: no cover
148+ args = parse_args (argparse .ArgumentParser ())
138149 path = get_path (args .paths )
139150 if path :
140151 result_path = run_tool (path , args .protoannotate )
0 commit comments