On Oct 1, 2009, at 2:15 PM, Roy Nielsen wrote: > metaparameter name collisions.... > > I cannot make a "path" metaparameter as the exec path parameter is > different from the k5login path parameter. > > A "user" metaparameter would cause problems as the cron type and > exec type have different implementations of a "user" parameter. > > A "group" metaparameter might be a problem (hard for me to tell) as > the exec and macauthorization seem to describe it differently. > > A "timeout" metaparameter would cause problems as the exec and > macauthorization timeout parameter are definitely different. > > A "environment" metaparameter would cause problems as the exec and > cron types have different implementations of their "environemnt" > parameter. > > While an "unless" metaparameter might be written without the above > metaparameter functionality . . . it doesn't seem like a good idea, > it'd be a bit crippled without them. > > That's not to mention the name collisions from the supporting "def" > statements. > > All of the above could be written with different, or slightly > altered names, but that seems like a bit of a kludge to me.
Well, to start with we could skip most of that -- checks would have to run as the current user/group, couldn't set environment, and would have to be fully specified. That would at least be a reasonable start, and would reduce all of the other requirements. I don't think we'll ever get user/group into the top-level checks, and there's already work begun on a timeout metaparam. The environment is the only sticky one, IMO. > > On Thu, Oct 1, 2009 at 1:46 PM, Roy Nielsen <[email protected]> wrote: > ok, this is going to take some thinking.. > > It also appears to depend on exec's: > > path > user > group > timeout > environment > > parameters. > > Regards, > -Roy > > > On Wed, Sep 30, 2009 at 5:43 PM, Luke Kanies <[email protected]> wrote: > > I don't think this will quite work -- you want to define a 'check' > parameter type, like exec does, and then modify some of the core > system to actually run those checks. This is currently done in the > 'returns' parameter of exec, but it should probably be moved into the > Type's 'evaluate' method or something similar. > > On Sep 30, 2009, at 9:42 AM, Roy Nielsen wrote: > > > Hello, > > > > Below is a patch to the 0.25.1 rc1 /lib/puppet/type.rb file with the > > code for an "unless" metaparameter. > > > > Unfortunately, I haven't had time (or the resources) to test it yet. > > > > Regards, > > -Roy > > > > --- a/lib/puppet/type.rb 2009-09-29 17:21:42.000000000 -0600 > > +++ b/lib/puppet/type.rb 2009-09-30 10:21:14.000000000 -0600 > > @@ -1259,6 +1259,44 @@ > > end > > end > > > > + newmetaparam(:unless) do > > + desc "If this parameter is set in the package type, then > > this ``package`` > > + will install unless the command returns 0 . For > > example:: > > + > > + package { \"puppet.pkg.dmg\": > > + path => \"/usr/bin:/usr/sbin:/bin\", > > + unless => \"ps -acx | grep puppet 2>/dev/null\" > > + } > > + > > + This would install the puppet.pkg.dmg package unless a > > process > > + containing the ``puppet`` string is found in the > > process list. > > + > > + Note that this command follows the same rules as the > > exec command, > > + which is to say that it must be fully qualified if the > > path is not set. > > + " > > + > > + validate do |cmds| > > + cmds = [cmds] unless cmds.is_a? Array > > + > > + cmds.each do |cmd| > > + @resource.validatecmd(cmd) > > + end > > + end > > + > > + # Return true if the command does not return 0. > > + def check(value) > > + begin > > + output, status = @resource.run(value, true) > > + rescue Timeout::Error > > + err "Check %s exceeded timeout" % value.inspect > > + return false > > + end > > + > > + return status.exitstatus != 0 > > + end > > + end > > + > > + > > class RelationshipMetaparam < Puppet::Parameter > > class << self > > > attr_accessor :direction, :events, :callback, :subclasses > > @@ -1726,6 +1764,116 @@ > > end > > > > ############################### > > + # All of the unless code. > > + > > + def checkexe(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 > > + elsif path = self[:path] > > + exe = cmd.split(/ /)[0] > > + withenv :PATH => self[:path].join(":") do > > + path = %{which #{exe}}.chomp > > + if path == "" > > + raise ArgumentError, > > + "Could not find command '%s'" % exe > > + end > > + end > > + else > > + raise ArgumentError, > > + "%s is somehow not qualified with no search path" % > > + self[:command] > > + end > > + end > > + > > + def run(command, check = false) > > + output = nil > > + status = nil > > + > > + dir = nil > > + > > + checkexe(command) > > + > > + if dir = self[:cwd] > > + unless File.directory?(dir) > > + if check > > + dir = nil > > + else > > + self.fail "Working directory '%s' does not > > exist" % dir > > + end > > + end > > + end > > + > > + dir ||= Dir.pwd > > + > > + if check > > + debug "Executing check '#{command}'" > > + else > > + debug "Executing '#{command}'" > > + end > > + begin > > + # Do our chdir > > + Dir.chdir(dir) do > > + environment = {} > > + > > + if self[:path] > > + environment[:PATH] = self[:path].join(":") > > + end > > + > > + if envlist = self[:environment] > > + envlist = [envlist] unless envlist.is_a? Array > > + envlist.each do |setting| > > + if setting =~ /^(\w+)=((.|\n)+)$/ > > + name = $1 > > + value = $2 > > + if environment.include? name > > + warning( > > + "Overriding environment setting > > '%s' with '%s'" % > > + [name, value] > > + ) > > + end > > + environment[name] = value > > + else > > + warning "Cannot understand environment > > setting %s" % setting.inspect > > + end > > + end > > + end > > + > > + withenv environment do > > + Timeout::timeout(self[:timeout]) do > > + output, status = > > Puppet::Util::SUIDManager.run_and_capture( > > + [command], self[:user], self[:group] > > + ) > > + end > > + # 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 validatecmd(cmd) > > + # if we're not fully qualified, require a path > > + if cmd !~ /^\// > > + if self[:path].nil? > > + self.fail "'%s' is both unqualifed and specified no > > search path" % cmd > > + end > > + end > > + end > > + > > + ############################### > > # All of the scheduling code. > > > > # Look up the schedule and set it appropriately. This is done > > after > > > > > > > > > > -- > A gentleman is a man who can play the accordion but doesn't. --Unknown > --------------------------------------------------------------------- > Luke Kanies | http://reductivelabs.com | http://madstop.com > > > > > > > > -- Happiness is not achieved by the conscious pursuit of happiness; it is generally the by-product of other activities. -- Aldous Huxley --------------------------------------------------------------------- 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 -~----------~----~----~----~------~----~------~--~---
