Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

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

# Authors: 

#   Rob Crittenden <rcritten@redhat.com> 

#   Pavel Zuna <pzuna@redhat.com> 

# 

# Copyright (C) 2009  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, either version 3 of the License, or 

# (at your option) any later version. 

# 

# 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, see <http://www.gnu.org/licenses/>. 

 

from ipalib.plugins.baseldap import * 

from ipalib import api, Int, _, ngettext, errors 

from ipalib.plugins.netgroup import NETGROUP_PATTERN, NETGROUP_PATTERN_ERRMSG 

from ipalib.dn import DN 

 

__doc__ = _(""" 

Groups of hosts. 

 

Manage groups of hosts. This is useful for applying access control to a 

number of hosts by using Host-based Access Control. 

 

EXAMPLES: 

 

Add a new host group: 

   ipa hostgroup-add --desc="Baltimore hosts" baltimore 

 

Add another new host group: 

   ipa hostgroup-add --desc="Maryland hosts" maryland 

 

Add members to the hostgroup: 

   ipa hostgroup-add-member --hosts=box1,box2,box3 baltimore 

 

Add a hostgroup as a member of another hostgroup: 

   ipa hostgroup-add-member --hostgroups=baltimore maryland 

 

Remove a host from the hostgroup: 

   ipa hostgroup-remove-member --hosts=box2 baltimore 

 

Display a host group: 

   ipa hostgroup-show baltimore 

 

Delete a hostgroup: 

   ipa hostgroup-del baltimore 

""") 

 

class hostgroup(LDAPObject): 

    """ 

    Hostgroup object. 

    """ 

    container_dn = api.env.container_hostgroup 

    object_name = _('host group') 

    object_name_plural = _('host groups') 

    object_class = ['ipaobject', 'ipahostgroup'] 

    default_attributes = ['cn', 'description', 'member', 'memberof', 

        'memberindirect', 'memberofindirect', 

    ] 

    uuid_attribute = 'ipauniqueid' 

    attribute_members = { 

        'member': ['host', 'hostgroup'], 

        'memberof': ['hostgroup', 'netgroup', 'hbacrule', 'sudorule'], 

        'memberindirect': ['host', 'hostgroup'], 

        'memberofindirect': ['hostgroup', 'hbacrule', 'sudorule'], 

    } 

 

    label = _('Host Groups') 

    label_singular = _('Host Group') 

 

    takes_params = ( 

        Str('cn', 

            pattern=NETGROUP_PATTERN, 

            pattern_errmsg=NETGROUP_PATTERN_ERRMSG, 

            cli_name='hostgroup_name', 

            label=_('Host-group'), 

            doc=_('Name of host-group'), 

            primary_key=True, 

            normalizer=lambda value: value.lower(), 

        ), 

        Str('description', 

            cli_name='desc', 

            label=_('Description'), 

            doc=_('A description of this host-group'), 

        ), 

    ) 

 

    def suppress_netgroup_memberof(self, dn, entry_attrs): 

        """ 

        We don't want to show managed netgroups so remove them from the 

        memberOf list. 

        """ 

        if 'memberof' in entry_attrs: 

            hgdn = DN(dn) 

            for member in entry_attrs['memberof']: 

                ngdn = DN(member) 

                if ngdn['cn'] == hgdn['cn']: 

                    try: 

                        netgroup = api.Command['netgroup_show'](ngdn['cn'], all=True)['result'] 

                        if self.has_objectclass(netgroup['objectclass'], 'mepmanagedentry'): 

                            entry_attrs['memberof'].remove(member) 

                            return 

                    except errors.NotFound: 

                        pass 

 

api.register(hostgroup) 

 

 

class hostgroup_add(LDAPCreate): 

    __doc__ = _('Add a new hostgroup.') 

 

    msg_summary = _('Added hostgroup "%(value)s"') 

 

    def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options): 

        try: 

            # check duplicity with hostgroups first to provide proper error 

            netgroup = api.Command['hostgroup_show'](keys[-1]) 

            self.obj.handle_duplicate_entry(*keys) 

        except errors.NotFound: 

            pass 

 

        try: 

            # when enabled, a managed netgroup is created for every hostgroup 

            # make sure that the netgroup can be created 

            netgroup = api.Command['netgroup_show'](keys[-1]) 

            raise errors.DuplicateEntry(message=unicode(_(\ 

                    u'netgroup with name "%s" already exists. ' \ 

                    u'Hostgroups and netgroups share a common namespace'\ 

                    ) % keys[-1])) 

        except errors.NotFound: 

            pass 

 

        return dn 

 

    def post_callback(self, ldap, dn, entry_attrs, *keys, **options): 

        # Always wait for the associated netgroup to be created so we can 

        # be sure to ignore it in memberOf 

        newentry = wait_for_value(ldap, dn, 'objectclass', 'mepOriginEntry') 

        entry_from_entry(entry_attrs, newentry) 

        self.obj.suppress_netgroup_memberof(dn, entry_attrs) 

 

        return dn 

 

 

api.register(hostgroup_add) 

 

 

class hostgroup_del(LDAPDelete): 

    __doc__ = _('Delete a hostgroup.') 

 

    msg_summary = _('Deleted hostgroup "%(value)s"') 

 

api.register(hostgroup_del) 

 

 

class hostgroup_mod(LDAPUpdate): 

    __doc__ = _('Modify a hostgroup.') 

 

    msg_summary = _('Modified hostgroup "%(value)s"') 

 

    def post_callback(self, ldap, dn, entry_attrs, *keys, **options): 

        self.obj.suppress_netgroup_memberof(dn, entry_attrs) 

        return dn 

 

api.register(hostgroup_mod) 

 

 

class hostgroup_find(LDAPSearch): 

    __doc__ = _('Search for hostgroups.') 

 

    member_attributes = ['member', 'memberof'] 

    msg_summary = ngettext( 

        '%(count)d hostgroup matched', '%(count)d hostgroups matched', 0 

    ) 

 

    def post_callback(self, ldap, entries, truncated, *args, **options): 

        if options.get('pkey_only', False): 

            return 

        for entry in entries: 

            (dn, entry_attrs) = entry 

            self.obj.suppress_netgroup_memberof(dn, entry_attrs) 

 

api.register(hostgroup_find) 

 

 

class hostgroup_show(LDAPRetrieve): 

    __doc__ = _('Display information about a hostgroup.') 

 

    def post_callback(self, ldap, dn, entry_attrs, *keys, **options): 

        self.obj.suppress_netgroup_memberof( dn, entry_attrs) 

        return dn 

 

api.register(hostgroup_show) 

 

 

class hostgroup_add_member(LDAPAddMember): 

    __doc__ = _('Add members to a hostgroup.') 

 

    def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options): 

        self.obj.suppress_netgroup_memberof(dn, entry_attrs) 

        return (completed, dn) 

 

api.register(hostgroup_add_member) 

 

 

class hostgroup_remove_member(LDAPRemoveMember): 

    __doc__ = _('Remove members from a hostgroup.') 

 

    def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options): 

        self.obj.suppress_netgroup_memberof(dn, entry_attrs) 

        return (completed, dn) 

 

api.register(hostgroup_remove_member)