diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-03-09 03:26:27 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-03-09 03:26:27 +0100 |
commit | b14e63328cdf670fc67a004f1c5018ecc44e8b58 (patch) | |
tree | 377a7ccd05864f925f3f12379bb7c62548b01a82 /src | |
parent | m (diff) | |
download | xpybar-b14e63328cdf670fc67a004f1c5018ecc44e8b58.tar.gz xpybar-b14e63328cdf670fc67a004f1c5018ecc44e8b58.tar.bz2 xpybar-b14e63328cdf670fc67a004f1c5018ecc44e8b58.tar.xz |
improve users plugin + users demo
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/users.py | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/src/plugins/users.py b/src/plugins/users.py index a73939e..85e390c 100644 --- a/src/plugins/users.py +++ b/src/plugins/users.py @@ -17,6 +17,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ''' +import os + from util import * @@ -24,19 +26,82 @@ class Users: ''' Gets the logged in users and what TTY:s they are using - @variable users:dict<str, list<str>> Map from logged in users to acquired TTY:s + @variable users:dict<str, list<str>> Map from logged in users to acquired TTY:s (all might not be listed) ''' - def __init__(self): + def __init__(self, method = 'who'): ''' Constructor + + @param method:str|()→itr<str> The user listing method ''' - users = spawn('w').read().decode('utf-8', 'replace').split('\n')[2 : -1] - users = [list(filter(lambda cell : not cell == '', line.split(' ')))[:2] for line in users] + users = Users.who + if not isinstance(method, str): + users = method + elif method == 'who': users = Users.who + elif method == 'w': users = Users.w + elif method == 'devfs': users = Users.devfs + + users = users() self.users = {} for (user, tty) in users: if user not in self.users: self.users[user] = [] self.users[user].append(tty) + + + @staticmethod + def who(): + ''' + Use Coreutil's `who` command to fetch users and ttys + + @return :list<(user:str, tty:str>) List of user–tty pairs + ''' + users = spawn('who').read().decode('utf-8', 'replace').split('\n')[:-1] + users = [list(filter(lambda cell : not cell == '', line.split(' ')))[:2] for line in users] + return users + + + @staticmethod + def w(): + ''' + Use procps-ng's `w` command to fetch users and ttys + + @return :list<(user:str, tty:str>) List of user–tty pairs + ''' + users = spawn('w').read().decode('utf-8', 'replace').split('\n')[2 : -1] + users = [list(filter(lambda cell : not cell == '', line.split(' ')))[:2] for line in users] + return users + + + @staticmethod + def devfs(try_to_find_root = False): + ''' + Walk /dev to find TTY acquisitions + + @param try_to_find_root:bool Whether to list root for /dev/tty[[:numeric:]]+ if the permission bits looks good + @return :list<(user:str, tty:str>) List of user–tty pairs + ''' + import pwd + + def num(s): + return (not s == '') and (0 == len(list(filter(lambda c : not ('0' <= c <= '9'), s)))) + + ttys = [f for f in os.listdir('/dev') if f.startswith('tty') and num(f[3:])] + ttys += ['pts/' + f for f in os.listdir('/dev/pts') if num(f)] + + users, rc = {}, [] + for tty in ttys: + attr = os.stat('/dev/' + tty) + if ('/' not in tty) and (attr.st_uid == 0): + if not (try_to_find_root and (attr.st_mode == 0o20600)): + continue + user = attr.st_uid + if user in users: + user = users[user] + else: + users[user] = user = pwd.getpwuid(user).pw_name + rc.append((user, tty)) + return rc |