2f4039ad1c2ff66c31945246587df7fe54ffccf1
[cascardo/ipsilon.git] / ipsilon / info / nss.py
1 # Copyright (C) 2014 Ipsilon Project Contributors
2 #
3 # See the file named COPYING for the project license
4
5 from ipsilon.info.common import InfoProviderBase
6 from ipsilon.info.common import InfoProviderInstaller
7 from ipsilon.info.common import InfoMapping
8 from ipsilon.util.plugin import PluginObject
9 import grp
10 import pwd
11 import os
12
13
14 posix_map = {
15     'gecos': 'fullname'
16 }
17
18
19 class InfoProvider(InfoProviderBase):
20
21     def __init__(self, *pargs):
22         super(InfoProvider, self).__init__(*pargs)
23         self.mapper = InfoMapping()
24         self.mapper.set_mapping(posix_map)
25         self.name = 'nss'
26         self.new_config(self.name)
27
28     def _get_posix_user(self, user):
29         p = pwd.getpwnam(user)
30         return {'username': p.pw_name, 'uidNumber': p.pw_uid,
31                 'gidNumber': p.pw_gid, 'gecos': p.pw_gecos,
32                 'homeDirectory': p.pw_dir, 'loginShell': p.pw_shell}
33
34     def _get_posix_groups(self, user, group):
35         groups = set()
36         getgrouplist = getattr(os, 'getgrouplist', None)
37         if getgrouplist:
38             ids = getgrouplist(user, group)
39             for i in ids:
40                 try:
41                     g = grp.getgrgid(i)
42                     groups.add(g.gr_name)
43                 except KeyError:
44                     pass
45
46         else:
47             g = grp.getgrgid(group)
48             groups.add(g.gr_name)
49
50             allg = grp.getgrall()
51             for g in allg:
52                 if user in g.gr_mem:
53                     groups.add(g.gr_name)
54
55         return list(groups)
56
57     def get_user_attrs(self, user):
58         reply = dict()
59         try:
60             posix_user = self._get_posix_user(user)
61             userattrs, extras = self.mapper.map_attrs(posix_user)
62             groups = self._get_posix_groups(posix_user['username'],
63                                             posix_user['gidNumber'])
64             reply = userattrs
65             reply['_groups'] = groups
66             reply['_extras'] = {'posix': extras}
67
68         except KeyError:
69             pass
70
71         return reply
72
73
74 class Installer(InfoProviderInstaller):
75
76     def __init__(self, *pargs):
77         super(Installer, self).__init__()
78         self.name = 'nss'
79         self.pargs = pargs
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(*self.pargs)
91         po.name = 'nss'
92         po.wipe_data()
93         po.wipe_config_values()
94
95         # Update global config to add info plugin
96         po.is_enabled = True
97         po.save_enabled_state()