majuna/app/terraform/list/__init__.py

63 lines
2.1 KiB
Python

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))