diff --git a/src/provider/update.py b/src/provider/update.py index 8765a0958..6e64fb9d3 100755 --- a/src/provider/update.py +++ b/src/provider/update.py @@ -27,50 +27,64 @@ def file2url(f): def process_data(data, file): global out_all, out_domains, count - status = data.get("state", "") + status = data.get("status", "") out_provider = " static ref P" + str(count) + ": Provider = Provider {\n" if status == "OK" or status == "PREPARATION" or status == "BROKEN": out_provider += " status: Status::" + status + ",\n" else: - print("ERROR: bad state") - return + raise TypeError("bad status") comment = "" if not "domains" in data: - print("ERROR: no domains found") - return + raise TypeError("no domains found") for domain in data["domains"]: out_domains += " (\"" + domain + "\", &*P" + str(count) + "),\n" comment += domain + ", " out_server = "" + has_imap = False + has_smtp = False if "server" in data: for s in data["server"]: hostname = cleanstr(s.get("hostname", "")) port = int(s.get("port", "")) if hostname == "" or hostname.count(".") < 1 or port <= 0: - print("ERROR: bad hostname or port") - return - out_server += " Server {" - out_server += " protocol: " + s.get("type", "").upper() + "," - out_server += " socket: " + s.get("socket", "").upper() + "," - out_server += " hostname: \"" + hostname + "\"," - out_server += " port: " + str(port) + "," - out_server += " username_pattern: " + s.get("username_pattern", "EMAIL").upper() - out_server += " }\n" + raise TypeError("bad hostname or port") - out_provider += " before_login_hint: \"" + cleanstr(data.get("before_login_hint", "")) + "\",\n" - out_provider += " after_login_hint: \"" + cleanstr(data.get("after_login_hint", "")) + "\",\n" - out_provider += " overview_page: \"" + file2url(file) + "\",\n" - out_provider += " server: vec![\n" + out_server + " ],\n" - out_provider += " };\n\n" + protocol = s.get("type", "").upper() + if protocol == "IMAP": + has_imap = True + elif protocol == "SMTP": + has_smtp = True + else: + raise TypeError("bad protocol") - out_all += " // " + comment.strip(", ") + "\n" + out_provider + socket = s.get("socket", "").upper() + if socket != "STARTTLS" and socket != "SSL": + raise TypeError("bad socket") + + username_pattern = s.get("username_pattern", "EMAIL").upper() + if username_pattern != "EMAIL" and username_pattern != "EMAILLOCALPART": + raise TypeError("bad username pattern") + + out_server += (" Server { protocol: " + protocol + ", socket: " + socket + ", hostname: \"" + + hostname + "\", port: " + str(port) + ", username_pattern: " + username_pattern + " },\n") + + if (not has_imap and not has_smtp) or (has_imap and has_smtp): + out_provider += " before_login_hint: \"" + cleanstr(data.get("before_login_hint", "")) + "\",\n" + out_provider += " after_login_hint: \"" + cleanstr(data.get("after_login_hint", "")) + "\",\n" + out_provider += " overview_page: \"" + file2url(file) + "\",\n" + out_provider += " server: vec![\n" + out_server + " ],\n" + out_provider += " };\n\n" + else: + raise TypeError("SMTP and IMAP must be specified together or left out both") + + out_all += " // " + file[file.rindex("/")+1:] + ": " + comment.strip(", ") + "\n" + out_provider def process_file(file): global count - print("processing file: " + file) + print("processing file: " + file, file=sys.stderr) with open(file) as f: # load_all() loads "---"-separated yamls - # by coincidence, this is also the frontmatter separator :) @@ -80,15 +94,16 @@ def process_file(file): def process_dir(dir): - print("processing directory: " + dir) + print("processing directory: " + dir, file=sys.stderr) files = [f for f in os.listdir(dir) if f.endswith(".md")] + files.sort() for f in files: process_file(os.path.join(dir, f)) if __name__ == "__main__": if len(sys.argv) < 2: - raise SystemExit("need argument: path to dir with md/yaml files") + raise SystemExit("usage: update.py DIR_WITH_MD_FILES > data.rs") out_all = ("// file generated by src/provider/update.py\n\n" "use crate::provider::*;\n"