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 '--nobuildebpf', action='store_false', default=True, 38 dest='buildebpf', 39 help='Don\'t build eBPF programs') 40 41 return self.argparser 42 43 def _ebpf_makeall(self): 44 if self.args.buildebpf: 45 self._make('all') 46 47 def _ebpf_makeclean(self): 48 if self.args.buildebpf: 49 self._make('clean') 50 51 def _make(self, target): 52 command = 'make -C {} {}'.format(self.args.NAMES['EBPFDIR'], target) 53 proc = subprocess.Popen(command, 54 shell=True, 55 stdout=subprocess.PIPE, 56 stderr=subprocess.PIPE, 57 env=os.environ.copy()) 58 (rawout, serr) = proc.communicate() 59 60 if proc.returncode != 0 and len(serr) > 0: 61 foutput = serr.decode("utf-8") 62 else: 63 foutput = rawout.decode("utf-8") 64 65 proc.stdout.close() 66 proc.stderr.close() 67 return proc, foutput 68