module Sprinkle # = Verify Blocks # # As documented in Sprinkle::Package, you may define a block on a package # which verifies that a package was installed correctly. If this verification # block fails, Sprinkle will stop the script gracefully, raising the error. # # In addition to checking post install if it was successfully, verification # blocks are also run before an install to see if a package is already # installed. If this is the case, the package is skipped and Sprinkle continues # with the next package. This behavior can be overriden by setting the -f flag on # the sprinkle script or setting Sprinkle::OPTIONS[:force] to true if you're # using sprinkle programmatically. # # == An Example # # The following verifies that rails was installed correctly be checking to see # if the 'rails' command is available on the command line: # # package :rails do # gem 'rails' # # verify do # has_executable 'rails' # end # end # # == Available Verifiers # # There are a variety of available methods for use in the verification block. # The standard methods are defined in the Sprinkle::Verifiers module, so see # their corresponding documentation. # # == Custom Verifiers # # If you feel that the built-in verifiers do not offer a certain aspect of # verification which you need, you may create your own verifier! Simply wrap # any method in a module which you want to use: # # module MagicBeansVerifier # def has_magic_beans(sauce) # @commands << '[ -z "`echo $' + sauce + '`"]' # end # end # # The method can append as many commands as it wishes to the @commands array. # These commands will be run on the remote server and MUST give an # exit status of 0 if successful or other if unsuccessful. # # To register your verifier, call the register method on Sprinkle::Verify: # # Sprinkle::Verify.register(MagicBeansVerifier) # # And now you may use it like any other verifier: # # package :magic_beans do # gem 'magic_beans' # # verify { has_magic_beans('ranch') } # end class Verify include Sprinkle::Attributes include Sprinkle::Package::Rendering::Helpers include Sprinkle::Sudo attr_accessor :package, :description, :options #:nodoc: delegate :opts, :to => :package delegate :args, :to => :package delegate :version, :to => :package delegate :description, :to => :package class < Verifying #{description}..." unless @delivery.verify(self, roles) # Verification failed, halt sprinkling gracefully. raise Sprinkle::VerificationFailed.new(@package, description) end end end end class VerificationFailed < Exception #:nodoc: attr_accessor :package, :description def initialize(package, description) super("Verifying #{package.name}#{description} failed.") @package = package @description = description end end end