Hello Luke, I'm not familiar with git unfortunately.
I did look up James Turnbull's talk from the last conference, but was unable to follow what was going on -- I guess due to animations? Regards, -Roy Luke Kanies 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 >> >> >> >> >> >> > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
