You're missing at least three pieces of functionality in this patch:

* You need a 'check' method on the resource instance that actually  
calls all of these checks to make sure they pass.  You should be able  
to essentially copy this from Exec.
* You need the Transaction class to skip resources that fail their  
checks.
* You need to move all of the other checks from Exec to the main type

Also, what's the stack trace you get when it failed?

On Oct 8, 2009, at 5:04 PM, Roy Nielsen wrote:

> Hello,
>
> I was able to do some basic testing for the patch below, when the  
> unless metaparameter is used, the puppet run exits with an error  
> (used self.fail).
>
> I'm not sure how to upload the tests, I watched James Turnbull's  
> "Puppet Release Manager Developing for Puppet" talk on: 
> http://coursestream.sfsu.edu/ess/feed?id=e723afa9-1748-43c7-8231-180d2a7f7d3e&type=MP3
>  
>  , but the online slides didn't show the changing git part of the  
> presentation (didn't show an automation?).
>
> I used the following resources (on a mac) to test:
>
> $cron_found = "Did not find the cron process"
>
> file { "/tmp/cronFound":
>     unless  => "/bin/ps -ef | /usr/bin/grep cron | grep -v grep",
>     path    => '/tmp/cronFound',
>     content => $cron_found
> }
>
> The cron process is always running, so the command returns 0, so  
> file should not be created, and the puppet process on the client  
> will exit with an error.
>
> $garbage_found = "Did not find the garbageProcess process"
>
> file { "/tmp/garbageFound":
>     unless  => "/bin/ps -ef | /usr/bin/grep garbageProcess | grep -v  
> grep",
>     path    => '/tmp/garbageFound',
>     content => $garbage_found
> }
>
> There should be no garbageProcess running, so the command returns !=  
> 0, so file should be created.
>
> Thoughts?
>
> It would be nice to be able to "skip" a resource if the command  
> returned 0, but I'm not sure how to do that (still working on  
> understanding the code).
>
> Regards,
> -Roy
>
> --- a/lib/puppet/type.rb    2009-10-02 16:04:43.000000000 -0600
> +++ b/lib/puppet/type.rb    2009-10-08 14:46:09.000000000 -0600
> @@ -13,6 +13,7 @@
>  require 'puppet/util/cacher'
>  require 'puppet/file_collection/lookup'
>  require 'puppet/util/tagging'
> +require 'puppet/util/execution'
>
>  # see the bottom of the file for the rest of the inclusions
>
> @@ -25,6 +26,7 @@
>      include Puppet::Util::Cacher
>      include Puppet::FileCollection::Lookup
>      include Puppet::Util::Tagging
> +    include Puppet::Util::Execution
>
>      ###############################
>      # Code related to resource type attributes.
> @@ -1259,6 +1261,44 @@
>          end
>      end
>
> +    def self.newcheckme(myname, &block)
> +        @checksme ||= {}
> +
> +        check = newmetaparam(myname, &block)
> +        @checksme[myname] = check
> +    end
> +
> +    def self.checks
> +        @checksme.keys
> +    end
> +
> +    newcheckme(:unless) do
> +        desc "If this parameter is set, then the type will run unless
> +            the command returns 0.  For example::
> +
> +                exec { \"/bin/echo root >> /usr/lib/cron/cron.allow 
> \":
> +                    unless => \"/usr/bin/grep root /usr/lib/cron/ 
> cron.allow 2>/dev/null\"
> +                }
> +
> +            This would add ``root`` to the cron.allow file (on  
> Solaris) unless
> +            ``grep`` determines it's already there.
> +
> +            Note that this metaparameter requires the full path to  
> the command.
> +        "
> +
> +        munge do |cmds|
> +            cmds = [cmds] unless cmds.is_a? Array
> +
> +            cmds.each do |cmd|
> +                @resource.validateexecmd(cmd)
> +                output, status = @resource.runexec(cmd, true)
> +                if status.exitstatus == 0
> +                    self.fail("Unless returned 0 with command: %s"  
> % [cmd])
> +                end
> +            end
> +        end
> +    end
> +
>      class RelationshipMetaparam < Puppet::Parameter
>          class << self
>              attr_accessor :direction, :events, :callback, :subclasses
> @@ -1726,6 +1766,69 @@
>      end
>
>      ###############################
> +    # All of the unless code.
> +
> +    def checkexec(cmd)
> +        if cmd =~ /^\//
> +            exe = cmd.split(/ /)[0]
> +            unless FileTest.exists?(exe)
> +                raise ArgumentError, "Could not find executable %s"  
> % exe
> +            end
> +            unless FileTest.executable?(exe)
> +                raise ArgumentError,
> +                    "%s is not executable" % exe
> +            end
> +        else
> +            raise ArgumentError,
> +                "is somehow not qualified with no search path"
> +        end
> +    end
> +
> +    def runexec(command, check = false)
> +        output = nil
> +        status = nil
> +
> +        dir = nil
> +
> +        checkexec(command)
> +
> +        dir ||= Dir.pwd
> +
> +        if check
> +            debug "Executing check '#{command}'"
> +        else
> +            debug "Executing '#{command}'"
> +        end
> +        begin
> +            # Do our chdir
> +            Dir.chdir(dir) do
> +                environment = {}
> +
> +                withenv environment do
> +                    output, status =  
> Puppet::Util::SUIDManager.run_and_capture(
> +                        [command]
> +                    )
> +                    # The shell returns 127 if the command is  
> missing.
> +                    if status.exitstatus == 127
> +                        raise ArgumentError, output
> +                    end
> +                end
> +            end
> +        rescue Errno::ENOENT => detail
> +            self.fail detail.to_s
> +        end
> +
> +        return output, status
> +    end
> +
> +    def validateexecmd(cmd)
> +        # if we're not fully qualified, require a path
> +        if cmd !~ /^\//
> +            self.fail "'%s' is both unqualifed and specified no  
> search path" % cmd
> +        end
> +    end
> +
> +    ###############################
>      # All of the scheduling code.
>
>      # Look up the schedule and set it appropriately.  This is done  
> after
>
>
>
> >


-- 
Reality is that which, when you stop believing in it, doesn't go
away. -- Philip K. Dick, "How to Build a Universe"
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to