diff --git a/whereami.py b/whereami.py index f05f060..78a271a 100644 --- a/whereami.py +++ b/whereami.py @@ -2,25 +2,61 @@ Library of path constants to be used or referenced elsewhere. """ -from custtypes import ExecutedPath, Roles, Scopes, AnsibleScopes +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 -USER_PATH: ExecutedPath = Path.home() +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() -PROJ_ROLES: ExecutedPath = PROJ_ROOT / "roles" +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 / ".config", + Scopes.USER.name.lower(): USER_PATH(NodeType.remote) / ".config", Scopes.SHARED.name.lower(): Path("/usr/share"), - Scopes.PROJ.name.lower(): tuple(list(PROJ_ROLES.glob("**/files")) + list(PROJ_ROLES.glob("**/templates"))) + 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(): None, - AnsibleScopes.ROLE.name.lower(): None + AnsibleScopes.INVENTORY.name.lower(): tuple(PROJ_INVENTORIES), + AnsibleScopes.ROLE.name.lower(): tuple(PROJ_ROLES) } \ No newline at end of file