knife-acl 0.0.12 → 1.0.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Steven Danna (steve@opscode.com)
3
- # Copyright:: Copyright 2011--2014 Chef Software, Inc.
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,8 +21,8 @@ module OpscodeAcl
20
21
  module AclBase
21
22
 
22
23
  PERM_TYPES = %w(create read update delete grant)
23
- ACTOR_TYPES = %w(client group)
24
- OBJECT_TYPES = %w(clients groups containers data nodes roles cookbooks sandboxes environments)
24
+ MEMBER_TYPES = %w(client group user)
25
+ OBJECT_TYPES = %w(clients containers cookbooks data environments groups nodes roles)
25
26
  OBJECT_NAME_SPEC = /^[\-[:alnum:]_\.]+$/
26
27
 
27
28
  def validate_object_type!(type)
@@ -38,35 +39,41 @@ module OpscodeAcl
38
39
  end
39
40
  end
40
41
 
41
- def validate_actor_type!(type)
42
- if ! ACTOR_TYPES.include?(type)
43
- ui.fatal "Unknown actor type \"#{type}\". The following types are permitted: #{ACTOR_TYPES.join(', ')}"
42
+ def validate_member_type!(type)
43
+ if ! MEMBER_TYPES.include?(type)
44
+ ui.fatal "Unknown member type \"#{type}\". The following types are permitted: #{MEMBER_TYPES.join(', ')}"
44
45
  exit 1
45
46
  end
46
47
  end
47
48
 
48
- def validate_actor_name!(name)
49
- # Same rules apply to object's and actors
49
+ def validate_member_name!(name)
50
+ # Same rules apply to objects and members
50
51
  validate_object_name!(name)
51
52
  end
52
53
 
53
- def validate_perm_type!(perm)
54
- if ! PERM_TYPES.include?(perm)
55
- ui.fatal "Invalid permission \"#{perm}\". The following permissions are permitted: #{PERM_TYPES.join(',')}"
56
- exit 1
54
+ def validate_perm_type!(perms)
55
+ perms.split(',').each do |perm|
56
+ if ! PERM_TYPES.include?(perm)
57
+ ui.fatal "Invalid permission \"#{perm}\". The following permissions are permitted: #{PERM_TYPES.join(',')}"
58
+ exit 1
59
+ end
57
60
  end
61
+ end
58
62
 
63
+ def validate_member_exists!(member_type, member_name)
64
+ begin
65
+ true if rest.get_rest("#{member_type}s/#{member_name}")
66
+ rescue NameError
67
+ # ignore "NameError: uninitialized constant Chef::ApiClient" when finding a client
68
+ true
69
+ rescue
70
+ ui.fatal "#{member_type} '#{member_name}' does not exist"
71
+ exit 1
72
+ end
59
73
  end
60
74
 
61
- def validate_all_params!
62
- # Helper method to valid parameters for commands that modify permisisons
63
- # This assumes including class has the necessary accessors
64
- # We the validation to ensure we can give the user more helpful error messages.
65
- validate_perm_type!(perm)
66
- validate_actor_type!(actor_type)
67
- validate_actor_name!(actor_name)
68
- validate_object_name!(object_name)
69
- validate_object_type!(object_type)
75
+ def is_usag?(gname)
76
+ gname.length == 32 && gname =~ /^[0-9a-f]+$/
70
77
  end
71
78
 
72
79
  def get_acl(object_type, object_name)
@@ -77,9 +84,85 @@ module OpscodeAcl
77
84
  get_acl(object_type, object_name)[perm]
78
85
  end
79
86
 
87
+ def add_to_acl!(member_type, member_name, object_type, object_name, perms)
88
+ acl = get_acl(object_type, object_name)
89
+ perms.split(',').each do |perm|
90
+ ui.msg "Adding '#{member_name}' to '#{perm}' ACE of '#{object_name}'"
91
+ ace = acl[perm]
92
+
93
+ case member_type
94
+ when "client", "user"
95
+ next if ace['actors'].include?(member_name)
96
+ ace['actors'] << member_name
97
+ when "group"
98
+ next if ace['groups'].include?(member_name)
99
+ ace['groups'] << member_name
100
+ end
101
+
102
+ update_ace!(object_type, object_name, perm, ace)
103
+ end
104
+ end
105
+
106
+ def remove_from_acl!(member_type, member_name, object_type, object_name, perms)
107
+ acl = get_acl(object_type, object_name)
108
+ perms.split(',').each do |perm|
109
+ ui.msg "Removing '#{member_name}' from '#{perm}' ACE of '#{object_name}'"
110
+ ace = acl[perm]
111
+
112
+ case member_type
113
+ when "client", "user"
114
+ next unless ace['actors'].include?(member_name)
115
+ ace['actors'].delete(member_name)
116
+ when "group"
117
+ next unless ace['groups'].include?(member_name)
118
+ ace['groups'].delete(member_name)
119
+ end
120
+
121
+ update_ace!(object_type, object_name, perm, ace)
122
+ end
123
+ end
124
+
80
125
  def update_ace!(object_type, object_name, ace_type, ace)
81
126
  rest.put_rest("#{object_type}/#{object_name}/_acl/#{ace_type}", ace_type => ace)
82
127
  end
83
128
 
129
+ def add_to_group!(member_type, member_name, group_name)
130
+ validate_member_exists!(member_type, member_name)
131
+ existing_group = rest.get_rest("groups/#{group_name}")
132
+ ui.msg "Adding '#{member_name}' to '#{group_name}' group"
133
+ if !existing_group["#{member_type}s"].include?(member_name)
134
+ existing_group["#{member_type}s"] << member_name
135
+ new_group = {
136
+ "groupname" => existing_group["groupname"],
137
+ "orgname" => existing_group["orgname"],
138
+ "actors" => {
139
+ "users" => existing_group["users"],
140
+ "clients" => existing_group["clients"],
141
+ "groups" => existing_group["groups"]
142
+ }
143
+ }
144
+ rest.put_rest("groups/#{group_name}", new_group)
145
+ end
146
+ end
147
+
148
+ def remove_from_group!(member_type, member_name, group_name)
149
+ validate_member_exists!(member_type, member_name)
150
+ existing_group = rest.get_rest("groups/#{group_name}")
151
+ ui.msg "Removing '#{member_name}' from '#{group_name}' group"
152
+ if existing_group["#{member_type}s"].include?(member_name)
153
+ existing_group["#{member_type}s"].delete(member_name)
154
+ new_group = {
155
+ "groupname" => existing_group["groupname"],
156
+ "orgname" => existing_group["orgname"],
157
+ "actors" => {
158
+ "users" => existing_group["users"],
159
+ "clients" => existing_group["clients"],
160
+ "groups" => existing_group["groups"]
161
+ }
162
+ }
163
+ rest.put_rest("groups/#{group_name}", new_group)
164
+ end
165
+ end
166
+
84
167
  end
85
168
  end
@@ -0,0 +1,73 @@
1
+ #
2
+ # Author:: Jeremiah Snapp (jeremiah@chef.io)
3
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ module OpscodeAcl
20
+ class AclBulkAdd < Chef::Knife
21
+ category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
+ banner "knife acl bulk add MEMBER_TYPE MEMBER_NAME OBJECT_TYPE REGEX PERMS"
23
+
24
+ deps do
25
+ include OpscodeAcl::AclBase
26
+ end
27
+
28
+ def run
29
+ member_type, member_name, object_type, regex, perms = name_args
30
+ object_name_matcher = /#{regex}/
31
+
32
+ if name_args.length != 5
33
+ show_usage
34
+ ui.fatal "You must specify the member type [group], member name, object type, object name REGEX and perms"
35
+ exit 1
36
+ end
37
+
38
+ unless member_type == 'group'
39
+ ui.fatal "ERROR: To enforce best practice, knife-acl can only add a group to an ACL."
40
+ ui.fatal " See the knife-acl README for more information."
41
+ exit 1
42
+ end
43
+ validate_perm_type!(perms)
44
+ validate_member_name!(member_name)
45
+ validate_object_type!(object_type)
46
+ validate_member_exists!(member_type, member_name)
47
+
48
+ if %w(containers groups).include?(object_type)
49
+ ui.fatal "bulk modifying the ACL of #{object_type} is not permitted"
50
+ exit 1
51
+ end
52
+
53
+ objects_to_modify = []
54
+ all_objects = rest.get_rest(object_type)
55
+ objects_to_modify = all_objects.keys.select { |object_name| object_name =~ object_name_matcher }
56
+
57
+ if objects_to_modify.empty?
58
+ ui.info "No #{object_type} match the expression /#{regex}/"
59
+ exit 0
60
+ end
61
+
62
+ ui.msg("The ACL of the following #{object_type} will be modified:")
63
+ ui.msg("")
64
+ ui.msg(ui.list(objects_to_modify.sort, :columns_down))
65
+ ui.msg("")
66
+ ui.confirm("Are you sure you want to modify the ACL of these #{object_type}?")
67
+
68
+ objects_to_modify.each do |object_name|
69
+ add_to_acl!(member_type, member_name, object_type, object_name, perms)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,78 @@
1
+ #
2
+ # Author:: Jeremiah Snapp (jeremiah@chef.io)
3
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ module OpscodeAcl
20
+ class AclBulkRemove < Chef::Knife
21
+ category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
+ banner "knife acl bulk remove MEMBER_TYPE MEMBER_NAME OBJECT_TYPE REGEX PERMS"
23
+
24
+ deps do
25
+ include OpscodeAcl::AclBase
26
+ end
27
+
28
+ def run
29
+ member_type, member_name, object_type, regex, perms = name_args
30
+ object_name_matcher = /#{regex}/
31
+
32
+ if name_args.length != 5
33
+ show_usage
34
+ ui.fatal "You must specify the member type [client|group|user], member name, object type, object name REGEX and perms"
35
+ exit 1
36
+ end
37
+
38
+ if member_name == 'pivotal' && %w(client user).include?(member_type)
39
+ ui.fatal "ERROR: 'pivotal' is a system user so knife-acl will not remove it from an ACL."
40
+ exit 1
41
+ end
42
+ if member_name == 'admins' && member_type == 'group' && perms.to_s.split(',').include?('grant')
43
+ ui.fatal "ERROR: knife-acl will not remove the 'admins' group from the 'grant' ACE."
44
+ ui.fatal " Removal could prevent future attempts to modify permissions."
45
+ exit 1
46
+ end
47
+ validate_perm_type!(perms)
48
+ validate_member_type!(member_type)
49
+ validate_member_name!(member_name)
50
+ validate_object_type!(object_type)
51
+ validate_member_exists!(member_type, member_name)
52
+
53
+ if %w(containers groups).include?(object_type)
54
+ ui.fatal "bulk modifying the ACL of #{object_type} is not permitted"
55
+ exit 1
56
+ end
57
+
58
+ objects_to_modify = []
59
+ all_objects = rest.get_rest(object_type)
60
+ objects_to_modify = all_objects.keys.select { |object_name| object_name =~ object_name_matcher }
61
+
62
+ if objects_to_modify.empty?
63
+ ui.info "No #{object_type} match the expression /#{regex}/"
64
+ exit 0
65
+ end
66
+
67
+ ui.msg("The ACL of the following #{object_type} will be modified:")
68
+ ui.msg("")
69
+ ui.msg(ui.list(objects_to_modify.sort, :columns_down))
70
+ ui.msg("")
71
+ ui.confirm("Are you sure you want to modify the ACL of these #{object_type}?")
72
+
73
+ objects_to_modify.each do |object_name|
74
+ remove_from_acl!(member_type, member_name, object_type, object_name, perms)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Steven Danna (steve@opscode.com)
3
- # Copyright:: Copyright 2011--2014 Chef Software, Inc.
3
+ # Author:: Jeremiah Snapp (jeremiah@chef.io)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,45 +20,38 @@
19
20
  module OpscodeAcl
20
21
  class AclRemove < Chef::Knife
21
22
  category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
- banner "knife acl remove OBJECT_TYPE OBJECT_NAME PERM ACTOR_TYPE ACTOR_NAME"
23
-
24
- attr_reader :object_type, :object_name, :perm, :actor_type, :actor_name
23
+ banner "knife acl remove MEMBER_TYPE MEMBER_NAME OBJECT_TYPE OBJECT_NAME PERMS"
25
24
 
26
25
  deps do
27
26
  include OpscodeAcl::AclBase
28
27
  end
29
28
 
30
29
  def run
31
- @object_type, @object_name, @perm, @actor_type, @actor_name = name_args
30
+ member_type, member_name, object_type, object_name, perms = name_args
32
31
 
33
- if name_args.length < 5
32
+ if name_args.length != 5
34
33
  show_usage
35
- ui.fatal "You must specify the object_type, object_name, perm, actor type (client or group), and actor name"
34
+ ui.fatal "You must specify the member type [client|group|user], member name, object type, object name and perms"
36
35
  exit 1
37
36
  end
38
37
 
39
- validate_all_params!
40
- ace = get_ace(object_type, object_name, perm)
41
-
42
- case actor_type
43
- when "client"
44
- remove_actor_from_ace!(actor_name, ace)
45
- when "group"
46
- remove_group_from_ace!(actor_name, ace)
47
- when "users"
48
- # Not Implemented yet, we shouldn't get here.
38
+ if member_name == 'pivotal' && %w(client user).include?(member_type)
39
+ ui.fatal "ERROR: 'pivotal' is a system user so knife-acl will not remove it from an ACL."
40
+ exit 1
49
41
  end
50
-
51
- update_ace!(object_type, object_name, perm, ace)
52
- end
53
-
54
- def remove_group_from_ace!(name, ace)
55
- ace['groups'].delete(name)
56
- end
57
-
58
- def remove_actor_from_ace!(name, ace)
59
- ace['actors'].delete(name)
42
+ if member_name == 'admins' && member_type == 'group' && perms.to_s.split(',').include?('grant')
43
+ ui.fatal "ERROR: knife-acl will not remove the 'admins' group from the 'grant' ACE."
44
+ ui.fatal " Removal could prevent future attempts to modify permissions."
45
+ exit 1
46
+ end
47
+ validate_perm_type!(perms)
48
+ validate_member_type!(member_type)
49
+ validate_member_name!(member_name)
50
+ validate_object_name!(object_name)
51
+ validate_object_type!(object_type)
52
+ validate_member_exists!(member_type, member_name)
53
+
54
+ remove_from_acl!(member_type, member_name, object_type, object_name, perms)
60
55
  end
61
-
62
56
  end
63
57
  end
@@ -28,7 +28,7 @@ module OpscodeAcl
28
28
  def run
29
29
  object_type, object_name = name_args
30
30
 
31
- if ! object_name || ! object_type
31
+ if name_args.length != 2
32
32
  show_usage
33
33
  ui.fatal "You must specify an object type and object name"
34
34
  exit 1
@@ -0,0 +1,51 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@chef.io>)
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ module OpscodeAcl
21
+ class GroupAdd < Chef::Knife
22
+ category "OPSCODE HOSTED CHEF ACCESS CONTROL"
23
+ banner "knife group add MEMBER_TYPE MEMBER_NAME GROUP_NAME"
24
+
25
+ deps do
26
+ include OpscodeAcl::AclBase
27
+ end
28
+
29
+ def run
30
+ member_type, member_name, group_name = name_args
31
+
32
+ if name_args.length != 3
33
+ show_usage
34
+ ui.fatal "You must specify member type [client|group|user], member name and group name"
35
+ exit 1
36
+ end
37
+
38
+ validate_member_name!(group_name)
39
+ validate_member_type!(member_type)
40
+ validate_member_name!(member_name)
41
+
42
+ if group_name.downcase == "users"
43
+ ui.fatal "knife-acl can not manage members of the Users group"
44
+ ui.fatal "please read knife-acl's README.md for more information"
45
+ exit 1
46
+ end
47
+
48
+ add_to_group!(member_type, member_name, group_name)
49
+ end
50
+ end
51
+ end
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Seth Falcon (<seth@opscode.com>)
3
- # Copyright:: Copyright 2011--2014 Chef Software, Inc.
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,21 +20,25 @@
19
20
  module OpscodeAcl
20
21
  class GroupCreate < Chef::Knife
21
22
  category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
- banner "knife group create GROUP"
23
-
23
+ banner "knife group create GROUP_NAME"
24
+
24
25
  deps do
25
- require 'yaml'
26
+ include OpscodeAcl::AclBase
26
27
  end
27
28
 
28
29
  def run
29
30
  group_name = name_args[0]
30
- if !group_name || group_name.empty?
31
- ui.error "must specify a group name"
31
+
32
+ if name_args.length != 1
33
+ show_usage
34
+ ui.fatal "You must specify group name"
32
35
  exit 1
33
36
  end
34
- group = rest.post_rest("groups", {:groupname => group_name})
35
- ui.output group
37
+
38
+ validate_member_name!(group_name)
39
+
40
+ ui.msg "Creating '#{group_name}' group"
41
+ rest.post_rest("groups", {:groupname => group_name})
36
42
  end
37
43
  end
38
44
  end
39
-
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Christopher Maier (<cm@opscode.com>)
3
- # Copyright:: Copyright 2014 Opscode, Inc.
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2015 Opscode, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,20 +20,29 @@
19
20
  module OpscodeAcl
20
21
  class GroupDestroy < Chef::Knife
21
22
  category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
- banner "knife group destroy GROUP"
23
+ banner "knife group destroy GROUP_NAME"
23
24
 
24
25
  deps do
25
- require 'yaml'
26
+ include OpscodeAcl::AclBase
26
27
  end
27
28
 
28
29
  def run
29
30
  group_name = name_args[0]
30
- if !group_name || group_name.empty?
31
- ui.error "must specify a group name"
31
+
32
+ if name_args.length != 1
33
+ show_usage
34
+ ui.fatal "You must specify group name"
35
+ exit 1
36
+ end
37
+
38
+ validate_member_name!(group_name)
39
+
40
+ if %w(admins billing-admins clients users).include?(group_name.downcase)
41
+ ui.fatal "the '#{group_name}' group is a special group that should not be destroyed"
32
42
  exit 1
33
43
  end
34
- result = rest.delete_rest("groups/#{group_name}")
35
- ui.output result
44
+ ui.msg "Destroying '#{group_name}' group"
45
+ rest.delete_rest("groups/#{group_name}")
36
46
  end
37
47
  end
38
48
  end
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Seth Falcon (<seth@opscode.com>)
3
- # Copyright:: Copyright 2011--2014 Chef Software, Inc.
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,21 +21,18 @@ module OpscodeAcl
20
21
  class GroupList < Chef::Knife
21
22
  category "OPSCODE HOSTED CHEF ACCESS CONTROL"
22
23
  banner "knife group list"
23
-
24
+
25
+ deps do
26
+ include OpscodeAcl::AclBase
27
+ end
28
+
24
29
  def run
25
- chef_rest = Chef::REST.new(Chef::Config[:chef_server_url])
26
- groups = chef_rest.get_rest("groups").keys.sort
27
-
30
+ groups = rest.get_rest("groups").keys.sort
28
31
  ui.output(remove_usags(groups))
29
32
  end
30
33
 
31
34
  def remove_usags(groups)
32
35
  groups.select { |gname| !is_usag?(gname) }
33
36
  end
34
-
35
- def is_usag?(gname)
36
- gname.length == 32 && gname =~ /^[0-9a-f]+$/
37
- end
38
37
  end
39
38
  end
40
-
@@ -0,0 +1,51 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@chef.io>)
3
+ # Author:: Jeremiah Snapp (<jeremiah@chef.io>)
4
+ # Copyright:: Copyright 2011--2015 Chef Software, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ module OpscodeAcl
21
+ class GroupRemove < Chef::Knife
22
+ category "OPSCODE HOSTED CHEF ACCESS CONTROL"
23
+ banner "knife group remove MEMBER_TYPE MEMBER_NAME GROUP_NAME"
24
+
25
+ deps do
26
+ include OpscodeAcl::AclBase
27
+ end
28
+
29
+ def run
30
+ member_type, member_name, group_name = name_args
31
+
32
+ if name_args.length != 3
33
+ show_usage
34
+ ui.fatal "You must specify member type [client|group|user], member name and group name"
35
+ exit 1
36
+ end
37
+
38
+ validate_member_name!(group_name)
39
+ validate_member_type!(member_type)
40
+ validate_member_name!(member_name)
41
+
42
+ if group_name.downcase == "users"
43
+ ui.fatal "knife-acl can not manage members of the Users group"
44
+ ui.fatal "please read knife-acl's README.md for more information"
45
+ exit 1
46
+ end
47
+
48
+ remove_from_group!(member_type, member_name, group_name)
49
+ end
50
+ end
51
+ end