Files
shadow/tests/system/framework/roles/shadow.py
2025-02-24 22:57:12 +01:00

130 lines
3.7 KiB
Python

"""shadow multihost role."""
from __future__ import annotations
import shlex
from typing import Dict
from pytest_mh.conn import ProcessLogLevel, ProcessResult
from ..hosts.shadow import ShadowHost
from .base import BaseLinuxRole
__all__ = [
"Shadow",
]
class Shadow(BaseLinuxRole[ShadowHost]):
"""
shadow role.
Provides unified Python API for managing and testing shadow.
"""
def __init__(self, *args, **kwargs) -> None:
"""
Set up the environment.
"""
super().__init__(*args, **kwargs)
def teardown(self) -> None:
"""
Detect file mismatches before cleaning up the environment.
"""
self.host.detect_file_mismatches()
"""
Clean up the environment.
"""
super().teardown()
def _parse_args(self, *args) -> Dict[str, str]:
args_list = shlex.split(*args[0])
name = args_list[-1]
return {"name": name}
def useradd(self, *args) -> ProcessResult:
"""
Create user.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Creating user "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("useradd " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/passwd")
self.host.discard_file("/etc/shadow")
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd
def usermod(self, *args) -> ProcessResult:
"""
Modify user.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Modifying user "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("usermod " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/passwd")
self.host.discard_file("/etc/shadow")
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd
def userdel(self, *args) -> ProcessResult:
"""
Delete user.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Deleting user "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("userdel " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/passwd")
self.host.discard_file("/etc/shadow")
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd
def groupadd(self, *args) -> ProcessResult:
"""
Create group.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Creating group "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("groupadd " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd
def groupmod(self, *args) -> ProcessResult:
"""
Modify group.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Modifying group "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("groupmod " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd
def groupdel(self, *args) -> ProcessResult:
"""
Delete group.
"""
args_dict = self._parse_args(args)
self.logger.info(f'Deleting group "{args_dict["name"]}" on {self.host.hostname}')
cmd = self.host.conn.run("groupdel " + args[0], log_level=ProcessLogLevel.Error)
self.host.discard_file("/etc/group")
self.host.discard_file("/etc/gshadow")
return cmd