| # SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause |
| |
| """ |
| Locating YNL spec and schema files on disk. |
| |
| Resolves the directory holding the YAML specs (preferring an in-tree copy |
| over the installed system path) and maps family names to spec files. |
| """ |
| |
| import os |
| |
| SYS_SCHEMA_DIR='/usr/share/ynl' |
| RELATIVE_SCHEMA_DIR='../../../../../Documentation/netlink' |
| |
| |
| def schema_dir(): |
| """ |
| Return the effective schema directory, preferring in-tree before |
| system schema directory. |
| """ |
| script_dir = os.path.dirname(os.path.abspath(__file__)) |
| schema_dir_ = os.path.abspath(f"{script_dir}/{RELATIVE_SCHEMA_DIR}") |
| if not os.path.isdir(schema_dir_): |
| schema_dir_ = SYS_SCHEMA_DIR |
| if not os.path.isdir(schema_dir_): |
| raise FileNotFoundError(f"Schema directory {schema_dir_} does not exist") |
| return schema_dir_ |
| |
| def spec_dir(): |
| """ |
| Return the effective spec directory, relative to the effective |
| schema directory. |
| """ |
| spec_dir_ = schema_dir() + '/specs' |
| if not os.path.isdir(spec_dir_): |
| raise FileNotFoundError(f"Spec directory {spec_dir_} does not exist") |
| return spec_dir_ |
| |
| |
| def find_spec(family): |
| """ Return the path to the YAML spec file for a family by name. """ |
| spec = f"{spec_dir()}/{family}.yaml" |
| if not os.path.isfile(spec): |
| raise FileNotFoundError(f"Spec for family '{family}' not found at {spec}") |
| return spec |
| |
| |
| def list_families(): |
| """ Return the sorted names of all families with an installed spec. """ |
| return sorted(f.removesuffix('.yaml') |
| for f in os.listdir(spec_dir()) if f.endswith('.yaml')) |