1#!/usr/bin/env python3
2__package__ = 'configurator.pyodide'
3
4from .pyodide import convert_result, nuc11_board, nuc11_scenario
5
6import re
7from lxml import etree
8from defusedxml.lxml import fromstring
9
10
11class GenerateSchema:
12
13    def __init__(self, board, scenario):
14        parser = etree.XMLParser(remove_blank_text=True)
15        self.board_etree = fromstring(board, parser)
16        self.scenario = scenario
17
18    @property
19    def pcis(self):
20        line = self.board_etree.xpath('/acrn-config/PCI_DEVICE/text()')[0]
21        cnt = []
22        for line in line.replace('\t', '').split('\n'):
23            re_cpi = re.compile(r'^([0-9A-Fa-f]{1,2}:[0-1][0-9A-Fa-f]\.[0-7].*)\(')
24            ret_ = re_cpi.search(line)
25            if ret_:
26                ret = ret_.group(1).strip()
27                if re.search(r'^00:00.0', ret):  # omit 00:00.0
28                    continue
29                cnt.append(ret)
30        return cnt
31
32    @property
33    def schemas(self):
34        return self.scenario
35
36    def update(self):
37        return sorted(list(set(self.pcis) - set(self.schemas)))
38
39
40def updateSchema(board, scenario):
41    return convert_result(GenerateSchema(board, scenario).update())
42
43
44main = updateSchema
45
46
47def test():
48    main(nuc11_board, nuc11_scenario)
49
50
51if __name__ == '__main__':
52    test()
53