Source code for wtforglib.fstats
"""Top-level module for wtforglib Library."""
import platform
import re
import shutil
from inspect import stack
from pathlib import Path
from typing import Optional, Union
from wtforglib.functions import WINDOZE, windoze_not_implemented
from wtforglib.kinds import Fspec
OwnGrpId = Optional[Union[str, int]]
if platform.system() != WINDOZE:
from grp import getgrgid # noqa: WPS433
from pwd import getpwuid # noqa: WPS433
[docs]
def set_file_perms(tgt: Fspec, mode: str) -> bool: # noqa: WPS231
"""Sets the owner group permissions for a posix file if needed.
Parameters
----------
tgt : Fspec
Path to the target file
mode : str
Mode of the target file
Returns
-------
bool : True if changes are made to the target
Raises
------
ValueError
When mode is not valid
"""
if mode:
target = Path(tgt)
mode_length = len(mode)
if mode_length > 4 or mode_length < 3:
raise ValueError("Invalid mode string length. Must be 3 or 4 characters.")
if not re.match("[0-7]+$", mode):
raise ValueError("Invalid mode string. Must be 3 or 4 octal digits.")
windoze_not_implemented(stack()[0][3])
# convert mode to octal string right 4 chars
cmode = str(oct(target.stat().st_mode))[-mode_length:]
if cmode != mode:
omode = int(mode, 8)
target.chmod(omode)
return True
return False
[docs]
def get_new_owner(tgt: Fspec, own: OwnGrpId) -> Optional[str]:
"""Sets the owner for a posix file in needed.
Parameters
----------
tgt : Fspec
Path to the target file
own : OwnGrpId
Owner of the target file
Returns
-------
Optional[str] : new_owner or None
"""
windoze_not_implemented(stack()[0][3])
new_owner: Optional[str]
if own:
if isinstance(own, int):
new_owner = getpwuid(own)[0]
else:
new_owner = str(own)
if Path(tgt).owner() == new_owner:
new_owner = None
else:
new_owner = None
return new_owner
[docs]
def get_new_group(tgt: Fspec, grp: OwnGrpId) -> Optional[str]:
"""Sets the owner for a posix file in needed.
Parameters
----------
tgt : Fspec
Path to the target file
grp : OwnGrpId
Group of the target file
Returns
-------
Optional[str] : new_group or None
"""
windoze_not_implemented(stack()[0][3])
new_group: Optional[str]
if grp:
if isinstance(grp, int):
new_group = getgrgid(grp)[0]
else:
new_group = str(grp)
if Path(tgt).group() == new_group:
new_group = None
else:
new_group = None
return new_group
[docs]
def set_owner_group(tgt: Fspec, own: OwnGrpId, grp: OwnGrpId) -> bool:
"""Sets the owner group for a posix file in needed.
Parameters
----------
tgt : Fspec
Path to the target file
own : str
Owner of the target file
grp : str
Group of the target file
Returns
-------
bool : True if changes are made to the target
"""
windoze_not_implemented(stack()[0][3])
target = Path(tgt)
new_owner = get_new_owner(target, own)
new_group = get_new_group(target, grp)
if (new_group is not None) or (new_owner is not None):
shutil.chown(target, new_owner, new_group) # type: ignore
return True
return False
[docs]
def set_owner_group_perms(tgt: Fspec, own: OwnGrpId, grp: OwnGrpId, mode: str) -> bool:
"""Sets the owner group permissions for a posix file if needed.
Parameters
----------
tgt : Fspec
Path to the target file
own : str
Owner of the target file
grp : str
Group of the target file
mode : str
Mode of the target file
Returns
-------
bool : True if changes are made to the target
"""
windoze_not_implemented(stack()[0][3])
og_changed = set_owner_group(tgt, own, grp)
fp_changed = set_file_perms(tgt, mode)
return og_changed or fp_changed