diff options
| author | Stefan Schulte <stefan.schulte@taunusstein.net> | 2010-11-17 23:15:46 +0100 |
|---|---|---|
| committer | Nick Lewis <nick@puppetlabs.com> | 2010-11-17 15:55:35 -0800 |
| commit | ee7d2f92f9d3ec45b5c3a9cd3fe2f5832b17f23b (patch) | |
| tree | fed6946c27f612dc7d87bf081b556299f4edb4dd /lib/puppet/provider | |
| parent | 8efdc769db2e144fe61eccbb1663a1c9594b09ab (diff) | |
(#5274) New comment property for the hosttype
When the parsefile provider for host parses /etc/hosts, it throws any
inlinecomment away. As a result they are also purged in /etc/hosts after
a puppetrun that detects a change. That could be dangerous because you
will lose information even about unmanaged resources.
So if you have something like
192.168.0.1 hostentry_not_managed_by_puppet # Important comment
in /etc/hosts the endresult will be
192.168.0.1\thostentry_not_managed_by_puppet
This patch introduces a new property "comment" for the host type. The
provider is nearly a complete rewrite and a lot shorter and hopefully
easier to understand.
Diffstat (limited to 'lib/puppet/provider')
| -rw-r--r-- | lib/puppet/provider/host/parsed.rb | 76 |
1 files changed, 23 insertions, 53 deletions
diff --git a/lib/puppet/provider/host/parsed.rb b/lib/puppet/provider/host/parsed.rb index 4f15eff3f..a303c4bcf 100644 --- a/lib/puppet/provider/host/parsed.rb +++ b/lib/puppet/provider/host/parsed.rb @@ -8,66 +8,36 @@ else end - Puppet::Type.type(:host).provide( - :parsed, - :parent => Puppet::Provider::ParsedFile, - :default_target => hosts, - - :filetype => :flat -) do +Puppet::Type.type(:host).provide(:parsed,:parent => Puppet::Provider::ParsedFile, + :default_target => hosts,:filetype => :flat) do confine :exists => hosts text_line :comment, :match => /^#/ text_line :blank, :match => /^\s*$/ - record_line :parsed, :fields => %w{ip name host_aliases}, - :optional => %w{host_aliases}, - :rts => true do |line| - hash = {} - if line.sub!(/^(\S+)\s+(\S+)\s*/, '') - hash[:ip] = $1 - hash[:name] = $2 - - if line.empty? - hash[:host_aliases] = [] + record_line :parsed, :fields => %w{ip name host_aliases comment}, + :optional => %w{host_aliases comment}, + :match => /^(\S+)\s+(\S+)\s*(.*?)?(?:\s*#\s*(.*))?$/, + :post_parse => proc { |hash| + # An absent comment should match "comment => ''" + hash[:comment] = '' if hash[:comment].nil? or hash[:comment] == :absent + unless hash[:host_aliases].nil? or hash[:host_aliases] == :absent + hash[:host_aliases] = hash[:host_aliases].split(/\s+/) else - line.sub!(/\s*/, '') - line.sub!(/^([^#]+)\s*/) do |value| - aliases = $1 - unless aliases =~ /^\s*$/ - hash[:host_aliases] = aliases.split(/\s+/) - end - - "" - end + hash[:host_aliases] = [] end - else - raise Puppet::Error, "Could not match '#{line}'" - end - - hash[:host_aliases] = [] if hash[:host_aliases] == "" - - return hash - end - - # Convert the current object into a host-style string. - def self.to_line(hash) - return super unless hash[:record_type] == :parsed - [:ip, :name].each do |n| - raise ArgumentError, "#{n} is a required attribute for hosts" unless hash[n] and hash[n] != :absent - end - - str = "#{hash[:ip]}\t#{hash[:name]}" - - if hash.include? :host_aliases and !hash[:host_aliases].empty? - if hash[:host_aliases].is_a? Array + }, + :to_line => proc { |hash| + [:ip, :name].each do |n| + raise ArgumentError, "#{n} is a required attribute for hosts" unless hash[n] and hash[n] != :absent + end + str = "#{hash[:ip]}\t#{hash[:name]}" + if hash.include? :host_aliases and !hash[:host_aliases].empty? str += "\t#{hash[:host_aliases].join("\t")}" - else - raise ArgumentError, "Host aliases must be specified as an array" end - end - - str - end + if hash.include? :comment and !hash[:comment].empty? + str += "\t# #{hash[:comment]}" + end + str + } end - |
