Hello Luke, Thanks for the pointers - I'll get you more information when I get back to work on Tuesday.
Regards, -Roy Luke Kanies 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 >> >> >> >> > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
