aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/lint-test-build-push.yaml26
-rw-r--r--Dockerfile12
-rw-r--r--Pipfile3
-rw-r--r--config/snekbox.cfg1
-rw-r--r--snekbox/config_pb2.py1017
-rw-r--r--snekbox/nsjail.py83
-rw-r--r--snekbox/utils/__init__.py3
-rw-r--r--snekbox/utils/cgroup.py102
-rw-r--r--snekbox/utils/swap.py62
-rw-r--r--tests/api/__init__.py3
-rw-r--r--tests/gunicorn_utils.py80
-rw-r--r--tests/test_integration.py43
-rw-r--r--tests/test_nsjail.py3
13 files changed, 378 insertions, 1060 deletions
diff --git a/.github/workflows/lint-test-build-push.yaml b/.github/workflows/lint-test-build-push.yaml
index 87fc5d5..020b2a5 100644
--- a/.github/workflows/lint-test-build-push.yaml
+++ b/.github/workflows/lint-test-build-push.yaml
@@ -9,7 +9,16 @@ on:
jobs:
lint-test-build-push:
- runs-on: ubuntu-latest
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-20.04, self-hosted]
+ include:
+ - os: ubuntu-20.04
+ full: true
+ - os: self-hosted
+ full: false # Only run tests.
+
env:
# Determine whether or not we should build the
# final production image and push it to GHCR.
@@ -88,6 +97,7 @@ jobs:
# Required by pre-commit.
- name: Install git
+ if: matrix.full
run: >-
docker exec snekbox_dev /bin/bash -c
'apt-get -y update && apt-get install -y git=1:2.20.*'
@@ -96,12 +106,13 @@ jobs:
# Skip the flake8 hook because the following step will run it.
- name: Run pre-commit hooks
id: run-pre-commit-hooks
+ if: matrix.full
run: >-
docker exec snekbox_dev /bin/bash -c
'PIP_USER=0 SKIP=flake8 pre-commit run --all-files'
- name: Show pre-commit logs
- if: always() && steps.run-pre-commit-hooks.outcome != 'success'
+ if: matrix.full && always() && steps.run-pre-commit-hooks.outcome != 'success'
run: >-
docker exec snekbox_dev /bin/bash -c
'cat /root/.cache/pre-commit/pre-commit.log'
@@ -112,6 +123,7 @@ jobs:
# up on this output to generate nice annotations to indicate what went
# wrong where.
- name: Run linter
+ if: matrix.full
run: >-
docker exec snekbox_dev /bin/bash -c
'flake8 --format
@@ -136,7 +148,7 @@ jobs:
# Note: This step runs even if the test step failed to make
# sure we process the coverage reports.
- name: Setup python
- if: always() && steps.run_tests.outputs.started == 'true'
+ if: matrix.os != 'self-hosted' && always() && steps.run_tests.outputs.started == 'true'
id: python
uses: actions/setup-python@v2
with:
@@ -166,7 +178,7 @@ jobs:
# both with the short commit SHA and 'latest'. This step should use
# the local build cache of the current run.
- name: Build final image
- if: env.production_build == 'true'
+ if: matrix.full && env.production_build == 'true'
uses: docker/build-push-action@v2
with:
context: .
@@ -185,7 +197,7 @@ jobs:
# Deploy to Kubernetes
- name: Authenticate with Kubernetes
- if: env.production_build == 'true'
+ if: matrix.full && env.production_build == 'true'
uses: azure/k8s-set-context@v1
with:
method: kubeconfig
@@ -202,7 +214,7 @@ jobs:
# Push the base image to GHCR, with an inline cache manifest
- name: Push base image
- if: env.production_build == 'true'
+ if: matrix.full && env.production_build == 'true'
uses: docker/build-push-action@v2
with:
context: .
@@ -216,7 +228,7 @@ jobs:
# Push the venv image to GHCR, with an inline cache manifest
- name: Push venv image
- if: env.production_build == 'true'
+ if: matrix.full && env.production_build == 'true'
uses: docker/build-push-action@v2
with:
context: .
diff --git a/Dockerfile b/Dockerfile
index b56d25a..b0d2702 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,7 @@
FROM python:3.10-slim-buster as builder
+
+WORKDIR /nsjail
+
RUN apt-get -y update \
&& apt-get install -y \
bison=2:3.3.* \
@@ -11,12 +14,8 @@ RUN apt-get -y update \
make=4.2.* \
pkg-config=0.29-6 \
protobuf-compiler=3.6.*
-RUN git clone \
- -b '2.9' \
- --single-branch \
- --depth 1 \
- https://github.com/google/nsjail.git /nsjail
-WORKDIR /nsjail
+RUN git clone -b master --single-branch https://github.com/google/nsjail.git . \
+ && git checkout dccf911fd2659e7b08ce9507c25b2b38ec2c5800
RUN make
# ------------------------------------------------------------------------------
@@ -25,6 +24,7 @@ FROM python:3.10-slim-buster as base
# Everything will be a user install to allow snekbox's dependencies to be kept
# separate from the packages exposed during eval.
ENV PATH=/root/.local/bin:$PATH \
+ PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=false \
PIP_USER=1 \
PIPENV_DONT_USE_PYENV=1 \
diff --git a/Pipfile b/Pipfile
index e814d6b..c630530 100644
--- a/Pipfile
+++ b/Pipfile
@@ -40,9 +40,10 @@ precommit = "pre-commit install"
# Testing
report = "coverage report"
# Fix ownership of the coverage file even if tests fail & preserve exit code
+# Install numpy because a test checks if it's importable
test = """
docker-compose run --entrypoint /bin/bash --rm snekbox -c \
- 'coverage run -m unittest; e=$?; chown --reference=. .coverage; exit $e'
+ 'env PYTHONUSERBASE=/snekbox/user_base pip install numpy && coverage run -m unittest; e=$?; chown --reference=. .coverage; exit $e'
"""
# Docker
diff --git a/config/snekbox.cfg b/config/snekbox.cfg
index 3a4cc67..a1caf68 100644
--- a/config/snekbox.cfg
+++ b/config/snekbox.cfg
@@ -105,6 +105,7 @@ mount {
}
cgroup_mem_max: 52428800
+cgroup_mem_swap_max: 0
cgroup_mem_mount: "/sys/fs/cgroup/memory"
cgroup_pids_max: 5
diff --git a/snekbox/config_pb2.py b/snekbox/config_pb2.py
index 35d6a8f..bd4e112 100644
--- a/snekbox/config_pb2.py
+++ b/snekbox/config_pb2.py
@@ -1,14 +1,13 @@
+# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: config.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
@@ -16,109 +15,13 @@ _sym_db = _symbol_database.Default()
-DESCRIPTOR = _descriptor.FileDescriptor(
- name='config.proto',
- package='nsjail',
- serialized_pb=_b('\n\x0c\x63onfig.proto\x12\x06nsjail\"a\n\x05IdMap\x12\x13\n\tinside_id\x18\x01 \x01(\t:\x00\x12\x14\n\noutside_id\x18\x02 \x01(\t:\x00\x12\x10\n\x05\x63ount\x18\x03 \x01(\r:\x01\x31\x12\x1b\n\x0cuse_newidmap\x18\x04 \x01(\x08:\x05\x66\x61lse\"\xca\x02\n\x07MountPt\x12\r\n\x03src\x18\x01 \x01(\t:\x00\x12\x18\n\x0eprefix_src_env\x18\x02 \x01(\t:\x00\x12\x15\n\x0bsrc_content\x18\x03 \x01(\x0c:\x00\x12\r\n\x03\x64st\x18\x04 \x02(\t:\x00\x12\x18\n\x0eprefix_dst_env\x18\x05 \x01(\t:\x00\x12\x10\n\x06\x66stype\x18\x06 \x01(\t:\x00\x12\x11\n\x07options\x18\x07 \x01(\t:\x00\x12\x16\n\x07is_bind\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\x11\n\x02rw\x18\t \x01(\x08:\x05\x66\x61lse\x12\x0e\n\x06is_dir\x18\n \x01(\x08\x12\x17\n\tmandatory\x18\x0b \x01(\x08:\x04true\x12\x19\n\nis_symlink\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06nosuid\x18\r \x01(\x08:\x05\x66\x61lse\x12\x14\n\x05nodev\x18\x0e \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06noexec\x18\x0f \x01(\x08:\x05\x66\x61lse\"F\n\x03\x45xe\x12\x0c\n\x04path\x18\x01 \x02(\t\x12\x0b\n\x03\x61rg\x18\x02 \x03(\t\x12\x0c\n\x04\x61rg0\x18\x03 \x01(\t\x12\x16\n\x07\x65xec_fd\x18\x04 \x01(\x08:\x05\x66\x61lse\"\x81\x14\n\x0cNsJailConfig\x12\x0e\n\x04name\x18\x01 \x01(\t:\x00\x12\x13\n\x0b\x64\x65scription\x18\x02 \x03(\t\x12 \n\x04mode\x18\x03 \x01(\x0e\x32\x0c.nsjail.Mode:\x04ONCE\x12\x16\n\nchroot_dir\x18\x04 \x01(\tB\x02\x18\x01\x12\x1d\n\nis_root_rw\x18\x05 \x01(\x08:\x05\x66\x61lseB\x02\x18\x01\x12\x18\n\x08hostname\x18\x08 \x01(\t:\x06NSJAIL\x12\x0e\n\x03\x63wd\x18\t \x01(\t:\x01/\x12\x0f\n\x04port\x18\n \x01(\r:\x01\x30\x12\x14\n\x08\x62indhost\x18\x0b \x01(\t:\x02::\x12\x1b\n\x10max_conns_per_ip\x18\x0c \x01(\r:\x01\x30\x12\x17\n\ntime_limit\x18\r \x01(\r:\x03\x36\x30\x30\x12\x15\n\x06\x64\x61\x65mon\x18\x0e \x01(\x08:\x05\x66\x61lse\x12\x13\n\x08max_cpus\x18\x0f \x01(\r:\x01\x30\x12\x0e\n\x06log_fd\x18\x10 \x01(\x05\x12\x10\n\x08log_file\x18\x11 \x01(\t\x12#\n\tlog_level\x18\x12 \x01(\x0e\x32\x10.nsjail.LogLevel\x12\x17\n\x08keep_env\x18\x13 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05\x65nvar\x18\x14 \x03(\t\x12\x18\n\tkeep_caps\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x0b\n\x03\x63\x61p\x18\x16 \x03(\t\x12\x15\n\x06silent\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bskip_setsid\x18\x18 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0estderr_to_null\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07pass_fd\x18\x1a \x03(\x05\x12#\n\x14\x64isable_no_new_privs\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x17\n\trlimit_as\x18\x1c \x01(\x04:\x04\x34\x30\x39\x36\x12-\n\x0erlimit_as_type\x18\x1d \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x16\n\x0brlimit_core\x18\x1e \x01(\x04:\x01\x30\x12/\n\x10rlimit_core_type\x18\x1f \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x17\n\nrlimit_cpu\x18 \x01(\x04:\x03\x36\x30\x30\x12.\n\x0frlimit_cpu_type\x18! \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x17\n\x0crlimit_fsize\x18\" \x01(\x04:\x01\x31\x12\x30\n\x11rlimit_fsize_type\x18# \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x19\n\rrlimit_nofile\x18$ \x01(\x04:\x02\x33\x32\x12\x31\n\x12rlimit_nofile_type\x18% \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x1a\n\x0crlimit_nproc\x18& \x01(\x04:\x04\x31\x30\x32\x34\x12/\n\x11rlimit_nproc_type\x18\' \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x1d\n\x0crlimit_stack\x18( \x01(\x04:\x07\x31\x30\x34\x38\x35\x37\x36\x12/\n\x11rlimit_stack_type\x18) \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x19\n\ndisable_rl\x18T \x01(\x08:\x05\x66\x61lse\x12)\n\x1apersona_addr_compat_layout\x18* \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_mmap_page_zero\x18+ \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_read_implies_exec\x18, \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_addr_limit_3gb\x18- \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_addr_no_randomize\x18. \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0c\x63lone_newnet\x18/ \x01(\x08:\x04true\x12\x1b\n\rclone_newuser\x18\x30 \x01(\x08:\x04true\x12\x19\n\x0b\x63lone_newns\x18\x31 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newpid\x18\x32 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newipc\x18\x33 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newuts\x18\x34 \x01(\x08:\x04true\x12\x1d\n\x0f\x63lone_newcgroup\x18\x35 \x01(\x08:\x04true\x12\x1d\n\x06uidmap\x18\x36 \x03(\x0b\x32\r.nsjail.IdMap\x12\x1d\n\x06gidmap\x18\x37 \x03(\x0b\x32\r.nsjail.IdMap\x12\x19\n\nmount_proc\x18\x38 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x05mount\x18\x39 \x03(\x0b\x32\x0f.nsjail.MountPt\x12\x1b\n\x13seccomp_policy_file\x18: \x01(\t\x12\x16\n\x0eseccomp_string\x18; \x03(\t\x12\x1a\n\x0bseccomp_log\x18< \x01(\x08:\x05\x66\x61lse\x12\x19\n\x0e\x63group_mem_max\x18= \x01(\x04:\x01\x30\x12/\n\x10\x63group_mem_mount\x18> \x01(\t:\x15/sys/fs/cgroup/memory\x12!\n\x11\x63group_mem_parent\x18? \x01(\t:\x06NSJAIL\x12\x1a\n\x0f\x63group_pids_max\x18@ \x01(\x04:\x01\x30\x12.\n\x11\x63group_pids_mount\x18\x41 \x01(\t:\x13/sys/fs/cgroup/pids\x12\"\n\x12\x63group_pids_parent\x18\x42 \x01(\t:\x06NSJAIL\x12!\n\x16\x63group_net_cls_classid\x18\x43 \x01(\r:\x01\x30\x12\x34\n\x14\x63group_net_cls_mount\x18\x44 \x01(\t:\x16/sys/fs/cgroup/net_cls\x12%\n\x15\x63group_net_cls_parent\x18\x45 \x01(\t:\x06NSJAIL\x12 \n\x15\x63group_cpu_ms_per_sec\x18\x46 \x01(\r:\x01\x30\x12,\n\x10\x63group_cpu_mount\x18G \x01(\t:\x12/sys/fs/cgroup/cpu\x12!\n\x11\x63group_cpu_parent\x18H \x01(\t:\x06NSJAIL\x12\x1a\n\x0biface_no_lo\x18I \x01(\x08:\x05\x66\x61lse\x12\x11\n\tiface_own\x18J \x03(\t\x12\x15\n\rmacvlan_iface\x18K \x01(\t\x12\"\n\rmacvlan_vs_ip\x18L \x01(\t:\x0b\x31\x39\x32.168.0.2\x12$\n\rmacvlan_vs_nm\x18M \x01(\t:\r255.255.255.0\x12\"\n\rmacvlan_vs_gw\x18N \x01(\t:\x0b\x31\x39\x32.168.0.1\x12\x17\n\rmacvlan_vs_ma\x18O \x01(\t:\x00\x12\x16\n\nnice_level\x18P \x01(\x05:\x02\x31\x39\x12\x1d\n\x08\x65xec_bin\x18Q \x01(\x0b\x32\x0b.nsjail.Exe\x12&\n\x0e\x63groupv2_mount\x18R \x01(\t:\x0e/sys/fs/cgroup\x12\x1b\n\x0cuse_cgroupv2\x18S \x01(\x08:\x05\x66\x61lse*3\n\x04Mode\x12\n\n\x06LISTEN\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\t\n\x05RERUN\x10\x02\x12\n\n\x06\x45XECVE\x10\x03*B\n\x08LogLevel\x12\t\n\x05\x44\x45\x42UG\x10\x00\x12\x08\n\x04INFO\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\t\n\x05\x45RROR\x10\x03\x12\t\n\x05\x46\x41TAL\x10\x04*0\n\x06RLimit\x12\t\n\x05VALUE\x10\x00\x12\x08\n\x04SOFT\x10\x01\x12\x08\n\x04HARD\x10\x02\x12\x07\n\x03INF\x10\x03')
-)
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-_MODE = _descriptor.EnumDescriptor(
- name='Mode',
- full_name='nsjail.Mode',
- filename=None,
- file=DESCRIPTOR,
- values=[
- _descriptor.EnumValueDescriptor(
- name='LISTEN', index=0, number=0,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='ONCE', index=1, number=1,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='RERUN', index=2, number=2,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='EXECVE', index=3, number=3,
- options=None,
- type=None),
- ],
- containing_type=None,
- options=None,
- serialized_start=3092,
- serialized_end=3143,
-)
-_sym_db.RegisterEnumDescriptor(_MODE)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x63onfig.proto\x12\x06nsjail\"a\n\x05IdMap\x12\x13\n\tinside_id\x18\x01 \x01(\t:\x00\x12\x14\n\noutside_id\x18\x02 \x01(\t:\x00\x12\x10\n\x05\x63ount\x18\x03 \x01(\r:\x01\x31\x12\x1b\n\x0cuse_newidmap\x18\x04 \x01(\x08:\x05\x66\x61lse\"\xca\x02\n\x07MountPt\x12\r\n\x03src\x18\x01 \x01(\t:\x00\x12\x18\n\x0eprefix_src_env\x18\x02 \x01(\t:\x00\x12\x15\n\x0bsrc_content\x18\x03 \x01(\x0c:\x00\x12\r\n\x03\x64st\x18\x04 \x02(\t:\x00\x12\x18\n\x0eprefix_dst_env\x18\x05 \x01(\t:\x00\x12\x10\n\x06\x66stype\x18\x06 \x01(\t:\x00\x12\x11\n\x07options\x18\x07 \x01(\t:\x00\x12\x16\n\x07is_bind\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\x11\n\x02rw\x18\t \x01(\x08:\x05\x66\x61lse\x12\x0e\n\x06is_dir\x18\n \x01(\x08\x12\x17\n\tmandatory\x18\x0b \x01(\x08:\x04true\x12\x19\n\nis_symlink\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06nosuid\x18\r \x01(\x08:\x05\x66\x61lse\x12\x14\n\x05nodev\x18\x0e \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06noexec\x18\x0f \x01(\x08:\x05\x66\x61lse\"F\n\x03\x45xe\x12\x0c\n\x04path\x18\x01 \x02(\t\x12\x0b\n\x03\x61rg\x18\x02 \x03(\t\x12\x0c\n\x04\x61rg0\x18\x03 \x01(\t\x12\x16\n\x07\x65xec_fd\x18\x04 \x01(\x08:\x05\x66\x61lse\"\xe5\x16\n\x0cNsJailConfig\x12\x0e\n\x04name\x18\x01 \x01(\t:\x00\x12\x13\n\x0b\x64\x65scription\x18\x02 \x03(\t\x12 \n\x04mode\x18\x03 \x01(\x0e\x32\x0c.nsjail.Mode:\x04ONCE\x12\x18\n\x08hostname\x18\x04 \x01(\t:\x06NSJAIL\x12\x0e\n\x03\x63wd\x18\x05 \x01(\t:\x01/\x12\x1b\n\x0cno_pivotroot\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x04port\x18\x07 \x01(\r:\x01\x30\x12\x14\n\x08\x62indhost\x18\x08 \x01(\t:\x02::\x12\x14\n\tmax_conns\x18\t \x01(\r:\x01\x30\x12\x1b\n\x10max_conns_per_ip\x18\n \x01(\r:\x01\x30\x12\x17\n\ntime_limit\x18\x0b \x01(\r:\x03\x36\x30\x30\x12\x15\n\x06\x64\x61\x65mon\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x13\n\x08max_cpus\x18\r \x01(\r:\x01\x30\x12\x0e\n\x06log_fd\x18\x0e \x01(\x05\x12\x10\n\x08log_file\x18\x0f \x01(\t\x12#\n\tlog_level\x18\x10 \x01(\x0e\x32\x10.nsjail.LogLevel\x12\x17\n\x08keep_env\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05\x65nvar\x18\x12 \x03(\t\x12\x18\n\tkeep_caps\x18\x13 \x01(\x08:\x05\x66\x61lse\x12\x0b\n\x03\x63\x61p\x18\x14 \x03(\t\x12\x15\n\x06silent\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bskip_setsid\x18\x16 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0estderr_to_null\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07pass_fd\x18\x18 \x03(\x05\x12#\n\x14\x64isable_no_new_privs\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x17\n\trlimit_as\x18\x1a \x01(\x04:\x04\x34\x30\x39\x36\x12-\n\x0erlimit_as_type\x18\x1b \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x16\n\x0brlimit_core\x18\x1c \x01(\x04:\x01\x30\x12/\n\x10rlimit_core_type\x18\x1d \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x17\n\nrlimit_cpu\x18\x1e \x01(\x04:\x03\x36\x30\x30\x12.\n\x0frlimit_cpu_type\x18\x1f \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x17\n\x0crlimit_fsize\x18 \x01(\x04:\x01\x31\x12\x30\n\x11rlimit_fsize_type\x18! \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x19\n\rrlimit_nofile\x18\" \x01(\x04:\x02\x33\x32\x12\x31\n\x12rlimit_nofile_type\x18# \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x1a\n\x0crlimit_nproc\x18$ \x01(\x04:\x04\x31\x30\x32\x34\x12/\n\x11rlimit_nproc_type\x18% \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x17\n\x0crlimit_stack\x18& \x01(\x04:\x01\x38\x12/\n\x11rlimit_stack_type\x18\' \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x1a\n\x0erlimit_memlock\x18( \x01(\x04:\x02\x36\x34\x12\x31\n\x13rlimit_memlock_type\x18) \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x18\n\rrlimit_rtprio\x18* \x01(\x04:\x01\x30\x12\x30\n\x12rlimit_rtprio_type\x18+ \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x1d\n\x0frlimit_msgqueue\x18, \x01(\x04:\x04\x31\x30\x32\x34\x12\x32\n\x14rlimit_msgqueue_type\x18- \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x19\n\ndisable_rl\x18. \x01(\x08:\x05\x66\x61lse\x12)\n\x1apersona_addr_compat_layout\x18/ \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_mmap_page_zero\x18\x30 \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_read_implies_exec\x18\x31 \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_addr_limit_3gb\x18\x32 \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_addr_no_randomize\x18\x33 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0c\x63lone_newnet\x18\x34 \x01(\x08:\x04true\x12\x1b\n\rclone_newuser\x18\x35 \x01(\x08:\x04true\x12\x19\n\x0b\x63lone_newns\x18\x36 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newpid\x18\x37 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newipc\x18\x38 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newuts\x18\x39 \x01(\x08:\x04true\x12\x1d\n\x0f\x63lone_newcgroup\x18: \x01(\x08:\x04true\x12\x1c\n\rclone_newtime\x18; \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x06uidmap\x18< \x03(\x0b\x32\r.nsjail.IdMap\x12\x1d\n\x06gidmap\x18= \x03(\x0b\x32\r.nsjail.IdMap\x12\x19\n\nmount_proc\x18> \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x05mount\x18? \x03(\x0b\x32\x0f.nsjail.MountPt\x12\x1b\n\x13seccomp_policy_file\x18@ \x01(\t\x12\x16\n\x0eseccomp_string\x18\x41 \x03(\t\x12\x1a\n\x0bseccomp_log\x18\x42 \x01(\x08:\x05\x66\x61lse\x12\x19\n\x0e\x63group_mem_max\x18\x43 \x01(\x04:\x01\x30\x12\x1f\n\x14\x63group_mem_memsw_max\x18[ \x01(\x04:\x01\x30\x12\x1f\n\x13\x63group_mem_swap_max\x18\\ \x01(\x03:\x02-1\x12/\n\x10\x63group_mem_mount\x18\x44 \x01(\t:\x15/sys/fs/cgroup/memory\x12!\n\x11\x63group_mem_parent\x18\x45 \x01(\t:\x06NSJAIL\x12\x1a\n\x0f\x63group_pids_max\x18\x46 \x01(\x04:\x01\x30\x12.\n\x11\x63group_pids_mount\x18G \x01(\t:\x13/sys/fs/cgroup/pids\x12\"\n\x12\x63group_pids_parent\x18H \x01(\t:\x06NSJAIL\x12!\n\x16\x63group_net_cls_classid\x18I \x01(\r:\x01\x30\x12\x34\n\x14\x63group_net_cls_mount\x18J \x01(\t:\x16/sys/fs/cgroup/net_cls\x12%\n\x15\x63group_net_cls_parent\x18K \x01(\t:\x06NSJAIL\x12 \n\x15\x63group_cpu_ms_per_sec\x18L \x01(\r:\x01\x30\x12,\n\x10\x63group_cpu_mount\x18M \x01(\t:\x12/sys/fs/cgroup/cpu\x12!\n\x11\x63group_cpu_parent\x18N \x01(\t:\x06NSJAIL\x12&\n\x0e\x63groupv2_mount\x18O \x01(\t:\x0e/sys/fs/cgroup\x12\x1b\n\x0cuse_cgroupv2\x18P \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0biface_no_lo\x18Q \x01(\x08:\x05\x66\x61lse\x12\x11\n\tiface_own\x18R \x03(\t\x12\x15\n\rmacvlan_iface\x18S \x01(\t\x12\"\n\rmacvlan_vs_ip\x18T \x01(\t:\x0b\x31\x39\x32.168.0.2\x12$\n\rmacvlan_vs_nm\x18U \x01(\t:\r255.255.255.0\x12\"\n\rmacvlan_vs_gw\x18V \x01(\t:\x0b\x31\x39\x32.168.0.1\x12\x17\n\rmacvlan_vs_ma\x18W \x01(\t:\x00\x12\x1e\n\rmacvlan_vs_mo\x18X \x01(\t:\x07private\x12\x16\n\nnice_level\x18Y \x01(\x05:\x02\x31\x39\x12\x1d\n\x08\x65xec_bin\x18Z \x01(\x0b\x32\x0b.nsjail.Exe*3\n\x04Mode\x12\n\n\x06LISTEN\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\t\n\x05RERUN\x10\x02\x12\n\n\x06\x45XECVE\x10\x03*B\n\x08LogLevel\x12\t\n\x05\x44\x45\x42UG\x10\x00\x12\x08\n\x04INFO\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\t\n\x05\x45RROR\x10\x03\x12\t\n\x05\x46\x41TAL\x10\x04*0\n\x06RLimit\x12\t\n\x05VALUE\x10\x00\x12\x08\n\x04SOFT\x10\x01\x12\x08\n\x04HARD\x10\x02\x12\x07\n\x03INF\x10\x03')
+_MODE = DESCRIPTOR.enum_types_by_name['Mode']
Mode = enum_type_wrapper.EnumTypeWrapper(_MODE)
-_LOGLEVEL = _descriptor.EnumDescriptor(
- name='LogLevel',
- full_name='nsjail.LogLevel',
- filename=None,
- file=DESCRIPTOR,
- values=[
- _descriptor.EnumValueDescriptor(
- name='DEBUG', index=0, number=0,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='INFO', index=1, number=1,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='WARNING', index=2, number=2,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='ERROR', index=3, number=3,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='FATAL', index=4, number=4,
- options=None,
- type=None),
- ],
- containing_type=None,
- options=None,
- serialized_start=3145,
- serialized_end=3211,
-)
-_sym_db.RegisterEnumDescriptor(_LOGLEVEL)
-
+_LOGLEVEL = DESCRIPTOR.enum_types_by_name['LogLevel']
LogLevel = enum_type_wrapper.EnumTypeWrapper(_LOGLEVEL)
-_RLIMIT = _descriptor.EnumDescriptor(
- name='RLimit',
- full_name='nsjail.RLimit',
- filename=None,
- file=DESCRIPTOR,
- values=[
- _descriptor.EnumValueDescriptor(
- name='VALUE', index=0, number=0,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='SOFT', index=1, number=1,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='HARD', index=2, number=2,
- options=None,
- type=None),
- _descriptor.EnumValueDescriptor(
- name='INF', index=3, number=3,
- options=None,
- type=None),
- ],
- containing_type=None,
- options=None,
- serialized_start=3213,
- serialized_end=3261,
-)
-_sym_db.RegisterEnumDescriptor(_RLIMIT)
-
+_RLIMIT = DESCRIPTOR.enum_types_by_name['RLimit']
RLimit = enum_type_wrapper.EnumTypeWrapper(_RLIMIT)
LISTEN = 0
ONCE = 1
@@ -135,885 +38,53 @@ HARD = 2
INF = 3
-
-_IDMAP = _descriptor.Descriptor(
- name='IdMap',
- full_name='nsjail.IdMap',
- filename=None,
- file=DESCRIPTOR,
- containing_type=None,
- fields=[
- _descriptor.FieldDescriptor(
- name='inside_id', full_name='nsjail.IdMap.inside_id', index=0,
- number=1, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='outside_id', full_name='nsjail.IdMap.outside_id', index=1,
- number=2, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='count', full_name='nsjail.IdMap.count', index=2,
- number=3, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=1,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='use_newidmap', full_name='nsjail.IdMap.use_newidmap', index=3,
- number=4, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- ],
- extensions=[
- ],
- nested_types=[],
- enum_types=[
- ],
- options=None,
- is_extendable=False,
- extension_ranges=[],
- oneofs=[
- ],
- serialized_start=24,
- serialized_end=121,
-)
-
-
-_MOUNTPT = _descriptor.Descriptor(
- name='MountPt',
- full_name='nsjail.MountPt',
- filename=None,
- file=DESCRIPTOR,
- containing_type=None,
- fields=[
- _descriptor.FieldDescriptor(
- name='src', full_name='nsjail.MountPt.src', index=0,
- number=1, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='prefix_src_env', full_name='nsjail.MountPt.prefix_src_env', index=1,
- number=2, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='src_content', full_name='nsjail.MountPt.src_content', index=2,
- number=3, type=12, cpp_type=9, label=1,
- has_default_value=True, default_value=_b(""),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='dst', full_name='nsjail.MountPt.dst', index=3,
- number=4, type=9, cpp_type=9, label=2,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='prefix_dst_env', full_name='nsjail.MountPt.prefix_dst_env', index=4,
- number=5, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='fstype', full_name='nsjail.MountPt.fstype', index=5,
- number=6, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='options', full_name='nsjail.MountPt.options', index=6,
- number=7, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='is_bind', full_name='nsjail.MountPt.is_bind', index=7,
- number=8, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rw', full_name='nsjail.MountPt.rw', index=8,
- number=9, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='is_dir', full_name='nsjail.MountPt.is_dir', index=9,
- number=10, type=8, cpp_type=7, label=1,
- has_default_value=False, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='mandatory', full_name='nsjail.MountPt.mandatory', index=10,
- number=11, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='is_symlink', full_name='nsjail.MountPt.is_symlink', index=11,
- number=12, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='nosuid', full_name='nsjail.MountPt.nosuid', index=12,
- number=13, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='nodev', full_name='nsjail.MountPt.nodev', index=13,
- number=14, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='noexec', full_name='nsjail.MountPt.noexec', index=14,
- number=15, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- ],
- extensions=[
- ],
- nested_types=[],
- enum_types=[
- ],
- options=None,
- is_extendable=False,
- extension_ranges=[],
- oneofs=[
- ],
- serialized_start=124,
- serialized_end=454,
-)
-
-
-_EXE = _descriptor.Descriptor(
- name='Exe',
- full_name='nsjail.Exe',
- filename=None,
- file=DESCRIPTOR,
- containing_type=None,
- fields=[
- _descriptor.FieldDescriptor(
- name='path', full_name='nsjail.Exe.path', index=0,
- number=1, type=9, cpp_type=9, label=2,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='arg', full_name='nsjail.Exe.arg', index=1,
- number=2, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='arg0', full_name='nsjail.Exe.arg0', index=2,
- number=3, type=9, cpp_type=9, label=1,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='exec_fd', full_name='nsjail.Exe.exec_fd', index=3,
- number=4, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- ],
- extensions=[
- ],
- nested_types=[],
- enum_types=[
- ],
- options=None,
- is_extendable=False,
- extension_ranges=[],
- oneofs=[
- ],
- serialized_start=456,
- serialized_end=526,
-)
-
-
-_NSJAILCONFIG = _descriptor.Descriptor(
- name='NsJailConfig',
- full_name='nsjail.NsJailConfig',
- filename=None,
- file=DESCRIPTOR,
- containing_type=None,
- fields=[
- _descriptor.FieldDescriptor(
- name='name', full_name='nsjail.NsJailConfig.name', index=0,
- number=1, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='description', full_name='nsjail.NsJailConfig.description', index=1,
- number=2, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='mode', full_name='nsjail.NsJailConfig.mode', index=2,
- number=3, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=1,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='chroot_dir', full_name='nsjail.NsJailConfig.chroot_dir', index=3,
- number=4, type=9, cpp_type=9, label=1,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
- _descriptor.FieldDescriptor(
- name='is_root_rw', full_name='nsjail.NsJailConfig.is_root_rw', index=4,
- number=5, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
- _descriptor.FieldDescriptor(
- name='hostname', full_name='nsjail.NsJailConfig.hostname', index=5,
- number=8, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("NSJAIL").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cwd', full_name='nsjail.NsJailConfig.cwd', index=6,
- number=9, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='port', full_name='nsjail.NsJailConfig.port', index=7,
- number=10, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='bindhost', full_name='nsjail.NsJailConfig.bindhost', index=8,
- number=11, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("::").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='max_conns_per_ip', full_name='nsjail.NsJailConfig.max_conns_per_ip', index=9,
- number=12, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='time_limit', full_name='nsjail.NsJailConfig.time_limit', index=10,
- number=13, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=600,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='daemon', full_name='nsjail.NsJailConfig.daemon', index=11,
- number=14, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='max_cpus', full_name='nsjail.NsJailConfig.max_cpus', index=12,
- number=15, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='log_fd', full_name='nsjail.NsJailConfig.log_fd', index=13,
- number=16, type=5, cpp_type=1, label=1,
- has_default_value=False, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='log_file', full_name='nsjail.NsJailConfig.log_file', index=14,
- number=17, type=9, cpp_type=9, label=1,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='log_level', full_name='nsjail.NsJailConfig.log_level', index=15,
- number=18, type=14, cpp_type=8, label=1,
- has_default_value=False, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='keep_env', full_name='nsjail.NsJailConfig.keep_env', index=16,
- number=19, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='envar', full_name='nsjail.NsJailConfig.envar', index=17,
- number=20, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='keep_caps', full_name='nsjail.NsJailConfig.keep_caps', index=18,
- number=21, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cap', full_name='nsjail.NsJailConfig.cap', index=19,
- number=22, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='silent', full_name='nsjail.NsJailConfig.silent', index=20,
- number=23, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='skip_setsid', full_name='nsjail.NsJailConfig.skip_setsid', index=21,
- number=24, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='stderr_to_null', full_name='nsjail.NsJailConfig.stderr_to_null', index=22,
- number=25, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='pass_fd', full_name='nsjail.NsJailConfig.pass_fd', index=23,
- number=26, type=5, cpp_type=1, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='disable_no_new_privs', full_name='nsjail.NsJailConfig.disable_no_new_privs', index=24,
- number=27, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_as', full_name='nsjail.NsJailConfig.rlimit_as', index=25,
- number=28, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=4096,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_as_type', full_name='nsjail.NsJailConfig.rlimit_as_type', index=26,
- number=29, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_core', full_name='nsjail.NsJailConfig.rlimit_core', index=27,
- number=30, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_core_type', full_name='nsjail.NsJailConfig.rlimit_core_type', index=28,
- number=31, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_cpu', full_name='nsjail.NsJailConfig.rlimit_cpu', index=29,
- number=32, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=600,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_cpu_type', full_name='nsjail.NsJailConfig.rlimit_cpu_type', index=30,
- number=33, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_fsize', full_name='nsjail.NsJailConfig.rlimit_fsize', index=31,
- number=34, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=1,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_fsize_type', full_name='nsjail.NsJailConfig.rlimit_fsize_type', index=32,
- number=35, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_nofile', full_name='nsjail.NsJailConfig.rlimit_nofile', index=33,
- number=36, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=32,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_nofile_type', full_name='nsjail.NsJailConfig.rlimit_nofile_type', index=34,
- number=37, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_nproc', full_name='nsjail.NsJailConfig.rlimit_nproc', index=35,
- number=38, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=1024,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_nproc_type', full_name='nsjail.NsJailConfig.rlimit_nproc_type', index=36,
- number=39, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=1,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_stack', full_name='nsjail.NsJailConfig.rlimit_stack', index=37,
- number=40, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=1048576,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='rlimit_stack_type', full_name='nsjail.NsJailConfig.rlimit_stack_type', index=38,
- number=41, type=14, cpp_type=8, label=1,
- has_default_value=True, default_value=1,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='disable_rl', full_name='nsjail.NsJailConfig.disable_rl', index=39,
- number=84, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='persona_addr_compat_layout', full_name='nsjail.NsJailConfig.persona_addr_compat_layout', index=40,
- number=42, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='persona_mmap_page_zero', full_name='nsjail.NsJailConfig.persona_mmap_page_zero', index=41,
- number=43, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='persona_read_implies_exec', full_name='nsjail.NsJailConfig.persona_read_implies_exec', index=42,
- number=44, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='persona_addr_limit_3gb', full_name='nsjail.NsJailConfig.persona_addr_limit_3gb', index=43,
- number=45, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='persona_addr_no_randomize', full_name='nsjail.NsJailConfig.persona_addr_no_randomize', index=44,
- number=46, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newnet', full_name='nsjail.NsJailConfig.clone_newnet', index=45,
- number=47, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newuser', full_name='nsjail.NsJailConfig.clone_newuser', index=46,
- number=48, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newns', full_name='nsjail.NsJailConfig.clone_newns', index=47,
- number=49, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newpid', full_name='nsjail.NsJailConfig.clone_newpid', index=48,
- number=50, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newipc', full_name='nsjail.NsJailConfig.clone_newipc', index=49,
- number=51, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newuts', full_name='nsjail.NsJailConfig.clone_newuts', index=50,
- number=52, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='clone_newcgroup', full_name='nsjail.NsJailConfig.clone_newcgroup', index=51,
- number=53, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=True,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='uidmap', full_name='nsjail.NsJailConfig.uidmap', index=52,
- number=54, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='gidmap', full_name='nsjail.NsJailConfig.gidmap', index=53,
- number=55, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='mount_proc', full_name='nsjail.NsJailConfig.mount_proc', index=54,
- number=56, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='mount', full_name='nsjail.NsJailConfig.mount', index=55,
- number=57, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='seccomp_policy_file', full_name='nsjail.NsJailConfig.seccomp_policy_file', index=56,
- number=58, type=9, cpp_type=9, label=1,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='seccomp_string', full_name='nsjail.NsJailConfig.seccomp_string', index=57,
- number=59, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='seccomp_log', full_name='nsjail.NsJailConfig.seccomp_log', index=58,
- number=60, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_mem_max', full_name='nsjail.NsJailConfig.cgroup_mem_max', index=59,
- number=61, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_mem_mount', full_name='nsjail.NsJailConfig.cgroup_mem_mount', index=60,
- number=62, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/sys/fs/cgroup/memory").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_mem_parent', full_name='nsjail.NsJailConfig.cgroup_mem_parent', index=61,
- number=63, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("NSJAIL").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_pids_max', full_name='nsjail.NsJailConfig.cgroup_pids_max', index=62,
- number=64, type=4, cpp_type=4, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_pids_mount', full_name='nsjail.NsJailConfig.cgroup_pids_mount', index=63,
- number=65, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/sys/fs/cgroup/pids").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_pids_parent', full_name='nsjail.NsJailConfig.cgroup_pids_parent', index=64,
- number=66, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("NSJAIL").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_net_cls_classid', full_name='nsjail.NsJailConfig.cgroup_net_cls_classid', index=65,
- number=67, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_net_cls_mount', full_name='nsjail.NsJailConfig.cgroup_net_cls_mount', index=66,
- number=68, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/sys/fs/cgroup/net_cls").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_net_cls_parent', full_name='nsjail.NsJailConfig.cgroup_net_cls_parent', index=67,
- number=69, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("NSJAIL").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_cpu_ms_per_sec', full_name='nsjail.NsJailConfig.cgroup_cpu_ms_per_sec', index=68,
- number=70, type=13, cpp_type=3, label=1,
- has_default_value=True, default_value=0,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_cpu_mount', full_name='nsjail.NsJailConfig.cgroup_cpu_mount', index=69,
- number=71, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/sys/fs/cgroup/cpu").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroup_cpu_parent', full_name='nsjail.NsJailConfig.cgroup_cpu_parent', index=70,
- number=72, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("NSJAIL").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='iface_no_lo', full_name='nsjail.NsJailConfig.iface_no_lo', index=71,
- number=73, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='iface_own', full_name='nsjail.NsJailConfig.iface_own', index=72,
- number=74, type=9, cpp_type=9, label=3,
- has_default_value=False, default_value=[],
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='macvlan_iface', full_name='nsjail.NsJailConfig.macvlan_iface', index=73,
- number=75, type=9, cpp_type=9, label=1,
- has_default_value=False, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='macvlan_vs_ip', full_name='nsjail.NsJailConfig.macvlan_vs_ip', index=74,
- number=76, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("192.168.0.2").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='macvlan_vs_nm', full_name='nsjail.NsJailConfig.macvlan_vs_nm', index=75,
- number=77, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("255.255.255.0").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='macvlan_vs_gw', full_name='nsjail.NsJailConfig.macvlan_vs_gw', index=76,
- number=78, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("192.168.0.1").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='macvlan_vs_ma', full_name='nsjail.NsJailConfig.macvlan_vs_ma', index=77,
- number=79, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='nice_level', full_name='nsjail.NsJailConfig.nice_level', index=78,
- number=80, type=5, cpp_type=1, label=1,
- has_default_value=True, default_value=19,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='exec_bin', full_name='nsjail.NsJailConfig.exec_bin', index=79,
- number=81, type=11, cpp_type=10, label=1,
- has_default_value=False, default_value=None,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='cgroupv2_mount', full_name='nsjail.NsJailConfig.cgroupv2_mount', index=80,
- number=82, type=9, cpp_type=9, label=1,
- has_default_value=True, default_value=_b("/sys/fs/cgroup").decode('utf-8'),
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- _descriptor.FieldDescriptor(
- name='use_cgroupv2', full_name='nsjail.NsJailConfig.use_cgroupv2', index=81,
- number=83, type=8, cpp_type=7, label=1,
- has_default_value=True, default_value=False,
- message_type=None, enum_type=None, containing_type=None,
- is_extension=False, extension_scope=None,
- options=None),
- ],
- extensions=[
- ],
- nested_types=[],
- enum_types=[
- ],
- options=None,
- is_extendable=False,
- extension_ranges=[],
- oneofs=[
- ],
- serialized_start=529,
- serialized_end=3090,
-)
-
-_NSJAILCONFIG.fields_by_name['mode'].enum_type = _MODE
-_NSJAILCONFIG.fields_by_name['log_level'].enum_type = _LOGLEVEL
-_NSJAILCONFIG.fields_by_name['rlimit_as_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_core_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_cpu_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_fsize_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_nofile_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_nproc_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['rlimit_stack_type'].enum_type = _RLIMIT
-_NSJAILCONFIG.fields_by_name['uidmap'].message_type = _IDMAP
-_NSJAILCONFIG.fields_by_name['gidmap'].message_type = _IDMAP
-_NSJAILCONFIG.fields_by_name['mount'].message_type = _MOUNTPT
-_NSJAILCONFIG.fields_by_name['exec_bin'].message_type = _EXE
-DESCRIPTOR.message_types_by_name['IdMap'] = _IDMAP
-DESCRIPTOR.message_types_by_name['MountPt'] = _MOUNTPT
-DESCRIPTOR.message_types_by_name['Exe'] = _EXE
-DESCRIPTOR.message_types_by_name['NsJailConfig'] = _NSJAILCONFIG
-DESCRIPTOR.enum_types_by_name['Mode'] = _MODE
-DESCRIPTOR.enum_types_by_name['LogLevel'] = _LOGLEVEL
-DESCRIPTOR.enum_types_by_name['RLimit'] = _RLIMIT
-
-IdMap = _reflection.GeneratedProtocolMessageType('IdMap', (_message.Message,), dict(
- DESCRIPTOR = _IDMAP,
- __module__ = 'config_pb2'
+_IDMAP = DESCRIPTOR.message_types_by_name['IdMap']
+_MOUNTPT = DESCRIPTOR.message_types_by_name['MountPt']
+_EXE = DESCRIPTOR.message_types_by_name['Exe']
+_NSJAILCONFIG = DESCRIPTOR.message_types_by_name['NsJailConfig']
+IdMap = _reflection.GeneratedProtocolMessageType('IdMap', (_message.Message,), {
+ 'DESCRIPTOR' : _IDMAP,
+ '__module__' : 'config_pb2'
# @@protoc_insertion_point(class_scope:nsjail.IdMap)
- ))
+ })
_sym_db.RegisterMessage(IdMap)
-MountPt = _reflection.GeneratedProtocolMessageType('MountPt', (_message.Message,), dict(
- DESCRIPTOR = _MOUNTPT,
- __module__ = 'config_pb2'
+MountPt = _reflection.GeneratedProtocolMessageType('MountPt', (_message.Message,), {
+ 'DESCRIPTOR' : _MOUNTPT,
+ '__module__' : 'config_pb2'
# @@protoc_insertion_point(class_scope:nsjail.MountPt)
- ))
+ })
_sym_db.RegisterMessage(MountPt)
-Exe = _reflection.GeneratedProtocolMessageType('Exe', (_message.Message,), dict(
- DESCRIPTOR = _EXE,
- __module__ = 'config_pb2'
+Exe = _reflection.GeneratedProtocolMessageType('Exe', (_message.Message,), {
+ 'DESCRIPTOR' : _EXE,
+ '__module__' : 'config_pb2'
# @@protoc_insertion_point(class_scope:nsjail.Exe)
- ))
+ })
_sym_db.RegisterMessage(Exe)
-NsJailConfig = _reflection.GeneratedProtocolMessageType('NsJailConfig', (_message.Message,), dict(
- DESCRIPTOR = _NSJAILCONFIG,
- __module__ = 'config_pb2'
+NsJailConfig = _reflection.GeneratedProtocolMessageType('NsJailConfig', (_message.Message,), {
+ 'DESCRIPTOR' : _NSJAILCONFIG,
+ '__module__' : 'config_pb2'
# @@protoc_insertion_point(class_scope:nsjail.NsJailConfig)
- ))
+ })
_sym_db.RegisterMessage(NsJailConfig)
-
-_NSJAILCONFIG.fields_by_name['chroot_dir'].has_options = True
-_NSJAILCONFIG.fields_by_name['chroot_dir']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
-_NSJAILCONFIG.fields_by_name['is_root_rw'].has_options = True
-_NSJAILCONFIG.fields_by_name['is_root_rw']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+ DESCRIPTOR._options = None
+ _MODE._serialized_start=3448
+ _MODE._serialized_end=3499
+ _LOGLEVEL._serialized_start=3501
+ _LOGLEVEL._serialized_end=3567
+ _RLIMIT._serialized_start=3569
+ _RLIMIT._serialized_end=3617
+ _IDMAP._serialized_start=24
+ _IDMAP._serialized_end=121
+ _MOUNTPT._serialized_start=124
+ _MOUNTPT._serialized_end=454
+ _EXE._serialized_start=456
+ _EXE._serialized_end=526
+ _NSJAILCONFIG._serialized_start=529
+ _NSJAILCONFIG._serialized_end=3446
# @@protoc_insertion_point(module_scope)
diff --git a/snekbox/nsjail.py b/snekbox/nsjail.py
index a1092cf..ac36551 100644
--- a/snekbox/nsjail.py
+++ b/snekbox/nsjail.py
@@ -4,15 +4,13 @@ import re
import subprocess
import sys
import textwrap
-import uuid
-from pathlib import Path
from subprocess import CompletedProcess
from tempfile import NamedTemporaryFile
from typing import Iterable
from google.protobuf import text_format
-from snekbox import DEBUG
+from snekbox import DEBUG, utils
from snekbox.config_pb2 import NsJailConfig
log = logging.getLogger(__name__)
@@ -26,9 +24,6 @@ LOG_BLACKLIST = ("Process will be ",)
NSJAIL_PATH = os.getenv("NSJAIL_PATH", "/usr/sbin/nsjail")
NSJAIL_CFG = os.getenv("NSJAIL_CFG", "./config/snekbox.cfg")
-# If this file is present, cgroupv2 should be enabled
-CGROUPV2_PROBE_PATH = Path("/sys/fs/cgroup/cgroup.controllers")
-
# Limit of stdout bytes we consume before terminating nsjail
OUTPUT_MAX = 1_000_000 # 1 MB
READ_CHUNK_SIZE = 10_000 # chars
@@ -44,19 +39,10 @@ class NsJail:
def __init__(self, nsjail_binary: str = NSJAIL_PATH):
self.nsjail_binary = nsjail_binary
self.config = self._read_config()
+ self.cgroup_version = utils.cgroup.init(self.config)
+ self.ignore_swap_limits = utils.swap.should_ignore_limit(self.config, self.cgroup_version)
- log.info(f"Cgroups version: {self._probe_cgroup_version()}")
-
- @staticmethod
- def _probe_cgroup_version() -> int:
- """Poll the filesystem and return the guessed cgroup version."""
- # Right now we check whenever the controller path exists
- version = 2 if CGROUPV2_PROBE_PATH.exists() else 1
-
- if DEBUG:
- log.info(f"Guessed cgroups version: {version}")
-
- return version
+ log.info(f"Assuming cgroup version {self.cgroup_version}.")
@staticmethod
def _read_config() -> NsJailConfig:
@@ -81,49 +67,6 @@ class NsJail:
return config
- def _create_dynamic_cgroups(self) -> str:
- """
- Create a PID and memory cgroup for NsJail to use as the parent cgroup.
-
- Returns the name of the cgroup, located in the cgroup root.
-
- NsJail doesn't do this automatically because it requires privileges NsJail usually doesn't
- have.
-
- Disables memory swapping.
- """
- # Pick a name for the cgroup
- cgroup = "snekbox-" + str(uuid.uuid4())
-
- pids = Path(self.config.cgroup_pids_mount, cgroup)
- mem = Path(self.config.cgroup_mem_mount, cgroup)
- mem_max = str(self.config.cgroup_mem_max)
-
- pids.mkdir(parents=True, exist_ok=True)
- mem.mkdir(parents=True, exist_ok=True)
-
- # Swap limit cannot be set to a value lower than memory.limit_in_bytes.
- # Therefore, this must be set before the swap limit.
- #
- # Since child cgroups are dynamically created, the swap limit has to be set on the parent
- # instead so that children inherit it. Given the swap's dependency on the memory limit,
- # the memory limit must also be set on the parent. NsJail only sets the memory limit for
- # child cgroups, not the parent.
- (mem / "memory.limit_in_bytes").write_text(mem_max, encoding="utf-8")
-
- try:
- # Swap limit is specified as the sum of the memory and swap limits.
- # Therefore, setting it equal to the memory limit effectively disables swapping.
- (mem / "memory.memsw.limit_in_bytes").write_text(mem_max, encoding="utf-8")
- except PermissionError:
- log.warning(
- "Failed to set the memory swap limit for the cgroup. "
- "This is probably because CONFIG_MEMCG_SWAP or CONFIG_MEMCG_SWAP_ENABLED is unset. "
- "Please ensure swap memory is disabled on the system."
- )
-
- return cgroup
-
@staticmethod
def _parse_log(log_lines: Iterable[str]) -> None:
"""Parse and log NsJail's log messages."""
@@ -203,19 +146,19 @@ class NsJail:
`py_args` are arguments to pass to the Python subprocess before the code,
which is the last argument. By default, it's "-c", which executes the code given.
"""
- cgroup = self._create_dynamic_cgroups()
+ if self.cgroup_version == 2:
+ nsjail_args = ("--use_cgroupv2", *nsjail_args)
- with NamedTemporaryFile() as nsj_log:
- if self._probe_cgroup_version() == 2:
- nsjail_args = (["--use_cgroupv2"]).extend(nsjail_args)
+ if self.ignore_swap_limits:
+ nsjail_args = (
+ "--cgroup_mem_memsw_max", "0", "--cgroup_mem_swap_max", "-1", *nsjail_args
+ )
+ with NamedTemporaryFile() as nsj_log:
args = (
self.nsjail_binary,
"--config", NSJAIL_CFG,
"--log", nsj_log.name,
- # Set our dynamically created parent cgroups
- "--cgroup_mem_parent", cgroup,
- "--cgroup_pids_parent", cgroup,
*nsjail_args,
"--",
self.config.exec_bin.path, *self.config.exec_bin.arg, *py_args, code
@@ -260,8 +203,4 @@ class NsJail:
log.info(f"nsjail return code: {returncode}")
- # Remove the dynamically created cgroups once we're done
- Path(self.config.cgroup_mem_mount, cgroup).rmdir()
- Path(self.config.cgroup_pids_mount, cgroup).rmdir()
-
return CompletedProcess(args, returncode, output, None)
diff --git a/snekbox/utils/__init__.py b/snekbox/utils/__init__.py
new file mode 100644
index 0000000..5a7b632
--- /dev/null
+++ b/snekbox/utils/__init__.py
@@ -0,0 +1,3 @@
+from . import cgroup, swap
+
+__all__ = ("cgroup", "swap")
diff --git a/snekbox/utils/cgroup.py b/snekbox/utils/cgroup.py
new file mode 100644
index 0000000..3e12406
--- /dev/null
+++ b/snekbox/utils/cgroup.py
@@ -0,0 +1,102 @@
+import logging
+from pathlib import Path
+
+from snekbox.config_pb2 import NsJailConfig
+
+log = logging.getLogger(__name__)
+
+
+def get_version(config: NsJailConfig) -> int:
+ """
+ Examine the filesystem and return the guessed cgroup version.
+
+ Fall back to use_cgroupv2 in the NsJail config if either both v1 and v2 seem to be enabled,
+ or neither seem to be enabled.
+ """
+ cgroup_mounts = (
+ config.cgroup_mem_mount,
+ config.cgroup_pids_mount,
+ config.cgroup_net_cls_mount,
+ config.cgroup_cpu_mount
+ )
+ v1_exists = any(Path(mount).exists() for mount in cgroup_mounts)
+
+ controllers_path = Path(config.cgroupv2_mount, "cgroup.controllers")
+ v2_exists = controllers_path.exists()
+
+ config_version = 2 if config.use_cgroupv2 else 1
+
+ if v1_exists and v2_exists:
+ # Probably hybrid mode. Use whatever is set in the config.
+ return config_version
+ elif v1_exists:
+ if config_version == 2:
+ log.warning(
+ "NsJail is configured to use cgroupv2, but only cgroupv1 was detected on the "
+ "system. Either use_cgroupv2 or cgroupv2_mount is incorrect. Snekbox is unable "
+ "to override use_cgroupv2. If NsJail has been configured to use cgroups, then "
+ "it will fail. In such case, please correct the config manually."
+ )
+ return 1
+ elif v2_exists:
+ return 2
+ else:
+ log.warning(
+ f"Neither the cgroupv1 controller mounts, nor {str(controllers_path)!r} exists. "
+ "Either cgroup_xxx_mount and cgroupv2_mount are misconfigured, or all "
+ "corresponding v1 controllers are disabled on the system. "
+ "Falling back to the use_cgroupv2 NsJail setting."
+ )
+ return config_version
+
+
+def init(config: NsJailConfig) -> int:
+ """Determine the cgroup version, initialise the cgroups for NsJail, and return the version."""
+ version = get_version(config)
+ if version == 1:
+ init_v1(config)
+ else:
+ init_v2(config)
+
+ return version
+
+
+def init_v1(config: NsJailConfig) -> None:
+ """
+ Create a PID and memory cgroup for NsJail to use as the parent cgroup for each controller.
+
+ NsJail doesn't do this automatically because it requires privileges NsJail usually doesn't
+ have.
+ """
+ pids = Path(config.cgroup_pids_mount, config.cgroup_pids_parent)
+ mem = Path(config.cgroup_mem_mount, config.cgroup_mem_parent)
+
+ pids.mkdir(parents=True, exist_ok=True)
+ mem.mkdir(parents=True, exist_ok=True)
+
+
+def init_v2(config: NsJailConfig) -> None:
+ """Ensure cgroupv2 children have controllers enabled."""
+ cgroup_mount = Path(config.cgroupv2_mount)
+
+ # If the root's subtree_control already has some controllers enabled,
+ # no further action is necessary.
+ if (cgroup_mount / "cgroup.subtree_control").read_text().strip():
+ return
+
+ # Move all processes from the cgroupv2 mount to a child cgroup.
+ # This is necessary to be able to write to subtree_control in the parent later.
+ # Otherwise, a write operation would yield a "device or resource busy" error.
+ init_cgroup = cgroup_mount / "init"
+ init_cgroup.mkdir(parents=True, exist_ok=True)
+
+ procs = (cgroup_mount / "cgroup.procs").read_text().split()
+ for proc in procs:
+ (init_cgroup / "cgroup.procs").write_text(proc)
+
+ # Enable all available controllers for child cgroups.
+ # This also retroactively enables controllers for children that already exist,
+ # including the "init" child created just before.
+ controllers = (cgroup_mount / "cgroup.controllers").read_text().split()
+ for controller in controllers:
+ (cgroup_mount / "cgroup.subtree_control").write_text(f"+{controller}")
diff --git a/snekbox/utils/swap.py b/snekbox/utils/swap.py
new file mode 100644
index 0000000..3e0d0aa
--- /dev/null
+++ b/snekbox/utils/swap.py
@@ -0,0 +1,62 @@
+import logging
+import uuid
+from pathlib import Path
+
+from snekbox.config_pb2 import NsJailConfig
+
+log = logging.getLogger(__name__)
+
+
+def controller_exists(config: NsJailConfig, cgroup_version: int) -> bool:
+ """Return True if the swap memory cgroup controller is enabled."""
+ if cgroup_version == 1:
+ return Path(config.cgroup_mem_mount, "memory.memsw.max_usage_in_bytes").exists()
+ else:
+ # Create a child cgroup because memory.swap isn't available in the root cgroup.
+ child = Path(config.cgroupv2_mount, f"snekbox-temp-{uuid.uuid4()}")
+ child.mkdir()
+ swap_controller_exists = (child / "memory.swap.max").exists()
+ child.rmdir()
+
+ return swap_controller_exists
+
+
+def is_enabled() -> bool:
+ """Return True if the total size of swap memory is greater than 0."""
+ with open("/proc/meminfo", "rb") as f:
+ for line in f:
+ name, value, *_ = line.split()
+ if name == b"SwapTotal:":
+ return value != b"0"
+
+ log.warning("Couldn't determine if swap is on or off. Assuming it's off.")
+ return False
+
+
+def should_ignore_limit(config: NsJailConfig, cgroup_version: int) -> bool:
+ """
+ Return True if a swap limit should not be configured for NsJail.
+
+ If the swap controller doesn't exist, then NsJail would fail when trying to limit the swap.
+ It would attempt to write to a file that doesn't exist. In such case, the swap limit arguments
+ should be set to their default values, so NsJail will avoid setting a swap limit.
+
+ Log a warning if swap is enabled but the swap controller isn't enabled.
+ """
+ if config.cgroup_mem_max <= 0:
+ return False
+
+ if config.cgroup_mem_memsw_max <= 0 and config.cgroup_mem_swap_max < 0:
+ log.warning("Memory is being limited, but swap memory is unlimited.")
+ return False
+
+ controller_missing = not controller_exists(config, cgroup_version)
+ if is_enabled() and controller_missing:
+ log.warning(
+ "Swap memory is available, but the swap memory controller is not enabled. This is "
+ "probably due to the CONFIG_MEMCG_SWAP or CONFIG_MEMCG_SWAP_ENABLED kernel "
+ "parameters not being set. NsJail will not be able to limit memory effectively. "
+ "Please turn off swap memory on the system, or enable the swap memory controller."
+ )
+
+ return controller_missing
diff --git a/tests/api/__init__.py b/tests/api/__init__.py
index dcee5b5..a900316 100644
--- a/tests/api/__init__.py
+++ b/tests/api/__init__.py
@@ -1,3 +1,4 @@
+import logging
from subprocess import CompletedProcess
from unittest import mock
@@ -20,4 +21,6 @@ class SnekAPITestCase(testing.TestCase):
)
self.addCleanup(self.patcher.stop)
+ logging.getLogger("snekbox.nsjail").setLevel(logging.WARNING)
+
self.app = SnekAPI()
diff --git a/tests/gunicorn_utils.py b/tests/gunicorn_utils.py
new file mode 100644
index 0000000..f2d9b6d
--- /dev/null
+++ b/tests/gunicorn_utils.py
@@ -0,0 +1,80 @@
+import concurrent.futures
+import contextlib
+import multiprocessing
+from typing import Iterator
+
+from gunicorn.app.base import Application
+
+
+class _StandaloneApplication(Application):
+ def __init__(self, config_path: str = None, **kwargs):
+ self.config_path = config_path
+ self.options = kwargs
+
+ super().__init__()
+
+ def init(self, parser, opts, args):
+ pass
+
+ def load(self):
+ from snekbox.api.app import application
+ return application
+
+ def load_config(self):
+ for key, value in self.options.items():
+ if key in self.cfg.settings and value is not None:
+ self.cfg.set(key.lower(), value)
+
+ if self.config_path:
+ self.load_config_from_file(self.config_path)
+
+
+def _proc_target(config_path: str, event: multiprocessing.Event, **kwargs) -> None:
+ """Run a Gunicorn app with the given config and set `event` when Gunicorn is ready."""
+ def when_ready(_):
+ event.set()
+
+ app = _StandaloneApplication(config_path, when_ready=when_ready, **kwargs)
+
+ import logging
+ logging.disable(logging.INFO)
+
+ app.run()
+
+
+def run_gunicorn(config_path: str = "config/gunicorn.conf.py", **kwargs) -> Iterator[None]:
+ """
+ Run the Snekbox app through separate Gunicorn process. Use as a context manager.
+
+ `config_path` is the path to the Gunicorn config to use.
+ Additional kwargs are interpreted as Gunicorn settings.
+
+ Raise RuntimeError if Gunicorn terminates before it is ready.
+ Raise TimeoutError if Gunicorn isn't ready after 60 seconds.
+ """
+ event = multiprocessing.Event()
+ proc = multiprocessing.Process(target=_proc_target, args=(config_path, event), kwargs=kwargs)
+
+ try:
+ proc.start()
+
+ # Wait 60 seconds for Gunicorn to be ready, but exit early if Gunicorn fails.
+ executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
+ concurrent.futures.wait(
+ [executor.submit(proc.join), executor.submit(event.wait)],
+ timeout=60,
+ return_when=concurrent.futures.FIRST_COMPLETED
+ )
+ # Can't use the context manager cause wait=False needs to be set.
+ executor.shutdown(wait=False, cancel_futures=True)
+
+ if proc.is_alive():
+ if not event.is_set():
+ raise TimeoutError("Timed out waiting for Gunicorn to be ready.")
+ else:
+ raise RuntimeError(f"Gunicorn terminated unexpectedly with code {proc.exitcode}.")
+
+ yield
+ finally:
+ proc.terminate()
diff --git a/tests/test_integration.py b/tests/test_integration.py
new file mode 100644
index 0000000..b76b005
--- /dev/null
+++ b/tests/test_integration.py
@@ -0,0 +1,43 @@
+import json
+import unittest
+import urllib.request
+from multiprocessing.dummy import Pool
+
+from tests.gunicorn_utils import run_gunicorn
+
+
+def run_code_in_snekbox(code: str) -> tuple[str, int]:
+ body = {"input": code}
+ json_data = json.dumps(body).encode("utf-8")
+
+ req = urllib.request.Request("http://localhost:8060/eval")
+ req.add_header("Content-Type", "application/json; charset=utf-8")
+ req.add_header("Content-Length", str(len(json_data)))
+
+ with urllib.request.urlopen(req, json_data, timeout=30) as response:
+ response_data = response.read().decode("utf-8")
+
+ return response_data, response.status
+
+
+class IntegrationTests(unittest.TestCase):
+
+ def test_memory_limit_separate_per_process(self):
+ """
+ Each NsJail process should have its own memory limit.
+
+ The memory used by one process should not contribute to the memory cap of other processes.
+ See https://github.com/python-discord/snekbox/issues/83
+ """
+ with run_gunicorn():
+ code = "import time; ' ' * 33000000; time.sleep(0.1)"
+ processes = 3
+
+ args = [code] * processes
+ with Pool(processes) as p:
+ results = p.map(run_code_in_snekbox, args)
+
+ responses, statuses = zip(*results)
+
+ self.assertTrue(all(status == 200 for status in statuses))
+ self.assertTrue(all(json.loads(response)["returncode"] == 0 for response in responses))
diff --git a/tests/test_nsjail.py b/tests/test_nsjail.py
index c0ed96b..989cc31 100644
--- a/tests/test_nsjail.py
+++ b/tests/test_nsjail.py
@@ -259,7 +259,8 @@ class NsJailTests(unittest.TestCase):
args = ("foo", "bar")
result = self.nsjail.python3("", nsjail_args=args)
- self.assertEqual(result.args[9:11], args)
+ end = result.args.index("--")
+ self.assertEqual(result.args[end - len(args):end], args)
def test_py_args(self):
args = ("-m", "timeit")