summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorRob Crittenden <rcritten@redhat.com>2008-10-10 03:36:39 -0400
committerRob Crittenden <rcritten@redhat.com>2008-10-10 03:36:57 -0400
commitdbe49423ab16ed9ad01166feee22b68b7b05c725 (patch)
treeffb0233f106b5ac0bee2a261a125c7493f038f97 /ipalib
parent5d2a99925d4b8f8bb39dfbf4ae797d9845366109 (diff)
downloadfreeipa-dbe49423ab16ed9ad01166feee22b68b7b05c725.tar.gz
freeipa-dbe49423ab16ed9ad01166feee22b68b7b05c725.tar.xz
freeipa-dbe49423ab16ed9ad01166feee22b68b7b05c725.zip
Start service principal plugin
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/plugins/f_service.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/ipalib/plugins/f_service.py b/ipalib/plugins/f_service.py
new file mode 100644
index 000000000..0db1171cb
--- /dev/null
+++ b/ipalib/plugins/f_service.py
@@ -0,0 +1,155 @@
+# Authors:
+# Jason Gerard DeRose <jderose@redhat.com>
+#
+# Copyright (C) 2008 Red Hat
+# see file 'COPYING' for use and warranty information
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; version 2 only
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+"""
+Frontend plugins for service (Identity).
+"""
+
+from ipalib import frontend
+from ipalib import crud
+from ipalib.frontend import Param
+from ipalib import api
+from ipalib import errors
+from ipalib import ipa_types
+from ipa_server import servercore
+from ipa_server import ipaldap
+import ldap
+
+class service(frontend.Object):
+ """
+ Service object.
+ """
+ takes_params = (
+ Param('principal', primary_key=True),
+ )
+api.register(service)
+
+
+class service_add(crud.Add):
+ 'Add a new service.'
+ """
+ my_params = (
+ Param('force', type=ipa_types.Bool(), default=False),
+ )
+ def get_options(self):
+ for param in self.my_params:
+ yield param
+ """
+ def execute(self, *args, **kw):
+ """args[0] = service principal to add
+ kw{force} determines whether we continue on errors
+ """
+ force = kw.get('force', False)
+
+ principal = args[0]
+
+ # Break down the principal into its component parts, which may or
+ # may not include the realm.
+ sp = principal.split('/')
+ if len(sp) != 2:
+ raise errors.MalformedServicePrincipal
+ service = sp[0]
+
+ sr = sp[1].split('@')
+ if len(sr) == 1:
+ hostname = sr[0].lower()
+ realm = servercore.realm
+ elif len(sr) == 2:
+ hostname = sr[0].lower()
+ realm = sr[1]
+ else:
+ raise MalformedServicePrincipal
+
+ """
+ FIXME once DNS client is done
+ if not force:
+ fqdn = hostname + "."
+ rs = dnsclient.query(fqdn, dnsclient.DNS_C_IN, dnsclient.DNS_T_A)
+ if len(rs) == 0:
+ logging.debug("IPA: DNS A record lookup failed for '%s'" % hostname)
+ raise ipaerror.gen_exception(ipaerror.INPUT_NOT_DNS_A_RECORD)
+ else:
+ logging.debug("IPA: found %d records for '%s'" % (len(rs), hostname))
+ """
+
+ service_container = servercore.DefaultServiceContainer
+
+ # At some point we'll support multiple realms
+ if (realm != servercore.realm):
+ raise errors.RealmMismatch
+
+ # Put the principal back together again
+ princ_name = service + "/" + hostname + "@" + realm
+
+ dn = "krbprincipalname=%s,%s,%s" % (ldap.dn.escape_dn_chars(princ_name),
+ service_container,servercore.basedn)
+ entry = ipaldap.Entry(dn)
+
+ entry.setValues('objectClass', 'krbPrincipal', 'krbPrincipalAux', 'krbTicketPolicyAux')
+ entry.setValues('krbprincipalname', princ_name)
+
+ result = servercore.add_entry(entry)
+ return result
+ def forward(self, *args, **kw):
+ result = super(crud.Add, self).forward(*args, **kw)
+ if result:
+ print "Service %s added" % args[0]
+api.register(service_add)
+
+
+class service_del(crud.Del):
+ 'Delete an existing service.'
+ def execute(self, *args, **kw):
+ """args[0] = princial to remove
+
+ Delete a service principal.
+
+ principal is the full DN of the entry to delete.
+
+ This should be called with much care.
+ """
+ principal = args[0]
+ return False
+ def forward(self, *args, **kw):
+ result = super(crud.Del, self).forward(*args, **kw)
+ if result:
+ print "Service %s removed" % args[0]
+api.register(service_del)
+
+
+class service_mod(crud.Mod):
+ 'Edit an existing service.'
+api.register(service_mod)
+
+
+class service_find(crud.Find):
+ 'Search the existing services.'
+api.register(service_find)
+
+
+class service_show(crud.Get):
+ 'Examine an existing service.'
+ def execute(self, *args, **kw):
+ filter = "(&(objectclass=krbPrincipalAux)(!(objectClass=person))(!(|(krbprincipalname=kadmin/*)(krbprincipalname=K/M@*)(krbprincipalname=krbtgt/*)))(&(|(krbprincipalname=%s))))" % args[0]
+ result = servercore.get_sub_entry(servercore.basedn, filter, ["*"])
+ return result
+ def forward(self, *args, **kw):
+ result = super(crud.Get, self).forward(*args, **kw)
+ return result
+api.register(service_show)