binserve-config-toolkit/binserve-toolkit.py
2023-09-13 20:43:37 +02:00

69 lines
2.2 KiB
Python

import os
import argparse
import json
import pprint
import xmltodict
parser = argparse.ArgumentParser()
parser.add_argument('--basepath', '-b', dest='basepath', required=True)
parser.add_argument('--binserve-config', '-c', dest='binserve_config', default='config.json')
parser.add_argument('--basedirectory', '-d', dest='basedir', default='public', required=True)
parser.add_argument('--binserve-output', '-o', dest='binserve_output', default='new.binserve.json')
parser.add_argument('--filename', '-f', dest='filename', default='sitemap-0.xml')
parser.add_argument('--skip-file-extension-check', '-s', dest='extensioncheck', action='store_true', default=False)
def main(args: dict):
# Extract args
filename = args.filename
checkfileextension = args.extensioncheck
basepath = args.basepath.rstrip('/')
basedir = args.basedir
config = args.binserve_config
output = args.binserve_output
# Create new data
data = get_xml_content(filename, checkfileextension)
routes = get_url_slugs(basepath, data)
# Modify config
new_config_data = generate_config_entry(routes, basedir)
with open(config, 'r') as file:
configdata = json.load(file)
configdata['routes'] = {**new_config_data, **configdata['routes']}
with open(output, 'w+') as file:
json.dump(configdata, file, indent=4)
def get_xml_content(filename: str, checkfileextension: bool):
if not filename.lower().endswith('.xml') and not checkfileextension:
raise NameError('Wrong file extension')
if not os.path.isfile(filename):
raise FileExistsError('File is missing')
with open(filename, 'r') as file:
data = xmltodict.parse(file.read())
return data
def get_url_slugs(basepath: str, sitemap: dict):
url_slugs = []
for location in sitemap['urlset']['url']:
url_slugs.append(location['loc'].replace(basepath, ''))
return url_slugs
def generate_config_entry(routes, basedir):
routes_config = {}
for route in routes:
routes_config.update({f"{'/' if route == '/' else ''}{route.rstrip('/')}": f"{basedir}{'/' if route == '/' else ''}{route.rstrip('/')}"})
return routes_config
if __name__ == '__main__':
args = parser.parse_args()
main(args)