aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-03-09 03:26:27 +0100
committerMattias Andrée <maandree@operamail.com>2014-03-09 03:26:27 +0100
commitb14e63328cdf670fc67a004f1c5018ecc44e8b58 (patch)
tree377a7ccd05864f925f3f12379bb7c62548b01a82 /src
parentm (diff)
downloadxpybar-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.py73
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