commit 6868e1df824ecd1b7899eef7580816fe0618b502 Author: kudrom kudrom@riseup.net Date: Sat Jul 19 17:47:30 2014 +0200
PEP8 cleanup --- ooni/templates/scapyt.py | 16 ++++++----- ooni/utils/txscapy.py | 68 +++++++++++++++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 29 deletions(-)
diff --git a/ooni/templates/scapyt.py b/ooni/templates/scapyt.py index 8194925..ee21508 100644 --- a/ooni/templates/scapyt.py +++ b/ooni/templates/scapyt.py @@ -13,6 +13,7 @@ from ooni.settings import config from ooni.utils.txscapy import ScapySender, getDefaultIface, ScapyFactory from ooni.utils.txscapy import hasRawSocketPermission
+ class BaseScapyTest(NetTestCase): """ The report of a test run with scapy looks like this: @@ -29,13 +30,13 @@ class BaseScapyTest(NetTestCase):
requiresRoot = not hasRawSocketPermission() baseFlags = [ - ['ipsrc', 's', - 'Does *not* check if IP src and ICMP IP citation matches when processing answers'], - ['seqack', 'k', - 'Check if TCP sequence number and ACK match in the ICMP citation when processing answers'], - ['ipid', 'i', - 'Check if the IPID matches when processing answers'] - ] + ['ipsrc', 's', + 'Does *not* check if IP src and ICMP IP citation matches when processing answers'], + ['seqack', 'k', + 'Check if TCP sequence number and ACK match in the ICMP citation when processing answers'], + ['ipid', 'i', + 'Check if the IPID matches when processing answers'] + ]
def _setUp(self): super(BaseScapyTest, self)._setUp() @@ -144,4 +145,5 @@ class BaseScapyTest(NetTestCase): for sent_packet in packets: self.report['sent_packets'].append(sent_packet)
+ ScapyTest = BaseScapyTest diff --git a/ooni/utils/txscapy.py b/ooni/utils/txscapy.py index a96a397..bfd5d7f 100644 --- a/ooni/utils/txscapy.py +++ b/ooni/utils/txscapy.py @@ -19,9 +19,11 @@ from scapy.all import TCP, TCPerror, UDP, UDPerror from ooni.utils import log from ooni.settings import config
+ class LibraryNotInstalledError(Exception): pass
+ def pcapdnet_installed(): """ Checks to see if libdnet or libpcap are installed and set the according @@ -39,8 +41,10 @@ def pcapdnet_installed(): # expecting "dnet" so we try and import it under such name. try: import dumbnet + sys.modules['dnet'] = dumbnet - except ImportError: pass + except ImportError: + pass
try: conf.use_pcap = True @@ -68,6 +72,7 @@ def pcapdnet_installed():
return config.pcap_dnet
+ if pcapdnet_installed(): from scapy.all import PcapWriter
@@ -84,17 +89,18 @@ else:
from scapy.all import Gen, SetGen, MTU
+ def getNetworksFromRoutes(): """ Return a list of networks from the routing table """ from scapy.all import conf, ltoa, read_routes - from ipaddr import IPNetwork, IPAddress + from ipaddr import IPNetwork, IPAddress
- ## Hide the 'no routes' warnings + # # Hide the 'no routes' warnings conf.verb = 0
networks = [] for nw, nm, gw, iface, addr in read_routes(): - n = IPNetwork( ltoa(nw) ) + n = IPNetwork(ltoa(nw)) (n.netmask, n.gateway, n.ipaddr) = [IPAddress(x) for x in [nm, gw, addr]] n.iface = iface if not n.compressed in networks: @@ -102,12 +108,15 @@ def getNetworksFromRoutes():
return networks
+ class IfaceError(Exception): pass
+ def getAddresses(): from scapy.all import get_if_addr, get_if_list from ipaddr import IPAddress + addresses = set() for i in get_if_list(): try: @@ -118,9 +127,10 @@ def getAddresses(): addresses.remove('0.0.0.0') return [IPAddress(addr) for addr in addresses]
+ def getDefaultIface(): """ Return the default interface or raise IfaceError """ - #XXX: currently broken on OpenVZ environments, because + # XXX: currently broken on OpenVZ environments, because # the routing table does not contain a default route # Workaround: Set the default interface in ooniprobe.conf networks = getNetworksFromRoutes() @@ -129,6 +139,7 @@ def getDefaultIface(): return net.iface raise IfaceError
+ def hasRawSocketPermission(): try: socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) @@ -136,17 +147,21 @@ def hasRawSocketPermission(): except socket.error: return False
+ class ProtocolNotRegistered(Exception): pass
+ class ProtocolAlreadyRegistered(Exception): pass
+ class ScapyFactory(abstract.FileDescriptor): """ Inspired by muxTCP scapyLink: https://github.com/enki/muXTCP/blob/master/scapyLink.py """ + def __init__(self, interface, super_socket=None, timeout=5):
abstract.FileDescriptor.__init__(self, reactor) @@ -201,6 +216,7 @@ class ScapyFactory(abstract.FileDescriptor): else: raise ProtocolNotRegistered
+ class ScapyProtocol(object): factory = None
@@ -213,6 +229,7 @@ class ScapyProtocol(object): """ raise NotImplementedError
+ class ScapySender(ScapyProtocol): timeout = 5
@@ -236,7 +253,7 @@ class ScapySender(ScapyProtocol): if packet.answers(answer_hr[i]): self.answered_packets.append((answer_hr[i], packet)) if not self.multi: - del(answer_hr[i]) + del (answer_hr[i]) break
if len(self.answered_packets) == len(self.sent_packets): @@ -245,7 +262,7 @@ class ScapySender(ScapyProtocol): return
if self.expected_answers and \ - self.expected_answers == len(self.answered_packets): + self.expected_answers == len(self.answered_packets): log.debug("Got the number of expected answers") self.stopSending()
@@ -295,6 +312,7 @@ class ScapySender(ScapyProtocol): self.sendPackets(packets) return self.d
+ class ScapySniffer(ScapyProtocol): def __init__(self, pcap_filename, *arg, **kw): self.pcapwriter = PcapWriter(pcap_filename, *arg, **kw) @@ -302,6 +320,7 @@ class ScapySniffer(ScapyProtocol): def packetReceived(self, packet): self.pcapwriter.write(packet)
+ class ParasiticTraceroute(ScapyProtocol): def __init__(self): self.numHosts = 7 @@ -332,7 +351,7 @@ class ParasiticTraceroute(ScapyProtocol): return try: packet[IP].ttl = self.hosts[packet.dst]['ttl'].pop() - del packet.chksum #XXX Why is this incorrect? + del packet.chksum # XXX Why is this incorrect? log.debug("Sent packet to %s with ttl %d" % (packet.dst, packet.ttl)) self.sendPacket(packet) k = (packet.id, packet[TCP].sport, packet[TCP].dport, packet[TCP].seq) @@ -345,10 +364,10 @@ class ParasiticTraceroute(ScapyProtocol): def maxttl(packet=None): if packet: return min(self.ttl_max, - min( - abs( 64 - packet.ttl ), - abs( 128 - packet.ttl ), - abs( 256 - packet.ttl ))) - 1 + min( + abs(64 - packet.ttl), + abs(128 - packet.ttl), + abs(256 - packet.ttl))) - 1 else: return self.ttl_max
@@ -362,15 +381,15 @@ class ParasiticTraceroute(ScapyProtocol): and packet.dst not in self.addresses \ and isinstance(packet.getlayer(1), TCP):
- self.hosts[packet.dst] = {'ttl' : genttl()} + self.hosts[packet.dst] = {'ttl': genttl()} log.debug("Tracing to %s" % packet.dst)
elif packet.src not in self.hosts \ and packet.src not in self.addresses \ and isinstance(packet.getlayer(1), TCP):
- self.hosts[packet.src] = {'ttl' : genttl(packet), - 'ttl_max': maxttl(packet)} + self.hosts[packet.src] = {'ttl': genttl(packet), + 'ttl_max': maxttl(packet)} log.debug("Tracing to %s" % packet.src) return
@@ -387,6 +406,7 @@ class ParasiticTraceroute(ScapyProtocol): def stopListening(self): self.factory.unRegisterProtocol(self)
+ class MPTraceroute(ScapyProtocol): dst_ports = [0, 22, 23, 53, 80, 123, 443, 8080, 65535] ttl_min = 1 @@ -408,7 +428,7 @@ class MPTraceroute(ScapyProtocol): d = defer.Deferred() reactor.callLater(self.timeout, d.callback, self)
- self.sendPackets(IP(dst=host,ttl=(self.ttl_min,self.ttl_max), id=RandShort())/ICMP(id=RandShort())) + self.sendPackets(IP(dst=host, ttl=(self.ttl_min, self.ttl_max), id=RandShort()) / ICMP(id=RandShort())) return d
def UDPTraceroute(self, host): @@ -418,7 +438,8 @@ class MPTraceroute(ScapyProtocol): reactor.callLater(self.timeout, d.callback, self)
for dst_port in self.dst_ports: - self.sendPackets(IP(dst=host,ttl=(self.ttl_min,self.ttl_max), id=RandShort())/UDP(dport=dst_port, sport=RandShort())) + self.sendPackets( + IP(dst=host, ttl=(self.ttl_min, self.ttl_max), id=RandShort()) / UDP(dport=dst_port, sport=RandShort())) return d
def TCPTraceroute(self, host): @@ -428,7 +449,10 @@ class MPTraceroute(ScapyProtocol): reactor.callLater(self.timeout, d.callback, self)
for dst_port in self.dst_ports: - self.sendPackets(IP(dst=host,ttl=(self.ttl_min,self.ttl_max), id=RandShort())/TCP(flags=2L, dport=dst_port, sport=RandShort(), seq=RandShort())) + self.sendPackets( + IP(dst=host, ttl=(self.ttl_min, self.ttl_max), id=RandShort()) / TCP(flags=2L, dport=dst_port, + sport=RandShort(), + seq=RandShort())) return d
@defer.inlineCallbacks @@ -499,10 +523,10 @@ class MPTraceroute(ScapyProtocol): l = p.getlayer(1) i = 0 if isinstance(l, ICMP): - i += matchResponse(('icmp', p.id), p) # match by ipid - i += matchResponse(('icmp', l.id), p) # match by icmpid + i += matchResponse(('icmp', p.id), p) # match by ipid + i += matchResponse(('icmp', l.id), p) # match by icmpid if isinstance(l, TCP): - i += matchResponse(('tcp', l.dport, l.sport), p) # match by s|dport + i += matchResponse(('tcp', l.dport, l.sport), p) # match by s|dport i += matchResponse(('tcp', l.seq, l.sport, l.dport), p) if isinstance(l, UDP): i += matchResponse(('udp', l.dport, l.sport), p) @@ -517,7 +541,7 @@ class MPTraceroute(ScapyProtocol): if not l: return elif (isinstance(l, ICMP) or isinstance(l, UDP) or - isinstance(l, TCP)): + isinstance(l, TCP)): self._recvbuf.append(packet)
def stopListening(self):