Skip to content

Commit b702ada

Browse files
committed
Rework run.sh + Add retries
1 parent ae22e65 commit b702ada

File tree

4 files changed

+70
-22
lines changed

4 files changed

+70
-22
lines changed

run.sh

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ fi
77

88
file="datasets/alexa-top1m-2021-01-04_0900_UTC.csv"
99
num_files=$1
10+
((num_processes=num_files-1))
1011
total_lines=$(wc -l <$file)
1112
((lines_per_file = (total_lines + num_files - 1) / num_files))
1213

1314
echo "Lines per file = ${lines_per_file}"
15+
echo "Number of processes = ${num_processes}"
1416

1517
if [[ "$(uname)" == "Darwin" ]]; then
1618
# On macos the split command is prefixed with a 'g'
@@ -20,12 +22,14 @@ else
2022
fi
2123

2224
pids=()
23-
for i in {0000..$num_files}; do
25+
for i in {0000..$num_processes}; do
2426
current_input="datasets/domains.${i}"
2527
current_output="output/results_${i}.json"
2628
probing --input ${current_input} --output ${current_output} &
2729
pids+=($!)
30+
printf "$! "
2831
done;
32+
echo ""
2933

3034
# wait for all pids
3135
for pid in ${pids[*]}; do

src/dnssec/evaluation/evaluation.py

+48-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import argparse
77
from dnssec.probing.datatypes import ValidationResult
88
from enum import Enum
9+
import matplotlib.pyplot as plt
910

1011

1112
class EvalState(Enum):
@@ -14,6 +15,43 @@ class EvalState(Enum):
1415
FLAPPING = 2,
1516

1617

18+
def plot_or_show(output_path):
19+
if output_path:
20+
if output_path[-1] != '/':
21+
output_path += '/'
22+
plt.savefig(output_path + 'dnssec_deployment.pdf',
23+
bbox_inches='tight')
24+
else:
25+
plt.show()
26+
27+
28+
def plot_errors(dataframe, output_path):
29+
error_df = dataframe.groupby('reason')
30+
print(error_df.get_group(()))
31+
# count_df = validation_res_df.groupby('result', as_index=False).count()
32+
# count_df = count_df.drop(['reason'], axis=1)
33+
# count_df.columns = ['result', 'count']
34+
# count_df.sort_values(by='count', inplace=True, ascending=False)
35+
# print(count_df)
36+
# plot_or_show(output_path)
37+
38+
39+
def plot_deployment(validation_res_df, output_path):
40+
count_df = validation_res_df.groupby('result', as_index=False).count()
41+
count_df = count_df.drop(['reason'], axis=1)
42+
count_df.columns = ['result', 'count']
43+
count_df.sort_values(by='count', inplace=True, ascending=False)
44+
print(count_df)
45+
46+
plt.bar(x=count_df['result'], height=count_df['count'])
47+
plt.xlabel('Result')
48+
plt.ylabel('Count [#]')
49+
plt.title('Results of DNSSEC validation', loc='left')
50+
plt.gcf().set_size_inches(12, 5)
51+
52+
plot_or_show(output_path)
53+
54+
1755
def is_flapping(zone_infos):
1856
state = EvalState.UNBROKEN
1957
for zone_info in zone_infos:
@@ -29,33 +67,36 @@ def deployed_keys(zone_infos):
2967
for i, zone_info in enumerate(zone_infos):
3068
if zone_info['num_ksk'] != 0 and zone_info['num_zsk'] == 0:
3169
zones.append(zone_info['name'])
32-
# if len(zones) != 0:
33-
# return None
3470
return zones
3571

3672

3773
def to_csv(args):
38-
weird_dnssec_deployment = set()
74+
only_ksks = set()
3975
with open(args.input, 'r') as json_file:
4076
lst = []
4177
t1 = time.time()
4278
for i, line in enumerate(json_file):
4379
dct = json.loads(line)
4480
zones = dct['zones']
4581
flapping = is_flapping(zones)
82+
only_ksks.update(deployed_keys(zones))
4683

47-
#
48-
weird_dnssec_deployment.update(deployed_keys(zones))
49-
# lst.append([dct['name'], dct['validation_state'], dct['reason']])
84+
lst.append([dct['name'], dct['validation_state'], dct['reason']])
5085

5186
# if i > 10:
5287
# break
88+
# break
5389

5490
# df = pd.DataFrame(lst,
5591
# columns=['name', 'result', 'reason'])
92+
93+
df = pd.DataFrame(lst,
94+
columns=['name', 'result', 'reason'])
95+
plot_deployment(df, args.output_path)
96+
plot_errors(df, args.output_path)
5697
t2 = time.time()
5798
print(t2-t1, 's')
58-
print(len(weird_dnssec_deployment), 'zones deploy dnssec only using KSKs')
99+
print(len(only_ksks), 'zones deploy dnssec only using KSKs')
59100

60101

61102
def main():

src/dnssec/probing/datatypes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def from_dict(self, dct):
8686
self.valid_soa = dct['valid_soa']
8787
self.num_ksk = dct['num_ksk']
8888
self.num_zsk = dct['num_zsk']
89-
self.key_algos = dct['key_algos']
89+
# self.key_algos = dct['key_algos']
9090
self.validated = dct['validated']
9191
return self
9292

src/dnssec/probing/dnssec.py

+16-13
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def is_valid_zone(zone):
4040
# Has not been checked before. Check it!
4141
soa = query(zone, dns.rdatatype.SOA)
4242
if soa.rrset is None:
43-
raise RessourceMissingError(f'{zone} - SOA')
43+
raise RessourceMissingError(f'SOA')
4444
exists = soa.rrset.name.to_text() == zone
4545
if exists:
4646
existing_zones[zone] = soa
@@ -86,16 +86,19 @@ def get_all_from(response, rd_type, covers=dns.rdatatype.TYPE0):
8686
def raw_query(zone, record_type, ns_addr='8.8.8.8'):
8787
request = dns.message.make_query(
8888
zone, record_type, want_dnssec=True)
89-
try:
90-
response, _ = dns.query.udp_with_fallback(
91-
request, ns_addr, timeout=3)
92-
except dns.exception.Timeout:
93-
raise TimeoutError(
94-
f'{dns.rdatatype.to_text(record_type)}@{zone}')
95-
if response.rcode() != 0:
96-
raise QueryError(
97-
f'{dns.rdatatype.to_text(record_type)}@{zone}: {dns.rcode.to_text(response.rcode())}')
98-
return response
89+
for _ in range(3): # Retry maximum 3 times
90+
timeout = False
91+
try:
92+
response, _ = dns.query.udp_with_fallback(
93+
request, ns_addr, timeout=3)
94+
except dns.exception.Timeout:
95+
continue
96+
if response.rcode() != 0:
97+
raise QueryError(
98+
f'{dns.rdatatype.to_text(record_type)}: {dns.rcode.to_text(response.rcode())}')
99+
return response
100+
# this should only happen if the timeout happened 3 times!
101+
raise TimeoutError(f'{dns.rdatatype.to_text(record_type)}')
99102

100103

101104
def query(zone, record_type, ns_addr='8.8.8.8'):
@@ -205,7 +208,7 @@ def validate_root_zone():
205208
ns = '198.41.0.4' # IP of a.root-servers.net. This doesn't have to be validated!
206209
dnskey = query('.', dns.rdatatype.DNSKEY, ns)
207210
if dnskey.rrset is None:
208-
raise RessourceMissingError('. - DNSKEY')
211+
raise RessourceMissingError('DNSKEY')
209212
zone = Zone('.', dnskey, ns, None, None)
210213

211214
# Validate
@@ -230,7 +233,7 @@ def validate_zone(zone, parent_zone):
230233
try:
231234
ns_addr = query(zone.soa.rrset[0].mname.to_text(), dns.rdatatype.A)
232235
if ns_addr.rrset is None:
233-
raise RessourceMissingError(f'{zone.name} - NS A record')
236+
raise RessourceMissingError(f'NS A')
234237
zone.ns = ns_addr.rrset[0].to_text()
235238
ds, nsec_type = query_DS(zone, parent_zone)
236239
zone.dnskey = query(zone.name, dns.rdatatype.DNSKEY, zone.ns)

0 commit comments

Comments
 (0)