aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorGravatar Mark <[email protected]>2021-02-04 17:25:57 -0800
committerGravatar GitHub <[email protected]>2021-02-04 17:25:57 -0800
commitcf87b9b3cbc385ac0ae084cd73be3c218a125938 (patch)
tree3fa5ca111bc9129125883fa4c426d69512d119ef /scripts
parentMerge PR #88 - use protobuf to parse config (diff)
parentCI: use Docker Compose to run the container (diff)
Merge PR #92 - replace shell scripts with Python scripts
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/dev.sh65
-rwxr-xr-xscripts/protoc.py62
-rwxr-xr-xscripts/protoc.sh14
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"