Newer
Older
certbot-dns-inwx / update-record.py
#!/usr/bin/env python3
# -*- encoding: UTF8 -*-

# author: Pascal Gollor (https://gitbucket.pgollor.de)


from INWX.Domrobot import ApiClient
from configuration import get_account_data
import argparse


def errorCheck(ret):
	if (ret['code'] != 1000):
		raise RuntimeError('[ERROR] Code: ' + str(ret['code']) + ' Message: ' + ret['msg'])
	# end if

	return ret
# end errorCheck


def main(args):
	verbose = args.verbose
	domain = args.domain

	# split domain
	h = domain.split('.')
	if (len(h) < 3):
		raise ValueError("invalid subdomain")
	sub = h[0]
	for i in range(1, len(h)-2):
		sub += '.' + h[i]
	domain = h[-2] + '.' + h[-1]

	if (args.debug):
		print(args)

	# get config and login
	username, password, shared_secret = get_account_data(True, config_file=args.config_file, config_section=args.config_section)
	debug_mode = False
	api_url = ApiClient.API_LIVE_URL
	if (args.config_section == "ote"):
		debug_mode = True
		api_url = ApiClient.API_OTE_URL
	api_client = ApiClient(api_url=api_url, debug_mode=debug_mode)
	ret = errorCheck(api_client.login(username, password))
	if (verbose):
		print("login:", ret)


	# check domain
	ret = errorCheck(api_client.call_api(api_method='nameserver.list', method_params={'domain': domain}))
	if (verbose):
		print('list:', ret)
	if (ret['resData']['count'] == 0):
		raise RuntimeError("You are not user of this domain.")


	# looking if subdomain exists
	ret = errorCheck(api_client.call_api(api_method='nameserver.info', method_params={'domain': domain}))
	records = ret['resData']['record']

	content = str(args.content)
	if (args.delete or args.update):
		recordFound = False
		for r in records:
			if (r['name'] == args.domain and r['type'] == args.record_type):
				recordFound = True
				if (verbose):
					print('entry:', r)

				# delete entry
				if (args.delete):
					# if content is not none: delete only entry with given content.
					if (args.content != None and r['content'] != content):
						continue

					ret = errorCheck(api_client.call_api(api_method='nameserver.deleteRecord', method_params={'id': r['id']}))
					if (verbose):
						print('delete:', ret)
				# update entry
				elif (args.update):
					ret = errorCheck(api_client.call_api(api_method='nameserver.updateRecord', method_params={'id': r['id'], 'type': args.record_type, 'content': content, 'ttl': args.ttl}))
					if (verbose):
						print('update:', ret)
				# end if
			# end if
		# end for

		if (not recordFound):
			raise RuntimeError('No entry available for updating or deleting.')
	else:
		ret = errorCheck(api_client.call_api(api_method='nameserver.createRecord', method_params={'domain': domain, 'name': sub, 'type': args.record_type, 'content': content, 'ttl': args.ttl}))
		if (verbose):
			print('create:', ret)
	# end if

	api_client.logout()

# end main


if __name__ == '__main__':
	parser = argparse.ArgumentParser(description='inwx subdomain update')

	parser.add_argument('domain', metavar='domain', help='full domain like subdomain.example.com')
	parser.add_argument('content', metavar='content', nargs='?', default=None, help='ip or string to fill/update into subdomain domain entry')
	parser.add_argument('-r', '--record-type', metavar='type', required=True, choices=['A', 'AAAA', 'TXT', 'CNAME', 'TLSA'], help='record type (A, AAAA, TXT, CNAME, TLSA)')
	parser.add_argument('--delete', action='store_true', required=False, help='delete existing record with given content, or delete all records if no content is given')
	parser.add_argument('-u', '--update', action='store_true', required=False, help='update all existing records if one exists, otherwise fails')

	parser.add_argument('-c', '--config_file', metavar='path', default='./conf.cfg', help='path to configuration file')
	parser.add_argument('-t', '--ttl', default=3600, type=int, help='TTL (time to live) of the nameserver record in seconds (default 3600)')
	parser.add_argument('-s', '--config_section', metavar='section', default='live', choices=['live', 'ote'], help='configuration section (live, ote) default: live')
	parser.add_argument('-v', '--verbose', action='store_true', help='verbose')
	parser.add_argument('-d', '--debug', action='store_true', help='debug')

	args = parser.parse_args()


	# do some checks
	if (not args.delete and not args.content):
		raise ValueError("Missing content for domain entry.")
	# end if

	if (args.debug):
		main(args)
	else:
		try:
			main(args)
		except NameError as e:
			print(e.args[0])
		except RuntimeError as e:
			print(e.args[0])
		# end try
	# end if

# end if