#!/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