#!/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 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 = api_client.login(username, password) if (ret['code'] != 1000): raise RuntimeError('Api login error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) if (verbose): print("login: ", ret) # check domain ret = api_client.call_api(api_method='nameserver.list', method_params={'domain': domain}) if (verbose): print('list: ', ret) if (ret['code'] != 1000): raise RuntimeError('Api call error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) if (ret['resData']['count'] == 0): raise RuntimeError("You are not user of this domain.") # looking if subdomain exists subId = -1 ret = api_client.call_api(api_method='nameserver.info', method_params={'domain': domain}) if (ret['code'] != 1000): raise RuntimeError('Api call error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) records = ret['resData']['record'] for r in records: if (r['name'] == args.domain and r['type'] == args.record_type): subId = r['id'] if (verbose): print(r) break # end if # end for if (args.delete): if (subId >= 0): if (verbose): print ("delete id: ", subId) ret = api_client.call_api(api_method='nameserver.deleteRecord', method_params={'id': subId}) if (ret['code'] != 1000): raise RuntimeError('Api call error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) else: ret = None # end if else: if (not args.update or subId < 0): ret = api_client.call_api(api_method='nameserver.createRecord', method_params={'domain': domain, 'name': sub, 'type': args.record_type, 'content': str(args.content), 'ttl': args.ttl}) if (ret['code'] != 1000): raise RuntimeError('Api call error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) if (verbose): print('create: ', ret) else: ret = api_client.call_api(api_method='nameserver.updateRecord', method_params={'id': subId, 'type': args.record_type, 'content': str(args.content), 'ttl': args.ttl}) if (ret['code'] != 1000): raise RuntimeError('Api call error. Code: ' + str(ret['code']) + ' Message: ' + ret['msg']) if (verbose): print('update: ', ret) # end if # 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 into sub 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') parser.add_argument('-u', '--update', action='store_true', required=False, help='update existing record if it exists') 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('-l', '--language', metavar='lang', default='en', choices=['de', 'en'], help='answer language (de, en)') 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