Skip to content

Commit

Permalink
refactor: Move connectivity condition generation to base
Browse files Browse the repository at this point in the history
  • Loading branch information
irl committed Jan 21, 2018
1 parent 0af71aa commit 660ab7a
Show file tree
Hide file tree
Showing 13 changed files with 85 additions and 83 deletions.
20 changes: 20 additions & 0 deletions pathspider/base.py
Expand Up @@ -625,6 +625,26 @@ def add_job(self, job):

self.jobqueue.put(job)

def combine_connectivity(self, baseline, experimental=None, prefix=None):
if prefix is None:
prefix = self.name
if experimental is None:
if baseline:
return prefix + ".connectivity.online"
else:
return prefix + ".connectivity.offline"
if experimental:
if baseline:
return prefix + ".connectivity.works"
else:
return prefix + ".connectivity.transient"
else:
if baseline:
return prefix + ".connectivity.broken"
else:
return prefix + ".connectivity.offline"


class PluggableSpider:
@staticmethod
def register_args(subparsers):
Expand Down
25 changes: 9 additions & 16 deletions pathspider/plugins/dscp.py
Expand Up @@ -51,30 +51,23 @@ def combine_flows(self, flows):
conditions = []

baseline = 'dscp.' + str(flows[0]['dscp_mark_syn_fwd'] or
flows[0]['dscp_mark_data_fwd']) + '.'
flows[0]['dscp_mark_data_fwd'])
test = 'dscp.' + str(flows[1]['dscp_mark_syn_fwd'] or
flows[1]['dscp_mark_data_fwd']) + '.'
flows[1]['dscp_mark_data_fwd'])

if flows[0]['spdr_state'] == CONN_OK and flows[1][
'spdr_state'] == CONN_OK:
cond_conn = test + 'connectivity.works'
elif flows[0]['spdr_state'] == CONN_OK and not flows[1][
'spdr_state'] == CONN_OK:
cond_conn = test + 'connectivity.broken'
elif not flows[0]['spdr_state'] == CONN_OK and flows[1][
'spdr_state'] == CONN_OK:
cond_conn = test + 'connectivity.transient'
else:
cond_conn = test + 'connectivity.offline'
conditions.append(cond_conn)
conditions.append(self.combine_connectivity(
flows[0]['spdr_state'] == CONN_OK,
experimental = flows[1]['spdr_state'] == CONN_OK,
prefix = test)
)

baseline_replymark = flows[0]['dscp_mark_syn_rev'] or flows[0]['dscp_mark_data_rev']
test_replymark = flows[1]['dscp_mark_syn_rev'] or flows[1]['dscp_mark_data_rev']

if baseline_replymark is not None:
conditions.append(baseline + 'replymark:' + str(baseline_replymark))
conditions.append(baseline + '.replymark:' + str(baseline_replymark))
if test_replymark is not None:
conditions.append(test + 'replymark:' + str(test_replymark))
conditions.append(test + '.replymark:' + str(test_replymark))

return conditions

Expand Down
14 changes: 3 additions & 11 deletions pathspider/plugins/ecn.py
Expand Up @@ -49,17 +49,9 @@ def config_ecn(self): # pylint: disable=no-self-use
def combine_flows(self, flows):
conditions = []

if flows[0]['spdr_state'] == CONN_OK and flows[1][
'spdr_state'] == CONN_OK:
conditions.append('ecn.connectivity.works')
elif flows[0]['spdr_state'] == CONN_OK and not flows[1][
'spdr_state'] == CONN_OK:
conditions.append('ecn.connectivity.broken')
elif not flows[0]['spdr_state'] == CONN_OK and flows[1][
'spdr_state'] == CONN_OK:
conditions.append('ecn.connectivity.transient')
else:
conditions.append('ecn.connectivity.offline')
conditions.append(self.combine_connectivity(
flows[0]['spdr_state'] == CONN_OK,
flows[1]['spdr_state'] == CONN_OK))

for f in flows:
if not f['observed']:
Expand Down
20 changes: 6 additions & 14 deletions pathspider/plugins/evilbit.py
Expand Up @@ -16,16 +16,6 @@
from pathspider.chains.base import Chain
from pathspider.chains.tcp import TCP_SYN, TCP_SA

def _evilcon(conn0, conn1):
if conn0 is True and conn1 is True:
return 'evilbit.connectivity.works'
elif conn0 is True and conn1 is False:
return 'evilbit.connectivity.broken'
elif conn0 is False and conn1 is True:
return 'evilbit.connectivity.transient'
elif conn0 is False and conn1 is False:
return 'evilbit.connectivity.offline'

class EvilBit(ForgeSpider, PluggableSpider):

name = "evilbit"
Expand Down Expand Up @@ -69,9 +59,10 @@ def combine_flows(self, flows):
if flows[1]['tcp_synflags_rev'] is not None and flows[1][
'tcp_synflags_rev'] & TCP_SA == TCP_SA:
conn1 = True

conditions.append(self.combine_connectivity(conn0, conn1))

conditions.append(_evilcon(conn0, conn1))
if 'works' in (_evilcon(conn0, conn1)):
if conn1:
if flows[1]['evilbit_syn_rev']:
conditions.append('evilbit.mark.seen')
else:
Expand All @@ -81,12 +72,13 @@ def combine_flows(self, flows):
conn0 = flows[0]['dns_response_valid']
conn1 = flows[1]['dns_response_valid']

conditions.append(_evilcon(conn0, conn1))
if 'works' in (_evilcon(conn0, conn1)):
conditions.append(self.combine_connectivity(conn0, conn1))
if conn1:
if flows[1]['evilbit_data_rev']:
conditions.append('evilbit.mark.seen')
else:
conditions.append('evilbit.mark.not_seen')

return conditions


16 changes: 5 additions & 11 deletions pathspider/plugins/h2.py
Expand Up @@ -46,20 +46,14 @@ def conn_h2(self, job, config): # pylint: disable=unused-argument
def combine_flows(self, flows):
conditions = []

if (not flows[0]['spdr_state'] == CONN_OK and
not flows[1]['spdr_state'] == CONN_OK):
conditions.append('h2.connectivity.offline')
elif (not flows[0]['spdr_state'] == CONN_OK and
flows[1]['spdr_state'] == CONN_OK):
conditions.append('h2.connectivity.transient')
elif (flows[0]['spdr_state'] == CONN_OK and
flows[1]['spdr_state'] == CONN_OK):
conditions.append('h2.connectivity.works')
conditions.append(self.combine_connectivity(
flows[0]['spdr_state'] == CONN_OK,
flows[1]['spdr_state'] == CONN_OK))

if flows[1]['spdr_state'] == CONN_OK:
if flows[1]['http_info'][pycurl.INFO_HTTP_VERSION] == pycurl.CURL_HTTP_VERSION_2_0:
conditions.append('h2.upgrade.success')
else:
conditions.append('h2.upgrade.failed')
else:
conditions.append('h2.connectivity.broken')

return conditions
5 changes: 2 additions & 3 deletions pathspider/plugins/mss.py
Expand Up @@ -24,8 +24,9 @@ def combine_flows(self, flows):
if not flows[0]['observed']:
return ['pathspider.not_observed']

conditions.append(self.combine_connectivity(flows[0]['tcp_connected']))

if flows[0]['tcp_connected']:
conditions.append('mss.connectivity.online')
conditions.append('mss.option.local.value:' + str(flows[0]['mss_value_fwd']))
if flows[0]['mss_len_rev'] is not None:
conditions.append('mss.option.remote.value:' + str(flows[0]['mss_value_rev']))
Expand All @@ -37,8 +38,6 @@ def combine_flows(self, flows):
conditions.append('mss.option.received.inflated')
else:
conditions.append('mss.option.received.absent')
else:
conditions.append('mss.connectivity.offline')

return conditions

Expand Down
10 changes: 2 additions & 8 deletions pathspider/plugins/udpzero.py
Expand Up @@ -39,11 +39,5 @@ def combine_flows(self, flows):
if not flow['observed']:
return ['pathspider.not_observed']

if flows[0]['dns_response_valid'] and flows[1]['dns_response_valid']:
return ['udpzero.connectivity.works']
if flows[0]['dns_response_valid'] and not flows[1]['dns_response_valid']:
return ['udpzero.connectivity.broken']
if not flows[0]['dns_response_valid'] and flows[1]['dns_response_valid']:
return ['udpzero.connectivity.transient']
else:
return ['udpzero.connectivity.offline']
return [self.combine_connectivity(flows[0]['dns_response_valid'],
flows[1]['dns_response_valid'])]
8 changes: 6 additions & 2 deletions pathspider/tests/test_plugin_dscp.py
Expand Up @@ -16,7 +16,8 @@ def test_plugin_dscp_combine_not_observed():
{'observed': True},
{'observed': False}
]
conditions = DSCP.combine_flows(None, flows)
spider = DSCP(0, "", None)
conditions = spider.combine_flows(flows)
assert "pathspider.not_observed" in conditions

def test_plugin_dscp_combine():
Expand All @@ -31,7 +32,10 @@ def test_plugin_dscp_combine():
{'observed': True, 'spdr_state': group[0], 'dscp_mark_syn_fwd': 0, 'dscp_mark_data_fwd': 0, 'dscp_mark_syn_rev': 0, 'dscp_mark_data_rev': 0},
{'observed': True, 'spdr_state': group[1], 'dscp_mark_syn_fwd': 46, 'dscp_mark_data_fwd': 46, 'dscp_mark_syn_rev': 46, 'dscp_mark_data_rev': 46}
]
conditions = DSCP.combine_flows(None, flows)
spider = DSCP(0, "", None)
conditions = spider.combine_flows(flows)
print(group)
print(conditions)
assert group[2] in conditions
if 'dscp.46.connectivity.works' in conditions:
assert 'dscp.0.replymark:0' in conditions
Expand Down
18 changes: 11 additions & 7 deletions pathspider/tests/test_plugin_ecn.py
Expand Up @@ -13,7 +13,8 @@ def test_plugin_ecn_not_observed():
{'observed': True, 'spdr_state': CONN_OK},
{'observed': False, 'spdr_state': CONN_OK}
]
conditions = ECN.combine_flows(None, flows)
spider = ECN(0, "", None)
conditions = spider.combine_flows(flows)
assert "pathspider.not_observed" in conditions

def test_plugin_ecn_combine():
Expand All @@ -24,12 +25,13 @@ def test_plugin_ecn_combine():
(CONN_FAILED, CONN_FAILED, "ecn.connectivity.offline")
]
for group in test_groups:
flow = [
flows = [
{'observed': True, 'spdr_state': group[0], 'tcp_connected': False},
{'observed': True, 'spdr_state': group[1], 'tcp_connected': False}
]

conditions = ECN.combine_flows(None, flow)
spider = ECN(0, "", None)
conditions = spider.combine_flows(flows)
assert group[2] in conditions

test_groups_ecn = [
Expand All @@ -39,12 +41,13 @@ def test_plugin_ecn_combine():
]

for group in test_groups_ecn:
flow = [
flows = [
{'observed': True, 'spdr_state': CONN_OK},
{'observed': True, 'spdr_state': CONN_OK, 'tcp_connected': group[0], 'tcp_synflags_rev': group[1], 'ecn_ect0_syn_rev': False, 'ecn_ect1_syn_rev': False, 'ecn_ce_syn_rev': False, 'ecn_ect0_data_rev': False, 'ecn_ect1_data_rev': False, 'ecn_ce_data_rev': False }
]

conditions = ECN.combine_flows(None, flow)
spider = ECN(0, "", None)
conditions = spider.combine_flows(flows)
assert group[2] in conditions

test_groups_mark = [
Expand All @@ -56,9 +59,10 @@ def test_plugin_ecn_combine():
(False, "ecn.ipmark.ce.not_seen")
]
for group in test_groups_mark:
flow = [
flows = [
{'observed': True, 'spdr_state': CONN_OK},
{'observed': True, 'spdr_state': CONN_OK, 'tcp_connected': True, 'tcp_synflags_rev': TCP_SAE, 'ecn_ect0_syn_rev': group[0], 'ecn_ect1_syn_rev': group[0], 'ecn_ce_syn_rev': group[0], 'ecn_ect0_data_rev': group[0], 'ecn_ect1_data_rev': group[0], 'ecn_ce_data_rev': group[0] }
]
conditions = ECN.combine_flows(None, flow)
spider = ECN(0, "", None)
conditions = spider.combine_flows(flows)
assert group[1] in conditions
3 changes: 2 additions & 1 deletion pathspider/tests/test_plugin_evilbit.py
Expand Up @@ -73,7 +73,8 @@ def test_plugin_evilbit_combine_not_observed():
{'observed': True},
{'observed': False}
]
conditions = EvilBit.combine_flows(None, flows)
spider = EvilBit(0, "", None)
conditions = spider.combine_flows(flows)
assert "pathspider.not_observed" in conditions


Expand Down
10 changes: 6 additions & 4 deletions pathspider/tests/test_plugin_h2.py
Expand Up @@ -20,18 +20,20 @@ def test_plugin_h2_combine():
flows = [
{'spdr_state': group[0]},
{'spdr_state': group[1], 'http_info': {pycurl.INFO_HTTP_VERSION: pycurl.CURL_HTTP_VERSION_2_0}}
]
conditions = H2.combine_flows(None, flows)
]
spider = H2(0, "", None)
conditions = spider.combine_flows(flows)
assert group[2] in conditions

upgrade_groups = [
('h2.upgrade.success', pycurl.CURL_HTTP_VERSION_2_0),
('h2.upgrade.failed', None),
]
for group in upgrade_groups:
flow = [
flows = [
{'spdr_state': CONN_OK},
{'spdr_state': CONN_OK, 'http_info': {pycurl.INFO_HTTP_VERSION : group[1]}}
]
conditions = H2.combine_flows(None, flow)
spider = H2(0, "", None)
conditions = spider.combine_flows(flows)
assert group[0] in conditions
13 changes: 9 additions & 4 deletions pathspider/tests/test_plugin_mss.py
Expand Up @@ -8,7 +8,8 @@ def test_plugin_mss_combine_not_observed():
{'observed': False, 'tcp_connected': False},
{'observed': True, 'tcp_connected': False}
]
conditions = MSS.combine_flows(None, flows)
spider = MSS(0, "", None)
conditions = spider.combine_flows(flows)
assert "pathspider.not_observed" in conditions


Expand All @@ -22,7 +23,8 @@ def test_plugin_mss_combine():
{'observed': True, 'tcp_connected': group[0], 'mss_value_fwd': None , 'mss_len_rev': None, 'mss_value_rev': None}
]

conditions = MSS.combine_flows(None, flows)
spider = MSS(0, "", None)
conditions = spider.combine_flows(flows)
assert group[1] in conditions
if "mss.connectivity.online" in conditions:
assert 'mss.option.received.absent' in conditions
Expand All @@ -34,8 +36,11 @@ def test_plugin_mss_combine():
('mss.option.received.deflated', 1460, 1440)
]
for group in mss_groups:
flow = [
flows = [
{'observed': True, 'tcp_connected': True, 'mss_value_fwd': group[1], 'mss_len_rev': 4, 'mss_value_rev': group[2]}
]
conditions = MSS.combine_flows(None, flow)
spider = MSS(0, "", None)
conditions = spider.combine_flows(flows)
print(group)
print(conditions)
assert group[0] in conditions
6 changes: 4 additions & 2 deletions pathspider/tests/test_plugin_udpzero.py
Expand Up @@ -72,7 +72,8 @@ def test_plugin_udpzero_combine():
{'observed': True, 'dns_response_valid': group[0]},
{'observed': True, 'dns_response_valid': group[1]}
]
conditions = UDPZero.combine_flows(None, flows)
spider = UDPZero(0, "", None)
conditions = spider.combine_flows(flows)
assert group[2] in conditions

def test_plugin_udpzero_combine_not_observed():
Expand All @@ -81,5 +82,6 @@ def test_plugin_udpzero_combine_not_observed():
{'observed': True, 'dns_response_valid': valid},
{'observed': False}
]
conditions = UDPZero.combine_flows(None, flows)
spider = UDPZero(0, "", None)
conditions = spider.combine_flows(flows)
assert "pathspider.not_observed" in conditions

0 comments on commit 660ab7a

Please sign in to comment.