X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=blobdiff_plain;f=ipsilon%2Finfo%2Finfonss.py;fp=ipsilon%2Finfo%2Finfonss.py;h=0669e95de95c9e4ddb044f0ee4823647a69270be;hp=0000000000000000000000000000000000000000;hb=38d9a4c974d7d5b58edefd4857492648a6102d38;hpb=7c69a27be37b979b8734ad105239bfe10cfeaceb 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()