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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
--
Kind Regards, Markus Falb
signature.asc
Description: OpenPGP digital signature
