]
"""Files to verify for mismatch."""
+ self._features: dict[str, bool] | None = None
+ """Features supported by the host."""
+
def pytest_setup(self) -> None:
super().pytest_setup()
"""
raise NotImplementedError("Stopping shadow service is not implemented.")
+ @property
+ def features(self) -> dict[str, bool]:
+ """
+ Features supported by the host.
+ """
+ if self._features is not None:
+ return self._features
+
+ self.logger.info(f"Detecting shadow features on {self.hostname}")
+ result = self.conn.run(
+ """
+ set -ex
+
+ getent gshadow > /dev/null 2>&1 && echo "gshadow" || :
+ """,
+ log_level=ProcessLogLevel.Error,
+ )
+
+ # Set default values
+ self._features = {
+ "gshadow": False,
+ }
+
+ self._features.update({k: True for k in result.stdout_lines})
+ self.logger.info("Detected features:", extra={"data": {"Features": self._features}})
+
+ return self._features
+
def backup(self) -> Any:
"""
Backup all shadow data.