#!/usr/bin/env python import argparse import shutil from datetime import datetime from lxml import etree desc = """ Fix shed_data_manager_conf.xml Modifies the guid and version attribute of data_manager tags: - the version in the guid (text after the last slash) is replaced by the data manager tool version - the version attribute is set to the data manager tool version By default only data managers with duplicated guid are modified and version attributes are not added if absent. A copy of the original file with a time stamp appended to the name is created. Note, if there are versions of the data manager tool that have the same version there will still be DMs with duplicated guids. These need to be corrected manually. """ parser = argparse.ArgumentParser(description=desc) parser.add_argument( "shed_data_manager_conf", metavar="CONFIG_FILE", type=str, default="config/shed_data_manager_conf.xml", help="an integer for the accumulator", ) parser.add_argument( "--all-entries", action="store_true", help="modify all entries (default only those with duplicated guid)" ) parser.add_argument("--add-version", action="store_true", help="also add version attribute if absent") parser.add_argument("--dry-run", action="store_true", help="do not write resulting config file") args = parser.parse_args() with open(args.shed_data_manager_conf) as fh: tree = etree.parse(args.shed_data_manager_conf) root = tree.getroot() guid_mapping = {} for dm in root.iter("data_manager"): guid = dm.attrib["guid"] if guid not in guid_mapping: guid_mapping[guid] = [dm] else: guid_mapping[guid].append(dm) for guid in guid_mapping: if len(guid_mapping[guid]) > 1: print(f"{guid} found {len(guid_mapping[guid])}x") elif not args.all_entries: continue for dm in guid_mapping[guid]: tool_version = dm.find("./tool/version") tool_version = tool_version.text new_guid = f"{guid[:guid.rfind('/')]}/{tool_version}" dm.attrib["guid"] = new_guid print(f"changing guid: {guid} -> {new_guid}") if "version" in dm.attrib: print(f"changing version: {dm.attrib['version']} -> {tool_version}") dm.attrib["version"] = tool_version elif args.add_version: print(f"adding version: {tool_version}") dm.attrib["version"] = tool_version if not args.dry_run: nfn = args.shed_data_manager_conf + datetime.now().isoformat() print(f"save copy at {nfn}") shutil.copyfile(args.shed_data_manager_conf, nfn) print(f"saving {args.shed_data_manager_conf}") tree.write(args.shed_data_manager_conf)