class Chef::Resource::File::Verification
See RFC 027 for a full specification
File
verifications allow user-supplied commands a means of preventing file resource content deploys. Their intended use is to verify the contents of a temporary file before it is deployed onto the system.
Similar to not_if and only_if, file verifications can take a ruby block, which will be called, or a string, which will be executed as a Shell
command.
Additonally, Chef
or third-party verifications can ship “registered verifications” that the user can use by specifying a :symbol as the command name.
To create a registered verification, create a class that inherits from Chef::Resource::File::Verification
and use the provides class method to give it name. Registered verifications are expected to supply a verify instance method that takes 2 arguments.
Example: class Chef
class Resource class File::Verification::Foo < Chef::Resource::File::Verification provides :noop def verify(path, opts) #yolo true end end end
end
Public Class Methods
# File lib/chef/resource/file/verification.rb, line 75 def self.lookup(name) c = descendants.find { |d| d.provides?(name) } if c.nil? raise Chef::Exceptions::VerificationNotFound.new "No file verification for #{name} found." end c end
# File lib/chef/resource/file/verification.rb, line 87 def initialize(parent_resource, command, opts, &block) @command, @command_opts = command, opts @block = block @parent_resource = parent_resource end
# File lib/chef/resource/file/verification.rb, line 67 def self.provides(name) @provides = name end
# File lib/chef/resource/file/verification.rb, line 71 def self.provides?(name) @provides == name end
Public Instance Methods
# File lib/chef/resource/file/verification.rb, line 83 def logger @parent_resource.logger end
# File lib/chef/resource/file/verification.rb, line 127 def to_s if @block "<Proc>" elsif @command.is_a?(Symbol) "#{@command.inspect} (#{Chef::Resource::File::Verification.lookup(@command).name})" elsif @command.is_a?(String) @command end end
# File lib/chef/resource/file/verification.rb, line 93 def verify(path, opts = {}) logger.trace("Running verification[#{self}] on #{path}") if @block verify_block(path, opts) elsif @command.is_a?(Symbol) verify_registered_verification(path, opts) elsif @command.is_a?(String) verify_command(path, opts) end end
opts is currently unused, but included in the API to support future extensions
# File lib/chef/resource/file/verification.rb, line 106 def verify_block(path, opts) @block.call(path) end
We reuse Chef::GuardInterpreter
in order to support the same set of options that the not_if/only_if blocks do
# File lib/chef/resource/file/verification.rb, line 112 def verify_command(path, opts) if @command.include?("%{file}") raise ArgumentError, "The %{file} expansion for verify commands has been removed. Please use %{path} instead." end command = @command % { path: path } interpreter = Chef::GuardInterpreter.for_resource(@parent_resource, command, @command_opts) interpreter.evaluate end
# File lib/chef/resource/file/verification.rb, line 121 def verify_registered_verification(path, opts) verification_class = Chef::Resource::File::Verification.lookup(@command) v = verification_class.new(@parent_resource, @command, @command_opts, &@block) v.verify(path, opts) end