|  | @@ -0,0 +1,97 @@
 | 
	
		
			
				|  |  | +#!/usr/bin/env python3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import json, sys, subprocess, ast
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if len(sys.argv) < 3:
 | 
	
		
			
				|  |  | +    print(f"Error, use {sys.argv[0]} install|update")
 | 
	
		
			
				|  |  | +    sys.exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +settings = sys.argv[1]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +conv = {
 | 
	
		
			
				|  |  | +    "LISTENIP": ("listen.ip", str),
 | 
	
		
			
				|  |  | +    "PORT": ("listen.port", int),
 | 
	
		
			
				|  |  | +    "GIT": ("git", bool),
 | 
	
		
			
				|  |  | +    "BASEPATH": ("basepath.dir", str),
 | 
	
		
			
				|  |  | +    "ENFORCE_BASEPATH": ("basepath.enforce", bool),
 | 
	
		
			
				|  |  | +    "SSL_CERTIFICATE": ("ssl.certificate", str),
 | 
	
		
			
				|  |  | +    "SSL_KEY": ("ssl.key", str),
 | 
	
		
			
				|  |  | +    "IGNORE_SSL": ("ssl.ignore", bool),
 | 
	
		
			
				|  |  | +    "HASS_API": ("hass.api.url", str),
 | 
	
		
			
				|  |  | +    "HASS_WS_API": ("hass.api.ws-url", str),
 | 
	
		
			
				|  |  | +    "HASS_API_PASSWORD": ("hass.api.password", str),
 | 
	
		
			
				|  |  | +    "USERNAME": ("login.username", str),
 | 
	
		
			
				|  |  | +    "PASSWORD": ("login.password", str),
 | 
	
		
			
				|  |  | +    "ALLOWED_NETWORKS": ("allowed.networks", list),
 | 
	
		
			
				|  |  | +    "ALLOWED_DOMAINS": ("allowed.domains", list),
 | 
	
		
			
				|  |  | +    "BANNED_IPS": ("ban.ips", list),
 | 
	
		
			
				|  |  | +    "BANLIMIT": ("ban.limit", list),
 | 
	
		
			
				|  |  | +    "IGNORE_PATTERN": ("ignore-pattern", list),
 | 
	
		
			
				|  |  | +    "DIRSFIRST": ("dirs-first", bool),
 | 
	
		
			
				|  |  | +    "SESAME": ("sesame.key", str),
 | 
	
		
			
				|  |  | +    "SESAME_TOTP_SECRET": ("sesame.secret", str),
 | 
	
		
			
				|  |  | +    "VERIFY_HOSTNAME": ("verify-hostname", bool),
 | 
	
		
			
				|  |  | +    "ENV_PREFIX": ("env-prefix",  str),
 | 
	
		
			
				|  |  | +    "NOTIFY_SERVICE": ("notify-service", str)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def read(param=None):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    with open(settings, "r") as json_file:
 | 
	
		
			
				|  |  | +        obj = json.load(json_file)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if param is None:
 | 
	
		
			
				|  |  | +            return obj
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if param in obj:
 | 
	
		
			
				|  |  | +            return obj[param]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    sys.exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def iterate_obj(obj, orig, i, path=""):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not isinstance(obj, dict):
 | 
	
		
			
				|  |  | +        raise Exception("Invalid data")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for k,v in obj.items():
 | 
	
		
			
				|  |  | +        if isinstance(v, dict):
 | 
	
		
			
				|  |  | +            iterate_obj(v, orig, i, path+k+".")
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            key=path+k
 | 
	
		
			
				|  |  | +            for origkey, conversion in conv.items():
 | 
	
		
			
				|  |  | +                if key == conversion[0]:
 | 
	
		
			
				|  |  | +                    if conversion[1] == list:
 | 
	
		
			
				|  |  | +                        orig[origkey] = ast.literal_eval(v)
 | 
	
		
			
				|  |  | +                    elif conversion[1] == bool:
 | 
	
		
			
				|  |  | +                        orig[origkey] = True if v.lower() == "true" else False
 | 
	
		
			
				|  |  | +                    else:
 | 
	
		
			
				|  |  | +                        if v.lower() in ("none", "null"):
 | 
	
		
			
				|  |  | +                            v = "null"
 | 
	
		
			
				|  |  | +                        else:
 | 
	
		
			
				|  |  | +                            orig[origkey] = (conversion[1])(v)
 | 
	
		
			
				|  |  | +                    i[0] = i[0] + 1
 | 
	
		
			
				|  |  | +                    break
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if sys.argv[2] == "update":
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +        new = json.loads(sys.stdin.read())
 | 
	
		
			
				|  |  | +        orig = read()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        i = [0]
 | 
	
		
			
				|  |  | +        iterate_obj(new, orig, i)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assert i[0] == len(conv), f"Wrong number of entries, {i[0]} != {len(conv)}."
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        with open(settings, "w+") as json_file:
 | 
	
		
			
				|  |  | +            json.dump(orig, json_file, indent=4)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    except Exception as e:
 | 
	
		
			
				|  |  | +        print(e)
 | 
	
		
			
				|  |  | +        sys.exit(1)
 | 
	
		
			
				|  |  | +    sys.exit(0)
 | 
	
		
			
				|  |  | +if sys.argv[2] == "install":
 | 
	
		
			
				|  |  | +    obj = read()
 | 
	
		
			
				|  |  | +    for k, v in obj.items():
 | 
	
		
			
				|  |  | +        print(f"server.{conv[k][0]}=\"{v}\"")
 | 
	
		
			
				|  |  | +    sys.exit(0)
 | 
	
		
			
				|  |  | +sys.exit(1)
 |