| ''' | |
| build ebpf program | |
| ''' | |
| import os | |
| import signal | |
| from string import Template | |
| import subprocess | |
| import time | |
| from TdcPlugin import TdcPlugin | |
| from tdc_config import * | |
| class SubPlugin(TdcPlugin): | |
| def __init__(self): | |
| self.sub_class = 'buildebpf/SubPlugin' | |
| self.tap = '' | |
| super().__init__() | |
| def pre_suite(self, testcount, testidlist): | |
| super().pre_suite(testcount, testidlist) | |
| if self.args.buildebpf: | |
| self._ebpf_makeall() | |
| def post_suite(self, index): | |
| super().post_suite(index) | |
| self._ebpf_makeclean() | |
| def add_args(self, parser): | |
| super().add_args(parser) | |
| self.argparser_group = self.argparser.add_argument_group( | |
| 'buildebpf', | |
| 'options for buildebpfPlugin') | |
| self.argparser_group.add_argument( | |
| '--nobuildebpf', action='store_false', default=True, | |
| dest='buildebpf', | |
| help='Don\'t build eBPF programs') | |
| return self.argparser | |
| def _ebpf_makeall(self): | |
| if self.args.buildebpf: | |
| self._make('all') | |
| def _ebpf_makeclean(self): | |
| if self.args.buildebpf: | |
| self._make('clean') | |
| def _make(self, target): | |
| command = 'make -C {} {}'.format(self.args.NAMES['EBPFDIR'], target) | |
| proc = subprocess.Popen(command, | |
| shell=True, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE, | |
| env=os.environ.copy()) | |
| (rawout, serr) = proc.communicate() | |
| if proc.returncode != 0 and len(serr) > 0: | |
| foutput = serr.decode("utf-8") | |
| else: | |
| foutput = rawout.decode("utf-8") | |
| proc.stdout.close() | |
| proc.stderr.close() | |
| return proc, foutput |