Skip to content

Commit 4f87365

Browse files
authored
Merge pull request #222 from anarkiwi/annotate2
Annotate pcaps with protocol by default.
2 parents 5890478 + 1a63a5a commit 4f87365

File tree

2 files changed

+57
-34
lines changed

2 files changed

+57
-34
lines changed

pcap_to_node_pcap/pcap_to_node_pcap.py

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
@author: Blake Pagon
77
"""
88

9+
# TODO: https://github.com/PyCQA/bandit/issues/333 for bandit false positive on subprocess.
10+
911
import argparse
1012
import datetime
1113
import 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+
3040
def 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

6173
def 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)

pcap_to_node_pcap/test_pcap_to_node_pcap.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,22 @@
44
Created on 20 December 2018
55
@author: Charlie Lewis
66
"""
7+
import argparse
78
import sys
89

9-
from .pcap_to_node_pcap import get_path
10-
from .pcap_to_node_pcap import run_tool
10+
from .pcap_to_node_pcap import get_path, run_tool, pcap_name_with_layers, parse_args
11+
12+
13+
def test_pcap_name_with_layers():
14+
pcap_suffix = '.pcap'
15+
pcap_basename = 'trace_3cf8009a09d9684250ffa77d6f7752aee61463a8_2019-11-07_04_11_19-server-ip-74-125-68-189'
16+
pcap_filename = pcap_basename + pcap_suffix
17+
new_name = pcap_name_with_layers(pcap_filename, ['a', 'b', 'c'], pcap_suffix)
18+
assert new_name == pcap_basename + '-a-b-c' + pcap_suffix
19+
20+
def test_parse_args():
21+
args = parse_args(argparse.ArgumentParser([]))
22+
assert args.protoannotate
1123

1224

1325
def test_get_path():

0 commit comments

Comments
 (0)