Source code for draugr.os_utilities.linux_utilities.user_utilities
__author__ = "Christian Heider Nielsen"
__doc__ = r"""description"""
__all__ = ["make_user", "remove_user", "change_passwd", "change_home_dir"]
from pathlib import Path
from warg import ContextWrapper
[docs]def make_user(
username: str = "demo_user",
password: str = None,
*,
add_home: bool = True,
home_dir: Path = None,
allow_existing_user: bool = True,
get_sudo: bool = True,
) -> None:
"""description"""
import crypt
import sh
import getpass
query = []
if add_home:
query += [f"-m", f"-d"]
if home_dir:
query += [str(home_dir)]
else:
query += [f"/home/{username}"]
try:
user_id = sh.id(["-u", username])
if int(user_id):
if not allow_existing_user:
raise FileExistsError
group_id = sh.id(["-g", username])
print(f"user {username} exists with id {user_id} and {group_id}")
except (ValueError, sh.ErrorReturnCode_1):
pass
with ContextWrapper(
sh.contrib.sudo,
construction_kwargs=dict(
password=getpass.getpass(
prompt=f"[sudo] password for {getpass.getuser()}: "
)
if get_sudo
else None,
_with=True,
),
enabled=get_sudo,
):
try:
sh.useradd(
query
+ [
f"-p",
f"{crypt.crypt(password if password else input(f'new password for user {username}: '), '22')}",
f"{username}",
]
)
except sh.ErrorReturnCode_9:
pass
[docs]def remove_user(
username: str = "demo_user", *, remove_home: bool = True, get_sudo: bool = True
) -> None:
"""description"""
import sh
import getpass
try:
user_id = sh.id(["-u", username])
if int(user_id):
print(f"User {username} exists with id {user_id}")
with ContextWrapper(
sh.contrib.sudo,
construction_kwargs=dict(
password=getpass.getpass(
prompt=f"[sudo] password for {getpass.getuser()}: "
)
if get_sudo
else None,
_with=True,
),
enabled=get_sudo,
):
sh.userdel((["-r"] if remove_home else []) + [f"{username}"])
print(f"Removed user {username}")
except (ValueError, sh.ErrorReturnCode_1):
pass
[docs]def change_passwd(
username: str = "demo_user",
password: str = None,
) -> None:
"""
:param username:
:param password:
"""
raise NotImplementedError
pass # ./passwd
[docs]def change_home_dir(username: str = "demo_user", new_home: str = None) -> None:
"""
:param username:
:param new_home:
"""
raise NotImplementedError
pass # ./mkhomedir_helper username
if __name__ == "__main__":
make_user()
remove_user()