On 3.6.2011 17:07, Greg Sutcliffe wrote:
> Hi all,
> 
> As my first foray into types and providers (and as suggested on the
> -users list), here is a patch for Onyx Point's Concat type which
> implements insync? for both concat_build and concat_fragment. It's
> probably ugly, and I need to learn, so feedback is welcome :)

If one fragment is not insync and there were fragments found insync
before those fragments will not make it into the target. Actually the
whole fragments directory is purged after a not in sync fragment is
found. The insync fragments found before will not be recreated.


> diff --git a/lib/puppet/provider/concat_build/build.rb
> b/lib/puppet/provider/concat_build/build.rb
> index b9e7539..01b054d 100644
> --- a/lib/puppet/provider/concat_build/build.rb
> +++ b/lib/puppet/provider/concat_build/build.rb
> @@ -21,8 +21,9 @@ Puppet::Type.type(:concat_build ).provide :concat_build do
>  
>    desc "concat_build provider"
>  
> -  def build_file
> -    if
> File.directory?("/var/lib/puppet/concat/fragments/#{@resource[:name]}") then
> +  def build_file(build = false)
> +    if
> File.directory?("/var/lib/puppet/concat/fragments/#{@resource[:name]}")
> and not build then
> +      # Just diff'ing - build the file but don't move it yet
>        begin
>          FileUtils.mkdir_p("/var/lib/puppet/concat/output")
>  
> @@ -101,18 +102,22 @@ Puppet::Type.type(:concat_build ).provide
> :concat_build do
>  
>          f.close
>  
> -      
>  
> FileUtils.touch("/var/lib/puppet/concat/fragments/#{@resource[:name]}/.~concat_fragments")
> -        if @resource[:target] and check_onlyif then
> -          debug "Copying
> /var/lib/puppet/concat/output/#{@resource[:name]}.out to
> #{@resource[:target]}"
> -        
>  FileUtils.cp("/var/lib/puppet/concat/output/#{@resource[:name]}.out",
> @resource[:target])
> -        elsif @resource[:target] then
> -          debug "Not copying to #{@resource[:target]}, 'onlyif' check
> failed"
> -        elsif @resource[:onlyif] then
> -          debug "Specified 'onlyif' without 'target', ignoring."
> -        end
>        rescue Exception => e
>          fail Puppet::Error, e
>        end
> +    elsif
> File.directory?("/var/lib/puppet/concat/fragments/#{@resource[:name]}")
> and build then
> +      # This time for real - move the built file into the fragments dir
> +    
>  
> FileUtils.touch("/var/lib/puppet/concat/fragments/#{@resource[:name]}/.~concat_fragments")
> +      if @resource[:target] and check_onlyif then
> +        debug "Copying
> /var/lib/puppet/concat/output/#{@resource[:name]}.out to
> #{@resource[:target]}"
> +      
>  FileUtils.cp("/var/lib/puppet/concat/output/#{@resource[:name]}.out",
> @resource[:target])
> +      elsif @resource[:target] then
> +        debug "Not copying to #{@resource[:target]}, 'onlyif' check failed"
> +      elsif @resource[:onlyif] then
> +        debug "Specified 'onlyif' without 'target', ignoring."
> +      end
>      elsif not @resource.quiet? then
>        fail Puppet::Error, "The fragments directory at
> '/var/lib/puppet/concat/fragments/#{@resource[:name]}' does not exist!"
>      end
> diff --git a/lib/puppet/type/concat_build.rb
> b/lib/puppet/type/concat_build.rb
> index 1670322..72e2be0 100644
> --- a/lib/puppet/type/concat_build.rb
> +++ b/lib/puppet/type/concat_build.rb
> @@ -16,6 +16,9 @@
>  # You should have received a copy of the GNU General Public License
> along with
>  # this program.  If not, see <http://www.gnu.org/licenses/>.
>  #
> +
> +include Puppet::Util::Diff
> +
>  Puppet::Type.newtype(:concat_build) do
>    @doc = "Build file from fragments"
>  
> @@ -158,11 +161,20 @@ Puppet::Type.newtype(:concat_build) do
>      end
>  
>      def insync?(is)
> -      return false
> +      # Build the temporary file, and then diff it against the actual one
> +      provider.build_file(false)
> +      diffs =
> diff(@resource[:target],"/var/lib/puppet/concat/output/#{@resource[:name]}.out")
>  
> +      if diffs != "" then
> +        puts diffs
> +        return false
> +      else
> +        return true
> +      end
>      end
>  
>      def sync
> -      provider.build_file
> +      # Move the tempfile into place
> +      provider.build_file(true)
>      end
>  
>      def change_to_s(currentvalue, newvalue)
> diff --git a/lib/puppet/type/concat_fragment.rb
> b/lib/puppet/type/concat_fragment.rb
> index 2ac7fab..705cfe9 100644
> --- a/lib/puppet/type/concat_fragment.rb
> +++ b/lib/puppet/type/concat_fragment.rb
> @@ -16,6 +16,9 @@
>  # You should have received a copy of the GNU General Public License
> along with
>  # this program.  If not, see <http://www.gnu.org/licenses/>.
>  #
> +
> +include Puppet::Util::Diff
> +
>  Puppet::Type.newtype(:concat_fragment) do
>    @doc = "Create a concat fragment"
>  
> @@ -26,7 +29,19 @@ Puppet::Type.newtype(:concat_fragment) do
>      end
>  
>      def insync?(is)
> -      return false
> +      group = @resource[:name].split('+').first
> +      fragment = @resource[:name].split('+')[1..-1].join('+')
> +      frag_file = "/var/lib/puppet/concat/fragments/#{group}/#{fragment}"
> +
> +      if File.exist?(frag_file)
> +        data = File.read(frag_file)
> +        if data == @resource[:content] then
> +          debug "Disk contents differ from resource content for
> #{@resource[:name]}"
> +          return true
> +        end
> +      else
> +        return false
> +      end
>      end
>  
>      def sync
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Puppet Developers" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/puppet-dev/-/SzJqVjZCZ1dUOVlK.
> To post to this group, send email to puppet-dev@googlegroups.com.
> To unsubscribe from this group, send email to
> puppet-dev+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.


-- 
Kind Regards, Markus Falb

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to