from collections.abc import Mapping, Sequence import json from typing import List, Any, IO from app import app from app.lists import lists from app.models.base import MirrorList from app.terraform.terraform import TerraformAutomation def obfuscator(obj: Any) -> Any: if isinstance(obj, str): return "".join([f"!AAA!{hex(ord(c))[2:].zfill(4)}" for c in obj]) if isinstance(obj, Mapping): return {obfuscator(k): obfuscator(v) for k, v in obj.items()} if isinstance(obj, Sequence): return [obfuscator(i) for i in obj] return obj def json_encode(obj: Any, obfuscate: bool) -> str: if obfuscate: obj = obfuscator(obj) s = json.dumps(obj).replace("!AAA!", "\\u") return s return json.dumps(obj, indent=2, sort_keys=True) def javascript_encode(obj: Any, obfuscate: bool) -> str: return "mirrors = " + json_encode(obj, obfuscate) + ";" class ListAutomation(TerraformAutomation): template: str """ Terraform configuration template using Jinja 2. """ template_parameters: List[str] """ List of parameters to be read from the application configuration for use in the templating of the Terraform configuration. """ def tf_generate(self) -> None: self.tf_write( self.template, lists=MirrorList.query.filter( MirrorList.destroyed.is_(None), MirrorList.provider == self.provider, ).all(), global_namespace=app.config['GLOBAL_NAMESPACE'], **{ k: app.config[k.upper()] for k in self.template_parameters } ) for format_ in lists: for obfuscate in [True, False]: with open(self.working_directory(f"{format_}{'.jsno' if obfuscate else '.json'}"), 'w') as out: out.write(json_encode(lists[format_](), obfuscate)) with open(self.working_directory(f"{format_}{'.jso' if obfuscate else '.js'}"), 'w') as out: out.write(javascript_encode(lists[format_](), obfuscate))