diff options
author | Rob Crittenden <rcritten@redhat.com> | 2015-03-02 23:02:03 -0500 |
---|---|---|
committer | Patrick Uiterwijk <puiterwijk@redhat.com> | 2015-04-09 23:46:31 +0200 |
commit | 38d9a4c974d7d5b58edefd4857492648a6102d38 (patch) | |
tree | e48851e6327061bde1e998b2da5eebfc54b773ce /ipsilon/info/infonss.py | |
parent | 7c69a27be37b979b8734ad105239bfe10cfeaceb (diff) | |
download | ipsilon.git-38d9a4c974d7d5b58edefd4857492648a6102d38.tar.gz ipsilon.git-38d9a4c974d7d5b58edefd4857492648a6102d38.tar.xz ipsilon.git-38d9a4c974d7d5b58edefd4857492648a6102d38.zip |
Rename nss info plugin to match format of info+name
This also eliminates a namespace collision with python-nss
https://fedorahosted.org/ipsilon/ticket/104
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
Diffstat (limited to 'ipsilon/info/infonss.py')
-rw-r--r-- | ipsilon/info/infonss.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/ipsilon/info/infonss.py b/ipsilon/info/infonss.py new file mode 100644 index 0000000..0669e95 --- /dev/null +++ b/ipsilon/info/infonss.py @@ -0,0 +1,96 @@ +# Copyright (C) 2014 Ipsilon Project Contributors +# +# See the file named COPYING for the project license + +from ipsilon.info.common import InfoProviderBase +from ipsilon.info.common import InfoProviderInstaller +from ipsilon.util.plugin import PluginObject +from ipsilon.util.policy import Policy +import grp +import pwd +import os + + +posix_map = [ + ['gecos', 'fullname'] +] + + +class InfoProvider(InfoProviderBase): + + def __init__(self, *pargs): + super(InfoProvider, self).__init__(*pargs) + self.mapper = Policy(posix_map) + self.name = 'nss' + self.new_config(self.name) + + 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): + reply = dict() + try: + posix_user = self._get_posix_user(user) + userattrs, extras = self.mapper.map_attributes(posix_user) + groups = self._get_posix_groups(posix_user['username'], + posix_user['gidNumber']) + reply = userattrs + reply['_groups'] = groups + reply['_extras'] = {'posix': extras} + + except KeyError: + pass + + return reply + + +class Installer(InfoProviderInstaller): + + def __init__(self, *pargs): + super(Installer, self).__init__() + self.name = 'nss' + self.pargs = pargs + + def install_args(self, group): + group.add_argument('--info-nss', choices=['yes', 'no'], default='no', + help='Use passwd data to populate user attrs') + + def configure(self, opts): + if opts['info_nss'] != 'yes': + return + + # Add configuration data to database + po = PluginObject(*self.pargs) + po.name = 'nss' + po.wipe_data() + po.wipe_config_values() + + # Update global config to add info plugin + po.is_enabled = True + po.save_enabled_state() |