summaryrefslogtreecommitdiffstats
path: root/ipsilon/info
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2014-06-27 19:29:27 -0400
committerPatrick Uiterwijk <puiterwijk@redhat.com>2014-09-24 20:29:41 +0200
commitaa7cd3ad8e6d51f51ae46b3a6a15a9021edfa595 (patch)
tree4898b6df453237f8f9ed7451e632f77d98b91121 /ipsilon/info
parent9c13685d58b242c865fd203fd7b4a239fbf07ac1 (diff)
downloadipsilon-aa7cd3ad8e6d51f51ae46b3a6a15a9021edfa595.tar.gz
ipsilon-aa7cd3ad8e6d51f51ae46b3a6a15a9021edfa595.tar.xz
ipsilon-aa7cd3ad8e6d51f51ae46b3a6a15a9021edfa595.zip
Add Info Provider plugin framework
Signed-off-by: Simo Sorce <simo@redhat.com> Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
Diffstat (limited to 'ipsilon/info')
-rw-r--r--ipsilon/info/__init__.py0
-rwxr-xr-xipsilon/info/common.py75
-rwxr-xr-xipsilon/info/nss.py62
3 files changed, 137 insertions, 0 deletions
diff --git a/ipsilon/info/__init__.py b/ipsilon/info/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ipsilon/info/__init__.py
diff --git a/ipsilon/info/common.py b/ipsilon/info/common.py
new file mode 100755
index 0000000..6dbaf93
--- /dev/null
+++ b/ipsilon/info/common.py
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Ipsilon Project Contributors
+#
+# See the file named COPYING for the project license
+
+from ipsilon.util.log import Log
+from ipsilon.util.plugin import PluginLoader, PluginObject
+from ipsilon.util.plugin import PluginInstaller
+
+
+class InfoProviderBase(PluginObject):
+
+ def __init__(self):
+ super(InfoProviderBase, self).__init__()
+
+ def get_user_attrs(self, user):
+ raise NotImplementedError
+
+
+FACILITY = 'info_config'
+
+
+class Info(Log):
+
+ def __init__(self, *args, **kwargs):
+ self.providers = []
+
+ loader = PluginLoader(Info, FACILITY, 'InfoProvider')
+ plugins = loader.get_plugin_data()
+
+ available = plugins['available'].keys()
+ self.debug('Available info providers: %s' % str(available))
+
+ for item in plugins['whitelist']:
+ self.debug('Login plugin in whitelist: %s' % item)
+ if item not in plugins['available']:
+ self.debug('Info Plugin %s not found' % item)
+ continue
+ self.providers.append((item, plugins['available'][item]))
+ self.debug('Added Info plugin: %s' % item)
+
+ def get_user_attrs(self, user, provider=None):
+ if provider:
+ for p in self.providers:
+ if p[0] == provider:
+ return p[1].get_user_attrs(user)
+ else:
+ for p in self.providers:
+ ret = p[1].get_user_attrs(user)
+ if ret:
+ return ret
+
+ return None
+
+
+class InfoProviderInstaller(object):
+
+ def __init__(self):
+ self.facility = FACILITY
+ self.ptype = 'info'
+ self.name = None
+
+ def install_args(self, group):
+ raise NotImplementedError
+
+ def configure(self, opts):
+ raise NotImplementedError
+
+
+class InfoProviderInstall(object):
+
+ def __init__(self):
+ pi = PluginInstaller(InfoProviderInstall)
+ self.plugins = pi.get_plugins()
diff --git a/ipsilon/info/nss.py b/ipsilon/info/nss.py
new file mode 100755
index 0000000..e9a3a96
--- /dev/null
+++ b/ipsilon/info/nss.py
@@ -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)