nsjail-python 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nsjail/__init__.py +21 -0
- nsjail/_field_meta.py +177 -0
- nsjail/_proto/__init__.py +57 -0
- nsjail/_proto/config_pb2.py +50 -0
- nsjail/builder.py +151 -0
- nsjail/config.py +168 -0
- nsjail/enums.py +27 -0
- nsjail/exceptions.py +29 -0
- nsjail/presets.py +74 -0
- nsjail/runner.py +274 -0
- nsjail/serializers/__init__.py +26 -0
- nsjail/serializers/cli.py +69 -0
- nsjail/serializers/protobuf.py +22 -0
- nsjail/serializers/textproto.py +91 -0
- nsjail_python-0.1.0.dist-info/METADATA +141 -0
- nsjail_python-0.1.0.dist-info/RECORD +18 -0
- nsjail_python-0.1.0.dist-info/WHEEL +4 -0
- nsjail_python-0.1.0.dist-info/licenses/LICENSE +21 -0
nsjail/__init__.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""nsjail-python: Python wrapper for Google's nsjail sandboxing tool."""
|
|
2
|
+
|
|
3
|
+
from nsjail.config import Exe, IdMap, MountPt, NsJailConfig
|
|
4
|
+
from nsjail.enums import LogLevel, Mode, RLimitType
|
|
5
|
+
from nsjail.builder import Jail
|
|
6
|
+
from nsjail.presets import sandbox
|
|
7
|
+
from nsjail.runner import NsJailResult, Runner
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"Exe",
|
|
11
|
+
"IdMap",
|
|
12
|
+
"Jail",
|
|
13
|
+
"LogLevel",
|
|
14
|
+
"Mode",
|
|
15
|
+
"MountPt",
|
|
16
|
+
"NsJailConfig",
|
|
17
|
+
"NsJailResult",
|
|
18
|
+
"RLimitType",
|
|
19
|
+
"Runner",
|
|
20
|
+
"sandbox",
|
|
21
|
+
]
|
nsjail/_field_meta.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# GENERATED from nsjail config.proto — DO NOT EDIT
|
|
2
|
+
# Re-run: python -m _codegen.generate
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True)
|
|
10
|
+
class FieldMeta:
|
|
11
|
+
"""Metadata about a single proto field."""
|
|
12
|
+
number: int
|
|
13
|
+
proto_type: str
|
|
14
|
+
default: object
|
|
15
|
+
cli_flag: str | None
|
|
16
|
+
cli_supported: bool
|
|
17
|
+
is_repeated: bool
|
|
18
|
+
is_message: bool
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
FIELD_REGISTRY: dict[tuple[str, str], FieldMeta] = {}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _r(msg: str, name: str, **kwargs: object) -> None:
|
|
25
|
+
FIELD_REGISTRY[(msg, name)] = FieldMeta(**kwargs) # type: ignore[arg-type]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# ── UserNet (19 fields) ───────────────────────────────────────────────────────
|
|
29
|
+
_r("UserNet", "enable", number=1, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
30
|
+
_r("UserNet", "ip", number=2, proto_type="string", default="10.255.255.2", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
31
|
+
_r("UserNet", "mask", number=3, proto_type="string", default="255.255.255.0", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
32
|
+
_r("UserNet", "gw", number=4, proto_type="string", default="10.255.255.1", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
33
|
+
_r("UserNet", "ip6", number=5, proto_type="string", default="fc00::2", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
34
|
+
_r("UserNet", "mask6", number=6, proto_type="string", default="64", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
35
|
+
_r("UserNet", "gw6", number=7, proto_type="string", default="fc00::1", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
36
|
+
_r("UserNet", "ns_iface", number=8, proto_type="string", default="eth0", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
37
|
+
_r("UserNet", "tcp_ports", number=9, proto_type="string", default="none", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
38
|
+
_r("UserNet", "udp_ports", number=10, proto_type="string", default="none", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
39
|
+
_r("UserNet", "enable_ip4_dhcp", number=11, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
40
|
+
_r("UserNet", "enable_dns", number=12, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
41
|
+
_r("UserNet", "dns_forward", number=13, proto_type="string", default="", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
42
|
+
_r("UserNet", "enable_tcp", number=14, proto_type="bool", default=True, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
43
|
+
_r("UserNet", "enable_udp", number=15, proto_type="bool", default=True, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
44
|
+
_r("UserNet", "enable_icmp", number=16, proto_type="bool", default=True, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
45
|
+
_r("UserNet", "no_map_gw", number=17, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
46
|
+
_r("UserNet", "enable_ip6_dhcp", number=18, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
47
|
+
_r("UserNet", "enable_ip6_ra", number=19, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
48
|
+
|
|
49
|
+
# ── IdMap (4 fields) ─────────────────────────────────────────────────────────
|
|
50
|
+
_r("IdMap", "inside_id", number=1, proto_type="string", default="", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
51
|
+
_r("IdMap", "outside_id", number=2, proto_type="string", default="", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
52
|
+
_r("IdMap", "count", number=3, proto_type="uint32", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
53
|
+
_r("IdMap", "use_newidmap", number=4, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
54
|
+
|
|
55
|
+
# ── MountPt (15 fields) ───────────────────────────────────────────────────────
|
|
56
|
+
_r("MountPt", "src", number=1, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
57
|
+
_r("MountPt", "prefix_src_env", number=2, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
58
|
+
_r("MountPt", "src_content", number=3, proto_type="bytes", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
59
|
+
_r("MountPt", "dst", number=4, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
60
|
+
_r("MountPt", "prefix_dst_env", number=5, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
61
|
+
_r("MountPt", "fstype", number=6, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
62
|
+
_r("MountPt", "options", number=7, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
63
|
+
_r("MountPt", "is_bind", number=8, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
64
|
+
_r("MountPt", "rw", number=9, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
65
|
+
_r("MountPt", "is_dir", number=10, proto_type="bool", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
66
|
+
_r("MountPt", "mandatory", number=11, proto_type="bool", default=True, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
67
|
+
_r("MountPt", "is_symlink", number=12, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
68
|
+
_r("MountPt", "nosuid", number=13, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
69
|
+
_r("MountPt", "nodev", number=14, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
70
|
+
_r("MountPt", "noexec", number=15, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
71
|
+
|
|
72
|
+
# ── Exe (4 fields) ───────────────────────────────────────────────────────────
|
|
73
|
+
_r("Exe", "path", number=1, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
74
|
+
_r("Exe", "arg", number=2, proto_type="string", default=[], cli_flag=None, cli_supported=False, is_repeated=True, is_message=False)
|
|
75
|
+
_r("Exe", "arg0", number=3, proto_type="string", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
76
|
+
_r("Exe", "exec_fd", number=4, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
77
|
+
|
|
78
|
+
# ── NsJailConfig (96 fields) ──────────────────────────────────────────────────
|
|
79
|
+
_r("NsJailConfig", "name", number=1, proto_type="string", default=None, cli_flag="--name", cli_supported=True, is_repeated=False, is_message=False)
|
|
80
|
+
_r("NsJailConfig", "description", number=2, proto_type="string", default=[], cli_flag=None, cli_supported=False, is_repeated=True, is_message=False)
|
|
81
|
+
_r("NsJailConfig", "mode", number=3, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
82
|
+
_r("NsJailConfig", "hostname", number=4, proto_type="string", default="NSJAIL", cli_flag="--hostname", cli_supported=True, is_repeated=False, is_message=False)
|
|
83
|
+
_r("NsJailConfig", "cwd", number=5, proto_type="string", default="/", cli_flag="--cwd", cli_supported=True, is_repeated=False, is_message=False)
|
|
84
|
+
_r("NsJailConfig", "no_pivotroot", number=6, proto_type="bool", default=False, cli_flag="--no_pivotroot", cli_supported=True, is_repeated=False, is_message=False)
|
|
85
|
+
_r("NsJailConfig", "port", number=7, proto_type="uint32", default=0, cli_flag="--port", cli_supported=True, is_repeated=False, is_message=False)
|
|
86
|
+
_r("NsJailConfig", "bindhost", number=8, proto_type="string", default="::", cli_flag="--bindhost", cli_supported=True, is_repeated=False, is_message=False)
|
|
87
|
+
_r("NsJailConfig", "max_conns", number=9, proto_type="uint32", default=0, cli_flag="--max_conns", cli_supported=True, is_repeated=False, is_message=False)
|
|
88
|
+
_r("NsJailConfig", "max_conns_per_ip", number=10, proto_type="uint32", default=0, cli_flag="--max_conns_per_ip", cli_supported=True, is_repeated=False, is_message=False)
|
|
89
|
+
_r("NsJailConfig", "time_limit", number=11, proto_type="uint32", default=600, cli_flag="--time_limit", cli_supported=True, is_repeated=False, is_message=False)
|
|
90
|
+
_r("NsJailConfig", "daemon", number=12, proto_type="bool", default=False, cli_flag="--daemon", cli_supported=True, is_repeated=False, is_message=False)
|
|
91
|
+
_r("NsJailConfig", "max_cpus", number=13, proto_type="uint32", default=0, cli_flag="--max_cpus", cli_supported=True, is_repeated=False, is_message=False)
|
|
92
|
+
_r("NsJailConfig", "nice_level", number=14, proto_type="int32", default=19, cli_flag="--nice_level", cli_supported=True, is_repeated=False, is_message=False)
|
|
93
|
+
_r("NsJailConfig", "log_fd", number=15, proto_type="int32", default=None, cli_flag="--log_fd", cli_supported=True, is_repeated=False, is_message=False)
|
|
94
|
+
_r("NsJailConfig", "log_file", number=16, proto_type="string", default=None, cli_flag="--log", cli_supported=True, is_repeated=False, is_message=False)
|
|
95
|
+
_r("NsJailConfig", "log_level", number=17, proto_type="enum", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
96
|
+
_r("NsJailConfig", "keep_env", number=18, proto_type="bool", default=False, cli_flag="--keep_env", cli_supported=True, is_repeated=False, is_message=False)
|
|
97
|
+
_r("NsJailConfig", "envar", number=19, proto_type="string", default=[], cli_flag="--env", cli_supported=True, is_repeated=True, is_message=False)
|
|
98
|
+
_r("NsJailConfig", "keep_caps", number=20, proto_type="bool", default=False, cli_flag="--keep_caps", cli_supported=True, is_repeated=False, is_message=False)
|
|
99
|
+
_r("NsJailConfig", "cap", number=21, proto_type="string", default=[], cli_flag="--cap", cli_supported=True, is_repeated=True, is_message=False)
|
|
100
|
+
_r("NsJailConfig", "silent", number=22, proto_type="bool", default=False, cli_flag="--silent", cli_supported=True, is_repeated=False, is_message=False)
|
|
101
|
+
_r("NsJailConfig", "skip_setsid", number=23, proto_type="bool", default=False, cli_flag="--skip_setsid", cli_supported=True, is_repeated=False, is_message=False)
|
|
102
|
+
_r("NsJailConfig", "stderr_to_null", number=24, proto_type="bool", default=False, cli_flag="--stderr_to_null", cli_supported=True, is_repeated=False, is_message=False)
|
|
103
|
+
_r("NsJailConfig", "pass_fd", number=25, proto_type="int32", default=[], cli_flag="--pass_fd", cli_supported=True, is_repeated=True, is_message=False)
|
|
104
|
+
_r("NsJailConfig", "disable_no_new_privs", number=26, proto_type="bool", default=False, cli_flag="--disable_no_new_privs", cli_supported=True, is_repeated=False, is_message=False)
|
|
105
|
+
_r("NsJailConfig", "forward_signals", number=27, proto_type="bool", default=False, cli_flag="--forward_signals", cli_supported=True, is_repeated=False, is_message=False)
|
|
106
|
+
_r("NsJailConfig", "disable_tsc", number=28, proto_type="bool", default=False, cli_flag="--disable_tsc", cli_supported=True, is_repeated=False, is_message=False)
|
|
107
|
+
_r("NsJailConfig", "rlimit_as", number=29, proto_type="uint64", default=4096, cli_flag="--rlimit_as", cli_supported=True, is_repeated=False, is_message=False)
|
|
108
|
+
_r("NsJailConfig", "rlimit_as_type", number=30, proto_type="enum", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
109
|
+
_r("NsJailConfig", "rlimit_core", number=31, proto_type="uint64", default=0, cli_flag="--rlimit_core", cli_supported=True, is_repeated=False, is_message=False)
|
|
110
|
+
_r("NsJailConfig", "rlimit_core_type", number=32, proto_type="enum", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
111
|
+
_r("NsJailConfig", "rlimit_cpu", number=33, proto_type="uint64", default=600, cli_flag="--rlimit_cpu", cli_supported=True, is_repeated=False, is_message=False)
|
|
112
|
+
_r("NsJailConfig", "rlimit_cpu_type", number=34, proto_type="enum", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
113
|
+
_r("NsJailConfig", "rlimit_fsize", number=35, proto_type="uint64", default=1, cli_flag="--rlimit_fsize", cli_supported=True, is_repeated=False, is_message=False)
|
|
114
|
+
_r("NsJailConfig", "rlimit_fsize_type", number=36, proto_type="enum", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
115
|
+
_r("NsJailConfig", "rlimit_nofile", number=37, proto_type="uint64", default=32, cli_flag="--rlimit_nofile", cli_supported=True, is_repeated=False, is_message=False)
|
|
116
|
+
_r("NsJailConfig", "rlimit_nofile_type", number=38, proto_type="enum", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
117
|
+
_r("NsJailConfig", "rlimit_nproc", number=39, proto_type="uint64", default=1024, cli_flag="--rlimit_nproc", cli_supported=True, is_repeated=False, is_message=False)
|
|
118
|
+
_r("NsJailConfig", "rlimit_nproc_type", number=40, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
119
|
+
_r("NsJailConfig", "rlimit_stack", number=41, proto_type="uint64", default=8, cli_flag="--rlimit_stack", cli_supported=True, is_repeated=False, is_message=False)
|
|
120
|
+
_r("NsJailConfig", "rlimit_stack_type", number=42, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
121
|
+
_r("NsJailConfig", "rlimit_memlock", number=43, proto_type="uint64", default=64, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
122
|
+
_r("NsJailConfig", "rlimit_memlock_type", number=44, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
123
|
+
_r("NsJailConfig", "rlimit_rtprio", number=45, proto_type="uint64", default=0, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
124
|
+
_r("NsJailConfig", "rlimit_rtprio_type", number=46, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
125
|
+
_r("NsJailConfig", "rlimit_msgqueue", number=47, proto_type="uint64", default=1024, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
126
|
+
_r("NsJailConfig", "rlimit_msgqueue_type", number=48, proto_type="enum", default=1, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
127
|
+
_r("NsJailConfig", "disable_rl", number=49, proto_type="bool", default=False, cli_flag="--disable_rl", cli_supported=True, is_repeated=False, is_message=False)
|
|
128
|
+
_r("NsJailConfig", "persona_addr_compat_layout", number=50, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
129
|
+
_r("NsJailConfig", "persona_mmap_page_zero", number=51, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
130
|
+
_r("NsJailConfig", "persona_read_implies_exec", number=52, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
131
|
+
_r("NsJailConfig", "persona_addr_limit_3gb", number=53, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
132
|
+
_r("NsJailConfig", "persona_addr_no_randomize", number=54, proto_type="bool", default=False, cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
133
|
+
_r("NsJailConfig", "clone_newnet", number=55, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
134
|
+
_r("NsJailConfig", "clone_newuser", number=56, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
135
|
+
_r("NsJailConfig", "clone_newns", number=57, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
136
|
+
_r("NsJailConfig", "clone_newpid", number=58, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
137
|
+
_r("NsJailConfig", "clone_newipc", number=59, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
138
|
+
_r("NsJailConfig", "clone_newuts", number=60, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
139
|
+
_r("NsJailConfig", "clone_newcgroup", number=61, proto_type="bool", default=True, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
140
|
+
_r("NsJailConfig", "clone_newtime", number=62, proto_type="bool", default=False, cli_flag=None, cli_supported=True, is_repeated=False, is_message=False)
|
|
141
|
+
_r("NsJailConfig", "uidmap", number=63, proto_type="message", default=[], cli_flag="--uid_mapping", cli_supported=True, is_repeated=True, is_message=True)
|
|
142
|
+
_r("NsJailConfig", "gidmap", number=64, proto_type="message", default=[], cli_flag="--gid_mapping", cli_supported=True, is_repeated=True, is_message=True)
|
|
143
|
+
_r("NsJailConfig", "mount_proc", number=65, proto_type="bool", default=False, cli_flag="--mount_proc", cli_supported=True, is_repeated=False, is_message=False)
|
|
144
|
+
_r("NsJailConfig", "mount", number=66, proto_type="message", default=[], cli_flag=None, cli_supported=False, is_repeated=True, is_message=True)
|
|
145
|
+
_r("NsJailConfig", "seccomp_policy_file", number=67, proto_type="string", default=None, cli_flag="--seccomp_policy", cli_supported=True, is_repeated=False, is_message=False)
|
|
146
|
+
_r("NsJailConfig", "seccomp_string", number=68, proto_type="string", default=[], cli_flag="--seccomp_string", cli_supported=True, is_repeated=True, is_message=False)
|
|
147
|
+
_r("NsJailConfig", "seccomp_log", number=69, proto_type="bool", default=False, cli_flag="--seccomp_log", cli_supported=True, is_repeated=False, is_message=False)
|
|
148
|
+
_r("NsJailConfig", "cgroup_mem_max", number=70, proto_type="uint64", default=0, cli_flag="--cgroup_mem_max", cli_supported=True, is_repeated=False, is_message=False)
|
|
149
|
+
_r("NsJailConfig", "cgroup_mem_memsw_max", number=71, proto_type="uint64", default=0, cli_flag="--cgroup_mem_memsw_max", cli_supported=True, is_repeated=False, is_message=False)
|
|
150
|
+
_r("NsJailConfig", "cgroup_mem_swap_max", number=72, proto_type="int64", default=-1, cli_flag="--cgroup_mem_swap_max", cli_supported=True, is_repeated=False, is_message=False)
|
|
151
|
+
_r("NsJailConfig", "cgroup_mem_mount", number=73, proto_type="string", default="/sys/fs/cgroup/memory", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
152
|
+
_r("NsJailConfig", "cgroup_mem_parent", number=74, proto_type="string", default="NSJAIL", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
153
|
+
_r("NsJailConfig", "cgroup_pids_max", number=75, proto_type="uint64", default=0, cli_flag="--cgroup_pids_max", cli_supported=True, is_repeated=False, is_message=False)
|
|
154
|
+
_r("NsJailConfig", "cgroup_pids_mount", number=76, proto_type="string", default="/sys/fs/cgroup/pids", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
155
|
+
_r("NsJailConfig", "cgroup_pids_parent", number=77, proto_type="string", default="NSJAIL", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
156
|
+
_r("NsJailConfig", "cgroup_net_cls_classid", number=78, proto_type="uint32", default=0, cli_flag="--cgroup_net_cls_classid", cli_supported=True, is_repeated=False, is_message=False)
|
|
157
|
+
_r("NsJailConfig", "cgroup_net_cls_mount", number=79, proto_type="string", default="/sys/fs/cgroup/net_cls", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
158
|
+
_r("NsJailConfig", "cgroup_net_cls_parent", number=80, proto_type="string", default="NSJAIL", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
159
|
+
_r("NsJailConfig", "cgroup_cpu_ms_per_sec", number=81, proto_type="uint32", default=0, cli_flag="--cgroup_cpu_ms_per_sec", cli_supported=True, is_repeated=False, is_message=False)
|
|
160
|
+
_r("NsJailConfig", "cgroup_cpu_mount", number=82, proto_type="string", default="/sys/fs/cgroup/cpu", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
161
|
+
_r("NsJailConfig", "cgroup_cpu_parent", number=83, proto_type="string", default="NSJAIL", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
162
|
+
_r("NsJailConfig", "cgroupv2_mount", number=84, proto_type="string", default="/sys/fs/cgroup", cli_flag=None, cli_supported=False, is_repeated=False, is_message=False)
|
|
163
|
+
_r("NsJailConfig", "use_cgroupv2", number=85, proto_type="bool", default=False, cli_flag="--use_cgroupv2", cli_supported=True, is_repeated=False, is_message=False)
|
|
164
|
+
_r("NsJailConfig", "detect_cgroupv2", number=86, proto_type="bool", default=False, cli_flag="--detect_cgroupv2", cli_supported=True, is_repeated=False, is_message=False)
|
|
165
|
+
_r("NsJailConfig", "iface_no_lo", number=87, proto_type="bool", default=False, cli_flag="--iface_no_lo", cli_supported=True, is_repeated=False, is_message=False)
|
|
166
|
+
_r("NsJailConfig", "iface_own", number=88, proto_type="string", default=[], cli_flag="--iface_own", cli_supported=True, is_repeated=True, is_message=False)
|
|
167
|
+
_r("NsJailConfig", "macvlan_iface", number=89, proto_type="string", default=None, cli_flag="--macvlan_iface", cli_supported=True, is_repeated=False, is_message=False)
|
|
168
|
+
_r("NsJailConfig", "macvlan_vs_ip", number=90, proto_type="string", default="192.168.0.2", cli_flag="--macvlan_vs_ip", cli_supported=True, is_repeated=False, is_message=False)
|
|
169
|
+
_r("NsJailConfig", "macvlan_vs_nm", number=91, proto_type="string", default="255.255.255.0", cli_flag="--macvlan_vs_nm", cli_supported=True, is_repeated=False, is_message=False)
|
|
170
|
+
_r("NsJailConfig", "macvlan_vs_gw", number=92, proto_type="string", default="192.168.0.1", cli_flag="--macvlan_vs_gw", cli_supported=True, is_repeated=False, is_message=False)
|
|
171
|
+
_r("NsJailConfig", "macvlan_vs_ma", number=93, proto_type="string", default="", cli_flag="--macvlan_vs_ma", cli_supported=True, is_repeated=False, is_message=False)
|
|
172
|
+
_r("NsJailConfig", "macvlan_vs_mo", number=94, proto_type="string", default="private", cli_flag="--macvlan_vs_mo", cli_supported=True, is_repeated=False, is_message=False)
|
|
173
|
+
_r("NsJailConfig", "user_net", number=95, proto_type="message", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=True)
|
|
174
|
+
_r("NsJailConfig", "exec_bin", number=96, proto_type="message", default=None, cli_flag=None, cli_supported=False, is_repeated=False, is_message=True)
|
|
175
|
+
|
|
176
|
+
del _r
|
|
177
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Auto-generated protobuf module for nsjail config.proto.
|
|
2
|
+
|
|
3
|
+
The config_pb2 module is generated from _vendor/nsjail/config.proto using
|
|
4
|
+
grpc_tools.protoc. If the generated module does not exist, this package
|
|
5
|
+
will attempt to generate it on first import.
|
|
6
|
+
|
|
7
|
+
To regenerate manually:
|
|
8
|
+
python -m grpc_tools.protoc \\
|
|
9
|
+
--python_out=src/nsjail/_proto/ \\
|
|
10
|
+
--proto_path=_vendor/nsjail/ \\
|
|
11
|
+
config.proto
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _compile_proto() -> None:
|
|
20
|
+
"""Compile config.proto using grpc_tools.protoc."""
|
|
21
|
+
try:
|
|
22
|
+
from grpc_tools import protoc
|
|
23
|
+
except ImportError as e:
|
|
24
|
+
raise ImportError(
|
|
25
|
+
"grpc_tools is required to compile config.proto. "
|
|
26
|
+
"Install it with: pip install grpcio-tools"
|
|
27
|
+
) from e
|
|
28
|
+
|
|
29
|
+
proto_dir = Path(__file__).parent
|
|
30
|
+
# Walk up to find the repo root (where _vendor lives)
|
|
31
|
+
repo_root = proto_dir
|
|
32
|
+
for _ in range(10):
|
|
33
|
+
if (repo_root / "_vendor" / "nsjail" / "config.proto").exists():
|
|
34
|
+
break
|
|
35
|
+
repo_root = repo_root.parent
|
|
36
|
+
else:
|
|
37
|
+
raise FileNotFoundError(
|
|
38
|
+
"Could not find _vendor/nsjail/config.proto relative to package"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
proto_path = str(repo_root / "_vendor" / "nsjail")
|
|
42
|
+
python_out = str(proto_dir)
|
|
43
|
+
|
|
44
|
+
ret = protoc.main([
|
|
45
|
+
"grpc_tools.protoc",
|
|
46
|
+
f"--proto_path={proto_path}",
|
|
47
|
+
f"--python_out={python_out}",
|
|
48
|
+
"config.proto",
|
|
49
|
+
])
|
|
50
|
+
if ret != 0:
|
|
51
|
+
raise RuntimeError(f"grpc_tools.protoc failed with exit code {ret}")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Attempt to import config_pb2; compile if missing
|
|
55
|
+
_pb2_path = Path(__file__).parent / "config_pb2.py"
|
|
56
|
+
if not _pb2_path.exists():
|
|
57
|
+
_compile_proto()
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# NO CHECKED-IN PROTOBUF GENCODE
|
|
4
|
+
# source: config.proto
|
|
5
|
+
# Protobuf Python Version: 6.31.1
|
|
6
|
+
"""Generated protocol buffer code."""
|
|
7
|
+
from google.protobuf import descriptor as _descriptor
|
|
8
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
9
|
+
from google.protobuf import runtime_version as _runtime_version
|
|
10
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
11
|
+
from google.protobuf.internal import builder as _builder
|
|
12
|
+
_runtime_version.ValidateProtobufRuntimeVersion(
|
|
13
|
+
_runtime_version.Domain.PUBLIC,
|
|
14
|
+
6,
|
|
15
|
+
31,
|
|
16
|
+
1,
|
|
17
|
+
'',
|
|
18
|
+
'config.proto'
|
|
19
|
+
)
|
|
20
|
+
# @@protoc_insertion_point(imports)
|
|
21
|
+
|
|
22
|
+
_sym_db = _symbol_database.Default()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
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\"\xe7\x1b\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\x16\n\nnice_level\x18\x0e \x01(\x05:\x02\x31\x39\x12\x0e\n\x06log_fd\x18\x0f \x01(\x05\x12\x10\n\x08log_file\x18\x10 \x01(\t\x12#\n\tlog_level\x18\x11 \x01(\x0e\x32\x10.nsjail.LogLevel\x12\x17\n\x08keep_env\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05\x65nvar\x18\x13 \x03(\t\x12\x18\n\tkeep_caps\x18\x14 \x01(\x08:\x05\x66\x61lse\x12\x0b\n\x03\x63\x61p\x18\x15 \x03(\t\x12\x15\n\x06silent\x18\x16 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bskip_setsid\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0estderr_to_null\x18\x18 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07pass_fd\x18\x19 \x03(\x05\x12#\n\x14\x64isable_no_new_privs\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0f\x66orward_signals\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x64isable_tsc\x18\x1c \x01(\x08:\x05\x66\x61lse\x12\x17\n\trlimit_as\x18\x1d \x01(\x04:\x04\x34\x30\x39\x36\x12-\n\x0erlimit_as_type\x18\x1e \x01(\x0e\x32\x0e.nsjail.RLimit:\x05VALUE\x12\x16\n\x0brlimit_core\x18\x1f \x01(\x04:\x01\x30\x12/\n\x10rlimit_core_type\x18 \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\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\x30 \x01(\x0e\x32\x0e.nsjail.RLimit:\x04SOFT\x12\x19\n\ndisable_rl\x18\x31 \x01(\x08:\x05\x66\x61lse\x12)\n\x1apersona_addr_compat_layout\x18\x32 \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_mmap_page_zero\x18\x33 \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_read_implies_exec\x18\x34 \x01(\x08:\x05\x66\x61lse\x12%\n\x16persona_addr_limit_3gb\x18\x35 \x01(\x08:\x05\x66\x61lse\x12(\n\x19persona_addr_no_randomize\x18\x36 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0c\x63lone_newnet\x18\x37 \x01(\x08:\x04true\x12\x1b\n\rclone_newuser\x18\x38 \x01(\x08:\x04true\x12\x19\n\x0b\x63lone_newns\x18\x39 \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newpid\x18: \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newipc\x18; \x01(\x08:\x04true\x12\x1a\n\x0c\x63lone_newuts\x18< \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\x41 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x05mount\x18\x42 \x03(\x0b\x32\x0f.nsjail.MountPt\x12\x1b\n\x13seccomp_policy_file\x18\x43 \x01(\t\x12\x16\n\x0eseccomp_string\x18\x44 \x03(\t\x12\x1a\n\x0bseccomp_log\x18\x45 \x01(\x08:\x05\x66\x61lse\x12\x19\n\x0e\x63group_mem_max\x18\x46 \x01(\x04:\x01\x30\x12\x1f\n\x14\x63group_mem_memsw_max\x18G \x01(\x04:\x01\x30\x12\x1f\n\x13\x63group_mem_swap_max\x18H \x01(\x03:\x02-1\x12/\n\x10\x63group_mem_mount\x18I \x01(\t:\x15/sys/fs/cgroup/memory\x12!\n\x11\x63group_mem_parent\x18J \x01(\t:\x06NSJAIL\x12\x1a\n\x0f\x63group_pids_max\x18K \x01(\x04:\x01\x30\x12.\n\x11\x63group_pids_mount\x18L \x01(\t:\x13/sys/fs/cgroup/pids\x12\"\n\x12\x63group_pids_parent\x18M \x01(\t:\x06NSJAIL\x12!\n\x16\x63group_net_cls_classid\x18N \x01(\r:\x01\x30\x12\x34\n\x14\x63group_net_cls_mount\x18O \x01(\t:\x16/sys/fs/cgroup/net_cls\x12%\n\x15\x63group_net_cls_parent\x18P \x01(\t:\x06NSJAIL\x12 \n\x15\x63group_cpu_ms_per_sec\x18Q \x01(\r:\x01\x30\x12,\n\x10\x63group_cpu_mount\x18R \x01(\t:\x12/sys/fs/cgroup/cpu\x12!\n\x11\x63group_cpu_parent\x18S \x01(\t:\x06NSJAIL\x12&\n\x0e\x63groupv2_mount\x18T \x01(\t:\x0e/sys/fs/cgroup\x12\x1b\n\x0cuse_cgroupv2\x18U \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0f\x64\x65tect_cgroupv2\x18V \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0biface_no_lo\x18W \x01(\x08:\x05\x66\x61lse\x12\x11\n\tiface_own\x18X \x03(\t\x12\x15\n\rmacvlan_iface\x18Y \x01(\t\x12\"\n\rmacvlan_vs_ip\x18Z \x01(\t:\x0b\x31\x39\x32.168.0.2\x12$\n\rmacvlan_vs_nm\x18[ \x01(\t:\r255.255.255.0\x12\"\n\rmacvlan_vs_gw\x18\\ \x01(\t:\x0b\x31\x39\x32.168.0.1\x12\x17\n\rmacvlan_vs_ma\x18] \x01(\t:\x00\x12\x1e\n\rmacvlan_vs_mo\x18^ \x01(\t:\x07private\x12.\n\x08user_net\x18_ \x01(\x0b\x32\x1c.nsjail.NsJailConfig.UserNet\x12\x1d\n\x08\x65xec_bin\x18` \x01(\x0b\x32\x0b.nsjail.Exe\x1a\xf3\x03\n\x07UserNet\x12\x15\n\x06\x65nable\x18\x01 \x01(\x08:\x05\x66\x61lse\x12\x18\n\x02ip\x18\x02 \x01(\t:\x0c\x31\x30.255.255.2\x12\x1b\n\x04mask\x18\x03 \x01(\t:\r255.255.255.0\x12\x18\n\x02gw\x18\x04 \x01(\t:\x0c\x31\x30.255.255.1\x12\x14\n\x03ip6\x18\x05 \x01(\t:\x07\x66\x63\x30\x30::2\x12\x11\n\x05mask6\x18\x06 \x01(\t:\x02\x36\x34\x12\x14\n\x03gw6\x18\x07 \x01(\t:\x07\x66\x63\x30\x30::1\x12\x16\n\x08ns_iface\x18\x08 \x01(\t:\x04\x65th0\x12\x17\n\ttcp_ports\x18\t \x01(\t:\x04none\x12\x17\n\tudp_ports\x18\n \x01(\t:\x04none\x12\x1e\n\x0f\x65nable_ip4_dhcp\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x19\n\nenable_dns\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x15\n\x0b\x64ns_forward\x18\r \x01(\t:\x00\x12\x18\n\nenable_tcp\x18\x0e \x01(\x08:\x04true\x12\x18\n\nenable_udp\x18\x0f \x01(\x08:\x04true\x12\x19\n\x0b\x65nable_icmp\x18\x10 \x01(\x08:\x04true\x12\x18\n\tno_map_gw\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0f\x65nable_ip6_dhcp\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\renable_ip6_ra\x18\x13 \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')
|
|
28
|
+
|
|
29
|
+
_globals = globals()
|
|
30
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
31
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'config_pb2', _globals)
|
|
32
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
|
33
|
+
DESCRIPTOR._loaded_options = None
|
|
34
|
+
_globals['_MODE']._serialized_start=4090
|
|
35
|
+
_globals['_MODE']._serialized_end=4141
|
|
36
|
+
_globals['_LOGLEVEL']._serialized_start=4143
|
|
37
|
+
_globals['_LOGLEVEL']._serialized_end=4209
|
|
38
|
+
_globals['_RLIMIT']._serialized_start=4211
|
|
39
|
+
_globals['_RLIMIT']._serialized_end=4259
|
|
40
|
+
_globals['_IDMAP']._serialized_start=24
|
|
41
|
+
_globals['_IDMAP']._serialized_end=121
|
|
42
|
+
_globals['_MOUNTPT']._serialized_start=124
|
|
43
|
+
_globals['_MOUNTPT']._serialized_end=454
|
|
44
|
+
_globals['_EXE']._serialized_start=456
|
|
45
|
+
_globals['_EXE']._serialized_end=526
|
|
46
|
+
_globals['_NSJAILCONFIG']._serialized_start=529
|
|
47
|
+
_globals['_NSJAILCONFIG']._serialized_end=4088
|
|
48
|
+
_globals['_NSJAILCONFIG_USERNET']._serialized_start=3589
|
|
49
|
+
_globals['_NSJAILCONFIG_USERNET']._serialized_end=4088
|
|
50
|
+
# @@protoc_insertion_point(module_scope)
|
nsjail/builder.py
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Fluent builder for NsJailConfig."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Literal, TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from nsjail.runner import Runner, NsJailResult
|
|
9
|
+
|
|
10
|
+
from nsjail.config import Exe, IdMap, MountPt, NsJailConfig
|
|
11
|
+
from nsjail.presets import (
|
|
12
|
+
apply_cgroup_limits,
|
|
13
|
+
apply_readonly_root,
|
|
14
|
+
apply_seccomp_log,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Jail:
|
|
19
|
+
"""Fluent builder for NsJailConfig."""
|
|
20
|
+
|
|
21
|
+
def __init__(self) -> None:
|
|
22
|
+
self._cfg = NsJailConfig()
|
|
23
|
+
|
|
24
|
+
def build(self) -> NsJailConfig:
|
|
25
|
+
return self._cfg
|
|
26
|
+
|
|
27
|
+
# --- Command builders ---
|
|
28
|
+
|
|
29
|
+
def command(self, *args: str) -> Jail:
|
|
30
|
+
self._cfg.exec_bin = Exe(path=args[0], arg=list(args[1:]))
|
|
31
|
+
return self
|
|
32
|
+
|
|
33
|
+
def sh(self, script: str) -> Jail:
|
|
34
|
+
self._cfg.exec_bin = Exe(path="/bin/sh", arg=["-c", script])
|
|
35
|
+
return self
|
|
36
|
+
|
|
37
|
+
def python(self, *args: str) -> Jail:
|
|
38
|
+
self._cfg.exec_bin = Exe(path="/usr/bin/python3", arg=list(args))
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
def bash(self, *args: str) -> Jail:
|
|
42
|
+
self._cfg.exec_bin = Exe(path="/bin/bash", arg=list(args))
|
|
43
|
+
return self
|
|
44
|
+
|
|
45
|
+
# --- Resource limits ---
|
|
46
|
+
|
|
47
|
+
def timeout(self, seconds: int) -> Jail:
|
|
48
|
+
self._cfg.time_limit = seconds
|
|
49
|
+
return self
|
|
50
|
+
|
|
51
|
+
def memory(self, amount: int, unit: Literal["MB", "GB"] = "MB") -> Jail:
|
|
52
|
+
if unit == "GB":
|
|
53
|
+
memory_mb = amount * 1024
|
|
54
|
+
else:
|
|
55
|
+
memory_mb = amount
|
|
56
|
+
apply_cgroup_limits(self._cfg, memory_mb=memory_mb)
|
|
57
|
+
return self
|
|
58
|
+
|
|
59
|
+
def cpu(self, ms_per_sec: int) -> Jail:
|
|
60
|
+
apply_cgroup_limits(self._cfg, cpu_ms_per_sec=ms_per_sec)
|
|
61
|
+
return self
|
|
62
|
+
|
|
63
|
+
def pids(self, max_pids: int) -> Jail:
|
|
64
|
+
apply_cgroup_limits(self._cfg, pids_max=max_pids)
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
# --- Namespace control ---
|
|
68
|
+
|
|
69
|
+
def no_network(self) -> Jail:
|
|
70
|
+
self._cfg.clone_newnet = True
|
|
71
|
+
return self
|
|
72
|
+
|
|
73
|
+
def network(self) -> Jail:
|
|
74
|
+
self._cfg.clone_newnet = False
|
|
75
|
+
return self
|
|
76
|
+
|
|
77
|
+
# --- Filesystem ---
|
|
78
|
+
|
|
79
|
+
def readonly_root(self) -> Jail:
|
|
80
|
+
apply_readonly_root(self._cfg)
|
|
81
|
+
return self
|
|
82
|
+
|
|
83
|
+
def writable(self, path: str, *, tmpfs: bool = False, size: str | None = None) -> Jail:
|
|
84
|
+
if tmpfs:
|
|
85
|
+
options = f"size={size}" if size else None
|
|
86
|
+
self._cfg.mount.append(
|
|
87
|
+
MountPt(dst=path, fstype="tmpfs", rw=True, is_dir=True, options=options)
|
|
88
|
+
)
|
|
89
|
+
else:
|
|
90
|
+
self._cfg.mount.append(
|
|
91
|
+
MountPt(src=path, dst=path, is_bind=True, rw=True)
|
|
92
|
+
)
|
|
93
|
+
return self
|
|
94
|
+
|
|
95
|
+
def mount(self, src: str, dst: str, *, readonly: bool = False) -> Jail:
|
|
96
|
+
self._cfg.mount.append(
|
|
97
|
+
MountPt(src=src, dst=dst, is_bind=True, rw=not readonly)
|
|
98
|
+
)
|
|
99
|
+
return self
|
|
100
|
+
|
|
101
|
+
# --- Environment ---
|
|
102
|
+
|
|
103
|
+
def env(self, var: str) -> Jail:
|
|
104
|
+
self._cfg.envar.append(var)
|
|
105
|
+
return self
|
|
106
|
+
|
|
107
|
+
def cwd(self, path: str) -> Jail:
|
|
108
|
+
self._cfg.cwd = path
|
|
109
|
+
return self
|
|
110
|
+
|
|
111
|
+
# --- Security ---
|
|
112
|
+
|
|
113
|
+
def seccomp_log(self) -> Jail:
|
|
114
|
+
apply_seccomp_log(self._cfg)
|
|
115
|
+
return self
|
|
116
|
+
|
|
117
|
+
def uid_map(self, *, inside: int = 0, outside: int = 1000, count: int = 1) -> Jail:
|
|
118
|
+
self._cfg.uidmap.append(
|
|
119
|
+
IdMap(inside_id=str(inside), outside_id=str(outside), count=count)
|
|
120
|
+
)
|
|
121
|
+
return self
|
|
122
|
+
|
|
123
|
+
# --- Execution ---
|
|
124
|
+
|
|
125
|
+
def run(self, *, runner: Runner | None = None, **run_kwargs: object) -> NsJailResult:
|
|
126
|
+
"""Execute the built config via a Runner."""
|
|
127
|
+
from nsjail.runner import Runner as _Runner
|
|
128
|
+
|
|
129
|
+
r = runner or _Runner()
|
|
130
|
+
temp = _Runner(
|
|
131
|
+
base_config=self._cfg,
|
|
132
|
+
nsjail_path=r._nsjail_path,
|
|
133
|
+
render_mode=r._render_mode,
|
|
134
|
+
capture_output=r._capture_output,
|
|
135
|
+
keep_config=r._keep_config,
|
|
136
|
+
)
|
|
137
|
+
return temp.run(**run_kwargs)
|
|
138
|
+
|
|
139
|
+
async def async_run(self, *, runner: Runner | None = None, **run_kwargs: object) -> NsJailResult:
|
|
140
|
+
"""Execute the built config asynchronously via a Runner."""
|
|
141
|
+
from nsjail.runner import Runner as _Runner
|
|
142
|
+
|
|
143
|
+
r = runner or _Runner()
|
|
144
|
+
temp = _Runner(
|
|
145
|
+
base_config=self._cfg,
|
|
146
|
+
nsjail_path=r._nsjail_path,
|
|
147
|
+
render_mode=r._render_mode,
|
|
148
|
+
capture_output=r._capture_output,
|
|
149
|
+
keep_config=r._keep_config,
|
|
150
|
+
)
|
|
151
|
+
return await temp.async_run(**run_kwargs)
|
nsjail/config.py
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# GENERATED from nsjail config.proto — DO NOT EDIT
|
|
2
|
+
# Re-run: python -m _codegen.generate
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from enum import IntEnum
|
|
8
|
+
|
|
9
|
+
from nsjail.enums import LogLevel, Mode, RLimitType
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class UserNet:
|
|
14
|
+
enable: bool = False
|
|
15
|
+
ip: str = "10.255.255.2"
|
|
16
|
+
mask: str = "255.255.255.0"
|
|
17
|
+
gw: str = "10.255.255.1"
|
|
18
|
+
ip6: str = "fc00::2"
|
|
19
|
+
mask6: str = "64"
|
|
20
|
+
gw6: str = "fc00::1"
|
|
21
|
+
ns_iface: str = "eth0"
|
|
22
|
+
tcp_ports: str = "none"
|
|
23
|
+
udp_ports: str = "none"
|
|
24
|
+
enable_ip4_dhcp: bool = False
|
|
25
|
+
enable_dns: bool = False
|
|
26
|
+
dns_forward: str = ""
|
|
27
|
+
enable_tcp: bool = True
|
|
28
|
+
enable_udp: bool = True
|
|
29
|
+
enable_icmp: bool = True
|
|
30
|
+
no_map_gw: bool = False
|
|
31
|
+
enable_ip6_dhcp: bool = False
|
|
32
|
+
enable_ip6_ra: bool = False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class IdMap:
|
|
37
|
+
inside_id: str = ""
|
|
38
|
+
outside_id: str = ""
|
|
39
|
+
count: int = 1
|
|
40
|
+
use_newidmap: bool = False
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class MountPt:
|
|
45
|
+
src: str | None = None
|
|
46
|
+
prefix_src_env: str | None = None
|
|
47
|
+
src_content: bytes | None = None
|
|
48
|
+
dst: str | None = None
|
|
49
|
+
prefix_dst_env: str | None = None
|
|
50
|
+
fstype: str | None = None
|
|
51
|
+
options: str | None = None
|
|
52
|
+
is_bind: bool = False
|
|
53
|
+
rw: bool = False
|
|
54
|
+
is_dir: bool | None = None
|
|
55
|
+
mandatory: bool = True
|
|
56
|
+
is_symlink: bool = False
|
|
57
|
+
nosuid: bool = False
|
|
58
|
+
nodev: bool = False
|
|
59
|
+
noexec: bool = False
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class Exe:
|
|
64
|
+
path: str | None = None
|
|
65
|
+
arg: list[str] = field(default_factory=list)
|
|
66
|
+
arg0: str | None = None
|
|
67
|
+
exec_fd: bool = False
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class NsJailConfig:
|
|
72
|
+
name: str | None = None
|
|
73
|
+
description: list[str] = field(default_factory=list)
|
|
74
|
+
mode: Mode = Mode.ONCE
|
|
75
|
+
hostname: str = "NSJAIL"
|
|
76
|
+
cwd: str = "/"
|
|
77
|
+
no_pivotroot: bool = False
|
|
78
|
+
port: int = 0
|
|
79
|
+
bindhost: str = "::"
|
|
80
|
+
max_conns: int = 0
|
|
81
|
+
max_conns_per_ip: int = 0
|
|
82
|
+
time_limit: int = 600
|
|
83
|
+
daemon: bool = False
|
|
84
|
+
max_cpus: int = 0
|
|
85
|
+
nice_level: int = 19
|
|
86
|
+
log_fd: int | None = None
|
|
87
|
+
log_file: str | None = None
|
|
88
|
+
log_level: LogLevel | None = None
|
|
89
|
+
keep_env: bool = False
|
|
90
|
+
envar: list[str] = field(default_factory=list)
|
|
91
|
+
keep_caps: bool = False
|
|
92
|
+
cap: list[str] = field(default_factory=list)
|
|
93
|
+
silent: bool = False
|
|
94
|
+
skip_setsid: bool = False
|
|
95
|
+
stderr_to_null: bool = False
|
|
96
|
+
pass_fd: list[int] = field(default_factory=list)
|
|
97
|
+
disable_no_new_privs: bool = False
|
|
98
|
+
forward_signals: bool = False
|
|
99
|
+
disable_tsc: bool = False
|
|
100
|
+
rlimit_as: int = 4096
|
|
101
|
+
rlimit_as_type: RLimitType = RLimitType.VALUE
|
|
102
|
+
rlimit_core: int = 0
|
|
103
|
+
rlimit_core_type: RLimitType = RLimitType.VALUE
|
|
104
|
+
rlimit_cpu: int = 600
|
|
105
|
+
rlimit_cpu_type: RLimitType = RLimitType.VALUE
|
|
106
|
+
rlimit_fsize: int = 1
|
|
107
|
+
rlimit_fsize_type: RLimitType = RLimitType.VALUE
|
|
108
|
+
rlimit_nofile: int = 32
|
|
109
|
+
rlimit_nofile_type: RLimitType = RLimitType.VALUE
|
|
110
|
+
rlimit_nproc: int = 1024
|
|
111
|
+
rlimit_nproc_type: RLimitType = RLimitType.SOFT
|
|
112
|
+
rlimit_stack: int = 8
|
|
113
|
+
rlimit_stack_type: RLimitType = RLimitType.SOFT
|
|
114
|
+
rlimit_memlock: int = 64
|
|
115
|
+
rlimit_memlock_type: RLimitType = RLimitType.SOFT
|
|
116
|
+
rlimit_rtprio: int = 0
|
|
117
|
+
rlimit_rtprio_type: RLimitType = RLimitType.SOFT
|
|
118
|
+
rlimit_msgqueue: int = 1024
|
|
119
|
+
rlimit_msgqueue_type: RLimitType = RLimitType.SOFT
|
|
120
|
+
disable_rl: bool = False
|
|
121
|
+
persona_addr_compat_layout: bool = False
|
|
122
|
+
persona_mmap_page_zero: bool = False
|
|
123
|
+
persona_read_implies_exec: bool = False
|
|
124
|
+
persona_addr_limit_3gb: bool = False
|
|
125
|
+
persona_addr_no_randomize: bool = False
|
|
126
|
+
clone_newnet: bool = True
|
|
127
|
+
clone_newuser: bool = True
|
|
128
|
+
clone_newns: bool = True
|
|
129
|
+
clone_newpid: bool = True
|
|
130
|
+
clone_newipc: bool = True
|
|
131
|
+
clone_newuts: bool = True
|
|
132
|
+
clone_newcgroup: bool = True
|
|
133
|
+
clone_newtime: bool = False
|
|
134
|
+
uidmap: list[IdMap] = field(default_factory=list)
|
|
135
|
+
gidmap: list[IdMap] = field(default_factory=list)
|
|
136
|
+
mount_proc: bool = False
|
|
137
|
+
mount: list[MountPt] = field(default_factory=list)
|
|
138
|
+
seccomp_policy_file: str | None = None
|
|
139
|
+
seccomp_string: list[str] = field(default_factory=list)
|
|
140
|
+
seccomp_log: bool = False
|
|
141
|
+
cgroup_mem_max: int = 0
|
|
142
|
+
cgroup_mem_memsw_max: int = 0
|
|
143
|
+
cgroup_mem_swap_max: int = -1
|
|
144
|
+
cgroup_mem_mount: str = "/sys/fs/cgroup/memory"
|
|
145
|
+
cgroup_mem_parent: str = "NSJAIL"
|
|
146
|
+
cgroup_pids_max: int = 0
|
|
147
|
+
cgroup_pids_mount: str = "/sys/fs/cgroup/pids"
|
|
148
|
+
cgroup_pids_parent: str = "NSJAIL"
|
|
149
|
+
cgroup_net_cls_classid: int = 0
|
|
150
|
+
cgroup_net_cls_mount: str = "/sys/fs/cgroup/net_cls"
|
|
151
|
+
cgroup_net_cls_parent: str = "NSJAIL"
|
|
152
|
+
cgroup_cpu_ms_per_sec: int = 0
|
|
153
|
+
cgroup_cpu_mount: str = "/sys/fs/cgroup/cpu"
|
|
154
|
+
cgroup_cpu_parent: str = "NSJAIL"
|
|
155
|
+
cgroupv2_mount: str = "/sys/fs/cgroup"
|
|
156
|
+
use_cgroupv2: bool = False
|
|
157
|
+
detect_cgroupv2: bool = False
|
|
158
|
+
iface_no_lo: bool = False
|
|
159
|
+
iface_own: list[str] = field(default_factory=list)
|
|
160
|
+
macvlan_iface: str | None = None
|
|
161
|
+
macvlan_vs_ip: str = "192.168.0.2"
|
|
162
|
+
macvlan_vs_nm: str = "255.255.255.0"
|
|
163
|
+
macvlan_vs_gw: str = "192.168.0.1"
|
|
164
|
+
macvlan_vs_ma: str = ""
|
|
165
|
+
macvlan_vs_mo: str = "private"
|
|
166
|
+
user_net: UserNet | None = None
|
|
167
|
+
exec_bin: Exe | None = None
|
|
168
|
+
|