""" Library of path constants to be used or referenced elsewhere. """ from custtypes import ExecutedPath, Roles, Scopes, AnsibleScopes, NodeType, UserName from pathlib import Path from configparser import ConfigParser as cfg from itertools import chain from typing import Callable def get_home(node: NodeType = NodeType.control, home: UserName | str | None = None) -> ExecutedPath: if node == NodeType.control: return Path.home() else: if home is None: return Path("~") else: if isinstance(home, UserName): return Path("/home") / home.name else: return Path(home) USER_PATH: Callable = get_home PROJ_ROOT: ExecutedPath = Path(__file__).parent.resolve() config = cfg() ANSIBLE_CONFIG = PROJ_ROOT / "ansible.cfg" if ANSIBLE_CONFIG.exists(): config.read(str(ANSIBLE_CONFIG)) role_candidates = config["defaults"]["roles_path"].split(":") role_candidates = map(lambda s: PROJ_ROOT / s, role_candidates) role_paths = list(filter(lambda p: p.exists(), role_candidates)) inv_candidates = config["defaults"]["inventory"].split(",") inv_candidates = map(lambda s: PROJ_ROOT / s, inv_candidates) inv_paths = list(filter(lambda p: p.exists(), inv_candidates)) else: role_paths = [PROJ_ROOT / "roles"] inv_paths = PROJ_ROOT.glob("hosts*.*") PROJ_ROLES: list[ExecutedPath] = role_paths PROJ_INVENTORIES: list[ExecutedPath] = inv_paths proj_paths = map(lambda r: r.glob("**/files"), PROJ_ROLES) proj_paths = list(chain.from_iterable(proj_paths)) template_paths = map(lambda r: r.glob("**/templates"), PROJ_ROLES) template_paths = list(chain.from_iterable(template_paths)) APP_ROOTS = { Roles.CONF.name.lower(): { Scopes.SYS.name.lower(): Path("/etc"), Scopes.USER.name.lower(): USER_PATH(NodeType.remote) / ".config", Scopes.SHARED.name.lower(): Path("/usr/share"), Scopes.PROJ.name.lower(): tuple(proj_paths + template_paths) } } ANSIBLE_ROOTS = { AnsibleScopes.GROUPVARS.name.lower(): PROJ_ROOT / "group_vars", AnsibleScopes.HOSTVARS.name.lower(): PROJ_ROOT / "host_vars", AnsibleScopes.INVENTORY.name.lower(): tuple(PROJ_INVENTORIES), AnsibleScopes.ROLE.name.lower(): tuple(PROJ_ROLES) }