chef 11.0.0 → 11.2.0.rc.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.
Files changed (66) hide show
  1. data/distro/common/html/chef-client.8.html +3 -3
  2. data/distro/common/html/chef-expander.8.html +3 -3
  3. data/distro/common/html/chef-expanderctl.8.html +3 -3
  4. data/distro/common/html/chef-server-webui.8.html +3 -3
  5. data/distro/common/html/chef-server.8.html +3 -3
  6. data/distro/common/html/chef-shell.1.html +7 -7
  7. data/distro/common/html/chef-solo.8.html +3 -3
  8. data/distro/common/html/chef-solr.8.html +3 -3
  9. data/distro/common/html/knife-bootstrap.1.html +3 -3
  10. data/distro/common/html/knife-client.1.html +4 -4
  11. data/distro/common/html/knife-configure.1.html +3 -3
  12. data/distro/common/html/knife-cookbook-site.1.html +6 -6
  13. data/distro/common/html/knife-cookbook.1.html +7 -7
  14. data/distro/common/html/knife-data-bag.1.html +3 -3
  15. data/distro/common/html/knife-environment.1.html +3 -3
  16. data/distro/common/html/knife-exec.1.html +4 -4
  17. data/distro/common/html/knife-index.1.html +4 -4
  18. data/distro/common/html/knife-node.1.html +4 -4
  19. data/distro/common/html/knife-role.1.html +6 -6
  20. data/distro/common/html/knife-search.1.html +5 -5
  21. data/distro/common/html/knife-ssh.1.html +3 -3
  22. data/distro/common/html/knife-status.1.html +4 -4
  23. data/distro/common/html/knife-tag.1.html +3 -3
  24. data/distro/common/html/knife.1.html +11 -11
  25. data/distro/common/man/man1/chef-shell.1 +1 -1
  26. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  27. data/distro/common/man/man1/knife-client.1 +1 -1
  28. data/distro/common/man/man1/knife-configure.1 +1 -1
  29. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  30. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  31. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  32. data/distro/common/man/man1/knife-environment.1 +1 -1
  33. data/distro/common/man/man1/knife-exec.1 +1 -1
  34. data/distro/common/man/man1/knife-index.1 +1 -1
  35. data/distro/common/man/man1/knife-node.1 +1 -1
  36. data/distro/common/man/man1/knife-role.1 +1 -1
  37. data/distro/common/man/man1/knife-search.1 +1 -1
  38. data/distro/common/man/man1/knife-ssh.1 +1 -1
  39. data/distro/common/man/man1/knife-status.1 +1 -1
  40. data/distro/common/man/man1/knife-tag.1 +1 -1
  41. data/distro/common/man/man1/knife.1 +1 -1
  42. data/distro/common/man/man8/chef-client.8 +1 -1
  43. data/distro/common/man/man8/chef-expander.8 +1 -1
  44. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  45. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  46. data/distro/common/man/man8/chef-server.8 +1 -1
  47. data/distro/common/man/man8/chef-solo.8 +1 -1
  48. data/distro/common/man/man8/chef-solr.8 +1 -1
  49. data/lib/chef/knife/configure.rb +16 -13
  50. data/lib/chef/knife/user_create.rb +93 -0
  51. data/lib/chef/knife/user_delete.rb +46 -0
  52. data/lib/chef/knife/user_edit.rb +53 -0
  53. data/lib/chef/knife/user_list.rb +42 -0
  54. data/lib/chef/knife/user_reregister.rb +59 -0
  55. data/lib/chef/knife/user_show.rb +52 -0
  56. data/lib/chef/user.rb +182 -0
  57. data/lib/chef/version.rb +1 -1
  58. data/spec/unit/knife/configure_spec.rb +23 -26
  59. data/spec/unit/knife/user_create_spec.rb +86 -0
  60. data/spec/unit/knife/user_delete_spec.rb +39 -0
  61. data/spec/unit/knife/user_edit_spec.rb +42 -0
  62. data/spec/unit/knife/user_list_spec.rb +32 -0
  63. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  64. data/spec/unit/knife/user_show_spec.rb +41 -0
  65. data/spec/unit/user_spec.rb +255 -0
  66. metadata +1246 -1227
@@ -0,0 +1,93 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserCreate < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ option :file,
31
+ :short => "-f FILE",
32
+ :long => "--file FILE",
33
+ :description => "Write the private key to a file"
34
+
35
+ option :admin,
36
+ :short => "-a",
37
+ :long => "--admin",
38
+ :description => "Create the user as an admin",
39
+ :boolean => true
40
+
41
+ option :user_password,
42
+ :short => "-p PASSWORD",
43
+ :long => "--password PASSWORD",
44
+ :description => "Password for newly created user",
45
+ :default => ""
46
+
47
+ option :user_key,
48
+ :long => "--user-key FILENAME",
49
+ :description => "Public key for newly created user. By default a key will be created for you."
50
+
51
+ banner "knife user create USER (options)"
52
+
53
+ def run
54
+ @user_name = @name_args[0]
55
+
56
+ if @user_name.nil?
57
+ show_usage
58
+ ui.fatal("You must specify a user name")
59
+ exit 1
60
+ end
61
+
62
+ if config[:user_password].length == 0
63
+ show_usage
64
+ ui.fatal("You must specify a non-blank password")
65
+ exit 1
66
+ end
67
+
68
+ user = Chef::User.new
69
+ user.name(@user_name)
70
+ user.admin(config[:admin])
71
+ user.password config[:user_password]
72
+
73
+ if config[:user_key]
74
+ user.public_key File.read(File.expand_path(config[:user_key]))
75
+ end
76
+
77
+ output = edit_data(user)
78
+ user = Chef::User.from_hash(output).create
79
+
80
+ ui.info("Created #{user}")
81
+ if user.private_key
82
+ if config[:file]
83
+ File.open(config[:file], "w") do |f|
84
+ f.print(user.private_key)
85
+ end
86
+ else
87
+ puts user.private_key
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,46 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserDelete < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife user delete USER (options)"
31
+
32
+ def run
33
+ @user_name = @name_args[0]
34
+
35
+ if @user_name.nil?
36
+ show_usage
37
+ ui.fatal("You must specify a user name")
38
+ exit 1
39
+ end
40
+
41
+ delete_object(Chef::User, @user_name)
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserEdit < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife user edit USER (options)"
31
+
32
+ def run
33
+ @user_name = @name_args[0]
34
+
35
+ if @user_name.nil?
36
+ show_usage
37
+ ui.fatal("You must specify a user name")
38
+ exit 1
39
+ end
40
+
41
+ original_user = Chef::User.load(@user_name).to_hash
42
+ edited_user = edit_data(original_user)
43
+ if original_user != edited_user
44
+ user = Chef::User.from_hash(edited_user)
45
+ user.update
46
+ ui.msg("Saved #{user}.")
47
+ else
48
+ ui.msg("User unchaged, not saving.")
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,42 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserList < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife user list (options)"
31
+
32
+ option :with_uri,
33
+ :short => "-w",
34
+ :long => "--with-uri",
35
+ :description => "Show corresponding URIs"
36
+
37
+ def run
38
+ output(format_list_for_display(Chef::User.list))
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,59 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserReregister < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife user reregister USER (options)"
31
+
32
+ option :file,
33
+ :short => "-f FILE",
34
+ :long => "--file FILE",
35
+ :description => "Write the private key to a file"
36
+
37
+ def run
38
+ @user_name = @name_args[0]
39
+
40
+ if @user_name.nil?
41
+ show_usage
42
+ ui.fatal("You must specify a user name")
43
+ exit 1
44
+ end
45
+
46
+ user = Chef::User.load(@user_name).reregister
47
+ Chef::Log.debug("Updated user data: #{user.inspect}")
48
+ key = user.private_key
49
+ if config[:file]
50
+ File.open(config[:file], "w") do |f|
51
+ f.print(key)
52
+ end
53
+ else
54
+ ui.msg key
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,52 @@
1
+ #
2
+ # Author:: Steven Danna (<steve@opscode.com>)
3
+ # Copyright:: Copyright (c) 2009 Opscode, 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
+ require 'chef/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class UserShow < Knife
24
+
25
+ deps do
26
+ require 'chef/user'
27
+ require 'chef/json_compat'
28
+ end
29
+
30
+ banner "knife user show USER (options)"
31
+
32
+ option :attribute,
33
+ :short => "-a ATTR",
34
+ :long => "--attribute ATTR",
35
+ :description => "Show only one attribute"
36
+
37
+ def run
38
+ @user_name = @name_args[0]
39
+
40
+ if @user_name.nil?
41
+ show_usage
42
+ ui.fatal("You must specify a user name")
43
+ exit 1
44
+ end
45
+
46
+ user = Chef::User.load(@user_name)
47
+ output(format_for_display(user))
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,182 @@
1
+ #
2
+ # Author:: Steven Danna (steve@opscode.com)
3
+ # Copyright:: Copyright 2012 Opscode, 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
+ require 'chef/config'
19
+ require 'chef/mixin/params_validate'
20
+ require 'chef/mixin/from_file'
21
+ require 'chef/mash'
22
+ require 'chef/json_compat'
23
+ require 'chef/search/query'
24
+
25
+ class Chef
26
+ class User
27
+
28
+ include Chef::Mixin::FromFile
29
+ include Chef::Mixin::ParamsValidate
30
+
31
+ def initialize
32
+ @name = ''
33
+ @public_key = nil
34
+ @private_key = nil
35
+ @password = nil
36
+ @admin = false
37
+ end
38
+
39
+ def name(arg=nil)
40
+ set_or_return(:name, arg,
41
+ :regex => /^[a-z0-9\-_]+$/)
42
+ end
43
+
44
+ def admin(arg=nil)
45
+ set_or_return(:admin,
46
+ arg, :kind_of => [TrueClass, FalseClass])
47
+ end
48
+
49
+ def public_key(arg=nil)
50
+ set_or_return(:public_key,
51
+ arg, :kind_of => String)
52
+ end
53
+
54
+ def private_key(arg=nil)
55
+ set_or_return(:private_key,
56
+ arg, :kind_of => String)
57
+ end
58
+
59
+ def password(arg=nil)
60
+ set_or_return(:password,
61
+ arg, :kind_of => String)
62
+ end
63
+
64
+ def to_hash
65
+ result = {
66
+ "name" => @name,
67
+ "public_key" => @public_key,
68
+ "admin" => @admin
69
+ }
70
+ result["private_key"] = @private_key if @private_key
71
+ result["password"] = @password if @password
72
+ result
73
+ end
74
+
75
+ def to_json(*a)
76
+ to_hash.to_json(*a)
77
+ end
78
+
79
+ def destroy
80
+ Chef::REST.new(Chef::Config[:chef_server_url]).delete_rest("users/#{@name}")
81
+ end
82
+
83
+ def create
84
+ payload = {:name => self.name, :admin => self.admin, :password => self.password }
85
+ payload[:public_key] = public_key if public_key
86
+ new_user =Chef::REST.new(Chef::Config[:chef_server_url]).post_rest("users", payload)
87
+ Chef::User.from_hash(self.to_hash.merge(new_user))
88
+ end
89
+
90
+ def update(new_key=false)
91
+ payload = {:name => name, :admin => admin}
92
+ payload[:private_key] = new_key if new_key
93
+ payload[:password] = password if password
94
+ updated_user = Chef::REST.new(Chef::Config[:chef_server_url]).put_rest("users/#{name}", payload)
95
+ Chef::User.from_hash(self.to_hash.merge(updated_user))
96
+ end
97
+
98
+ def save(new_key=false)
99
+ begin
100
+ create
101
+ rescue Net::HTTPServerException => e
102
+ if e.response.code == "409"
103
+ update(new_key)
104
+ else
105
+ raise e
106
+ end
107
+ end
108
+ end
109
+
110
+ def reregister
111
+ r = Chef::REST.new(Chef::Config[:chef_server_url])
112
+ reregistered_self = r.put_rest("users/#{name}", { :name => name, :admin => admin, :private_key => true })
113
+ private_key(reregistered_self["private_key"])
114
+ self
115
+ end
116
+
117
+ def to_s
118
+ "user[#{@name}]"
119
+ end
120
+
121
+ def inspect
122
+ "Chef::User name:'#{name}' admin:'#{admin.inspect}'" +
123
+ "public_key:'#{public_key}' private_key:#{private_key}"
124
+ end
125
+
126
+ # Class Methods
127
+
128
+ def self.from_hash(user_hash)
129
+ user = Chef::User.new
130
+ user.name user_hash['name']
131
+ user.private_key user_hash['private_key'] if user_hash.key?('private_key')
132
+ user.password user_hash['password'] if user_hash.key?('password')
133
+ user.public_key user_hash['public_key']
134
+ user.admin user_hash['admin']
135
+ user
136
+ end
137
+
138
+ def self.from_json(json)
139
+ Chef::User.from_hash(Chef::JSONCompat.from_json(json))
140
+ end
141
+
142
+ class << self
143
+ alias_method :json_create, :from_json
144
+ end
145
+
146
+ def self.list(inflate=false)
147
+ response = if inflate
148
+ users = Chef::REST.new(Chef::Config[:chef_server_url]).get_rest('users')
149
+ users.map do |name|
150
+ Chef::User.load(name)
151
+ end
152
+ else
153
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest('users')
154
+ end
155
+ if response.is_a? Array
156
+ transform_ohc_list_response(response)
157
+ else
158
+ response
159
+ end
160
+ end
161
+
162
+ def self.load(name)
163
+ response = Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("users/#{name}")
164
+ Chef::User.from_hash(response)
165
+ end
166
+
167
+ private
168
+
169
+ # Gross. Transforms an API response in the form of:
170
+ # [ { "user" => { "username" => USERNAME }}, ...]
171
+ # into the form
172
+ # { "USERNAME" => "URI" }
173
+ def self.transform_ohc_list_response(response)
174
+ new_response = Hash.new
175
+ response.each do |u|
176
+ name = u['user']['username']
177
+ new_response[name] = Chef::Config[:chef_server_url] + "/users/#{name}"
178
+ end
179
+ new_response
180
+ end
181
+ end
182
+ end