From fadab38da70362b85db2608ecf8d8c718783e477 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Tue, 4 Apr 2023 10:59:42 +0100 Subject: [PATCH] build: add a tool to scan extensions/ for kernel extensions --- .gitignore | 278 +++++++++++++++++++++++++++++++++-------- tools/kexttool/kext.py | 37 ++++++ tools/socks.kexttool | 29 ++++- 3 files changed, 289 insertions(+), 55 deletions(-) create mode 100644 tools/kexttool/kext.py diff --git a/.gitignore b/.gitignore index 17d0ebd..788d0e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -# Created by https://www.toptal.com/developers/gitignore/api/vim,macos,windows,linux,rust,c -# Edit at https://www.toptal.com/developers/gitignore?templates=vim,macos,windows,linux,rust,c +# Created by https://www.toptal.com/developers/gitignore/api/vim,macos,windows,linux,rust,c,python,emacs +# Edit at https://www.toptal.com/developers/gitignore?templates=vim,macos,windows,linux,rust,c,python,emacs ### C ### # Prerequisites @@ -55,8 +55,58 @@ Module.symvers Mkfile.old dkms.conf -### Linux ### +### Emacs ### +# -*- mode: gitignore; -*- *~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# network security +/network-security.data + + +### Linux ### # temporary files which can be created if a process still has a handle open of a deleted file .fuse_hidden* @@ -103,11 +153,180 @@ Temporary Items # iCloud generated files *.icloud +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions + +# Distribution / packaging +.Python +build/ +develop-eggs/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + ### Rust ### # Generated by Cargo # will have compiled files and executables debug/ -target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html @@ -164,57 +383,8 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -### Emacs ### -# -*- mode: gitignore; -*- -*~ -\#*\# -/.emacs.desktop -/.emacs.desktop.lock -*.elc -auto-save-list -tramp -.\#* +# End of https://www.toptal.com/developers/gitignore/api/vim,macos,windows,linux,rust,c,python,emacs -# Org-mode -.org-id-locations -*_archive - -# flymake-mode -*_flymake.* - -# eshell files -/eshell/history -/eshell/lastdir - -# elpa packages -/elpa/ - -# reftex files -*.rel - -# AUCTeX auto folder -/auto/ - -# cask packages -.cask/ -dist/ - -# Flycheck -flycheck_*.el - -# server auth directory -/server/ - -# projectiles files -.projectile - -# directory configuration -.dir-locals.el - -# network security -/network-security.data - -# End of https://www.toptal.com/developers/gitignore/api/vim,macos,windows,linux,rust,c,emacs build .clang-format diff --git a/tools/kexttool/kext.py b/tools/kexttool/kext.py new file mode 100644 index 0000000..7603c1f --- /dev/null +++ b/tools/kexttool/kext.py @@ -0,0 +1,37 @@ +import yaml +import io +import os + +class KextSource: + __kext_info = {} + __src_dir_path = '' + + + def __init__(self, info_file): + self.__src_dir_path = os.path.relpath(os.path.dirname(info_file), os.getcwd()) + with io.open(info_file, 'r', encoding='utf-8') as info_fp: + self.__kext_info = yaml.safe_load(info_fp) + + + def name(self): + return self.__kext_info['name'] + + + def id(self): + return self.__kext_info['id'] + + + def license(self): + return self.__kext_info['license'] + + + def copyright(self): + return self.__kext_info['copyright'] + + + def sources(self): + return self.__kext_info['sources'] + + + def src_dirpath(self): + return self.__src_dir_path diff --git a/tools/socks.kexttool b/tools/socks.kexttool index c7c6e3e..0ee64e5 100755 --- a/tools/socks.kexttool +++ b/tools/socks.kexttool @@ -2,4 +2,31 @@ # vim: ft=python # -*- mode: python -*- -print('hello, world') +import glob +import os +from kexttool import kext + +cwd = os.getcwd() +scan_arg = os.path.join(cwd, 'extensions', '**/extension.info') + +nr_extensions = 0 + +# root_dir needs a trailing slash (i.e. /root/dir/) +for filename in glob.iglob(scan_arg, recursive=True): + try: + kext_src = kext.KextSource(filename) + except Exception as e: + print('E: cannot read kernel extension source manifest (reason: {})'.format(e)) + continue + + print('* {}'.format(kext_src.name())) + print(' Bundle ID: {}'.format(kext_src.id())) + print(' License: {}'.format(kext_src.license())) + print(' Copyright: {}'.format(kext_src.copyright())) + print(' Location: {}'.format(kext_src.src_dirpath())) + print(' Sources:') + + for src in kext_src.sources(): + print(' {}'.format(src)) + + nr_extensions = nr_extensions + 1