1717import ContainerizationOCI
1818import ContainerizationOS
1919
20+ /// User-friendly Linux capabilities configuration
21+ public struct LinuxCapabilities : Sendable {
22+ /// Capabilities that define the maximum set of capabilities a process can have
23+ public var bounding : [ CapabilityName ] = [ ]
24+ /// Capabilities that are actually in effect for the current process
25+ public var effective : [ CapabilityName ] = [ ]
26+ /// Capabilities that can be inherited by child processes
27+ public var inheritable : [ CapabilityName ] = [ ]
28+ /// Capabilities that are currently permitted for the process
29+ public var permitted : [ CapabilityName ] = [ ]
30+ /// Capabilities that are preserved across execve() calls
31+ public var ambient : [ CapabilityName ] = [ ]
32+
33+ /// Grant all capabilities
34+ public static let allCapabilities = LinuxCapabilities (
35+ bounding: CapabilityName . allCases,
36+ effective: CapabilityName . allCases,
37+ inheritable: CapabilityName . allCases,
38+ permitted: CapabilityName . allCases,
39+ ambient: CapabilityName . allCases
40+ )
41+
42+ /// Default configuration
43+ public static let defaultOCICapabilities = LinuxCapabilities (
44+ bounding: [
45+ . chown,
46+ . dacOverride,
47+ . fsetid,
48+ . fowner,
49+ . mknod,
50+ . netRaw,
51+ . setgid,
52+ . setuid,
53+ . setfcap,
54+ . setpcap,
55+ . netBindService,
56+ . sysChroot,
57+ . kill,
58+ . auditWrite,
59+ ] ,
60+ effective: [
61+ . chown,
62+ . dacOverride,
63+ . fsetid,
64+ . fowner,
65+ . mknod,
66+ . netRaw,
67+ . setgid,
68+ . setuid,
69+ . setfcap,
70+ . setpcap,
71+ . netBindService,
72+ . sysChroot,
73+ . kill,
74+ . auditWrite,
75+ ] ,
76+ permitted: [
77+ . chown,
78+ . dacOverride,
79+ . fsetid,
80+ . fowner,
81+ . mknod,
82+ . netRaw,
83+ . setgid,
84+ . setuid,
85+ . setfcap,
86+ . setpcap,
87+ . netBindService,
88+ . sysChroot,
89+ . kill,
90+ . auditWrite,
91+ ] ,
92+ )
93+
94+ public init (
95+ bounding: [ CapabilityName ] = [ ] ,
96+ effective: [ CapabilityName ] = [ ] ,
97+ inheritable: [ CapabilityName ] = [ ] ,
98+ permitted: [ CapabilityName ] = [ ] ,
99+ ambient: [ CapabilityName ] = [ ]
100+ ) {
101+ self . bounding = bounding
102+ self . effective = effective
103+ self . inheritable = inheritable
104+ self . permitted = permitted
105+ self . ambient = ambient
106+ }
107+
108+ /// Convenience initializer that sets the same capabilities to effective, permitted, and bounding sets
109+ /// This matches the typical pattern used by containerd/runc
110+ public init ( capabilities: [ CapabilityName ] ) {
111+ self . bounding = capabilities
112+ self . effective = capabilities
113+ self . inheritable = [ ]
114+ self . permitted = capabilities
115+ self . ambient = [ ]
116+ }
117+
118+ /// Convert to OCI format for transport
119+ public func toOCI( ) -> ContainerizationOCI . LinuxCapabilities {
120+ ContainerizationOCI . LinuxCapabilities (
121+ bounding: bounding. isEmpty ? nil : bounding. map { $0. description } ,
122+ effective: effective. isEmpty ? nil : effective. map { $0. description } ,
123+ inheritable: inheritable. isEmpty ? nil : inheritable. map { $0. description } ,
124+ permitted: permitted. isEmpty ? nil : permitted. map { $0. description } ,
125+ ambient: ambient. isEmpty ? nil : ambient. map { $0. description }
126+ )
127+ }
128+ }
129+
20130public struct LinuxProcessConfiguration : Sendable {
21131 /// The default PATH value for a process.
22132 public static let defaultPath = " /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin "
@@ -31,6 +141,8 @@ public struct LinuxProcessConfiguration: Sendable {
31141 public var user : ContainerizationOCI . User = . init( )
32142 /// The rlimits for the container process.
33143 public var rlimits : [ POSIXRlimit ] = [ ]
144+ /// The Linux capabilities for the container process.
145+ public var capabilities : LinuxCapabilities = . allCapabilities
34146 /// Whether to allocate a pseudo terminal for the process. If you'd like interactive
35147 /// behavior and are planning to use a terminal for stdin/out/err on the client side,
36148 /// this should likely be set to true.
@@ -50,6 +162,7 @@ public struct LinuxProcessConfiguration: Sendable {
50162 workingDirectory: String = " / " ,
51163 user: ContainerizationOCI . User = . init( ) ,
52164 rlimits: [ POSIXRlimit ] = [ ] ,
165+ capabilities: LinuxCapabilities = . allCapabilities,
53166 terminal: Bool = false ,
54167 stdin: ReaderStream ? = nil ,
55168 stdout: Writer ? = nil ,
@@ -60,6 +173,7 @@ public struct LinuxProcessConfiguration: Sendable {
60173 self . workingDirectory = workingDirectory
61174 self . user = user
62175 self . rlimits = rlimits
176+ self . capabilities = capabilities
63177 self . terminal = terminal
64178 self . stdin = stdin
65179 self . stdout = stdout
@@ -92,6 +206,7 @@ public struct LinuxProcessConfiguration: Sendable {
92206 args: self . arguments,
93207 cwd: self . workingDirectory,
94208 env: self . environmentVariables,
209+ capabilities: self . capabilities. toOCI ( ) ,
95210 user: self . user,
96211 rlimits: self . rlimits,
97212 terminal: self . terminal
0 commit comments