114e5175eSLucas Bates#!/usr/bin/env python3
214e5175eSLucas Bates
314e5175eSLucas Batesimport os
414e5175eSLucas Batesimport signal
514e5175eSLucas Batesfrom string import Template
614e5175eSLucas Batesimport subprocess
714e5175eSLucas Batesimport time
814e5175eSLucas Batesfrom TdcPlugin import TdcPlugin
914e5175eSLucas Bates
1014e5175eSLucas Batesfrom tdc_config import *
1114e5175eSLucas Bates
1214e5175eSLucas Batestry:
1314e5175eSLucas Bates    from scapy.all import *
1414e5175eSLucas Batesexcept ImportError:
1514e5175eSLucas Bates    print("Unable to import the scapy python module.")
1614e5175eSLucas Bates    print("\nIf not already installed, you may do so with:")
1714e5175eSLucas Bates    print("\t\tpip3 install scapy==2.4.2")
1814e5175eSLucas Bates    exit(1)
1914e5175eSLucas Bates
2014e5175eSLucas Batesclass SubPlugin(TdcPlugin):
2114e5175eSLucas Bates    def __init__(self):
2214e5175eSLucas Bates        self.sub_class = 'scapy/SubPlugin'
2314e5175eSLucas Bates        super().__init__()
2414e5175eSLucas Bates
2514e5175eSLucas Bates    def post_execute(self):
2614e5175eSLucas Bates        if 'scapy' not in self.args.caseinfo:
2714e5175eSLucas Bates            if self.args.verbose:
2814e5175eSLucas Bates                print('{}.post_execute: no scapy info in test case'.format(self.sub_class))
2914e5175eSLucas Bates            return
3014e5175eSLucas Bates
3114e5175eSLucas Bates        # Check for required fields
32*11f04de9SMarcelo Ricardo Leitner        lscapyinfo = self.args.caseinfo['scapy']
33*11f04de9SMarcelo Ricardo Leitner        if type(lscapyinfo) != list:
34*11f04de9SMarcelo Ricardo Leitner            lscapyinfo = [ lscapyinfo, ]
35*11f04de9SMarcelo Ricardo Leitner
36*11f04de9SMarcelo Ricardo Leitner        for scapyinfo in lscapyinfo:
3714e5175eSLucas Bates            scapy_keys = ['iface', 'count', 'packet']
3814e5175eSLucas Bates            missing_keys = []
3914e5175eSLucas Bates            keyfail = False
4014e5175eSLucas Bates            for k in scapy_keys:
4114e5175eSLucas Bates                if k not in scapyinfo:
4214e5175eSLucas Bates                    keyfail = True
43b4fd096cSMarcelo Ricardo Leitner                    missing_keys.append(k)
4414e5175eSLucas Bates            if keyfail:
4514e5175eSLucas Bates                print('{}: Scapy block present in the test, but is missing info:'
4614e5175eSLucas Bates                    .format(self.sub_class))
4714e5175eSLucas Bates                print('{}'.format(missing_keys))
4814e5175eSLucas Bates
4914e5175eSLucas Bates            pkt = eval(scapyinfo['packet'])
5014e5175eSLucas Bates            if '$' in scapyinfo['iface']:
5114e5175eSLucas Bates                tpl = Template(scapyinfo['iface'])
5214e5175eSLucas Bates                scapyinfo['iface'] = tpl.safe_substitute(NAMES)
5314e5175eSLucas Bates            for count in range(scapyinfo['count']):
5414e5175eSLucas Bates                sendp(pkt, iface=scapyinfo['iface'])
55