cheffish 1.3.1 → 1.4.0
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.
- checksums.yaml +4 -4
- data/LICENSE +201 -201
- data/README.md +120 -117
- data/Rakefile +23 -23
- data/lib/chef/provider/chef_acl.rb +439 -434
- data/lib/chef/provider/chef_client.rb +53 -48
- data/lib/chef/provider/chef_container.rb +55 -50
- data/lib/chef/provider/chef_data_bag.rb +55 -50
- data/lib/chef/provider/chef_data_bag_item.rb +278 -273
- data/lib/chef/provider/chef_environment.rb +83 -78
- data/lib/chef/provider/chef_group.rb +83 -78
- data/lib/chef/provider/chef_mirror.rb +169 -164
- data/lib/chef/provider/chef_node.rb +87 -82
- data/lib/chef/provider/chef_organization.rb +155 -150
- data/lib/chef/provider/chef_resolved_cookbooks.rb +46 -41
- data/lib/chef/provider/chef_role.rb +84 -79
- data/lib/chef/provider/chef_user.rb +59 -54
- data/lib/chef/provider/private_key.rb +225 -220
- data/lib/chef/provider/public_key.rb +88 -82
- data/lib/chef/resource/chef_acl.rb +69 -65
- data/lib/chef/resource/chef_client.rb +48 -44
- data/lib/chef/resource/chef_container.rb +22 -18
- data/lib/chef/resource/chef_data_bag.rb +22 -18
- data/lib/chef/resource/chef_data_bag_item.rb +121 -114
- data/lib/chef/resource/chef_environment.rb +77 -71
- data/lib/chef/resource/chef_group.rb +53 -49
- data/lib/chef/resource/chef_mirror.rb +52 -48
- data/lib/chef/resource/chef_node.rb +22 -18
- data/lib/chef/resource/chef_organization.rb +69 -64
- data/lib/chef/resource/chef_resolved_cookbooks.rb +35 -31
- data/lib/chef/resource/chef_role.rb +110 -104
- data/lib/chef/resource/chef_user.rb +56 -52
- data/lib/chef/resource/private_key.rb +48 -44
- data/lib/chef/resource/public_key.rb +25 -21
- data/lib/cheffish.rb +235 -233
- data/lib/cheffish/actor_provider_base.rb +131 -131
- data/lib/cheffish/basic_chef_client.rb +184 -184
- data/lib/cheffish/chef_provider_base.rb +246 -246
- data/lib/cheffish/chef_run.rb +162 -155
- data/lib/cheffish/chef_run_data.rb +19 -19
- data/lib/cheffish/chef_run_listener.rb +30 -30
- data/lib/cheffish/key_formatter.rb +113 -113
- data/lib/cheffish/merged_config.rb +94 -94
- data/lib/cheffish/recipe_dsl.rb +157 -157
- data/lib/cheffish/rspec.rb +8 -8
- data/lib/cheffish/rspec/chef_run_support.rb +83 -83
- data/lib/cheffish/rspec/matchers.rb +4 -4
- data/lib/cheffish/rspec/matchers/be_idempotent.rb +16 -16
- data/lib/cheffish/rspec/matchers/emit_no_warnings_or_errors.rb +15 -15
- data/lib/cheffish/rspec/matchers/have_updated.rb +37 -37
- data/lib/cheffish/rspec/matchers/partially_match.rb +63 -63
- data/lib/cheffish/rspec/recipe_run_wrapper.rb +59 -47
- data/lib/cheffish/rspec/repository_support.rb +108 -108
- data/lib/cheffish/server_api.rb +52 -52
- data/lib/cheffish/version.rb +3 -3
- data/lib/cheffish/with_pattern.rb +21 -21
- data/spec/functional/fingerprint_spec.rb +64 -64
- data/spec/functional/merged_config_spec.rb +19 -19
- data/spec/functional/server_api_spec.rb +13 -13
- data/spec/integration/chef_acl_spec.rb +879 -879
- data/spec/integration/chef_client_spec.rb +105 -105
- data/spec/integration/chef_container_spec.rb +33 -33
- data/spec/integration/chef_group_spec.rb +309 -309
- data/spec/integration/chef_mirror_spec.rb +491 -491
- data/spec/integration/chef_node_spec.rb +786 -786
- data/spec/integration/chef_organization_spec.rb +226 -226
- data/spec/integration/chef_role_spec.rb +78 -0
- data/spec/integration/chef_user_spec.rb +85 -85
- data/spec/integration/private_key_spec.rb +399 -399
- data/spec/integration/recipe_dsl_spec.rb +28 -28
- data/spec/integration/rspec/converge_spec.rb +183 -183
- data/spec/support/key_support.rb +29 -29
- data/spec/support/spec_support.rb +15 -15
- data/spec/unit/get_private_key_spec.rb +131 -131
- data/spec/unit/recipe_run_wrapper_spec.rb +37 -0
- metadata +8 -5
@@ -1,82 +1,88 @@
|
|
1
|
-
require 'chef/provider/lwrp_base'
|
2
|
-
require 'openssl'
|
3
|
-
require 'cheffish/key_formatter'
|
4
|
-
|
5
|
-
class Chef
|
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
|
-
if
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
1
|
+
require 'chef/provider/lwrp_base'
|
2
|
+
require 'openssl'
|
3
|
+
require 'cheffish/key_formatter'
|
4
|
+
|
5
|
+
class Chef
|
6
|
+
class Provider
|
7
|
+
class PublicKey < Chef::Provider::LWRPBase
|
8
|
+
provides :public_key
|
9
|
+
|
10
|
+
action :create do
|
11
|
+
if !new_source_key
|
12
|
+
raise "No source key specified"
|
13
|
+
end
|
14
|
+
desired_output = encode_public_key(new_source_key)
|
15
|
+
if Array(current_resource.action) == [ :delete ] || desired_output != IO.read(new_resource.path)
|
16
|
+
converge_by "write #{new_resource.format} public key #{new_resource.path} from #{new_source_key_publicity} key #{new_resource.source_key_path}" do
|
17
|
+
IO.write(new_resource.path, desired_output)
|
18
|
+
# TODO permissions on file?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
action :delete do
|
24
|
+
if Array(current_resource.action) == [ :create ]
|
25
|
+
converge_by "delete public key #{new_resource.path}" do
|
26
|
+
::File.unlink(new_resource.path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def whyrun_supported?
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
def encode_public_key(key)
|
36
|
+
key_format = {}
|
37
|
+
key_format[:format] = new_resource.format if new_resource.format
|
38
|
+
Cheffish::KeyFormatter.encode(key, key_format)
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_reader :current_public_key
|
42
|
+
attr_reader :new_source_key_publicity
|
43
|
+
|
44
|
+
def new_source_key
|
45
|
+
@new_source_key ||= begin
|
46
|
+
if new_resource.source_key.is_a?(String)
|
47
|
+
source_key, source_key_format = Cheffish::KeyFormatter.decode(new_resource.source_key, new_resource.source_key_pass_phrase)
|
48
|
+
elsif new_resource.source_key
|
49
|
+
source_key = new_resource.source_key
|
50
|
+
elsif new_resource.source_key_path
|
51
|
+
source_key, source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
|
52
|
+
else
|
53
|
+
return nil
|
54
|
+
end
|
55
|
+
|
56
|
+
if source_key.private?
|
57
|
+
@new_source_key_publicity = 'private'
|
58
|
+
source_key.public_key
|
59
|
+
else
|
60
|
+
@new_source_key_publicity = 'public'
|
61
|
+
source_key
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def load_current_resource
|
67
|
+
if ::File.exist?(new_resource.path)
|
68
|
+
resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
|
69
|
+
begin
|
70
|
+
key, key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.path), nil, new_resource.path)
|
71
|
+
if key
|
72
|
+
@current_public_key = key
|
73
|
+
resource.format key_format[:format]
|
74
|
+
end
|
75
|
+
rescue
|
76
|
+
# If there is an error reading we assume format and such is broken
|
77
|
+
end
|
78
|
+
|
79
|
+
@current_resource = resource
|
80
|
+
else
|
81
|
+
not_found_resource = Chef::Resource::PublicKey.new(new_resource.path, run_context)
|
82
|
+
not_found_resource.action :delete
|
83
|
+
@current_resource = not_found_resource
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,65 +1,69 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
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
|
-
end
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefAcl < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_acl'
|
8
|
+
|
9
|
+
actions :create, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
# Path of the thing being secured, e.g. nodes, nodes/*, nodes/mynode,
|
18
|
+
# */*, **, roles/base, data/secrets, cookbooks/apache2, /users/*,
|
19
|
+
# /organizations/foo/nodes/x
|
20
|
+
attribute :path, :kind_of => String, :name_attribute => true
|
21
|
+
|
22
|
+
# Whether to change things recursively. true means it will descend all children
|
23
|
+
# and make the same modifications to them. :on_change will only descend if
|
24
|
+
# the parent has changed. :on_change is the default.
|
25
|
+
attribute :recursive, :equal_to => [ true, false, :on_change ], :default => :on_change
|
26
|
+
|
27
|
+
# Specifies that this is a complete specification for the acl (i.e. rights
|
28
|
+
# you don't specify will be reset to their defaults)
|
29
|
+
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
30
|
+
|
31
|
+
attribute :raw_json, :kind_of => Hash
|
32
|
+
attribute :chef_server, :kind_of => Hash
|
33
|
+
|
34
|
+
# rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
35
|
+
# rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
36
|
+
# rights :all, :users => 'jkeiser'
|
37
|
+
def rights(*values)
|
38
|
+
if values.size == 0
|
39
|
+
@rights
|
40
|
+
else
|
41
|
+
args = values.pop
|
42
|
+
args[:permissions] ||= []
|
43
|
+
values.each do |value|
|
44
|
+
args[:permissions] |= Array(value)
|
45
|
+
end
|
46
|
+
@rights ||= []
|
47
|
+
@rights << args
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# remove_rights :read, :users => 'jkeiser', :groups => [ 'admins', 'users' ]
|
52
|
+
# remove_rights [ :create, :read ], :users => [ 'jkeiser', 'adam' ]
|
53
|
+
# remove_rights :all, :users => [ 'jkeiser', 'adam' ]
|
54
|
+
def remove_rights(*values)
|
55
|
+
if values.size == 0
|
56
|
+
@remove_rights
|
57
|
+
else
|
58
|
+
args = values.pop
|
59
|
+
args[:permissions] ||= []
|
60
|
+
values.each do |value|
|
61
|
+
args[:permissions] |= Array(value)
|
62
|
+
end
|
63
|
+
@remove_rights ||= []
|
64
|
+
@remove_rights << args
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,44 +1,48 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
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
|
-
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefClient < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_client'
|
8
|
+
|
9
|
+
actions :create, :delete, :regenerate_keys, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
# Client attributes
|
18
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
+
attribute :admin, :kind_of => [TrueClass, FalseClass]
|
20
|
+
attribute :validator, :kind_of => [TrueClass, FalseClass]
|
21
|
+
|
22
|
+
# Input key
|
23
|
+
attribute :source_key # String or OpenSSL::PKey::*
|
24
|
+
attribute :source_key_path, :kind_of => String
|
25
|
+
attribute :source_key_pass_phrase
|
26
|
+
|
27
|
+
# Output public key (if so desired)
|
28
|
+
attribute :output_key_path, :kind_of => String
|
29
|
+
attribute :output_key_format, :kind_of => Symbol, :default => :openssh, :equal_to => [ :pem, :der, :openssh ]
|
30
|
+
|
31
|
+
# If this is set, client is not patchy
|
32
|
+
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
33
|
+
|
34
|
+
attribute :raw_json, :kind_of => Hash
|
35
|
+
attribute :chef_server, :kind_of => Hash
|
36
|
+
|
37
|
+
# Proc that runs just before the resource executes. Called with (resource)
|
38
|
+
def before(&block)
|
39
|
+
block ? @before = block : @before
|
40
|
+
end
|
41
|
+
|
42
|
+
# Proc that runs after the resource completes. Called with (resource, json, private_key, public_key)
|
43
|
+
def after(&block)
|
44
|
+
block ? @after = block : @after
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,18 +1,22 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefContainer < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_container'
|
8
|
+
|
9
|
+
actions :create, :delete, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
# Grab environment from with_environment
|
13
|
+
def initialize(*args)
|
14
|
+
super
|
15
|
+
chef_server run_context.cheffish.current_chef_server
|
16
|
+
end
|
17
|
+
|
18
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
19
|
+
attribute :chef_server, :kind_of => Hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,18 +1,22 @@
|
|
1
|
-
require 'cheffish'
|
2
|
-
require 'chef/resource/lwrp_base'
|
3
|
-
|
4
|
-
class Chef
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require 'cheffish'
|
2
|
+
require 'chef/resource/lwrp_base'
|
3
|
+
|
4
|
+
class Chef
|
5
|
+
class Resource
|
6
|
+
class ChefDataBag < Chef::Resource::LWRPBase
|
7
|
+
self.resource_name = 'chef_data_bag'
|
8
|
+
|
9
|
+
actions :create, :delete, :nothing
|
10
|
+
default_action :create
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
chef_server run_context.cheffish.current_chef_server
|
15
|
+
end
|
16
|
+
|
17
|
+
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
18
|
+
|
19
|
+
attribute :chef_server, :kind_of => Hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|