fix: DDNS register() always sends public IP and saves token to correct location
Unit Tests / test (push) Successful in 15m27s
Unit Tests / test (push) Successful in 15m27s
Two bugs that prevented registration from working after wizard completion: 1. register(name, '') sent empty IP; server stored blank A record. Now calls _get_public_ip() when ip is empty so the A record is always set correctly. 2. Token was saved to _identity.domain.ddns.token (TypeError when domain is a string) instead of the top-level ddns config where update_ip() reads it. Subdomain also now correctly written to _identity.domain_name. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+14
-12
@@ -386,27 +386,29 @@ class DDNSManager(BaseServiceManager):
|
||||
def register(self, name: str, ip: str) -> dict:
|
||||
"""Register the cell's subdomain with the configured provider.
|
||||
|
||||
Stores the returned token in the identity config under
|
||||
identity['domain']['ddns']['token'] and records the subdomain.
|
||||
Fetches the public IP via ipify when ip is empty.
|
||||
Stores the returned token in the top-level ddns config (where
|
||||
update_ip reads it) and updates _identity.domain_name.
|
||||
Returns the dict from provider.register().
|
||||
"""
|
||||
provider = self.get_provider()
|
||||
if provider is None:
|
||||
raise DDNSError("No DDNS provider configured")
|
||||
|
||||
if not ip:
|
||||
ip = _get_public_ip() or ''
|
||||
|
||||
result = provider.register(name, ip)
|
||||
|
||||
# Persist token + subdomain back into identity
|
||||
identity = self._identity()
|
||||
domain_cfg = dict(identity.get('domain', {}))
|
||||
ddns_cfg = dict(domain_cfg.get('ddns', {}))
|
||||
if 'token' in result:
|
||||
ddns_cfg['token'] = result['token']
|
||||
if 'subdomain' in result:
|
||||
ddns_cfg['subdomain'] = result['subdomain']
|
||||
domain_cfg['ddns'] = ddns_cfg
|
||||
if self.config_manager is not None:
|
||||
self.config_manager.set_identity_field('domain', domain_cfg)
|
||||
# Token lives in the top-level ddns config so update_ip() can find it
|
||||
if 'token' in result:
|
||||
ddns_cfg = dict(self.config_manager.configs.get('ddns', {}))
|
||||
ddns_cfg['token'] = result['token']
|
||||
self.config_manager.set_ddns_config(ddns_cfg)
|
||||
# Keep domain_name in identity up to date
|
||||
if 'subdomain' in result:
|
||||
self.config_manager.set_identity_field('domain_name', result['subdomain'])
|
||||
|
||||
self._last_ip = ip
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user