Implement change registration
[cascardo/ipsilon.git] / ipsilon / info / infonss.py
1 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
2
3 from ipsilon.info.common import InfoProviderBase
4 from ipsilon.info.common import InfoProviderInstaller
5 from ipsilon.util.plugin import PluginObject
6 from ipsilon.util.policy import Policy
7 import grp
8 import pwd
9 import os
10
11
12 posix_map = [
13     ['gecos', 'fullname']
14 ]
15
16
17 class InfoProvider(InfoProviderBase):
18
19     def __init__(self, *pargs):
20         super(InfoProvider, self).__init__(*pargs)
21         self.mapper = Policy(posix_map)
22         self.name = 'nss'
23         self.new_config(self.name)
24
25     def _get_posix_user(self, user):
26         p = pwd.getpwnam(user)
27         return {'username': p.pw_name, 'uidNumber': p.pw_uid,
28                 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
29                 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
30
31     def _get_posix_groups(self, user, group):
32         groups = set()
33         getgrouplist = getattr(os, 'getgrouplist', None)
34         if getgrouplist:
35             ids = getgrouplist(user, group)
36             for i in ids:
37                 try:
38                     g = grp.getgrgid(i)
39                     groups.add(g.gr_name)
40                 except KeyError:
41                     pass
42
43         else:
44             g = grp.getgrgid(group)
45             groups.add(g.gr_name)
46
47             allg = grp.getgrall()
48             for g in allg:
49                 if user in g.gr_mem:
50                     groups.add(g.gr_name)
51
52         return list(groups)
53
54     def get_user_attrs(self, user):
55         reply = dict()
56         try:
57             posix_user = self._get_posix_user(user)
58             userattrs, extras = self.mapper.map_attributes(posix_user)
59             groups = self._get_posix_groups(posix_user['username'],
60                                             posix_user['gidNumber'])
61             reply = userattrs
62             reply['_groups'] = groups
63             reply['_extras'] = {'posix': extras}
64
65         except KeyError:
66             pass
67
68         return reply
69
70
71 class Installer(InfoProviderInstaller):
72
73     def __init__(self, *pargs):
74         super(Installer, self).__init__()
75         self.name = 'nss'
76         self.pargs = pargs
77
78     def install_args(self, group):
79         group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
80                            help='Use passwd data to populate user attrs')
81
82     def configure(self, opts, changes):
83         if opts['info_nss'] != 'yes':
84             return
85
86         # Add configuration data to database
87         po = PluginObject(*self.pargs)
88         po.name = 'nss'
89         po.wipe_data()
90         po.wipe_config_values()
91
92         # Update global config to add info plugin
93         po.is_enabled = True
94         po.save_enabled_state()