diff options
author | 2021-02-04 17:25:57 -0800 | |
---|---|---|
committer | 2021-02-04 17:25:57 -0800 | |
commit | cf87b9b3cbc385ac0ae084cd73be3c218a125938 (patch) | |
tree | 3fa5ca111bc9129125883fa4c426d69512d119ef /scripts | |
parent | Merge PR #88 - use protobuf to parse config (diff) | |
parent | CI: use Docker Compose to run the container (diff) |
Merge PR #92 - replace shell scripts with Python scripts
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/dev.sh | 65 | ||||
-rwxr-xr-x | scripts/protoc.py | 62 | ||||
-rwxr-xr-x | scripts/protoc.sh | 14 |
3 files changed, 62 insertions, 79 deletions
diff --git a/scripts/dev.sh b/scripts/dev.sh deleted file mode 100755 index efbd93a..0000000 --- a/scripts/dev.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env sh - -# Sets up a development environment and runs a shell in a docker container. -# Usage: dev.sh [--build [--clean]] [bash_args ...] - -if [ "$1" = "--build" ]; then - shift - printf "Building ghcr.io/python-discord/snekbox-venv:dev..." - - docker build \ - -t ghcr.io/python-discord/snekbox-venv:dev \ - -f Dockerfile \ - --build-arg DEV=1 \ - --target venv \ - -q \ - . \ - >/dev/null \ - && printf " done!\n" || exit "$?" - - if [ "$1" = "--clean" ]; then - shift - dangling_imgs=$(docker images -f "dangling=true" -q) - - if [ -n "${dangling_imgs}" ]; then - printf "Removing dangling images..." - - # shellcheck disable=SC2086 - docker rmi $dangling_imgs >/dev/null \ - && printf " done!\n" || exit "$?" - fi - fi -fi - -# Keep the container up in the background so it doesn't have to be restarted -# for the ownership fix. -# The volume is mounted to same the path in the container as the source -# directory on the host to ensure coverage can find the source files. -docker run \ - --tty \ - --detach \ - --name snekbox_test \ - --privileged \ - --hostname pdsnk-dev \ - --ipc="none" \ - -e PYTHONDONTWRITEBYTECODE=1 \ - -e PIPENV_PIPFILE="/snekbox/Pipfile" \ - --volume "${PWD}":"${PWD}" \ - --workdir "${PWD}"\ - --entrypoint /bin/bash \ - ghcr.io/python-discord/snekbox-venv:dev \ - >/dev/null \ - -# Execute the given command(s) -docker exec -it snekbox_test /bin/bash "$@" - -# Fix ownership of coverage file -# BusyBox doesn't support --reference for chown -docker exec \ - -it \ - -e CWD="${PWD}" \ - snekbox_test \ - /bin/bash \ - -c 'chown "$(stat -c "%u:%g" "${CWD}")" "${CWD}/.coverage"' - -docker rm -f snekbox_test >/dev/null # Stop and remove the container diff --git a/scripts/protoc.py b/scripts/protoc.py new file mode 100755 index 0000000..09429d3 --- /dev/null +++ b/scripts/protoc.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import shutil +import subprocess +import sys +from argparse import ArgumentParser +from pathlib import Path +from tempfile import TemporaryDirectory +from urllib.request import urlopen + +SRC_DIR = Path("snekbox").resolve(strict=True) +FILE_NAME = "config" + + +def compile_proto(path: Path) -> None: + """Compile a protobuf file at `path` into Python code.""" + protoc_bin = shutil.which("protoc") + if not protoc_bin: + print("protoc binary could not be found on PATH", file=sys.stderr) + sys.exit(1) + + args = [protoc_bin, f"--proto_path={path.parent}", f"--python_out={SRC_DIR}", path] + result = subprocess.run(args) + + if result.returncode != 0: + sys.exit(result.returncode) + + +def get_version() -> str: + """Get the NsJail version from the command line arguments.""" + parser = ArgumentParser(description="Compile an NsJail config protobuf into Python.") + parser.add_argument("version", help="the NsJail version from which to get the protobuf file") + args = parser.parse_args() + + return args.version + + +def main() -> None: + """Get a config.proto for NsJail and compile it into Python.""" + version = get_version() + url = f"https://raw.githubusercontent.com/google/nsjail/{version}/config.proto" + + with urlopen(url) as response: + if response.status >= 400: + print(f"Failed to retrieve config.proto: status {response.status}", file=sys.stderr) + sys.exit(1) + + with TemporaryDirectory() as dir_name: + file_path = Path(dir_name) / f"{FILE_NAME}.proto" + with open(file_path, "wb") as file: + file.write(response.read()) + compile_proto(file_path) + + # Remove the _pb suffix from the generated Python file. + if generated_py := next(SRC_DIR.glob(f"{FILE_NAME}_pb*.py"), None): + generated_py.rename(generated_py.with_stem(FILE_NAME)) + else: + print(f"Could not find the generated Python file in {SRC_DIR}.", file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/scripts/protoc.sh b/scripts/protoc.sh deleted file mode 100755 index 5771b95..0000000 --- a/scripts/protoc.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env sh - -set -eu - -URL='https://raw.githubusercontent.com/google/nsjail/2.9/config.proto' -SRC_DIR='snekbox' -FILE_NAME='config' -PROTO_PATH="${SRC_DIR}/${FILE_NAME}.proto" - -curl -SsL "${URL}" -o "${PROTO_PATH}" -protoc --proto_path="${SRC_DIR}" --python_out="${SRC_DIR}" "${PROTO_PATH}" - -rm -f "${PROTO_PATH}" -mv -f "${SRC_DIR}/${FILE_NAME}_pb"*.py "${SRC_DIR}/${FILE_NAME}.py" |