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
signature.asc
Description: OpenPGP digital signature