172 lines
5 KiB
Python
172 lines
5 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
|
|
@dataclass
|
|
class ManagedFile:
|
|
path: str
|
|
src_rel: str
|
|
owner: str
|
|
group: str
|
|
mode: str
|
|
reason: str
|
|
|
|
|
|
@dataclass
|
|
class ManagedLink:
|
|
"""A symlink we want to materialise on the target host.
|
|
|
|
For configuration enablement patterns (e.g. sites-enabled), the symlink is
|
|
meaningful state even when the link target is captured elsewhere.
|
|
"""
|
|
|
|
path: str
|
|
target: str
|
|
reason: str
|
|
|
|
|
|
@dataclass
|
|
class ManagedDir:
|
|
path: str
|
|
owner: str
|
|
group: str
|
|
mode: str
|
|
reason: str
|
|
|
|
|
|
@dataclass
|
|
class ExcludedFile:
|
|
path: str
|
|
reason: str
|
|
|
|
|
|
@dataclass
|
|
class ServiceSnapshot:
|
|
unit: str
|
|
role_name: str
|
|
packages: List[str]
|
|
active_state: Optional[str]
|
|
sub_state: Optional[str]
|
|
unit_file_state: Optional[str]
|
|
condition_result: Optional[str]
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
managed_links: List[ManagedLink] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class PackageSnapshot:
|
|
package: str
|
|
role_name: str
|
|
section: Optional[str] = None
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
managed_links: List[ManagedLink] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
has_config: bool = True # False if package has no config/systemd/cron files
|
|
|
|
|
|
@dataclass
|
|
class UsersSnapshot:
|
|
role_name: str
|
|
users: List[dict]
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
user_flatpaks: Dict[str, List[Dict[str, Any]]] = field(default_factory=dict)
|
|
user_flatpak_remotes: List[Dict[str, Any]] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class FlatpakSnapshot:
|
|
role_name: str
|
|
system_flatpaks: List[Dict[str, Any]] = field(default_factory=list)
|
|
remotes: List[Dict[str, Any]] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class SnapSnapshot:
|
|
role_name: str
|
|
system_snaps: List[Dict[str, Any]] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ContainerImagesSnapshot:
|
|
role_name: str
|
|
images: List[Dict[str, Any]] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class AptConfigSnapshot:
|
|
role_name: str
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class DnfConfigSnapshot:
|
|
role_name: str
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class EtcCustomSnapshot:
|
|
role_name: str
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class UsrLocalCustomSnapshot:
|
|
role_name: str
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class ExtraPathsSnapshot:
|
|
role_name: str
|
|
include_patterns: List[str] = field(default_factory=list)
|
|
exclude_patterns: List[str] = field(default_factory=list)
|
|
managed_dirs: List[ManagedDir] = field(default_factory=list)
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
managed_links: List[ManagedLink] = field(default_factory=list)
|
|
excluded: List[ExcludedFile] = field(default_factory=list)
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class FirewallRuntimeSnapshot:
|
|
role_name: str
|
|
packages: List[str] = field(default_factory=list)
|
|
ipset_save: Optional[str] = None
|
|
ipset_sets: List[str] = field(default_factory=list)
|
|
iptables_v4_save: Optional[str] = None
|
|
iptables_v6_save: Optional[str] = None
|
|
notes: List[str] = field(default_factory=list)
|
|
|
|
|
|
@dataclass
|
|
class SysctlSnapshot:
|
|
role_name: str
|
|
managed_files: List[ManagedFile] = field(default_factory=list)
|
|
parameters: Dict[str, str] = field(default_factory=dict)
|
|
notes: List[str] = field(default_factory=list)
|