Compare commits
2 Commits
4d5569b156
...
6e40ecae05
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e40ecae05 | ||
|
|
0cd6d48bdd |
@ -25,3 +25,7 @@ def run():
|
|||||||
)
|
)
|
||||||
server = uvicorn.Server(config)
|
server = uvicorn.Server(config)
|
||||||
server.run()
|
server.run()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == 'main':
|
||||||
|
run()
|
||||||
|
|||||||
@ -56,9 +56,8 @@ def check_credentials_for_fqdn(
|
|||||||
async def dyndns(
|
async def dyndns(
|
||||||
username: Annotated[str, Depends(check_credentials_for_fqdn)],
|
username: Annotated[str, Depends(check_credentials_for_fqdn)],
|
||||||
fqdn_settings: Annotated[FQDNSettings, Depends(get_fqdn_settings)],
|
fqdn_settings: Annotated[FQDNSettings, Depends(get_fqdn_settings)],
|
||||||
ip: Annotated[list[IPv4Address | IPv6Address | EmptyStr], Query()] = None,
|
ip: Annotated[list[IPv4Address | IPv6Address | EmptyStr], Query(description='IPv4 or IPv6 addresses')] = None,
|
||||||
ipv6lanprefix: Annotated[IPv6Network, Query()] = None,
|
ipv6lanprefix: Annotated[IPv6Network, Query(description='IPv6 Network with Prefix. Will be used to update AAAA records for configured IIDs')] = None
|
||||||
dualstack: Annotated[bool, Query()] = None
|
|
||||||
):
|
):
|
||||||
if ip:
|
if ip:
|
||||||
# remove empty string items
|
# remove empty string items
|
||||||
@ -72,7 +71,7 @@ async def dyndns(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if ip:
|
if ip:
|
||||||
LOGGER.debug(f'DynDNS FQDN {fqdn_settings.fqdn} with IPs {", ".join(map(str, ip))}')
|
LOGGER.debug(f'{username} -DynDNS FQDN {fqdn_settings.fqdn} with IPs {", ".join(map(str, ip))}')
|
||||||
vendor = CONFIG.vendors.get_vendor(fqdn_settings.vendor)
|
vendor = CONFIG.vendors.get_vendor(fqdn_settings.vendor)
|
||||||
await vendor.ensure_fqdn(
|
await vendor.ensure_fqdn(
|
||||||
fqdn=fqdn_settings.fqdn,
|
fqdn=fqdn_settings.fqdn,
|
||||||
@ -86,7 +85,7 @@ async def dyndns(
|
|||||||
# and we have to bitwise OR network address with iid address
|
# and we have to bitwise OR network address with iid address
|
||||||
netaddr_ipv6lanprefix_address = IPNetwork(str(ipv6lanprefix)).network
|
netaddr_ipv6lanprefix_address = IPNetwork(str(ipv6lanprefix)).network
|
||||||
for iid_fqdn, iid in fqdn_settings.ipv6_lan_prefix_iid_map.items():
|
for iid_fqdn, iid in fqdn_settings.ipv6_lan_prefix_iid_map.items():
|
||||||
LOGGER.debug(f'DynDNS IID FQDN {iid_fqdn} {iid} with IPv6 LAN Prefix {ipv6lanprefix}')
|
LOGGER.debug(f'{username} - DynDNS IID FQDN {iid_fqdn} {iid} with IPv6 LAN Prefix {ipv6lanprefix}')
|
||||||
netaddr_iid_address = IPAddress(str(iid))
|
netaddr_iid_address = IPAddress(str(iid))
|
||||||
combined_address = IPv6Address(str(netaddr_ipv6lanprefix_address | netaddr_iid_address))
|
combined_address = IPv6Address(str(netaddr_ipv6lanprefix_address | netaddr_iid_address))
|
||||||
|
|
||||||
|
|||||||
@ -116,6 +116,11 @@ class Vendors(BaseModel):
|
|||||||
hetzner: HetznerSettings = Field(default_factory=HetznerSettings)
|
hetzner: HetznerSettings = Field(default_factory=HetznerSettings)
|
||||||
|
|
||||||
def get_vendor(self, name: VendorNames) -> Vendor:
|
def get_vendor(self, name: VendorNames) -> Vendor:
|
||||||
|
"""
|
||||||
|
returns initialized vendor class
|
||||||
|
|
||||||
|
raises ValueError if vendor is not defined
|
||||||
|
"""
|
||||||
vendor_settings = getattr(self, name, None)
|
vendor_settings = getattr(self, name, None)
|
||||||
if not vendor_settings:
|
if not vendor_settings:
|
||||||
raise ValueError(f'No vendor settings found for name `{name}`')
|
raise ValueError(f'No vendor settings found for name `{name}`')
|
||||||
|
|||||||
8
dyndnshelper/vendors/hetzner.py
vendored
8
dyndnshelper/vendors/hetzner.py
vendored
@ -27,6 +27,9 @@ class HetznerZone(BaseModel):
|
|||||||
name: str
|
name: str
|
||||||
ttl: int
|
ttl: int
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.id}/{self.name}'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def update_dict(self):
|
def update_dict(self):
|
||||||
return self.model_dump(
|
return self.model_dump(
|
||||||
@ -45,6 +48,9 @@ class HetznerRecord(BaseModel):
|
|||||||
value: str
|
value: str
|
||||||
ttl: int
|
ttl: int
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.id}/{self.name}/{self.type}'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def update_dict(self):
|
def update_dict(self):
|
||||||
return self.model_dump(
|
return self.model_dump(
|
||||||
@ -139,7 +145,7 @@ class Hetzner(Vendor):
|
|||||||
return HetznerRecord(**record)
|
return HetznerRecord(**record)
|
||||||
|
|
||||||
async def update_record(self, record: HetznerRecord) -> HetznerRecord:
|
async def update_record(self, record: HetznerRecord) -> HetznerRecord:
|
||||||
self.logger.info(f'Updating {record.id} / {record.type} record {record.name} in zone {record.zone_id}: {record.value}')
|
self.logger.info(f'Updating {record} in zone {record.zone_id}: {record.value}')
|
||||||
response = await self.api_put(
|
response = await self.api_put(
|
||||||
url=f'{self.settings.api_url}/records/{record.id}',
|
url=f'{self.settings.api_url}/records/{record.id}',
|
||||||
json=record.update_dict
|
json=record.update_dict
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user