X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=3rdparty%2Fmodules%2Fstdlib%2Flib%2Fpuppet%2Fprovider%2Ffile_line%2Fruby.rb;fp=3rdparty%2Fmodules%2Fstdlib%2Flib%2Fpuppet%2Fprovider%2Ffile_line%2Fruby.rb;h=16f2709c32edd355e5f78f63728273d4deb6fcd1;hb=6963202b4b62c2816655ac9532521b018fdf83bd;hp=e7854f00117790138ca60b378e6e9c38e4d640b9;hpb=a69999e580f8b3abd12446c2d6ad59e517651813;p=mirror%2Fdsa-puppet.git diff --git a/3rdparty/modules/stdlib/lib/puppet/provider/file_line/ruby.rb b/3rdparty/modules/stdlib/lib/puppet/provider/file_line/ruby.rb index e7854f001..16f2709c3 100644 --- a/3rdparty/modules/stdlib/lib/puppet/provider/file_line/ruby.rb +++ b/3rdparty/modules/stdlib/lib/puppet/provider/file_line/ruby.rb @@ -1,53 +1,92 @@ Puppet::Type.type(:file_line).provide(:ruby) do def exists? - lines.find do |line| - line.chomp == resource[:line].chomp + found = false + lines_count = 0 + lines.each do |line| + found = line.chomp == resource[:line] + if found + lines_count += 1 + end + end + if resource[:match] == nil + found = lines_count > 0 + else + match_count = count_matches(new_match_regex) + if resource[:append_on_no_match].to_s == 'false' + found = true + elsif resource[:replace].to_s == 'true' + found = lines_count > 0 && lines_count == match_count + else + found = match_count > 0 + end end + found end def create - if resource[:match] - handle_create_with_match - elsif resource[:after] - handle_create_with_after - else - append_line + unless resource[:replace].to_s != 'true' && count_matches(new_match_regex) > 0 + if resource[:match] + handle_create_with_match + elsif resource[:after] + handle_create_with_after + else + handle_append_line + end end end def destroy - local_lines = lines - File.open(resource[:path],'w') do |fh| - fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join('')) + if resource[:match_for_absence].to_s == 'true' && resource[:match] + handle_destroy_with_match + else + handle_destroy_line end end private + def lines # If this type is ever used with very large files, we should # write this in a different way, using a temp # file; for now assuming that this type is only used on # small-ish config files that can fit into memory without # too much trouble. - @lines ||= File.readlines(resource[:path]) + begin + @lines ||= File.readlines(resource[:path], :encoding => resource[:encoding]) + rescue TypeError => e + # Ruby 1.8 doesn't support open_args + @lines ||= File.readlines(resource[:path]) + end + end + + def new_after_regex + resource[:after] ? Regexp.new(resource[:after]) : nil + end + + def new_match_regex + resource[:match] ? Regexp.new(resource[:match]) : nil + end + + def count_matches(regex) + lines.select{ |line| line.match(regex) }.size end def handle_create_with_match() - regex = resource[:match] ? Regexp.new(resource[:match]) : nil - regex_after = resource[:after] ? Regexp.new(resource[:after]) : nil - match_count = count_matches(regex) + after_regex = new_after_regex + match_regex = new_match_regex + match_count = count_matches(new_match_regex) if match_count > 1 && resource[:multiple].to_s != 'true' raise Puppet::Error, "More than one line in file '#{resource[:path]}' matches pattern '#{resource[:match]}'" end File.open(resource[:path], 'w') do |fh| - lines.each do |l| - fh.puts(regex.match(l) ? resource[:line] : l) - if (match_count == 0 and regex_after) - if regex_after.match(l) + lines.each do |line| + fh.puts(match_regex.match(line) ? resource[:line] : line) + if match_count == 0 && after_regex + if after_regex.match(line) fh.puts(resource[:line]) - match_count += 1 #Increment match_count to indicate that the new line has been inserted. + match_count += 1 # Increment match_count to indicate that the new line has been inserted. end end end @@ -59,39 +98,53 @@ Puppet::Type.type(:file_line).provide(:ruby) do end def handle_create_with_after - regex = Regexp.new(resource[:after]) - count = count_matches(regex) - case count - when 1 # find the line to put our line after - File.open(resource[:path], 'w') do |fh| - lines.each do |l| - fh.puts(l) - if regex.match(l) then - fh.puts(resource[:line]) - end + after_regex = new_after_regex + after_count = count_matches(after_regex) + + if after_count > 1 && resource[:multiple].to_s != 'true' + raise Puppet::Error, "#{after_count} lines match pattern '#{resource[:after]}' in file '#{resource[:path]}'. One or no line must match the pattern." + end + + File.open(resource[:path],'w') do |fh| + lines.each do |line| + fh.puts(line) + if after_regex.match(line) + fh.puts(resource[:line]) end end - when 0 # append the line to the end of the file - append_line - else - raise Puppet::Error, "#{count} lines match pattern '#{resource[:after]}' in file '#{resource[:path]}'. One or no line must match the pattern." + + if (after_count == 0) + fh.puts(resource[:line]) + end end end - def count_matches(regex) - lines.select{|l| l.match(regex)}.size + def handle_destroy_with_match + match_regex = new_match_regex + match_count = count_matches(match_regex) + if match_count > 1 && resource[:multiple].to_s != 'true' + raise Puppet::Error, "More than one line in file '#{resource[:path]}' matches pattern '#{resource[:match]}'" + end + + local_lines = lines + File.open(resource[:path],'w') do |fh| + fh.write(local_lines.reject{ |line| match_regex.match(line) }.join('')) + end end - ## - # append the line to the file. - # - # @api private - def append_line - File.open(resource[:path], 'w') do |fh| - lines.each do |l| - fh.puts(l) + def handle_destroy_line + local_lines = lines + File.open(resource[:path],'w') do |fh| + fh.write(local_lines.reject{ |line| line.chomp == resource[:line] }.join('')) + end + end + + def handle_append_line + File.open(resource[:path],'w') do |fh| + lines.each do |line| + fh.puts(line) end - fh.puts resource[:line] + fh.puts(resource[:line]) end end end