0x1000 #ˆl–Ðz¾”Ëm q@=q¦nõ1hßÊ ƒuñ?ÉÀÇù# -*- coding: utf-8 -*- # Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2018 All Rights Reserved # # Licensed under CLOUD LINUX LICENSE AGREEMENT # http://cloudlinux.com/docs/LICENSE.TXT # import os import pwd import grp from contextlib import contextmanager from .clexception import FormattedException class ClPwd: LOGIN_DEF_FILE = '/etc/login.defs' class NoSuchUserException(FormattedException): def __init__(self, user, *args, **kwargs): super(ClPwd.NoSuchUserException, self).__init__({ 'message': "No such user (%(user)s)", 'context': {'user': user} }, *args, **kwargs) def __init__(self, min_uid=None): self._user_key_map = {} self._uid_key_map = {} self._user_full_map = {} self._uid_full_map = {} if min_uid is None: self._min_uid = self.get_sys_min_uid(500) else: self._min_uid = min_uid def get_user_dict(self): self._load_passwd_database() return self._user_key_map def get_uid_dict(self): self._load_passwd_database() return self._uid_key_map def get_user_full_dict(self): self._load_passwd_database() return self._user_full_map def get_uid_full_dict(self): self._load_passwd_database() return self._uid_full_map def get_pw_by_name(self, user): """ Return pw_entry for user """ try: return self.get_user_full_dict()[user] except KeyError as e: raise ClPwd.NoSuchUserException(user) from e def get_pw_by_uid(self, uid): """ Return list of passwd entries for uid """ try: return self.get_uid_full_dict()[uid] except KeyError as e: raise ClPwd.NoSuchUserException(uid) from e def get_uid(self, user): """ Returns uid for user """ try: return self.get_user_full_dict()[user].pw_uid except KeyError as e: raise ClPwd.NoSuchUserException(user) from e def get_homedir(self, user): """ Returns homedir for a user @param user: string @return: string """ try: return self.get_user_full_dict()[user].pw_dir except KeyError as e: raise ClPwd.NoSuchUserException(user) from e def _load_passwd_database(self): """ Loads the passwd database and fills user_to_uid and user_to_homedir maps """ if not self._uid_full_map: for entry in pwd.getpwall(): self._user_full_map[entry.pw_name] = entry if entry.pw_uid not in self._uid_full_map: self._uid_full_map[entry.pw_uid] = [] self._uid_full_map[entry.pw_uid].append(entry) if entry.pw_uid >= self._min_uid: self._user_key_map[entry.pw_name] = entry if entry.pw_uid not in self._uid_key_map: self._uid_key_map[entry.pw_uid] = [] self._uid_key_map[entry.pw_uid].append(entry) def get_names(self, uid): """ Return names of users with uid specified @param uid: int @return: list of strings """ try: entries = self.get_uid_full_dict()[uid] except KeyError as e: raise ClPwd.NoSuchUserException(uid) from e return [entry.pw_name for entry in entries] def get_sys_min_uid(self, def_min_uid=500): """ Return system defined MIN_UID from /etc/login.def or def_min_uid @param def_min_uid: int @return: MIN_UID: int """ if os.path.exists(self.LOGIN_DEF_FILE): with open(self.LOGIN_DEF_FILE, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: if line.startswith('UID_MIN'): try: