class Cheffish::ChefActorBase
Public Instance Methods
augment_new_json(json)
click to toggle source
# File lib/cheffish/chef_actor_base.rb, line 109 def augment_new_json(json) if new_public_key json["public_key"] = new_public_key.to_pem end json end
create_actor()
click to toggle source
# File lib/cheffish/chef_actor_base.rb, line 8 def create_actor if new_resource.before new_resource.before.call(new_resource) end # Create or update the client/user current_public_key = new_json["public_key"] differences = json_differences(current_json, new_json) if current_resource_exists? # Update the actor if it's different if differences.size > 0 description = [ "update #{actor_type} #{new_resource.name} at #{actor_path}" ] + differences converge_by description do result = rest.put("#{actor_path}/#{new_resource.name}", normalize_for_put(new_json)) current_public_key, _current_public_key_format = Cheffish::KeyFormatter.decode(result["public_key"]) if result["public_key"] end end else # Create the actor if it's missing unless new_public_key raise "You must specify a public key to create a #{actor_type}! Use the private_key resource to create a key, and pass it in with source_key_path." end description = [ "create #{actor_type} #{new_resource.name} at #{actor_path}" ] + differences converge_by description do result = rest.post((actor_path).to_s, normalize_for_post(new_json)) current_public_key, _current_public_key_format = Cheffish::KeyFormatter.decode(result["public_key"]) if result["public_key"] end end # Write out the public key if new_resource.output_key_path # TODO use inline_resource key_content = Cheffish::KeyFormatter.encode(current_public_key, { format: new_resource.output_key_format }) if !current_resource.output_key_path action = "create" elsif key_content != IO.read(current_resource.output_key_path) action = "overwrite" else action = nil end if action converge_by "#{action} public key #{new_resource.output_key_path}" do IO.write(new_resource.output_key_path, key_content) end end # TODO permissions? end if new_resource.after new_resource.after.call(self, new_json, server_private_key, server_public_key) end end
delete_actor()
click to toggle source
# File lib/cheffish/chef_actor_base.rb, line 62 def delete_actor if current_resource_exists? converge_by "delete #{actor_type} #{new_resource.name} at #{actor_path}" do rest.delete("#{actor_path}/#{new_resource.name}") Chef::Log.info("#{new_resource} deleted #{actor_type} #{new_resource.name} at #{rest.url}") end end if current_resource.output_key_path converge_by "delete public key #{current_resource.output_key_path}" do ::File.unlink(current_resource.output_key_path) end end end
load_current_resource()
click to toggle source
# File lib/cheffish/chef_actor_base.rb, line 116 def load_current_resource begin json = rest.get("#{actor_path}/#{new_resource.name}") @current_resource = json_to_resource(json) rescue Net::HTTPClientException => e if e.response.code == "404" @current_resource = not_found_resource else raise end end if new_resource.output_key_path && ::File.exist?(new_resource.output_key_path) current_resource.output_key_path = new_resource.output_key_path end end
new_public_key()
click to toggle source
# File lib/cheffish/chef_actor_base.rb, line 76 def new_public_key @new_public_key ||= if new_resource.source_key if new_resource.source_key.is_a?(String) key, _key_format = Cheffish::KeyFormatter.decode(new_resource.source_key) if key.private? key.public_key else key end elsif new_resource.source_key.private? new_resource.source_key.public_key else new_resource.source_key end elsif new_resource.source_key_path source_key_path = new_resource.source_key_path if Pathname.new(source_key_path).relative? source_key_str, source_key_path = Cheffish.get_private_key_with_path(source_key_path, run_context.config) else source_key_str = IO.read(source_key_path) end source_key, _source_key_format = Cheffish::KeyFormatter.decode(source_key_str, new_resource.source_key_pass_phrase, source_key_path) if source_key.private? source_key.public_key else source_key end else nil end end