stages/org.osbuild.dnf.config: Edit /etc/dnf/dnf.conf

Fixes #906
This commit is contained in:
Sanne Raymaekers 2021-12-08 14:21:50 +01:00 committed by Tomáš Hozza
parent c825c7e4fa
commit 5b3ebd7912
4 changed files with 80 additions and 4 deletions

View file

@ -6,8 +6,9 @@ The stage changes persistent DNF configuration on the filesystem. Currently,
only DNF variables can be defined.
"""
import os
import sys
import iniparse
import osbuild.api
@ -30,6 +31,13 @@ SCHEMA = r"""
"description": "Value of the variable."
}
}
},
"config_main": {
"ip_resolve": {
"type": "string",
"enum": ["4", "IPv4", "6", "IPv6"],
"description": "Determines how DNF resolves host names."
}
}
},
"additionalProperties": false,
@ -41,6 +49,16 @@ SCHEMA = r"""
"items": {
"$ref": "#/definitions/variable"
}
},
"config": {
"additionalProperties": false,
"type": "object",
"description": "DNF global configuration.",
"properties": {
"main": {
"$ref": "#/definitions/config_main"
}
}
}
}
"""
@ -61,12 +79,53 @@ def configure_variable(tree, name, value):
f.write(value + "\n")
def make_value(value):
val = str(value)
return val
def make_section(cfg, name, settings):
if not cfg.has_section(name):
cfg.add_section(name)
for key, value in settings.items():
val = make_value(value)
cfg.set(name, key, val)
def make_dnf_config(tree, config_options):
"""
Merges the given config object into /etc/dnf/dnf.conf, overwriting existing
values.
"""
dnf_config_path = f"{tree}/etc/dnf/dnf.conf"
dnf_config = iniparse.SafeConfigParser()
try:
with open(dnf_config_path, "r") as f:
dnf_config.readfp(f)
except FileNotFoundError:
print(f"Warning: DNF configuration file '{dnf_config_path}' does not exist, will create it.")
os.makedirs(f"{tree}/etc/dnf", exist_ok=True)
for section, items in config_options.items():
make_section(dnf_config, section, items)
with open(dnf_config_path, "w") as f:
os.fchmod(f.fileno(), 0o644)
dnf_config.write(f)
def main(tree, options):
variables = options.get("variables", [])
for variable in variables:
configure_variable(tree, variable["name"], variable["value"])
config_options = options.get("config")
if config_options:
make_dnf_config(tree, config_options)
return 0

View file

@ -500,7 +500,12 @@
"name": "releasever",
"value": "8.4"
}
]
],
"config": {
"main": {
"ip_resolve": "4"
}
}
}
}
]

View file

@ -37,7 +37,12 @@
"name": "releasever",
"value": "8.4"
}
]
],
"config": {
"main": {
"ip_resolve": "4"
}
}
}
}
]

View file

@ -3,5 +3,12 @@
"/etc/dnf/vars/releasever"
],
"deleted_files": [],
"differences": {}
"differences": {
"/etc/dnf/dnf.conf": {
"content": [
"sha256:c517559154f0de26716dd6464fbf524aeebf965cb8cf89ebde69e51355633878",
"sha256:86795d352e3107dfb5257a9a4466fdc93668ec0776def8f62e211560f6fabeac"
]
}
}
}