In configure we do not need to set_config()
[cascardo/ipsilon.git] / ipsilon / info / nss.py
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2014 Ipsilon Project Contributors
4 #
5 # See the file named COPYING for the project license
6
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
11 import grp
12 import pwd
13 import os
14
15
16 posix_map = {
17     'gecos': 'fullname'
18 }
19
20
21 class InfoProvider(InfoProviderBase):
22
23     def __init__(self):
24         super(InfoProvider, self).__init__()
25         self.mapper = InfoMapping()
26         self.mapper.set_mapping(posix_map)
27         self.name = 'nss'
28
29     def _get_posix_user(self, user):
30         p = pwd.getpwnam(user)
31         return {'username': p.pw_name, 'uidNumber': p.pw_uid,
32                 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
33                 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
34
35     def _get_posix_groups(self, user, group):
36         groups = set()
37         getgrouplist = getattr(os, 'getgrouplist', None)
38         if getgrouplist:
39             ids = getgrouplist(user, group)
40             for i in ids:
41                 try:
42                     g = grp.getgrgid(i)
43                     groups.add(g.gr_name)
44                 except KeyError:
45                     pass
46
47         else:
48             g = grp.getgrgid(group)
49             groups.add(g.gr_name)
50
51             allg = grp.getgrall()
52             for g in allg:
53                 if user in g.gr_mem:
54                     groups.add(g.gr_name)
55
56         return list(groups)
57
58     def get_user_attrs(self, user):
59         reply = dict()
60         try:
61             posix_user = self._get_posix_user(user)
62             userattrs, extras = self.mapper.map_attrs(posix_user)
63             groups = self._get_posix_groups(posix_user['username'],
64                                             posix_user['gidNumber'])
65             reply['userdata'] = userattrs
66             reply['groups'] = groups
67             reply['extras'] = {'posix': extras}
68
69         except KeyError:
70             pass
71
72         return reply
73
74
75 class Installer(InfoProviderInstaller):
76
77     def __init__(self):
78         super(Installer, self).__init__()
79         self.name = 'nss'
80
81     def install_args(self, group):
82         group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
83                            help='Use passwd data to populate user attrs')
84
85     def configure(self, opts):
86         if opts['info_nss'] != 'yes':
87             return
88
89         # Add configuration data to database
90         po = PluginObject()
91         po.name = 'nss'
92         po.wipe_data()
93         po.wipe_config_values(self.facility)
94
95         # Replace global config, only one plugin info can be used
96         po.name = 'global'
97         globalconf = po.get_plugin_config(self.facility)
98         if 'order' in globalconf:
99             order = globalconf['order'].split(',')
100         else:
101             order = []
102         order.append('nss')
103         globalconf['order'] = ','.join(order)
104         po.save_plugin_config(self.facility, globalconf)