3dfd885727000c8e4ced043f4f7084f3eb748151
[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         self.new_config(self.name)
29
30     def _get_posix_user(self, user):
31         p = pwd.getpwnam(user)
32         return {'username': p.pw_name, 'uidNumber': p.pw_uid,
33                 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
34                 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
35
36     def _get_posix_groups(self, user, group):
37         groups = set()
38         getgrouplist = getattr(os, 'getgrouplist', None)
39         if getgrouplist:
40             ids = getgrouplist(user, group)
41             for i in ids:
42                 try:
43                     g = grp.getgrgid(i)
44                     groups.add(g.gr_name)
45                 except KeyError:
46                     pass
47
48         else:
49             g = grp.getgrgid(group)
50             groups.add(g.gr_name)
51
52             allg = grp.getgrall()
53             for g in allg:
54                 if user in g.gr_mem:
55                     groups.add(g.gr_name)
56
57         return list(groups)
58
59     def get_user_attrs(self, user):
60         reply = dict()
61         try:
62             posix_user = self._get_posix_user(user)
63             userattrs, extras = self.mapper.map_attrs(posix_user)
64             groups = self._get_posix_groups(posix_user['username'],
65                                             posix_user['gidNumber'])
66             reply['userdata'] = userattrs
67             reply['groups'] = groups
68             reply['extras'] = {'posix': extras}
69
70         except KeyError:
71             pass
72
73         return reply
74
75
76 class Installer(InfoProviderInstaller):
77
78     def __init__(self):
79         super(Installer, self).__init__()
80         self.name = 'nss'
81
82     def install_args(self, group):
83         group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
84                            help='Use passwd data to populate user attrs')
85
86     def configure(self, opts):
87         if opts['info_nss'] != 'yes':
88             return
89
90         # Add configuration data to database
91         po = PluginObject()
92         po.name = 'nss'
93         po.wipe_data()
94         po.wipe_config_values(self.facility)
95
96         # Replace global config, only one plugin info can be used
97         po.name = 'global'
98         globalconf = po.get_plugin_config(self.facility)
99         if 'order' in globalconf:
100             order = globalconf['order'].split(',')
101         else:
102             order = []
103         order.append('nss')
104         globalconf['order'] = ','.join(order)
105         po.save_plugin_config(self.facility, globalconf)