50c84a8df22af69ce089b495c098dd4a47e61434
[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, *pargs):
24         super(InfoProvider, self).__init__(*pargs)
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, *pargs):
79         super(Installer, self).__init__()
80         self.name = 'nss'
81         self.pargs = pargs
82
83     def install_args(self, group):
84         group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
85                            help='Use passwd data to populate user attrs')
86
87     def configure(self, opts):
88         if opts['info_nss'] != 'yes':
89             return
90
91         # Add configuration data to database
92         po = PluginObject(*self.pargs)
93         po.name = 'nss'
94         po.wipe_data()
95         po.wipe_config_values()
96
97         # Update global config to add login plugin
98         po.is_enabled = True
99         po.save_enabled_state()