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 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
+