From: Rob Crittenden Date: Tue, 3 Mar 2015 04:02:03 +0000 (-0500) Subject: Rename nss info plugin to match format of info+name X-Git-Tag: v0.6.0~18 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=commitdiff_plain;h=38d9a4c974d7d5b58edefd4857492648a6102d38 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 Reviewed-by: Patrick Uiterwijk --- diff --git a/contrib/fedora/ipsilon.spec b/contrib/fedora/ipsilon.spec index 577d6ed..0c1f1ca 100644 --- a/contrib/fedora/ipsilon.spec +++ b/contrib/fedora/ipsilon.spec @@ -244,7 +244,7 @@ fi %dir %{python2_sitelib}/ipsilon/info %{python2_sitelib}/ipsilon/info/__init__* %{python2_sitelib}/ipsilon/info/common* -%{python2_sitelib}/ipsilon/info/nss* +%{python2_sitelib}/ipsilon/info/infonss* %dir %{python2_sitelib}/ipsilon/providers %{python2_sitelib}/ipsilon/providers/__init__* %{python2_sitelib}/ipsilon/providers/common* 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() diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py deleted file mode 100644 index 0669e95..0000000 --- a/ipsilon/info/nss.py +++ /dev/null @@ -1,96 +0,0 @@ -# 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()