summaryrefslogtreecommitdiffstats
path: root/ipalib/plugins/application.py
blob: 150dbe8e1cf42855bf77cad16d2826b2d3c1da0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# Authors:
#   Jakub Hrozek <jhrozek@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 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)