summaryrefslogtreecommitdiffstats
path: root/ipsilon/info/nss.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipsilon/info/nss.py')
-rwxr-xr-xipsilon/info/nss.py55
1 files changed, 49 insertions, 6 deletions
diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py
index e9a3a96..4208442 100755
--- a/ipsilon/info/nss.py
+++ b/ipsilon/info/nss.py
@@ -6,27 +6,70 @@
from ipsilon.info.common import InfoProviderBase
from ipsilon.info.common import InfoProviderInstaller
+from ipsilon.info.common import InfoMapping
from ipsilon.util.plugin import PluginObject
+import grp
import pwd
+import os
+
+
+posix_map = {
+ 'gecos': 'fullname'
+}
class InfoProvider(InfoProviderBase):
def __init__(self):
super(InfoProvider, self).__init__()
+ self.mapper = InfoMapping()
+ self.mapper.set_mapping(posix_map)
self.name = 'nss'
+ def _get_posix_user(self, user):
+ p = pwd.getpwnam(user)
+ return {'username': p.pw_name, 'uidNumber': p.pw_uid,
+ 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
+ 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
+
+ def _get_posix_groups(self, user, group):
+ groups = set()
+ getgrouplist = getattr(os, 'getgrouplist', None)
+ if getgrouplist:
+ ids = getgrouplist(user, group)
+ for i in ids:
+ try:
+ g = grp.getgrgid(i)
+ groups.add(g.gr_name)
+ except KeyError:
+ pass
+
+ else:
+ g = grp.getgrgid(group)
+ groups.add(g.gr_name)
+
+ allg = grp.getgrall()
+ for g in allg:
+ if user in g.gr_mem:
+ groups.add(g.gr_name)
+
+ return list(groups)
+
def get_user_attrs(self, user):
- userattrs = None
+ reply = dict()
try:
- p = pwd.getpwnam(user)
- userattrs = {'uidNumber': p[2], 'gidNumber': p[3],
- 'gecos': p[4], 'homeDirectory': p[5],
- 'loginShell': p[6]}
+ posix_user = self._get_posix_user(user)
+ userattrs, extras = self.mapper.map_attrs(posix_user)
+ groups = self._get_posix_groups(posix_user['username'],
+ posix_user['gidNumber'])
+ reply['userdata'] = userattrs
+ reply['groups'] = groups
+ reply['extras'] = {'posix': extras}
+
except KeyError:
pass
- return userattrs
+ return reply
class Installer(InfoProviderInstaller):