Bug#703204: unblock: puppet/2.7.18-4
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package puppet
A bug (http://bugs.debian.org/698294) prevents the use of symbolic links at
the source when using puppet to distribute files; they fail with a checksum
error. This is a regression from puppet in stable. Puppet Labs recently
included the fix for this bug into their 2.7.x maintenance branch.
A test with puppet 2.7.18-3 (with the bug) and 2.7.18-4 (bug fixed) shows the
following:
,----[ setup ]
| # echo testing > testfile
| # ln -s testfile testlink
| # md5sum testfile
| eb1a3227cdc3fedbaec2fe38bf6c044a testfile
`----
,----[ test with 2.7.18-3 ]
| # dpkg -i /home/ssm/Debian/pbuilder/unstable_result/{puppet-common,puppetmaster-common,puppetmaster}_2.7.18-3_all.deb
| # puppet resource file $(pwd)/newfile ensure=file links=follow source=$(pwd)/testlink mode=0644
| err: /File[/root/newfile]/ensure: change from absent to present
| failed: Could not rename temporary file /root/newfile.puppettmp_1534
| to /root/newfile: File written to disk did not match checksum;
| discarding changes ( vs {md5}d41d8cd98f00b204e9800998ecf8427e)
| file { '/root/newfile':
| ensure => 'absent',
| }
`----
,----[ test with 2.7.18-4 ]
| # dpkg -i /home/ssm/Debian/pbuilder/unstable_result/{puppet-common,puppetmaster-common,puppetmaster}_2.7.18-4_all.deb
| # puppet resource file $(pwd)/newfile ensure=file links=follow source=$(pwd)/testlink mode=0644
| notice: /File[/root/newfile]/ensure: defined content as '{md5}eb1a3227cdc3fedbaec2fe38bf6c044a'
| file { '/root/newfile':
| ensure => 'file',
| content => '{md5}eb1a3227cdc3fedbaec2fe38bf6c044a',
| group => '0',
| mode => '644',
| owner => '0',
| }
`----
The list of patches are taken from
https://github.com/puppetlabs/puppet/pull/1532, minus one patch for a newer
puppet version, and area added to the packaging as follows (debdiff also
attached):
* fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03
fixes broken tests, which prevented the fix from being accepted.
* fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63
the actual bugfix. Two lines changed. :)
* fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72
updates tests to reflect new behaviour
* fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309
add acceptance test
Since we also package the tests as "puppet-testsuite", the patches updating the
tests are included.
unblock puppet/2.7.18-4
-- System Information:
Debian Release: 7.0
APT prefers testing
APT policy: (900, 'testing'), (800, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru puppet-2.7.18/debian/changelog puppet-2.7.18/debian/changelog
--- puppet-2.7.18/debian/changelog 2013-03-13 15:46:03.000000000 +0100
+++ puppet-2.7.18/debian/changelog 2013-03-15 21:43:41.000000000 +0100
@@ -1,3 +1,10 @@
+puppet (2.7.18-4) unstable; urgency=low
+
+ * Import upstream patch to fix puppet's handling of symbolic links
+ (Closes: #698294)
+
+ -- Stig Sandbeck Mathisen <ssm@debian.org> Fri, 15 Mar 2013 20:32:40 +0100
+
puppet (2.7.18-3) unstable; urgency=high
* Add patch to fix puppet vulnerabilities (CVE-2013-1640, CVE-2013-1652,
diff -Nru puppet-2.7.18/debian/patches/fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03 puppet-2.7.18/debian/patches/fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03
--- puppet-2.7.18/debian/patches/fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03 1970-01-01 01:00:00.000000000 +0100
+++ puppet-2.7.18/debian/patches/fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03 2013-03-15 21:43:41.000000000 +0100
@@ -0,0 +1,128 @@
+commit ee4c6f7c697737aa919b9f90436ab0cc69934b03
+Author: Chris Boot <crb@tiger-computing.co.uk>
+Date: Mon Mar 11 15:30:14 2013 +0000
+
+ (#7680) Update tests for changed behaviour after bugfix
+
+ A number of tests were broken before the bugfix:
+ * incorrectly checking the file mode (missing .should)
+ * operating on a non-existent source symlink
+
+ Enabled all of the #10315 tests which now pass, some of which needed
+ editing due to the expected behaviour now being different for
+ links => follow.
+
+--- a/spec/integration/type/file_spec.rb
++++ b/spec/integration/type/file_spec.rb
+@@ -234,22 +234,20 @@
+
+ describe "that is readable" do
+ it "should set the executable bits when creating the destination (#10315)" do
+- pending "bug #10315"
+-
+ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow)
+ catalog.apply
+
++ File.should be_directory(path)
+ (get_mode(path) & 07777).should == 0777
+ end
+
+ it "should set the executable bits when overwriting the destination (#10315)" do
+- pending "bug #10315"
+-
+ FileUtils.touch(path)
+
+- catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow)
++ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow, :backup => false)
+ catalog.apply
+
++ File.should be_directory(path)
+ (get_mode(path) & 07777).should == 0777
+ end
+ end
+@@ -264,37 +262,41 @@
+ set_mode(0700, target)
+ end
+
+- it "should not set executable bits when creating the destination (#10315)" do
+- pending "bug #10315"
+-
++ it "should set executable bits when creating the destination (#10315)" do
+ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow)
+ catalog.apply
+
+- (get_mode(path) & 07777).should == 0666
++ File.should be_directory(path)
++ (get_mode(path) & 07777).should == 0777
+ end
+
+- it "should not set executable bits when overwriting the destination" do
++ it "should set executable bits when overwriting the destination" do
+ FileUtils.touch(path)
+
+- catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow)
++ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0666, :links => :follow, :backup => false)
+ catalog.apply
+
+- (get_mode(path) & 07777).should == 0666
++ File.should be_directory(path)
++ (get_mode(path) & 07777).should == 0777
+ end
+ end
+ end
+
+ describe "to a file" do
+- let(:target) { tmpfile('file_target') }
++ let(:link_target) { tmpfile('file_target') }
+
+- it "should create the file, not a symlink (#2817, #10315)" do
+- pending "bug #2817, #10315"
++ before :each do
++ FileUtils.touch(link_target)
+
++ File.symlink(link_target, link)
++ end
++
++ it "should create the file, not a symlink (#2817, #10315)" do
+ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0600, :links => :follow)
+ catalog.apply
+
+ File.should be_file(path)
+- (get_mode(path) & 07777) == 0600
++ (get_mode(path) & 07777).should == 0600
+ end
+
+ it "should overwrite the file" do
+@@ -304,7 +306,7 @@
+ catalog.apply
+
+ File.should be_file(path)
+- (get_mode(path) & 07777) == 0600
++ (get_mode(path) & 07777).should == 0600
+ end
+ end
+
+@@ -326,13 +328,11 @@
+
+ describe "when following all links" do
+ it "should create the destination and apply executable bits (#10315)" do
+- pending "bug #10315"
+-
+ catalog.add_resource described_class.new(:path => path, :source => link, :mode => 0600, :links => :follow)
+ catalog.apply
+
+ File.should be_directory(path)
+- (get_mode(path) & 07777) == 0777
++ (get_mode(path) & 07777).should == 0700
+ end
+
+ it "should overwrite the destination and apply executable bits" do
+@@ -342,7 +342,7 @@
+ catalog.apply
+
+ File.should be_directory(path)
+- (get_mode(path) & 07777) == 0777
++ (get_mode(path) & 0111).should == 0100
+ end
+ end
+ end
diff -Nru puppet-2.7.18/debian/patches/fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63 puppet-2.7.18/debian/patches/fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63
--- puppet-2.7.18/debian/patches/fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63 1970-01-01 01:00:00.000000000 +0100
+++ puppet-2.7.18/debian/patches/fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63 2013-03-15 21:43:41.000000000 +0100
@@ -0,0 +1,31 @@
+commit 1b0e812ad9e33b3cc148fac30a28490f60f40c63
+Author: Chris Boot <crb@tiger-computing.co.uk>
+Date: Thu Mar 14 17:56:39 2013 +0000
+
+ Send the :links option to the file server
+
+ Previously, the server was never asked to follow links when 'links =>
+ follow' was used, so the server always provided the metadata for the
+ link itself. With this patch, the server correctly follows the link
+ server-side and the client can apply the catalog correctly.
+
+--- a/lib/puppet/type/file/source.rb
++++ b/lib/puppet/type/file/source.rb
+@@ -101,7 +101,7 @@
+ return @content if @content
+ raise Puppet::DevError, "No source for content was stored with the metadata" unless metadata.source
+
+- unless tmp = Puppet::FileServing::Content.indirection.find(metadata.source)
++ unless tmp = Puppet::FileServing::Content.indirection.find(metadata.source, :links => resource[:links])
+ fail "Could not find any content at %s" % metadata.source
+ end
+ @content = tmp.content
+@@ -154,7 +154,7 @@
+ return nil unless value
+ value.each do |source|
+ begin
+- if data = Puppet::FileServing::Metadata.indirection.find(source)
++ if data = Puppet::FileServing::Metadata.indirection.find(source, :links => resource[:links])
+ @metadata = data
+ @metadata.source = source
+ break
diff -Nru puppet-2.7.18/debian/patches/fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72 puppet-2.7.18/debian/patches/fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72
--- puppet-2.7.18/debian/patches/fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72 1970-01-01 01:00:00.000000000 +0100
+++ puppet-2.7.18/debian/patches/fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72 2013-03-15 21:43:41.000000000 +0100
@@ -0,0 +1,73 @@
+commit 3a00ed468617c17b5a527c68cfc37d7d1fddaa72
+Author: Chris Boot <crb@tiger-computing.co.uk>
+Date: Thu Mar 14 19:05:50 2013 +0000
+
+ Update Puppet::FileServing::Metadata tests
+
+ Provide a stub for resource[:links] => :manage
+ Expect :find to be called with :links => :manage
+
+--- a/spec/unit/type/file/source_spec.rb
++++ b/spec/unit/type/file/source_spec.rb
+@@ -92,6 +92,7 @@
+ describe "when returning the metadata" do
+ before do
+ @metadata = stub 'metadata', :source= => nil
++ @resource.stubs(:[]).with(:links).returns :manage
+ end
+
+ it "should return already-available metadata" do
+@@ -107,22 +108,22 @@
+
+ it "should collect its metadata using the Metadata class if it is not already set" do
+ @source = source.new(:resource => @resource, :value => @foobar)
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri).returns @metadata
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri, :links => :manage).returns @metadata
+ @source.metadata
+ end
+
+ it "should use the metadata from the first found source" do
+ metadata = stub 'metadata', :source= => nil
+ @source = source.new(:resource => @resource, :value => [@foobar, @feebooz])
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri).returns nil
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@feebooz_uri).returns metadata
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri, :links => :manage).returns nil
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@feebooz_uri, :links => :manage).returns metadata
+ @source.metadata.should equal(metadata)
+ end
+
+ it "should store the found source as the metadata's source" do
+ metadata = mock 'metadata'
+ @source = source.new(:resource => @resource, :value => @foobar)
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri).returns metadata
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri, :links => :manage).returns metadata
+
+ metadata.expects(:source=).with(@foobar_uri)
+ @source.metadata
+@@ -130,7 +131,7 @@
+
+ it "should fail intelligently if an exception is encountered while querying for metadata" do
+ @source = source.new(:resource => @resource, :value => @foobar)
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri).raises RuntimeError
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri, :links => :manage).raises RuntimeError
+
+ @source.expects(:fail).raises ArgumentError
+ lambda { @source.metadata }.should raise_error(ArgumentError)
+@@ -138,7 +139,7 @@
+
+ it "should fail if no specified sources can be found" do
+ @source = source.new(:resource => @resource, :value => @foobar)
+- Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri).returns nil
++ Puppet::FileServing::Metadata.indirection.expects(:find).with(@foobar_uri, :links => :manage).returns nil
+
+ @source.expects(:fail).raises RuntimeError
+
+@@ -319,7 +320,7 @@
+ before(:each) do
+ metadata = Puppet::FileServing::Metadata.new(path, :source => uri, 'type' => 'file')
+ #metadata = stub('remote', :ftype => "file", :source => uri)
+- Puppet::FileServing::Metadata.indirection.stubs(:find).with(uri).returns metadata
++ Puppet::FileServing::Metadata.indirection.stubs(:find).with(uri, :links => :manage).returns metadata
+ resource[:source] = uri
+ end
+
diff -Nru puppet-2.7.18/debian/patches/fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309 puppet-2.7.18/debian/patches/fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309
--- puppet-2.7.18/debian/patches/fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309 1970-01-01 01:00:00.000000000 +0100
+++ puppet-2.7.18/debian/patches/fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309 2013-03-15 21:43:41.000000000 +0100
@@ -0,0 +1,42 @@
+commit 1d8a76e060f610a9db20cf1bdd4ff95dddba9309
+Author: Adrien Thebo <git@somethingsinistral.net>
+Date: Thu Mar 14 13:42:22 2013 -0700
+
+ (#7680) Add acceptance test for file links => follow
+
+--- /dev/null
++++ b/acceptance/tests/resource/file/ticket_7680-follow-symlinks.rb
+@@ -0,0 +1,33 @@
++test_name "#7680: 'links => follow' should use the file source content"
++confine :except, :platform => 'windows'
++
++agents.each do |agent|
++
++ step "Create file content"
++ real_source = agent.tmpfile('follow_links_source')
++ dest = agent.tmpfile('follow_links_dest')
++ symlink = agent.tmpfile('follow_links_symlink')
++
++ on agent, "echo 'This is the real content' > #{real_source}"
++ on agent, "ln -sf #{real_source} #{symlink}"
++
++ manifest = <<-MANIFEST
++ file { '#{dest}':
++ ensure => file,
++ source => '#{symlink}',
++ links => follow,
++ }
++ MANIFEST
++ apply_manifest_on(agent, manifest, :trace => true)
++
++ on agent, "cat #{dest}" do
++ assert_match /This is the real content/, stdout
++ end
++
++ step "Cleanup"
++ [real_source, dest, symlink].each do |file|
++ on agent, "rm -f '#{file}'"
++ end
++end
++
++
diff -Nru puppet-2.7.18/debian/patches/series puppet-2.7.18/debian/patches/series
--- puppet-2.7.18/debian/patches/series 2013-03-13 15:46:03.000000000 +0100
+++ puppet-2.7.18/debian/patches/series 2013-03-15 21:43:41.000000000 +0100
@@ -1,4 +1,8 @@
2.7.18-CVE-Rollup.patch
2.7.x-unit-test-fix.patch
+fix-symlink-1-ee4c6f7c697737aa919b9f90436ab0cc69934b03
+fix-symlink-2-1b0e812ad9e33b3cc148fac30a28490f60f40c63
+fix-symlink-3-3a00ed468617c17b5a527c68cfc37d7d1fddaa72
+fix-symlink-4-1d8a76e060f610a9db20cf1bdd4ff95dddba9309
apache2-passenger-template
fix_logcheck
Reply to: