import argparse import re from io import TextIOWrapper def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Helps transition older CORE services to work with newer versions" ) parser.add_argument( "-f", "--file", dest="file", type=argparse.FileType("r"), help="service file to update", ) return parser.parse_args() def update_service(service_file: TextIOWrapper) -> None: update = [] for line in service_file.readlines(): # update service attributes line = re.sub(r"^(\s+)_([a-z])", r"\1\2", line) # rename dirs to directories line = re.sub(r"^(\s+)dirs", r"\1directories", line) # fix import states for service line = re.sub( r"^.+import.+CoreService.+$", r"from core.services.coreservices import CoreService", line, ) # fix method signatures line = re.sub( r"def generateconfig\(cls, node, filename, services\)", r"def generate_config(cls, node, filename)", line, ) line = re.sub( r"def getvalidate\(cls, node, services\)", r"def get_validate(cls, node)", line, ) line = re.sub( r"def getstartup\(cls, node, services\)", r"def get_startup(cls, node)", line, ) line = re.sub( r"def getconfigfilenames\(cls, nodenum, services\)", r"def get_configs(cls, node)", line, ) # remove unwanted lines if re.search(r"addservice\(", line): continue if re.search(r"from.+\.ipaddr|import ipaddr", line): continue if re.search(r"from.+\.ipaddress|import ipaddress", line): continue # add modified line to make updated copy update.append(line) service_file.close() with open(f"{service_file.name}.update", "w") as f: f.writelines(update) if __name__ == "__main__": args = parse_args() update_service(args.file)