On Mon, Aug 22, 2011 at 06:33:27PM -0400, David Kavanagh wrote: > I'm working on a type/provider for the eucalyptus.conf file. What I > have generally works for modifying properties. I have a couple of > issues and not being very experienced with Ruby and custom providers, > I wonder if anyone can help? > The code is included below. The key/value constructs in the file look like: > > key="value" > > 1. I'm not getting the quotes surrounding the value, which I think I > can figure out myself. > 2. I get all blanks and comments replaced by "=", which is more of a problem. > > David > > > require 'puppet/provider/parsedfile' > > eucaconf = "/etc/eucalyptus/eucalyptus.conf" > > Puppet::Type.type(:eucalyptus_config).provide( > :parsed, > :parent => Puppet::Provider::ParsedFile, > :default_target => eucaconf, > :filetype => :flat > ) do > > confine :exists => eucaconf > text_line :comment, :match => /^#/; > text_line :blank, :match => /^\s*$/; > > record_line :parsed, > :fields => %w{line}, > :match => /(.*)/ , > :post_parse => proc { |hash| > Puppet.debug("eucalyptus config line:#{hash[:line]} has been parsed") > if hash[:line] =~ /^\s*(\S+)\s*=\s*(\S+)\s*$/ > hash[:name]=$1 > hash[:value]=$2 > elsif hash[:line] =~ /^\s*(\S+)\s*$/ > hash[:name]=$1 > hash[:value]=false > else > raise Puppet::Error, "Invalid line: #{hash[:line]}" > end > }
instead of the post_parse hook you can probably just change your regex :fields => %w{name value}, :optional => %w{value}, :match => /^\s*(.*?)(?:\s*=\s*"(\S+)")?\s*$/ This matches line like foo and foo = "bar" > > def self.to_line(hash) > "#{hash[:name]}=#{hash[:value]}" > end If you just overwrite the to_line method you have to take care of the different record_types (you defined :comment, :text and :parsed). So you have to do def self.to_line(hash) return super unless hash[:record_type] == :parsed if hash[:value] == :absent hash[:name] else "#{hash[:name]}=\"#{hash[:value]}\"" end end Nevertheless the "right" thing to do is to pass a block to the record_line method: record_line :parsed, :fields => ..., :match => ..., :to_line => proc { |hash| if hash[:value] == :absent hash[:name] else "#{hash[:name]}=\"#{hash[:value]}\"" end } Hope that helps. -Stefan
pgpTWpdsyUl2D.pgp
Description: PGP signature