1''' 2build ebpf program 3''' 4 5import os 6import signal 7from string import Template 8import subprocess 9import time 10from TdcPlugin import TdcPlugin 11from tdc_config import * 12 13class SubPlugin(TdcPlugin): 14 def __init__(self): 15 self.sub_class = 'buildebpf/SubPlugin' 16 self.tap = '' 17 super().__init__() 18 19 def pre_suite(self, testcount, testidlist): 20 super().pre_suite(testcount, testidlist) 21 22 if self.args.buildebpf: 23 self._ebpf_makeall() 24 25 def post_suite(self, index): 26 super().post_suite(index) 27 28 self._ebpf_makeclean() 29 30 def add_args(self, parser): 31 super().add_args(parser) 32 33 self.argparser_group = self.argparser.add_argument_group( 34 'buildebpf', 35 'options for buildebpfPlugin') 36 self.argparser_group.add_argument( 37 '-B', '--buildebpf', action='store_true', 38 help='build eBPF programs') 39 40 return self.argparser 41 42 def _ebpf_makeall(self): 43 if self.args.buildebpf: 44 self._make('all') 45 46 def _ebpf_makeclean(self): 47 if self.args.buildebpf: 48 self._make('clean') 49 50 def _make(self, target): 51 command = 'make -C {} {}'.format(self.args.NAMES['EBPFDIR'], target) 52 proc = subprocess.Popen(command, 53 shell=True, 54 stdout=subprocess.PIPE, 55 stderr=subprocess.PIPE, 56 env=ENVIR) 57 (rawout, serr) = proc.communicate() 58 59 if proc.returncode != 0 and len(serr) > 0: 60 foutput = serr.decode("utf-8") 61 else: 62 foutput = rawout.decode("utf-8") 63 64 proc.stdout.close() 65 proc.stderr.close() 66 return proc, foutput 67