Add Info Provider plugin framework
[cascardo/ipsilon.git] / ipsilon / info / nss.py
diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py
new file mode 100755 (executable)
index 0000000..e9a3a96
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Ipsilon Project Contributors
+#
+# See the file named COPYING for the project license
+
+from ipsilon.info.common import InfoProviderBase
+from ipsilon.info.common import InfoProviderInstaller
+from ipsilon.util.plugin import PluginObject
+import pwd
+
+
+class InfoProvider(InfoProviderBase):
+
+    def __init__(self):
+        super(InfoProvider, self).__init__()
+        self.name = 'nss'
+
+    def get_user_attrs(self, user):
+        userattrs = None
+        try:
+            p = pwd.getpwnam(user)
+            userattrs = {'uidNumber': p[2], 'gidNumber': p[3],
+                         'gecos': p[4], 'homeDirectory': p[5],
+                         'loginShell': p[6]}
+        except KeyError:
+            pass
+
+        return userattrs
+
+
+class Installer(InfoProviderInstaller):
+
+    def __init__(self):
+        super(Installer, self).__init__()
+        self.name = 'nss'
+
+    def install_args(self, group):
+        group.add_argument('--info-nss', choices=['yes', 'no'], default='no',
+                           help='Use passwd data to populate user attrs')
+
+    def configure(self, opts):
+        if opts['info_nss'] != 'yes':
+            return
+
+        # Add configuration data to database
+        po = PluginObject()
+        po.name = 'nss'
+        po.wipe_data()
+        po.wipe_config_values(self.facility)
+
+        # Replace global config, only one plugin info can be used
+        po.name = 'global'
+        globalconf = po.get_plugin_config(self.facility)
+        if 'order' in globalconf:
+            order = globalconf['order'].split(',')
+        else:
+            order = []
+        order.append('nss')
+        globalconf['order'] = ','.join(order)
+        po.set_config(globalconf)
+        po.save_plugin_config(self.facility)