Hello Luke,

I've updated the ticket with a link to the code (modified from 0.25.1rc2)

code here: http://github.com/amrset/puppet/blob/master/lib/puppet/type.rb

Regards,
-Roy

On Tue, Oct 20, 2009 at 11:17 PM, Luke Kanies <[email protected]> wrote:

>
> Hi Roy,
>
> Sorry for the slow response on this one; it's a lot of code, and at
> some point email becomes not so awesome for code collaboration.
>
> There's a lot of desire for this fix, so I'd like to work with you
> more closely to get this in place.  Do you have a git repository with
> your code?  If so, can you update the ticket with a link to it?
>
> On Oct 15, 2009, at 1:51 PM, Roy Nielsen wrote:
>
> > Hello Luke,
> >
> > This is what I get on the client when it failed:
> >
> > info: Caching catalog for g8626796u39.lanl.gov
> > debug: /File[/tmp/garbageFound]: Executing check '/bin/ps -ef | /usr/
> > bin/grep garbageProcess | grep -v grep'
> > debug: Executing '/bin/ps -ef | /usr/bin/grep garbageProcess | grep -
> > v grep'
> > debug: /File[/tmp/cronFound]: Executing check '/bin/ps -ef | /usr/
> > bin/grep cron | grep -v grep'
> > debug: Executing '/bin/ps -ef | /usr/bin/grep cron | grep -v grep'
> > debug: Reraising Unless returned 0 with command: /bin/ps -ef | /usr/
> > bin/grep cron | grep -v grep at /var/puppet/environments/development/
> > modules/lanl-baseline/manifests/classes/testUnless.pp:31
> > err: Could not run Puppet configuration client: Parameter unless
> > failed: Unless returned 0 with command: /bin/ps -ef | /usr/bin/grep
> > cron | grep -v grep at /var/puppet/environments/development/modules/
> > lanl-baseline/manifests/classes/testUnless.pp:31
> >
> > Thanks,
> > -Roy
> >
> > On Fri, Oct 9, 2009 at 4:30 PM, Luke Kanies <[email protected]> wrote:
> >
> > 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
> >
> >
> >
> >
> >
> > >
>
>
> --
> The covers of this book are too far apart. -- Ambrose Bierce
> ---------------------------------------------------------------------
> 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