fix: use configured domain in CoreDNS Corefile generation
Two bugs caused DNS to fail when the domain name changes: 1. generate_corefile() hardcoded 'cell' as the zone name instead of using the configured domain — on startup it would silently reset any domain change back to 'cell' 2. apply_domain() regex replaced ALL non-dot zones (including local.cell) with the new domain → duplicate zone blocks → CoreDNS crash Fix: add a domain parameter to generate_corefile/apply_all_dns_rules, add _configured_domain() helper in app.py, and delegate Corefile updates in apply_domain() to generate_corefile() so the logic is in one place. Also parameterise SERVICE_HOSTS ACL entries via the domain argument. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+9
-22
@@ -401,30 +401,17 @@ class NetworkManager(BaseServiceManager):
|
||||
except Exception as e:
|
||||
warnings.append(f"dnsmasq domain update failed: {e}")
|
||||
|
||||
# 2. Update Corefile: replace old primary zone block with new domain
|
||||
# 2. Regenerate Corefile using generate_corefile so it always stays consistent
|
||||
try:
|
||||
import firewall_manager as _fm
|
||||
corefile = os.path.join(self.config_dir, 'dns', 'Corefile')
|
||||
if os.path.exists(corefile):
|
||||
with open(corefile) as f:
|
||||
content = f.read()
|
||||
import re
|
||||
# Replace first named zone block (not the catch-all .) with new domain
|
||||
# Matches: <word> { ... } blocks (zone names like "cell", "oldname")
|
||||
def replace_zone(m):
|
||||
zone = m.group(1)
|
||||
if zone == '.':
|
||||
return m.group(0) # keep catch-all
|
||||
# Replace zone name with new domain; update file path reference
|
||||
body = m.group(2)
|
||||
body = re.sub(r'file\s+/data/\S+\.zone',
|
||||
f'file /data/{domain}.zone', body)
|
||||
return f'{domain} {{{body}}}'
|
||||
new_content = re.sub(
|
||||
r'(\S+)\s*\{([^}]*)\}',
|
||||
replace_zone, content, flags=re.DOTALL
|
||||
)
|
||||
with open(corefile, 'w') as f:
|
||||
f.write(new_content)
|
||||
peers_file = os.path.join(self.data_dir, 'peers.json')
|
||||
try:
|
||||
import json as _json
|
||||
peers = _json.loads(open(peers_file).read()) if os.path.exists(peers_file) else []
|
||||
except Exception:
|
||||
peers = []
|
||||
_fm.generate_corefile(peers, corefile, domain)
|
||||
except Exception as e:
|
||||
warnings.append(f"Corefile domain update failed: {e}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user