From 079f89d4615994f19a4d26fb879bf1c248fa468b Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 2 Feb 2009 16:27:31 +0100 Subject: Add application frontend plugin --- ipalib/plugins/f_application.py | 255 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 ipalib/plugins/f_application.py diff --git a/ipalib/plugins/f_application.py b/ipalib/plugins/f_application.py new file mode 100644 index 000000000..150dbe8e1 --- /dev/null +++ b/ipalib/plugins/f_application.py @@ -0,0 +1,255 @@ +# Authors: +# Jakub Hrozek +# +# 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 application policy containers. +""" + +from ipalib import api, crud +from ipalib import Object, Command # Plugin base classes +from ipalib import Str, StrEnum, Flag # Parameter types + +def get_base_by_type(type): + if type == 'config': + return api.env.container_applications + if type == 'role': + return api.env.container_roles + +class application(Object): + 'Application object' + takes_params = ( + Str('cn', + cli_name='appname', + primary_key=True, + doc='Application name', + ), + Str('description?', + doc='Application description', + ), + ) +api.register(application) + +# The default attributes to query +default_attributes = ['cn','description'] + +class application_create(crud.Create): + 'Add a new application' + takes_options = ( + StrEnum('type', + values=(u'config', u'role'), + doc='The type of the application', + ), + ) + + def execute(self, cn, **kw): + """ + Execute the application-create operation + + The dn should not be passed as a keyword argument, it + should be constructed by this method. + + :param cn: The name of the application being added. + :param kw: Keyword arguments for the other LDAP attributes. + """ + self.log.info("IPA: application-create '%s'" % cn) + + assert 'dn' not in kw + assert 'cn' not in kw + ldap = self.api.Backend.ldap + + kw['objectClass'] = ['nsContainer', 'ipaContainer'] + if kw['type'] == 'config': + kw['dn'] = ldap.make_application_dn(cn) + if kw['type'] == 'role': + kw['dn'] = ldap.make_role_application_dn(cn) + kw['cn'] = cn + + del kw['type'] + return ldap.create(**kw) + + def output_for_cli(self, textui, result, *args, **options): + """ + Output result of this command to command line interface. + """ + textui.print_name(self.name) + textui.print_entry(result) + textui.print_dashed('Added application "%s"' % result['cn']) + +api.register(application_create) + +class application_find(crud.Search): + 'Search for applications' + takes_options = ( + StrEnum('type', + values=(u'config', u'role'), + doc='The type of the application', + ), + Flag('all', + doc='Retrieve all application attributes' + ), + ) + + def execute(self, term, **kw): + """ + Execute the application-find operation + """ + ldap = self.api.Backend.ldap + + search_kw = dict() + search_kw['cn'] = term + search_kw['objectclass'] = 'ipaContainer' + search_kw['base'] = get_base_by_type(kw['type']) + search_kw['scope'] = 'one' + if kw.get('all', False): + search_kw['attributes'] = ['*'] + else: + search_kw['attributes'] = default_attributes + + return ldap.search(**search_kw) + + def output_for_cli(self, textui, result, cn, **options): + """ + Output result of this command to command line interface. + """ + counter = result[0] + apps = result[1:] + if counter == 0 or len(apps) == 0: + textui.print_plain("No applications found") + return + if len(apps) == 1: + textui.print_entry(apps[0]) + return + textui.print_name(self.name) + for a in apps: + textui.print_plain('%(cn)s:' % a) + textui.print_entry(a) + textui.print_plain('') + if counter == -1: + textui.print_plain('These results are truncated.') + textui.print_plain('Please refine your search and try again.') + textui.print_count(apps, '%d applications matched') + +api.register(application_find) + +class application_delete(crud.Del): + 'Delete an application' + takes_options = ( + StrEnum('type', + values=(u'config', u'role'), + doc='The type of the application', + ), + ) + + def execute(self, cn, **kw): + """ + Delete the application container. + + :param cn: The name of the application being deleted. + :param kw: Not used. + """ + if cn == "Shell Applications": + raise SyntaxError("Cannot delete shell application") + self.log.info("IPA: application_delete '%s'" % cn) + + ldap = self.api.Backend.ldap + dn = ldap.find_entry_dn("cn", + cn, + object_type='ipaContainer', + base=get_base_by_type(kw['type'])) + + return ldap.delete(dn) + + def output_for_cli(self, textui, result, cn): + """ + Output result of this command to command line interface. + """ + textui.print_plain('Deleted application "%s"' % cn) + +api.register(application_delete) + +class application_show(crud.Get): + 'Examine an existing application' + takes_options = ( + StrEnum('type', + values=(u'config', u'role'), + doc='The type of the application', + ), + Flag('all', + doc='Retrieve all application attributes' + ), + ) + def execute(self, cn, **kw): + """ + Execute the application-show operation. + """ + ldap = self.api.Backend.ldap + dn = ldap.find_entry_dn("cn", + cn, + object_type='ipaContainer', + base=get_base_by_type(kw['type'])) + + if kw.get('all', False): + return ldap.retrieve(dn) + else: + return ldap.retrieve(dn, default_attributes) + + def output_for_cli(self, textui, result, cn, **options): + if result: + textui.print_entry(result) + +api.register(application_show) + +class application_edit(crud.Mod): + 'Edit an existing application' + takes_options = ( + StrEnum('type', + values=(u'config', u'role'), + doc='The type of the application', + ), + ) + + def execute(self, cn, **kw): + """ + Execute the application-edit operation + + :param cn: The name of the application to edit + :param kw: Keyword arguments for the other LDAP attributes. + """ + self.log.info("IPA: application_edit '%s'" % cn) + + assert 'cn' not in kw + assert 'dn' not in kw + ldap = self.api.Backend.ldap + dn = ldap.find_entry_dn("cn", + cn, + object_type='ipaContainer', + base=get_base_by_type(kw['type'])) + + del kw['type'] + return ldap.update(dn, **kw) + + def output_for_cli(self, textui, result, cn, **options): + """ + Output result of this command to command line interface. + """ + textui.print_name(self.name) + textui.print_entry(result) + textui.print_dashed('Updated application "%s"' % result['cn']) + +api.register(application_edit) -- cgit