net/dns: restore resolv.conf when given an empty config in directManager.

Fixes #1720.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson 2021-04-20 15:14:11 -07:00
parent f99e63bb17
commit 3b1ab78954

View File

@ -201,15 +201,53 @@ func (m directManager) backupConfig() error {
return os.Rename(resolvConf, backupConf) return os.Rename(resolvConf, backupConf)
} }
func (m directManager) SetDNS(config OSConfig) error { func (m directManager) restoreBackup() error {
if err := m.backupConfig(); err != nil { if _, err := os.Stat(backupConf); err != nil {
if os.IsNotExist(err) {
// No backup, nothing we can do.
return nil
}
return err
}
owned, err := m.ownedByTailscale()
if err != nil {
return err
}
if _, err := os.Stat(resolvConf); err != nil && !os.IsNotExist(err) {
return err
}
resolvConfExists := !os.IsNotExist(err)
if resolvConfExists && !owned {
// There's already a non-tailscale config in place, get rid of
// our backup.
os.Remove(backupConf)
return nil
}
// We own resolv.conf, and a backup exists.
if err := os.Rename(backupConf, resolvConf); err != nil {
return err return err
} }
buf := new(bytes.Buffer) return nil
writeResolvConf(buf, config.Nameservers, config.SearchDomains) }
if err := atomicfile.WriteFile(resolvConf, buf.Bytes(), 0644); err != nil {
return err func (m directManager) SetDNS(config OSConfig) error {
if config.Equal(OSConfig{}) {
if err := m.restoreBackup(); err != nil {
return err
}
} else {
if err := m.backupConfig(); err != nil {
return err
}
buf := new(bytes.Buffer)
writeResolvConf(buf, config.Nameservers, config.SearchDomains)
if err := atomicfile.WriteFile(resolvConf, buf.Bytes(), 0644); err != nil {
return err
}
} }
// We might have taken over a configuration managed by resolved, // We might have taken over a configuration managed by resolved,