summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls Piņķis <emils@mullvad.net>2018-10-01 13:35:59 +0100
committerEmīls Piņķis <emils@mullvad.net>2018-10-05 12:09:18 +0100
commit8426f1709f1f47fa95d513df6ea35281a2085386 (patch)
tree6d42e6ee33c5719c7af5f50a25770483592b79b5
parent3818157d2f99b0e6c994c81695876afd88b4353b (diff)
downloadmullvadvpn-8426f1709f1f47fa95d513df6ea35281a2085386.tar.xz
mullvadvpn-8426f1709f1f47fa95d513df6ea35281a2085386.zip
Use NetworkManager to set and reset DNS
-rw-r--r--README.md1
-rw-r--r--talpid-core/src/security/linux/dns/mod.rs15
2 files changed, 12 insertions, 4 deletions
diff --git a/README.md b/README.md
index 8c9a35c418..75930e12c9 100644
--- a/README.md
+++ b/README.md
@@ -146,6 +146,7 @@ sections.
* `"static-file"`: change the `/etc/resolv.conf` file directly
* `"resolvconf"`: use the `resolvconf` program
* `"systemd"`: use systemd's `resolved` service through DBus
+ * `"network-manager"`: use `NetworkManager` service through DBus
## Building and running the Electron GUI app
diff --git a/talpid-core/src/security/linux/dns/mod.rs b/talpid-core/src/security/linux/dns/mod.rs
index b9ebb90b1a..9a5c915061 100644
--- a/talpid-core/src/security/linux/dns/mod.rs
+++ b/talpid-core/src/security/linux/dns/mod.rs
@@ -1,11 +1,12 @@
+mod network_manager;
mod resolvconf;
mod static_resolv_conf;
mod systemd_resolved;
-mod network_manager;
use std::env;
use std::net::IpAddr;
+use self::network_manager::NetworkManager;
use self::resolvconf::Resolvconf;
use self::static_resolv_conf::StaticResolvConf;
use self::systemd_resolved::SystemdResolved;
@@ -21,6 +22,7 @@ error_chain! {
Resolvconf(resolvconf::Error, resolvconf::ErrorKind);
StaticResolvConf(static_resolv_conf::Error, static_resolv_conf::ErrorKind);
SystemdResolved(systemd_resolved::Error, systemd_resolved::ErrorKind);
+ NetworkManager(network_manager::Error, network_manager::ErrorKind);
}
}
@@ -28,6 +30,7 @@ pub enum DnsSettings {
Resolvconf(Resolvconf),
StaticResolvConf(StaticResolvConf),
SystemdResolved(SystemdResolved),
+ NetworkManager(NetworkManager),
}
impl DnsSettings {
@@ -38,13 +41,15 @@ impl DnsSettings {
Some("static-file") => DnsSettings::StaticResolvConf(StaticResolvConf::new()?),
Some("resolvconf") => DnsSettings::Resolvconf(Resolvconf::new()?),
Some("systemd") => DnsSettings::SystemdResolved(SystemdResolved::new()?),
+ Some("network-manager") => DnsSettings::NetworkManager(NetworkManager::new()?),
Some(_) | None => Self::with_detected_dns_manager()?,
})
}
fn with_detected_dns_manager() -> Result<Self> {
- SystemdResolved::new()
- .map(DnsSettings::SystemdResolved)
+ NetworkManager::new()
+ .map(DnsSettings::NetworkManager)
+ .or_else(|_| SystemdResolved::new().map(DnsSettings::SystemdResolved))
.or_else(|_| Resolvconf::new().map(DnsSettings::Resolvconf))
.or_else(|_| StaticResolvConf::new().map(DnsSettings::StaticResolvConf))
.chain_err(|| ErrorKind::NoDnsSettingsManager)
@@ -57,8 +62,9 @@ impl DnsSettings {
Resolvconf(ref mut resolvconf) => resolvconf.set_dns(interface, servers)?,
StaticResolvConf(ref mut static_resolv_conf) => static_resolv_conf.set_dns(servers)?,
SystemdResolved(ref mut systemd_resolved) => {
- systemd_resolved.set_dns(interface, servers)?
+ systemd_resolved.set_dns(interface, &servers)?
}
+ NetworkManager(ref mut network_manager) => network_manager.set_dns(&servers)?,
}
Ok(())
@@ -71,6 +77,7 @@ impl DnsSettings {
Resolvconf(ref mut resolvconf) => resolvconf.reset()?,
StaticResolvConf(ref mut static_resolv_conf) => static_resolv_conf.reset()?,
SystemdResolved(ref mut systemd_resolved) => systemd_resolved.reset()?,
+ NetworkManager(ref mut network_manager) => network_manager.reset()?,
}
Ok(())