130 lines
3.7 KiB
Python
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
|