nuageinit: implement resolv_conf support

Add support for the 'resolv_conf' cloud-config key which writes
directly to /etc/resolv.conf.
This commit is contained in:
Baptiste Daroussin
2026-06-05 12:06:02 +02:00
parent 797dad91ff
commit 4662263c24
4 changed files with 87 additions and 0 deletions
+32
View File
@@ -837,6 +837,37 @@ local function add_fstab_entry(root, device, mount_point, fstype, options, dump_
return true return true
end end
local function write_resolv_conf(root, config)
local path = root .. "/etc/resolv.conf"
local f = io.open(path, "w")
if not f then
warnmsg("unable to open " .. path .. " for writing")
return
end
if config.domain then
f:write("domain " .. config.domain .. "\n")
end
if config.searchdomains then
f:write("search " .. table.concat(config.searchdomains, " ") .. "\n")
end
if config.sortlist then
f:write("sortlist " .. table.concat(config.sortlist, " ") .. "\n")
end
if config.options then
local opts = {}
for k, v in pairs(config.options) do
table.insert(opts, k .. ":" .. v)
end
f:write("options " .. table.concat(opts, " ") .. "\n")
end
if config.nameservers then
for _, ns in ipairs(config.nameservers) do
f:write("nameserver " .. ns .. "\n")
end
end
f:close()
end
local function remove_fstab_entry(root, mount_point) local function remove_fstab_entry(root, mount_point)
local fstab_path = root .. "/etc/fstab" local fstab_path = root .. "/etc/fstab"
local f = io.open(fstab_path, "r") local f = io.open(fstab_path, "r")
@@ -891,6 +922,7 @@ local n = {
addfile = addfile, addfile = addfile,
add_fstab_entry = add_fstab_entry, add_fstab_entry = add_fstab_entry,
remove_fstab_entry = remove_fstab_entry, remove_fstab_entry = remove_fstab_entry,
write_resolv_conf = write_resolv_conf,
} }
return n return n
+6
View File
@@ -531,6 +531,11 @@ local function disable_root(obj)
end end
end end
local function resolv_conf(obj)
if obj.resolv_conf == nil then return end
nuage.write_resolv_conf(root, obj.resolv_conf)
end
local function mounts(obj) local function mounts(obj)
if obj.mounts == nil then return end if obj.mounts == nil then return end
for _, m in ipairs(obj.mounts) do for _, m in ipairs(obj.mounts) do
@@ -870,6 +875,7 @@ elseif line == "#cloud-config" then
ssh_deletekeys, ssh_deletekeys,
ssh_keys, ssh_keys,
network_config, network_config,
resolv_conf,
disable_root, disable_root,
ssh_pwauth, ssh_pwauth,
runcmd, runcmd,
+17
View File
@@ -195,6 +195,23 @@ The pass number for
.Xr fsck 8 , .Xr fsck 8 ,
defaults to 0. defaults to 0.
.El .El
.It Ic resolv_conf
An object configuring the content of
.Pa /etc/resolv.conf .
.Pp
The following keys are recognized:
.Bl -tag -width "nameservers"
.It nameservers
A list of IP addresses for DNS name servers.
.It searchdomains
A list of search domains.
.It domain
A single domain name.
.It sortlist
A list of IP/netmask sortlist entries.
.It options
A dictionary of resolver options.
.El
.It Ic timezone .It Ic timezone
Sets the system timezone based on the value provided. Sets the system timezone based on the value provided.
.Pp .Pp
+32
View File
@@ -35,6 +35,7 @@ atf_test_case config2_userdata_disable_root
atf_test_case config2_userdata_bootcmd atf_test_case config2_userdata_bootcmd
atf_test_case config2_userdata_manage_etc_hosts atf_test_case config2_userdata_manage_etc_hosts
atf_test_case config2_userdata_mounts atf_test_case config2_userdata_mounts
atf_test_case config2_userdata_resolv_conf
atf_test_case config2_userdata_fqdn_and_hostname atf_test_case config2_userdata_fqdn_and_hostname
atf_test_case config2_userdata_write_files atf_test_case config2_userdata_write_files
@@ -1140,6 +1141,36 @@ EOF
true true
} }
config2_userdata_resolv_conf_head()
{
atf_set "require.user" root
}
config2_userdata_resolv_conf_body()
{
mkdir -p media/nuageinit
setup_test_adduser
printf "{}" > media/nuageinit/meta_data.json
cat > media/nuageinit/user_data <<EOF
#cloud-config
resolv_conf:
nameservers:
- 9.9.9.9
- 149.112.112.112
searchdomains:
- example.com
- test.local
domain: mydomain.local
options:
timeout: "1"
attempts: "2"
sortlist:
- 192.168.1.0/255.255.255.0
EOF
atf_check -o empty /usr/libexec/nuageinit "${PWD}"/media/nuageinit config-2
atf_check -o inline:"domain mydomain.local\nsearch example.com test.local\nsortlist 192.168.1.0/255.255.255.0\noptions timeout:1 attempts:2\nnameserver 9.9.9.9\nnameserver 149.112.112.112\n" cat etc/resolv.conf
true
}
config2_userdata_fqdn_and_hostname_body() config2_userdata_fqdn_and_hostname_body()
{ {
mkdir -p media/nuageinit mkdir -p media/nuageinit
@@ -1190,6 +1221,7 @@ atf_init_test_cases()
atf_add_test_case config2_userdata_bootcmd atf_add_test_case config2_userdata_bootcmd
atf_add_test_case config2_userdata_manage_etc_hosts atf_add_test_case config2_userdata_manage_etc_hosts
atf_add_test_case config2_userdata_mounts atf_add_test_case config2_userdata_mounts
atf_add_test_case config2_userdata_resolv_conf
atf_add_test_case config2_userdata_fqdn_and_hostname atf_add_test_case config2_userdata_fqdn_and_hostname
atf_add_test_case config2_userdata_write_files atf_add_test_case config2_userdata_write_files
} }