3 # Copyright (C) 2014 Ipsilon Project Contributors
5 # See the file named COPYING for the project license
7 from ipsilon.info.common import InfoProviderBase
8 from ipsilon.info.common import InfoProviderInstaller
9 from ipsilon.info.common import InfoMapping
10 from ipsilon.util.plugin import PluginObject
21 class InfoProvider(InfoProviderBase):
23 def __init__(self, *pargs):
24 super(InfoProvider, self).__init__(*pargs)
25 self.mapper = InfoMapping()
26 self.mapper.set_mapping(posix_map)
28 self.new_config(self.name)
30 def _get_posix_user(self, user):
31 p = pwd.getpwnam(user)
32 return {'username': p.pw_name, 'uidNumber': p.pw_uid,
33 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
34 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
36 def _get_posix_groups(self, user, group):
38 getgrouplist = getattr(os, 'getgrouplist', None)
40 ids = getgrouplist(user, group)
49 g = grp.getgrgid(group)
59 def get_user_attrs(self, user):
62 posix_user = self._get_posix_user(user)
63 userattrs, extras = self.mapper.map_attrs(posix_user)
64 groups = self._get_posix_groups(posix_user['username'],
65 posix_user['gidNumber'])
66 reply['userdata'] = userattrs
67 reply['groups'] = groups
68 reply['extras'] = {'posix': extras}
76 class Installer(InfoProviderInstaller):
78 def __init__(self, *pargs):
79 super(Installer, self).__init__()
83 def install_args(self, group):
84 group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
85 help='Use passwd data to populate user attrs')
87 def configure(self, opts):
88 if opts['info_nss'] != 'yes':
91 # Add configuration data to database
92 po = PluginObject(*self.pargs)
95 po.wipe_config_values()
97 # Update global config to add login plugin
99 po.save_enabled_state()