resolve: Make path to resolvconf(8) configurable

Prefer the configured command over finding it at the default location
over installing in the configured file.

References strongswan/strongswan#744
This commit is contained in:
Tobias Brunner
2022-12-19 16:12:46 +01:00
parent 2c7f6cd93f
commit dee1916e4c
2 changed files with 34 additions and 13 deletions
+11 -1
View File
@@ -1,5 +1,5 @@
charon.plugins.resolve.file = /etc/resolv.conf charon.plugins.resolve.file = /etc/resolv.conf
File where to add DNS server entries. File where to add DNS server entries if not using resolvconf(8).
charon.plugins.resolve.resolvconf.iface_prefix = lo.inet.ipsec. charon.plugins.resolve.resolvconf.iface_prefix = lo.inet.ipsec.
Prefix used for interface names sent to resolvconf(8). Prefix used for interface names sent to resolvconf(8).
@@ -9,3 +9,13 @@ charon.plugins.resolve.resolvconf.iface_prefix = lo.inet.ipsec.
a valid interface name according to the rules defined by resolvconf. Also, a valid interface name according to the rules defined by resolvconf. Also,
it should have a high priority according to the order defined in it should have a high priority according to the order defined in
**interface-order**(5). **interface-order**(5).
charon.plugins.resolve.resolvconf.path = /sbin/resolvconf
Path/command for resolvconf(8).
Path/command for **resolvconf**(8). The command is executed by a shell, so
"resolvconf" will work if it's in $PATH of the daemon.
If not configured, **resolvconf**(8) will be used if found at the default
location. Otherwise, the file in _charon.plugins.resolve.file_ will be
modfied directly.
+23 -12
View File
@@ -50,9 +50,9 @@ struct private_resolve_handler_t {
char *file; char *file;
/** /**
* Use resolvconf instead of writing directly to resolv.conf * Path/command for resolvconf(8)
*/ */
bool use_resolvconf; char *resolvconf;
/** /**
* Prefix to be used for interface names sent to resolvconf * Prefix to be used for interface names sent to resolvconf
@@ -196,7 +196,7 @@ static bool invoke_resolvconf(private_resolve_handler_t *this, host_t *addr,
/* we use the nameserver's IP address as part of the interface name to /* we use the nameserver's IP address as part of the interface name to
* make them unique */ * make them unique */
process = process_start_shell(NULL, install ? &in : NULL, &out, NULL, process = process_start_shell(NULL, install ? &in : NULL, &out, NULL,
"2>&1 %s %s %s%H", RESOLVCONF_EXEC, "2>&1 %s %s %s%H", this->resolvconf,
install ? "-a" : "-d", this->iface_prefix, addr); install ? "-a" : "-d", this->iface_prefix, addr);
if (!process) if (!process)
@@ -295,7 +295,7 @@ METHOD(attribute_handler_t, handle, bool,
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
if (array_bsearch(this->servers, addr, dns_server_find, &found) == -1) if (array_bsearch(this->servers, addr, dns_server_find, &found) == -1)
{ {
if (this->use_resolvconf) if (this->resolvconf)
{ {
handled = invoke_resolvconf(this, addr, TRUE); handled = invoke_resolvconf(this, addr, TRUE);
} }
@@ -362,7 +362,7 @@ METHOD(attribute_handler_t, release, void,
} }
else else
{ {
if (this->use_resolvconf) if (this->resolvconf)
{ {
invoke_resolvconf(this, addr, FALSE); invoke_resolvconf(this, addr, FALSE);
} }
@@ -483,17 +483,28 @@ resolve_handler_t *resolve_handler_create()
.destroy = _destroy, .destroy = _destroy,
}, },
.mutex = mutex_create(MUTEX_TYPE_DEFAULT), .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
.file = lib->settings->get_str(lib->settings, "%s.plugins.resolve.file", .file = lib->settings->get_str(lib->settings,
RESOLV_CONF, lib->ns), "%s.plugins.resolve.file", RESOLV_CONF, lib->ns),
.resolvconf = lib->settings->get_str(lib->settings,
"%s.plugins.resolve.resolvconf.path",
NULL, lib->ns),
.iface_prefix = lib->settings->get_str(lib->settings,
"%s.plugins.resolve.resolvconf.iface_prefix",
RESOLVCONF_PREFIX, lib->ns),
); );
if (stat(RESOLVCONF_EXEC, &st) == 0) if (!this->resolvconf && stat(RESOLVCONF_EXEC, &st) == 0)
{ {
this->use_resolvconf = TRUE; this->resolvconf = RESOLVCONF_EXEC;
this->iface_prefix = lib->settings->get_str(lib->settings,
"%s.plugins.resolve.resolvconf.iface_prefix",
RESOLVCONF_PREFIX, lib->ns);
} }
if (this->resolvconf)
{
DBG1(DBG_CFG, "using '%s' to install DNS servers", this->resolvconf);
}
else
{
DBG1(DBG_CFG, "install DNS servers in '%s'", this->file);
}
return &this->public; return &this->public;
} }