Compare commits

..

No commits in common. "5aba565dd4261293f583a44818612de45b20c2e9" and "1654cf5d761f384199e52b31db73cd6f295bf816" have entirely different histories.

2 changed files with 31 additions and 47 deletions

View file

@ -1,4 +0,0 @@
ci
README.md
requirements.txt
*.yaml

74
main.py
View file

@ -3,7 +3,6 @@
import itertools import itertools
import os import os
import sys import sys
import typing
import logging import logging
import yaml import yaml
@ -16,12 +15,6 @@ from schema import And, Optional, Use, Schema
logger = logging.getLogger('ovhdns') logger = logging.getLogger('ovhdns')
def str_or_list(i: typing.Union[str, typing.List[str]]) -> typing.List[str]:
if isinstance(i, str):
return [i]
return i
config_schema = Schema({ config_schema = Schema({
'ovh': { 'ovh': {
'application_key': Use(str), 'application_key': Use(str),
@ -30,7 +23,7 @@ config_schema = Schema({
'endpoint': Use(str), 'endpoint': Use(str),
}, },
'zone': Use(str), 'zone': Use(str),
Optional('subdomain', default=''): Use(str_or_list), Optional('subdomain', default=''): Use(str),
Optional('field_type', default='A'): And(Use(str), Use(str.upper), dns.rdatatype.RdataType.make), Optional('field_type', default='A'): And(Use(str), Use(str.upper), dns.rdatatype.RdataType.make),
Optional('logging', default={'level': ':WARNING,ovhdns:INFO'}): { Optional('logging', default={'level': ':WARNING,ovhdns:INFO'}): {
Optional('level', default=':WARNING,ovhdns:INFO'): Use(str), Optional('level', default=':WARNING,ovhdns:INFO'): Use(str),
@ -115,49 +108,44 @@ def main(config, level, force_refresh):
logger.debug('Found records %d:', len(records)) logger.debug('Found records %d:', len(records))
for r in records: for r in records:
logger.debug(' - %s', repr(r)) logger.debug(' - %s', repr(r))
logging.info('matching against subdomains %s', config['subdomain']) records = [
records_dict = {} r
for subdomain in config['subdomain']: for r in records
records_dict[subdomain] = [ if r['fieldType'] == config['field_type']
r and r['zone'] == config['zone']
for r in records and r['subDomain'] == config['subdomain']
if r['fieldType'] == config['field_type'] ]
and r['zone'] == config['zone'] logger.info('found matching records: %s', records)
and r['subDomain'] == subdomain if len(records) > 1:
] logger.error('found more than one record, don\'t know which to pick')
logger.info('found matching records: %s', records_dict) sys.exit(1)
for v in records_dict.values():
if len(v) > 1:
logger.error('found more than one record, don\'t know which to pick')
sys.exit(1)
my_ips = get_my_ips() my_ips = get_my_ips()
need_refresh = False need_refresh = False
for subdomain, records in records_dict.items(): if len(records) == 1:
if len(records) == 1: logger.info('record already present, updating if needed')
logger.info('record already present, updating if needed') if my_ips[0] == records[0]['target']:
if my_ips[0] == records[0]['target']: logger.info('ip is up-to-date, skipping update')
logger.info('ip is up-to-date, skipping update')
else:
need_refresh = True
ovh_client.put(
f'/domain/zone/{config["zone"]}/record/{records[0]["id"]}',
target=my_ips[0],
ttl=config['ttl'],
)
logger.info('updated record, new ip is %s', my_ips[0])
else: else:
logger.info('record not already present, creating new one')
need_refresh = True need_refresh = True
ovh_client.post( ovh_client.put(
f'/domain/zone/{config["zone"]}/record/', f'/domain/zone/{config["zone"]}/record/{records[0]["id"]}',
subDomain=subdomain,
target=my_ips[0], target=my_ips[0],
fieldType=config['field_type'],
ttl=config['ttl'], ttl=config['ttl'],
) )
logger.info('created new record, ip is %s', my_ips[0]) logger.info('updated record, new ip is %s', my_ips[0])
else:
logger.info('record not already present, creating new one')
need_refresh = True
ovh_client.post(
f'/domain/zone/{config["zone"]}/record/',
subDomain=config['subdomain'],
target=my_ips[0],
fieldType=config['field_type'],
ttl=config['ttl'],
)
logger.info('created new record, ip is %s', my_ips[0])
if need_refresh or force_refresh: if need_refresh or force_refresh:
ovh_client.post(f'/domain/zone/{config["zone"]}/refresh') ovh_client.post(f'/domain/zone/{config["zone"]}/refresh')