Hi Stefan, I have it working using your suggestions (I took out my hacks). I adjusted the match regex to match the quotes in the value portion. Otherwise, I kept getting more quotes added in each time the file was processed. The only glitch now is that it always thinks there's a comment, so even if there isn't a comment after the value, it adds a "#" at the end of line.
David On Tue, Aug 23, 2011 at 11:45 AM, Stefan Schulte <stefan.schu...@taunusstein.net> wrote: > On Tue, Aug 23, 2011 at 10:32:54AM -0400, David Kavanagh wrote: >> I did get this working. In a nutshell, I modified to_line like this; >> def self.to_line(hash) >> return super unless hash[:record_type] == :parsed >> "#{hash[:name]}=#{hash[:value]}" >> end > > As I said, I wouldn't to that. Just pass a :to_line => proc {...} to your > record_line call because you will then just overwrite the to_line method > of that particular record_type. > >> >> which handles the other line types. To handle wrapping values in >> quotes, I changed the type like this; >> newproperty(:value) do >> munge do |value| >> '"'+value.to_s+'"' >> end >> newvalues(/^\S+$/) >> end >> >> so, that line where value.to_s is wrapped with quotes seems to work nicely. > > Hm, in my opinion using a regex that gets the value as an unqoted string > and put the quotes back to the string in the to_line method looks saner > than munging the value. > >> >> My other problem now is that aside from handling these variations >> >> # comment lines >> key="value" >> >> I also need to handle this; >> >> key="value" #optional comment >> >> I could add to the regex for the line matching (in record_line >> :parsed). Then, I'm not sure how to get that into to_line for output. > > You have to store the inlinecomment in the record hash and then put it > back in the to_line hook. So this should work > (to test the regex I recommend rubular.com) > > record_line :parsed, > :fields => %w{name value comment}, > :optional => %w{value comment}, > :regex => /^\s*(.*?)(?:\s*=\s*(.*?))?(?:\s*#\s*(.*))?\s*$/, > :to_line => proc { |hash| > str = hash[:name] > str += "=\"#{hash[:value]}\"" if hash[:value] != :absent > str += " # #{hash[:comment]}" if hash[:comment] != :absent > str > } > > >> >> David >> >> On Mon, Aug 22, 2011 at 8:48 PM, David Kavanagh <dkavan...@gmail.com> wrote: >> > Thanks, I'll try to work through your suggestions. I took this from >> > the nova_config stuff on github, so that was my example. >> > >> > David >> > >> > On Mon, Aug 22, 2011 at 7:36 PM, Stefan Schulte >> > <stefan.schu...@taunusstein.net> wrote: >> >> 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 >> >> >> > >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Puppet Users" group. >> To post to this group, send email to puppet-users@googlegroups.com. >> To unsubscribe from this group, send email to >> puppet-users+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/puppet-users?hl=en. >> > -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.