compile/remote-compile/lbc/tool/generateUser.py (84 lines of code) (raw):

# -*- coding: utf-8 -*- """ ------------------------------------------------- File Name: generateUser Description : Author : liaozhaoyan date: 2021/7/17 ------------------------------------------------- Change Activity: 2021/7/17: ------------------------------------------------- """ __author__ = 'liaozhaoyan' import re import os import sys import json import hashlib from checkSymbol import ClbcSymbol # from parseArgs import CpaserGdbArgs from parsePahole import CparsePahole from objelf import CobjElf from ffiGen import CffiGen class CgenerateUser(object): def __init__(self, path='./'): self.__path = path self._skel = os.path.join(self.__path, '.output/lbc.skel.h') self._bpfc = os.path.join(self.__path, "bpf/lbc.bpf.c") self._bpfo = os.path.join(self.__path, '.output/lbc.bpf.o') self._ffiDb = os.path.join(self.__path, "lbc.db") self._reMaps = re.compile("struct bpf_map \\*[A-Za-z0-9_]+;") def upSkel(self, skel): self._skel = skel def getSkelMaps(self): rs = [] with open(self._skel) as fSkel: line = fSkel.read() maps = self._reMaps.findall(line) for m in maps: t, v = m.rsplit("*", 1) rs.append(v[:-1]) return rs def createUser(self, ver, arch, env="", oFile='src/bpf_init.c'): s = self.genModelSymbols(ver, arch, env) if not os.path.exists("src"): os.mkdir("src") with open(os.path.join(self.__path, oFile), 'w') as f: f.write(s) def _genFFI(self, ffiList): if os.path.exists(self._ffiDb): os.remove(self._ffiDb) e = CobjElf(self._bpfo) e.toDb("lbc", self._ffiDb) g = CffiGen(self._ffiDb) for ffi in ffiList: g.gen(ffi) return g.out() # os.remove(self._ffiDb) def genModelSymbols(self, ver, arch, env=""): a = CparsePahole(self._bpfo) dOut = {} dMaps = {} with open(self._bpfc, 'r') as f: sym = ClbcSymbol() s = f.read() s += env dOut['hash'] = hashlib.sha256(s.encode()).hexdigest() ffiList = [] ds = sym.findEvent(s) for k, v in ds.items(): dMaps[k] = {'type': v['type'], "fktype": "", 'ktype': None, "fvtype": v['vtype'], "vtype": a.parseType(v['vtype'])} if v['vtype'] not in ffiList: ffiList.append(v['vtype']) hs = sym.findMaps(s) for k, v in hs.items(): dMaps[k] = {'type': v['type'], "fktype": v['ktype'], 'ktype': a.parseType(v['ktype']), "fvtype": v['vtype'], "vtype": a.parseType(v['vtype'])} if v['ktype'] not in ffiList: ffiList.append(v['ktype']) if v['vtype'] not in ffiList: ffiList.append(v['vtype']) dOut['maps'] = dMaps dOut['arch'] = arch dOut['kern_version'] = ver dOut["ffi"] = self._genFFI(ffiList) print(dOut['ffi']) s = json.dumps(dOut) return """ #include "lbc_static.h" const char* lbc_get_map_types(void) { const char* s = %s; return s; } """ % (json.dumps(s)) if __name__ == "__main__": g = CgenerateUser() if len(sys.argv) <= 3: g.createUser(sys.argv[1], sys.argv[2]) else: g.createUser(sys.argv[1], sys.argv[2], sys.argv[3])