Skip to content

Commit 2b15f1b

Browse files
committed
vminitd: Fall back to /proc/net/pnp for DNS when nameservers are empty
When configureDns is called with an empty nameservers list, read /proc/net/pnp (written by the kernel IP_PNP DHCP client) and use any nameserver lines found there. This provides automatic DNS configuration for bridge-mode containers without a new RPC or proto change.
1 parent ab507e9 commit 2b15f1b

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

vminitd/Sources/vminitd/Server+GRPC.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,13 +1267,12 @@ extension Initd: Com_Apple_Containerization_Sandbox_V3_SandboxContext.SimpleServ
12671267
request: Com_Apple_Containerization_Sandbox_V3_ConfigureDnsRequest,
12681268
context: GRPCCore.ServerContext
12691269
) async throws -> Com_Apple_Containerization_Sandbox_V3_ConfigureDnsResponse {
1270-
let domain = request.hasDomain ? request.domain : nil
12711270
log.debug(
12721271
"configureDns",
12731272
metadata: [
12741273
"location": "\(request.location)",
12751274
"nameservers": "\(request.nameservers)",
1276-
"domain": "\(domain ?? "")",
1275+
"domain": "\(request.hasDomain ? request.domain : "")",
12771276
"searchDomains": "\(request.searchDomains)",
12781277
"options": "\(request.options)",
12791278
])
@@ -1282,8 +1281,23 @@ extension Initd: Com_Apple_Containerization_Sandbox_V3_SandboxContext.SimpleServ
12821281
let etc = URL(fileURLWithPath: request.location).appendingPathComponent("etc")
12831282
try FileManager.default.createDirectory(atPath: etc.path, withIntermediateDirectories: true)
12841283
let resolvConf = etc.appendingPathComponent("resolv.conf")
1284+
var nameservers = request.nameservers
1285+
var domain = request.hasDomain ? request.domain : nil
1286+
if nameservers.isEmpty,
1287+
let pnp = try? String(contentsOfFile: "/proc/net/pnp", encoding: .utf8)
1288+
{
1289+
let lines = pnp.split(separator: "\n")
1290+
nameservers = lines
1291+
.filter { $0.hasPrefix("nameserver") }
1292+
.compactMap { $0.split(separator: " ").dropFirst().first.map(String.init) }
1293+
if domain == nil {
1294+
domain = lines
1295+
.first { $0.hasPrefix("domain") }
1296+
.flatMap { $0.split(separator: " ").dropFirst().first.map(String.init) }
1297+
}
1298+
}
12851299
let config = DNS(
1286-
nameservers: request.nameservers,
1300+
nameservers: nameservers,
12871301
domain: domain,
12881302
searchDomains: request.searchDomains,
12891303
options: request.options

0 commit comments

Comments
 (0)