def main( ): ## args argumentparser = _argparse.ArgumentParser( description = "INWX CLI Frontend" ) argumentparser.add_argument( "-c", "--conf", type = str, dest = "conf", default = _os.path.join(str(_pathlib.Path.home()), ".inwx-conf.json"), metavar = "", help = "path to configuration file", ) argumentparser.add_argument( "-e", "--environment", type = str, dest = "environment", metavar = "", default = None, help = "environment to use; one of the keys in the 'url' file of the configuration; overwrites the configuration value", ) argumentparser.add_argument( "-u", "--username", type = str, dest = "username", metavar = "", default = None, help = "username; overwrites the configuration value", ) argumentparser.add_argument( "-p", "--password", type = str, dest = "password", metavar = "", default = None, help = "password; overwrites the configuration value", ) argumentparser.add_argument( "-b", "--domain-base", type = str, dest = "domain_base", default = None, metavar = "", help = "the domain, which holds the records" ) argumentparser.add_argument( "-n", "--domain-path", type = str, dest = "domain_path", default = None, metavar = "", help = "the record name/sub domain to work with" ) argumentparser.add_argument( "-t", "--type", type = str, dest = "type", default = None, metavar = "", help = "the record type (A, AAAA, TXT, …)" ) argumentparser.add_argument( "-v", "--value", type = str, dest = "value", default = None, metavar = "", help = "value for the record" ) argumentparser.add_argument( "-x", "--challenge-prefix", type = str, dest = "challenge_prefix", metavar = "", default = "_acme-challenge", help = "which subdomain to use for ACME challanges", ) argumentparser.add_argument( "-w", "--delay", type = float, dest = "delay", default = 60.0, metavar = "", help = "seconds to wait at end of certbot auth hook", ) argumentparser.add_argument( type = str, dest = "action", choices = [ "conf-schema", "info", "list", "save", "delete", "certbot-hook", ], metavar = "", help = string_coin( "action to execute; options:\n{{options}}", { "options": convey( [ {"name": "conf-schema", "requirements": []}, {"name": "info", "requirements": []}, {"name": "list", "requirements": [""]}, {"name": "save", "requirements": ["", "", "", ""]}, {"name": "delete", "requirements": ["", ""]}, {"name": "certbot-hook", "requirements": []}, ], [ lambda x: map( lambda entry: string_coin( "{{name}}{{macro_requirements}}", { "name": entry["name"], "macro_requirements": ( "" if (len(entry["requirements"]) <= 0) else string_coin( " (requires: {{requirements}})", { "requirements": ",".join(entry["requirements"]), } ) ), } ), x ), " | ".join, ] ) } ), ) arguments = argumentparser.parse_args() ## conf conf_load(arguments.conf) ## vars environment = (arguments.environment or conf_get("environment")) account_username = (arguments.username or conf_get("account.username")) account_password = (arguments.password or conf_get("account.password")) ## exec if (arguments.action == "conf-schema"): print(_json.dumps(conf_schema(), indent = "\t")) elif (arguments.action == "info"): if (account_username is None): raise ValueError("account username required") else: if (account_password is None): raise ValueError("account password required") else: result = api_macro_info( environment, account_username, account_password ) print(_json.dumps(result, indent = "\t")) elif (arguments.action == "list"): if (account_username is None): raise ValueError("account username required") else: if (account_password is None): raise ValueError("account password required") else: if (arguments.domain_base is None): raise ValueError("domain base required") else: result = api_macro_list( environment, account_username, account_password, arguments.domain_base ) print(_json.dumps(result, indent = "\t")) elif (arguments.action == "save"): if (account_username is None): raise ValueError("account username required") else: if (account_password is None): raise ValueError("account password required") else: if (arguments.domain_base is None): raise ValueError("domain base required") else: if (arguments.domain_base is None): raise ValueError("domain path required") else: if (arguments.type is None): raise ValueError("type required") else: if (arguments.value is None): raise ValueError("value required") else: api_macro_save( environment, account_username, account_password, arguments.domain_base, arguments.domain_path, arguments.type, arguments.value ) elif (arguments.action == "delete"): if (account_username is None): raise ValueError("account username required") else: if (account_password is None): raise ValueError("account password required") else: if (arguments.domain_base is None): raise ValueError("domain base required") else: if (arguments.domain_base is None): raise ValueError("domain path required") else: api_macro_delete( environment, account_username, account_password, arguments.domain_base, arguments.domain_path, arguments.type ) elif (arguments.action == "certbot-hook"): if (account_username is None): raise ValueError("account username required") else: if (account_password is None): raise ValueError("account password required") else: domain_full_parts = _os.environ["CERTBOT_DOMAIN"].split(".") account = ".".join(domain_full_parts[-2:]) concern = ".".join(domain_full_parts[:-2]) domain = account name = (arguments.challenge_prefix + "." + concern) type_ = "TXT" content = _os.environ["CERTBOT_VALIDATION"] api_macro_save( environment, account_username, account_password, domain, name, type_, content ) _time.sleep(arguments.delay) # print(_json.dumps(result, indent = "\t")) else: log("unhandled action '%s'" % (arguments.action, )) try: main() except ValueError as error: _sys.stderr.write("-- %s\n" % str(error))