[tor-commits] [ooni-probe/master] Refactor the Scapy test template.
art at torproject.org
art at torproject.org
Wed Nov 7 19:02:26 UTC 2012
commit f4a065da96af966e01126be4c3013780da1b7579
Author: Arturo Filastò <arturo at filasto.net>
Date: Wed Nov 7 19:49:08 2012 +0100
Refactor the Scapy test template.
* Now is it much more simple
For the time being the txscapy send and receiver will be disabled in sake of
KISS principle.
---
nettests/examples/example_scapyt.py | 25 ++-------
ooni/templates/scapyt.py | 103 ++++++++++++++++++-----------------
2 files changed, 56 insertions(+), 72 deletions(-)
diff --git a/nettests/examples/example_scapyt.py b/nettests/examples/example_scapyt.py
index ce32ac3..51ffd02 100644
--- a/nettests/examples/example_scapyt.py
+++ b/nettests/examples/example_scapyt.py
@@ -5,30 +5,13 @@
from ooni.utils import log
from ooni.templates import scapyt
-from scapy.all import *
+from scapy.all import IP, TCP
-class ExampleScapy(scapyt.ScapyTest):
+class ExampleBasicScapy(scapyt.BaseScapyTest):
name = "Example Scapy Test"
author = "Arturo Filastò"
version = 0.1
- inputs = [IP(dst="8.8.8.8")/TCP(dport=31337),
- IP(dst="ooni.nu")/TCP(dport=31337)]
-
- requiresRoot = True
-
- def test_sendReceive(self):
+ def test_send_raw_ip_frame(self):
log.msg("Running send receive")
- if self.receive:
- log.msg("Sending and receiving packets.")
- d = self.sendReceivePackets(self.buildPackets())
- else:
- log.msg("Sending packets.")
- d = self.sendPackets(self.buildPackets())
-
- def finished(data):
- log.msg("Finished sending")
- return data
-
- d.addCallback(finished)
- return
+ ans, unans = self.sr(IP(dst='8.8.8.8')/TCP(), timeout=1)
diff --git a/ooni/templates/scapyt.py b/ooni/templates/scapyt.py
index 9e18fbd..8683a8e 100644
--- a/ooni/templates/scapyt.py
+++ b/ooni/templates/scapyt.py
@@ -9,14 +9,61 @@ from twisted.python import usage
from twisted.plugin import IPlugin
from twisted.internet import protocol, defer, threads
-from scapy.all import IP, TCP, send, sr
+from scapy.all import send, sr, IP, TCP
from ooni.nettest import NetTestCase
from ooni.utils import log
from ooni.lib.txscapy import TXScapy
-class ScapyTest(NetTestCase):
+def createPacketReport(packet_list):
+ """
+ Takes as input a packet a list containing a dict with the packet
+ summary and the raw packet.
+ """
+ report = []
+ for packet in packet_list:
+ report.append({'raw_packet': str(packet),
+ 'summary': str(packet.summary())})
+ return report
+
+class BaseScapyTest(NetTestCase):
+ """
+ The report of a test run with scapy looks like this:
+
+ report:
+ sent_packets: [{'raw_packet': BASE64Encoding of packet,
+ 'summary': 'IP / TCP 192.168.2.66:ftp_data > 8.8.8.8:http S']
+ answered_packets: []
+
+ """
+ name = "Base Scapy Test"
+ version = 0.1
+
+ requiresRoot = True
+
+ sentPackets = []
+ answeredPackets = []
+
+ def sr(self, *arg, **kw):
+ """
+ Wrapper around scapy.sendrecv.sr for sending and receiving of packets
+ at layer 3.
+ """
+ answered_packets, sent_packets = sr(*arg, **kw)
+ self.report['answered_packets'] = createPacketReport(answered_packets)
+ self.report['sent_packets'] = createPacketReport(sent_packets)
+ return (answered_packets, sent_packets)
+
+ def send(self, *arg, **kw):
+ """
+ Wrapper around scapy.sendrecv.send for sending of packets at layer 3
+ """
+ sent_packets = send(*arg, **kw)
+ self.report['sent_packets'] = createPacketReport(sent_packets)
+ return sent_packets
+
+class TXScapyTest(BaseScapyTest):
"""
A utility class for writing scapy driven OONI tests.
@@ -25,8 +72,10 @@ class ScapyTest(NetTestCase):
* timeout: timeout in ms of when we should stop waiting to receive packets
* receive: if we should also receive packets and not just send
+
+ XXX This is currently not working
"""
- name = "Scapy Test"
+ name = "TX Scapy Test"
version = 0.1
receive = True
@@ -38,15 +87,6 @@ class ScapyTest(NetTestCase):
answered = None
unanswered = None
-
- def setUp(self):
- if not self.reactor:
- from twisted.internet import reactor
- self.reactor = reactor
- self.questions = []
- self.answers = []
- self.processInputs()
-
def processInputs(self):
"""
Place here the logic for validating and processing of inputs and
@@ -105,42 +145,3 @@ class ScapyTest(NetTestCase):
"""
pass
-class BlockingScapyTest(ScapyTest):
- """
- This is a very basic Scapy Test template that does not do all the
- multithreading kung-fu of txscapy, but maintains the same API.
-
- This will allow tests implemented using the BlockingScapyTest API to easily
- migrate to the new API.
- """
- name = "Blocking Scapy Test"
- version = 0.1
-
- timeout = None
-
- answered = None
- unanswered = None
-
- def sendReceivePackets(self):
- packets = self.buildPackets()
-
- log.debug("Sending and receiving %s" % packets)
-
- self.answered, self.unanswered = sr(packets, timeout=self.timeout)
-
- log.debug("%s %s" % (ans, unans))
-
- def sendPackets(self):
- packets = self.buildPackets()
-
- log.debug("Sending packets %s" % packets)
-
- send(packets)
-
-
- def buildPackets(self):
- """
- Override this method to build scapy packets.
- """
- pass
-
More information about the tor-commits
mailing list