tpkg 2.3.3 → 2.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +20 -0
  5. data/Portfile +39 -0
  6. data/Portfile.template +39 -0
  7. data/README.md +43 -0
  8. data/Rakefile +468 -18
  9. data/bin/gem2tpkg +2 -2
  10. data/bin/tpkg +18 -13
  11. data/bin/tpkg_uploader +132 -0
  12. data/ca.pem +1 -0
  13. data/control +7 -0
  14. data/depend +3 -0
  15. data/externals-etch/authorized_keys +40 -0
  16. data/externals-etch/group +9 -0
  17. data/externals-etch/iptables +38 -0
  18. data/externals-etch/limits +30 -0
  19. data/externals-etch/nfs +30 -0
  20. data/externals-etch/sudo +30 -0
  21. data/externals-etch/supplemental_groups +8 -0
  22. data/externals-etch/sysctl +30 -0
  23. data/externals-etch/user +41 -0
  24. data/externals/group +39 -0
  25. data/externals/supplemental_groups +48 -0
  26. data/externals/user +39 -0
  27. data/lib/tpkg.rb +260 -991
  28. data/lib/tpkg/os.rb +164 -0
  29. data/lib/tpkg/os/debian.rb +159 -0
  30. data/lib/tpkg/os/freebsd.rb +113 -0
  31. data/lib/tpkg/os/macosx.rb +113 -0
  32. data/lib/tpkg/os/redhat.rb +173 -0
  33. data/lib/tpkg/os/solaris.rb +101 -0
  34. data/lib/tpkg/os/windows.rb +26 -0
  35. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify.rb +67 -0
  36. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/errors.rb +127 -0
  37. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/kwalify.schema.yaml +58 -0
  38. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/main.rb +442 -0
  39. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/messages.rb +173 -0
  40. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/meta-validator.rb +275 -0
  41. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/base.rb +127 -0
  42. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/yaml.rb +841 -0
  43. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/rule.rb +559 -0
  44. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-java.eruby +222 -0
  45. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-php.eruby +104 -0
  46. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-ruby.eruby +113 -0
  47. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/types.rb +156 -0
  48. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util.rb +158 -0
  49. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/assert-text-equal.rb +46 -0
  50. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hash-interface.rb +18 -0
  51. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hashlike.rb +51 -0
  52. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/option-parser.rb +220 -0
  53. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/ordered-hash.rb +57 -0
  54. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/testcase-helper.rb +112 -0
  55. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/validator.rb +282 -0
  56. data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/yaml-parser.rb +870 -0
  57. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh.rb +219 -0
  58. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/agent.rb +179 -0
  59. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/constants.rb +18 -0
  60. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/key_manager.rb +219 -0
  61. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  62. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  63. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  64. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/password.rb +39 -0
  65. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  66. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/pageant.rb +183 -0
  67. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/session.rb +134 -0
  68. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffer.rb +340 -0
  69. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffered_io.rb +198 -0
  70. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/config.rb +205 -0
  71. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/channel.rb +630 -0
  72. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/constants.rb +33 -0
  73. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/session.rb +597 -0
  74. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/term.rb +178 -0
  75. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/errors.rb +85 -0
  76. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/key_factory.rb +102 -0
  77. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/known_hosts.rb +129 -0
  78. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/loggable.rb +61 -0
  79. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/packet.rb +102 -0
  80. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/prompt.rb +93 -0
  81. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/command.rb +75 -0
  82. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/errors.rb +14 -0
  83. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/http.rb +94 -0
  84. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks4.rb +70 -0
  85. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks5.rb +142 -0
  86. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/ruby_compat.rb +43 -0
  87. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/service/forward.rb +288 -0
  88. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test.rb +89 -0
  89. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/channel.rb +129 -0
  90. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/extensions.rb +152 -0
  91. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/kex.rb +44 -0
  92. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/local_packet.rb +51 -0
  93. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/packet.rb +81 -0
  94. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/remote_packet.rb +38 -0
  95. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/script.rb +157 -0
  96. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/socket.rb +64 -0
  97. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/algorithms.rb +384 -0
  98. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/cipher_factory.rb +97 -0
  99. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/constants.rb +30 -0
  100. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac.rb +31 -0
  101. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/abstract.rb +79 -0
  102. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5.rb +12 -0
  103. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  104. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/none.rb +15 -0
  105. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  106. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  107. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/identity_cipher.rb +55 -0
  108. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex.rb +13 -0
  109. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  110. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  111. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/openssl.rb +127 -0
  112. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/packet_stream.rb +235 -0
  113. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/server_version.rb +71 -0
  114. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/session.rb +276 -0
  115. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/state.rb +206 -0
  116. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/lenient.rb +30 -0
  117. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/null.rb +12 -0
  118. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/strict.rb +53 -0
  119. data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/version.rb +62 -0
  120. data/lib/tpkg/version.rb +3 -0
  121. data/man/man1/cpan2tpkg.1 +82 -0
  122. data/man/man1/gem2tpkg.1 +120 -0
  123. data/man/man1/tpkg.1 +411 -0
  124. data/pkginfo +8 -0
  125. data/postinstall.solaris +11 -0
  126. data/postremove.solaris +16 -0
  127. data/schema/schema-1.0.5.yml +0 -0
  128. data/schema/schema-1.0.6.yml +0 -0
  129. data/schema/schema-1.0.7.yml +0 -0
  130. data/schema/schema-1.0.8.yml +0 -0
  131. data/schema/schema-1.0.9.yml +0 -0
  132. data/schema/schema.yml +0 -0
  133. data/schema/tpkg-1.0.0.dtd +0 -0
  134. data/schema/tpkg-1.0.1.dtd +0 -0
  135. data/schema/tpkg-1.0.2.dtd +0 -0
  136. data/schema/tpkg-1.0.3.dtd +0 -0
  137. data/schema/tpkg-1.0.4.dtd +0 -0
  138. data/schema/tpkg-1.0.5.dtd +0 -0
  139. data/schema/tpkg-1.0.6.dtd +0 -0
  140. data/schema/tpkg-1.0.7.dtd +0 -0
  141. data/schema/tpkg-1.0.8.dtd +0 -0
  142. data/schema/tpkg-1.0.9.dtd +0 -0
  143. data/schema/tpkg.dtd +0 -0
  144. data/test/TODO +30 -0
  145. data/test/premadetestpkg/pkg_without_file_metadata-1.0-1.tpkg +0 -0
  146. data/test/test_checksum.rb +53 -0
  147. data/test/test_compress.rb +55 -0
  148. data/test/test_conflict.rb +41 -0
  149. data/test/test_crontabs.rb +398 -0
  150. data/test/test_dependency.rb +1113 -0
  151. data/test/test_downgrade.rb +80 -0
  152. data/test/test_download.rb +95 -0
  153. data/test/test_encrypt.rb +136 -0
  154. data/test/test_filemetadata.rb +131 -0
  155. data/test/test_initscript.rb +93 -0
  156. data/test/test_install.rb +186 -0
  157. data/test/test_lock.rb +82 -0
  158. data/test/test_make.rb +410 -0
  159. data/test/test_metadata.rb +805 -0
  160. data/test/test_misc.rb +379 -0
  161. data/test/test_options.rb +1711 -0
  162. data/test/test_os.rb +193 -0
  163. data/test/test_os_debian.rb +99 -0
  164. data/test/test_os_freebsd.rb +89 -0
  165. data/test/test_os_macosx.rb +79 -0
  166. data/test/test_os_redhat.rb +124 -0
  167. data/test/test_os_solaris.rb +85 -0
  168. data/test/test_os_windows.rb +26 -0
  169. data/test/test_query.rb +134 -0
  170. data/test/test_remove.rb +539 -0
  171. data/test/test_tar.rb +99 -0
  172. data/test/test_unpack.rb +977 -0
  173. data/test/test_upgrade.rb +398 -0
  174. data/test/test_version.rb +54 -0
  175. data/test/testcmds/crontab +14 -0
  176. data/test/testcmds/debian/apt-cache +145 -0
  177. data/test/testcmds/debian/dpkg-query +16 -0
  178. data/test/testcmds/freebsd/pkg_info +13 -0
  179. data/test/testcmds/macosx/port +35 -0
  180. data/test/testcmds/redhat/rpmbuild +6 -0
  181. data/test/testcmds/redhat/yum +90 -0
  182. data/test/testcmds/solaris/pkginfo +25 -0
  183. data/test/testcmds/solaris/pkgutil +36 -0
  184. data/test/testpkg/reloc/encfile +2 -0
  185. data/test/testpkg/reloc/file +2 -0
  186. data/test/testpkg/reloc/precryptfile +1 -0
  187. data/test/testpkg/reloc/precryptfile.plaintext +3 -0
  188. data/test/testpkg/tpkg-bad-ownergroup.xml +25 -0
  189. data/test/testpkg/tpkg-bad-ownergroup.yml +18 -0
  190. data/test/testpkg/tpkg-default-perms.xml +28 -0
  191. data/test/testpkg/tpkg-default-perms.yml +20 -0
  192. data/test/testpkg/tpkg-good-ownergroup.xml +25 -0
  193. data/test/testpkg/tpkg-good-ownergroup.yml +18 -0
  194. data/test/testpkg/tpkg-nativedeps.yml +13 -0
  195. data/test/testpkg/tpkg-nofiles.xml +14 -0
  196. data/test/testpkg/tpkg-nofiles.yml +9 -0
  197. data/test/testpkg/tpkg.xml +35 -0
  198. data/test/testpkg/tpkg.yml +25 -0
  199. data/test/tpkgtest.rb +300 -0
  200. data/tpkg.conf +16 -0
  201. data/tpkg.gemspec +24 -0
  202. data/tpkg.spec +28 -0
  203. data/tpkg.xml +17 -0
  204. data/tpkg_profile.sh +32 -0
  205. metadata +306 -31
@@ -0,0 +1,99 @@
1
+ #
2
+ # Test tpkg's basic tar functionality
3
+ #
4
+
5
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
6
+
7
+ class TpkgTarTests < Test::Unit::TestCase
8
+ include TpkgTests
9
+
10
+ def setup
11
+ Tpkg.set_prompt(false)
12
+ end
13
+
14
+ def test_find_tar
15
+ # Verify that find_tar finds GNU tar or bsdtar
16
+ good_tar = false
17
+ tar = Tpkg.find_tar
18
+ IO.popen("#{tar} --version") do |pipe|
19
+ pipe.each_line do |line|
20
+ if line.include?('GNU tar') || line.include?('bsdtar')
21
+ good_tar = true
22
+ end
23
+ end
24
+ end
25
+ assert(good_tar, 'find_tar returns GNU tar or bsdtar')
26
+
27
+ # Muck with ENV['PATH'] and verify that find_tar throws an exception
28
+ oldpath = ENV['PATH']
29
+ begin
30
+ ENV['PATH'] = Tempfile.new('tpkgtest').path
31
+ Tpkg.clear_cached_tar
32
+ assert_raise(RuntimeError, 'find tar with bogus path') { Tpkg.find_tar }
33
+ ensure
34
+ ENV['PATH'] = oldpath
35
+ end
36
+
37
+ # Muck with the returned variable and ensure that doesn't stick
38
+ tar = Tpkg.find_tar
39
+ goodtar = tar.dup
40
+ tar << 'junk'
41
+ assert_equal(goodtar, Tpkg.find_tar)
42
+
43
+ # Verify that the returned path is wrapped in quotes if it contains spaces
44
+ testdirtmp = Tempfile.new('tpkgtest')
45
+ testdir = testdirtmp.path
46
+ testdirtmp.close
47
+ File.unlink(testdir)
48
+ testsubdir = File.join(testdir, 'a b')
49
+ FileUtils.mkdir_p(testsubdir)
50
+ Tpkg.clear_cached_tar
51
+ tar = Tpkg.find_tar
52
+ tar.sub!(/^"/, '')
53
+ tar.sub!(/"$/, '')
54
+ FileUtils.cp(tar, testsubdir)
55
+ if File.basename(tar) == 'bsdtar.exe'
56
+ # Dir.glob and Windows-style paths with \ seem incompatible, even with
57
+ # File::FNM_NOESCAPE
58
+ tardir = File.dirname(tar).gsub('\\', '/')
59
+ Dir.glob(File.join(tardir, '*.dll')).each do |dll|
60
+ FileUtils.cp(dll, testsubdir)
61
+ end
62
+ end
63
+ Tpkg.clear_cached_tar
64
+ oldpath = ENV['PATH']
65
+ begin
66
+ ENV['PATH'] = testsubdir
67
+ expected_tar_path = nil
68
+ if RUBY_PLATFORM == 'i386-mingw32'
69
+ expected_tar_path =
70
+ testsubdir.gsub('/', '\\') + '\\' + File.basename(tar)
71
+ else
72
+ expected_tar_path = File.join(testsubdir, File.basename(tar))
73
+ end
74
+ assert_equal('"' + expected_tar_path + '"', Tpkg.find_tar)
75
+ FileUtils.rm_rf(testdir)
76
+ ensure
77
+ ENV['PATH'] = oldpath
78
+ end
79
+ Tpkg.clear_cached_tar
80
+ end
81
+
82
+ def test_clear_cached_tar
83
+ tar = Tpkg.find_tar
84
+ Tpkg.clear_cached_tar
85
+ Dir.mktmpdir('pathdir') do |pathdir|
86
+ mytar = File.join(pathdir, 'tar')
87
+ File.symlink(tar, mytar)
88
+ oldpath = ENV['PATH']
89
+ begin
90
+ ENV['PATH'] = "#{pathdir}:#{oldpath}"
91
+ assert_equal(mytar, Tpkg.find_tar)
92
+ ensure
93
+ ENV['PATH'] = oldpath
94
+ end
95
+ end
96
+ Tpkg.clear_cached_tar
97
+ end
98
+ end
99
+
@@ -0,0 +1,977 @@
1
+ #
2
+ # Test tpkg's ability to unpack packages
3
+ #
4
+
5
+ require File.expand_path('tpkgtest', File.dirname(__FILE__))
6
+ require 'find'
7
+
8
+ class TpkgUnpackTests < Test::Unit::TestCase
9
+ include TpkgTests
10
+
11
+ def setup
12
+ Tpkg::set_prompt(false)
13
+
14
+ # temp dir that will automatically get deleted at end of test run, can be
15
+ # used for storing packages
16
+ @tempoutdir = Dir.mktmpdir('tempoutdir')
17
+ # Make up a package with both relocatable and non-relocatable
18
+ # directory trees so that we can ensure both types are unpacked
19
+ # properly.
20
+ Dir.mktmpdir('srcdir') do |srcdir|
21
+ # The stock test package has a reloc directory we can use
22
+ system("#{Tpkg::find_tar} -C #{TESTPKGDIR} --exclude .svn -cf - . | #{Tpkg::find_tar} -C #{srcdir} -xf -")
23
+ # Then add a root directory
24
+ FileUtils.mkdir_p(File.join(srcdir, 'root', 'etc'))
25
+ File.open(File.join(srcdir, 'root', 'etc', 'rootfile'), 'w') do |file|
26
+ file.puts "Hello"
27
+ end
28
+ @pkgfile = make_package(:output_directory => @tempoutdir, :source_directory => srcdir, :files => {'/etc/rootfile' => {'perms' => '0666'}})
29
+ end
30
+
31
+ # Pretend to be an OS with init script support
32
+ fact = Facter::Util::Fact.new('operatingsystem')
33
+ fact.stubs(:value).returns('RedHat')
34
+ Facter.stubs(:[]).returns(fact)
35
+ end
36
+
37
+ def test_unpack
38
+ Dir.mktmpdir('testroot') do |testroot|
39
+ FileUtils.mkdir_p(File.join(testroot, 'home', 'tpkg'))
40
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
41
+ assert_nothing_raised { tpkg.unpack(@pkgfile, :passphrase => PASSPHRASE) }
42
+ # This file should have the default 0444 perms
43
+ assert(File.exist?(File.join(testroot, 'home', 'tpkg', 'file')))
44
+ assert_equal(0444, File.stat(File.join(testroot, 'home', 'tpkg', 'file')).mode & 07777)
45
+ # This file should have the 0400 perms specified specifically for it in the stock test tpkg.xml
46
+ assert(File.exist?(File.join(testroot, 'home', 'tpkg', 'encfile')))
47
+ assert_equal(0400, File.stat(File.join(testroot, 'home', 'tpkg', 'encfile')).mode & 07777)
48
+ assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'encfile')), IO.read(File.join(testroot, 'home', 'tpkg', 'encfile')))
49
+ # This file should have the 0666 perms we specified above
50
+ assert(File.exist?(File.join(testroot, 'etc', 'rootfile')))
51
+ assert_equal(0666, File.stat(File.join(testroot, 'etc', 'rootfile')).mode & 07777)
52
+ end
53
+
54
+ # Change the package base and unpack
55
+ Dir.mktmpdir('testroot2') do |testroot2|
56
+ tpkg2 = Tpkg.new(:file_system_root => testroot2, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
57
+ assert_nothing_raised { tpkg2.unpack(@pkgfile, :passphrase => PASSPHRASE) }
58
+ # Check that the files from the package ended up in the right place
59
+ assert(File.exist?(File.join(testroot2, 'home', 'tpkg', 'file')))
60
+ end
61
+
62
+ # Pass a nil passphrase to unpack and verify that it installs the
63
+ # package, skipping the unencrypted files
64
+ Dir.mktmpdir('testroot') do |testroot|
65
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
66
+ assert_nothing_raised { tpkg.unpack(@pkgfile) }
67
+ # Check that the files from the package ended up in the right place
68
+ assert(File.exist?(File.join(testroot, 'home', 'tpkg', 'file')))
69
+ assert(!File.exist?(File.join(testroot, 'home', 'tpkg', 'encfile')))
70
+ end
71
+
72
+ # Test permissions with no default permissions specified in tpkg.xml
73
+ # The stock test package has default permissions specified, so start
74
+ # with the -nofiles template which doesn't have default permissions.
75
+ pkg = nil
76
+ Dir.mktmpdir('srcdir') do |srcdir|
77
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
78
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'etc'))
79
+ # Set non-standard permissions on the directory so that we can
80
+ # ensure that the default permissions are applied by tpkg
81
+ File.chmod(0775, File.join(srcdir, 'reloc', 'etc'))
82
+ File.open(File.join(srcdir, 'reloc', 'etc', '666file'), 'w') do |file|
83
+ file.puts "Hello"
84
+ end
85
+ File.open(File.join(srcdir, 'reloc', 'etc', '400file'), 'w') do |file|
86
+ file.puts "Hello"
87
+ end
88
+ File.open(File.join(srcdir, 'reloc', 'etc', 'nopermsfile'), 'w') do |file|
89
+ file.puts "Hello"
90
+ end
91
+ # Set some crazy perms on this file so that we can be sure they
92
+ # are preserved (there are no default permissions for files)
93
+ File.chmod(0666, File.join(srcdir, 'reloc', 'etc', 'nopermsfile'))
94
+ pkg = make_package(:change => { 'name' => 'no-default-perms' }, :output_directory => @tempoutdir, :source_directory => srcdir, :files => {'etc/666file' => {'perms' => '0666'}, 'etc/400file' => {'perms' => '0400'}})
95
+ end
96
+ Dir.mktmpdir('testroot') do |testroot|
97
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
98
+ # Standard umask settings might be the same as the default permissions,
99
+ # which would mask failure here. Set an extreme umask so that we know
100
+ # tpkg is enforcing the desired permissions.
101
+ oldumask = File.umask
102
+ File.umask(0)
103
+ assert_nothing_raised { tpkg.unpack(pkg) }
104
+ File.umask(oldumask)
105
+ # This file should have the 0666 perms we specified above
106
+ assert_equal(0666, File.stat(File.join(testroot, 'home', 'tpkg', 'etc', '666file')).mode & 07777)
107
+ # This file should have the default 0400 perms we specified above
108
+ assert_equal(0400, File.stat(File.join(testroot, 'home', 'tpkg', 'etc', '400file')).mode & 07777)
109
+ # This file should have the 0666 perms we set on the file itself
110
+ assert_equal(0666, File.stat(File.join(testroot, 'home', 'tpkg', 'etc', 'nopermsfile')).mode & 07777)
111
+ # This directory should have the default 0755 tpkg directory perms
112
+ assert_equal(0755, File.stat(File.join(testroot, 'home', 'tpkg', 'etc')).mode & 07777)
113
+ end
114
+ FileUtils.rm_f(pkg)
115
+
116
+ # Test file_defaults and dir_defaults usage in a package
117
+ pkg = nil
118
+ Dir.mktmpdir('srcdir') do |srcdir|
119
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-default-perms.xml'), File.join(srcdir, 'tpkg.xml'))
120
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
121
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'dir1'))
122
+ File.open(File.join(srcdir, 'reloc', 'dir1', 'file1'), 'w') do |file|
123
+ file.puts 'Testing file_defaults'
124
+ end
125
+ # Ensure that the file goes into the package with permissions different
126
+ # from what we specify in the metadata so that we know tpkg set the
127
+ # permissions requested by the metadata and not that the file just came
128
+ # out of tar with the right permissions already.
129
+ File.chmod(0640, File.join(srcdir, 'reloc', 'dir1', 'file1'))
130
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'dir1', 'subdir1'))
131
+ File.chmod(0750, File.join(srcdir, 'reloc', 'dir1', 'subdir1'))
132
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'default-perms' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
133
+ end
134
+ Dir.mktmpdir('testroot') do |testroot|
135
+ testbase = File.join(testroot, 'home', 'tpkg')
136
+ FileUtils.mkdir_p(testbase)
137
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
138
+ # Standard umask settings might be the same as the default permissions,
139
+ # which would mask failure here. Set an extreme umask so that we know
140
+ # tpkg is enforcing the desired permissions.
141
+ oldumask = File.umask
142
+ File.umask(0)
143
+ assert_nothing_raised { tpkg.unpack(pkg) }
144
+ File.umask(oldumask)
145
+ # This file should have the 0444 perms we specified in the
146
+ # tpkg-default-perms.xml file
147
+ assert_equal(0444, File.stat(File.join(testbase, 'dir1', 'file1')).mode & 07777)
148
+ # These directories should have the 0555 perms we specified
149
+ assert_equal(0555, File.stat(File.join(testbase, 'dir1')).mode & 07777)
150
+ assert_equal(0555, File.stat(File.join(testbase, 'dir1', 'subdir1')).mode & 07777)
151
+ # The mktmpdir cleanup process doesn't seem to like cleaning up
152
+ # non-writeable directories and links. Note that any assertion failures
153
+ # will cause this to get skipped. So if you start getting permission
154
+ # errors from the cleanup process look to see if you might have caused
155
+ # an assertion to fail.
156
+ Find.find(testroot) do |f|
157
+ if File.symlink?(f)
158
+ begin
159
+ File.lchmod(0700, f)
160
+ rescue NotImplementedError
161
+ end
162
+ else
163
+ File.chmod(0700, f)
164
+ end
165
+ end
166
+ end
167
+ FileUtils.rm_f(pkg)
168
+
169
+ # Test that applying standard default permissions works in the face of
170
+ # symlinks in the package
171
+ pkg = nil
172
+ Dir.mktmpdir('srcdir') do |srcdir|
173
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
174
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
175
+ # Broken link to ensure that nothing attempts to traverse the link and
176
+ # fails as a result
177
+ File.symlink('/path/to/nowhere', File.join(srcdir, 'reloc', 'brokenlink'))
178
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'dir'))
179
+ File.symlink('dir', File.join(srcdir, 'reloc', 'dirlink'))
180
+ File.open(File.join(srcdir, 'reloc', 'file'), 'w') do |file|
181
+ file.puts 'Hello'
182
+ end
183
+ # Set some crazy perms on this file so that we can be sure they
184
+ # are preserved (there are no default permissions for files)
185
+ File.chmod(0777, File.join(srcdir, 'reloc', 'file'))
186
+ File.symlink('file', File.join(srcdir, 'reloc', 'filelink'))
187
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'no-default-perms-with-links' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
188
+ end
189
+ Dir.mktmpdir('testroot') do |testroot|
190
+ testbase = File.join(testroot, 'home', 'tpkg')
191
+ FileUtils.mkdir_p(testbase)
192
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
193
+ assert_nothing_raised { tpkg.unpack(pkg) }
194
+ assert_equal(0777, File.stat(File.join(testbase, 'file')).mode & 07777)
195
+ assert_equal(Tpkg::DEFAULT_DIR_PERMS, File.stat(File.join(testbase, 'dir')).mode & 07777)
196
+ end
197
+ FileUtils.rm_f(pkg)
198
+
199
+ # Test that applying specified default permissions works in the face of
200
+ # symlinks in the package
201
+ pkg = nil
202
+ Dir.mktmpdir('srcdir') do |srcdir|
203
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-default-perms.xml'), File.join(srcdir, 'tpkg.xml'))
204
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
205
+ # Broken link to ensure that nothing attempts to traverse the link and
206
+ # fails as a result
207
+ File.symlink('/path/to/nowhere', File.join(srcdir, 'reloc', 'brokenlink'))
208
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'dir'))
209
+ File.symlink('dir', File.join(srcdir, 'reloc', 'dirlink'))
210
+ File.open(File.join(srcdir, 'reloc', 'file'), 'w') do |file|
211
+ file.puts 'Hello'
212
+ end
213
+ File.chmod(0777, File.join(srcdir, 'reloc', 'file'))
214
+ File.symlink('file', File.join(srcdir, 'reloc', 'filelink'))
215
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'default-perms-with-links' }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
216
+ end
217
+ Dir.mktmpdir('testroot') do |testroot|
218
+ testbase = File.join(testroot, 'home', 'tpkg')
219
+ FileUtils.mkdir_p(testbase)
220
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
221
+ assert_nothing_raised { tpkg.unpack(pkg) }
222
+ assert_equal(0444, File.stat(File.join(testbase, 'file')).mode & 07777)
223
+ assert_equal(0555, File.stat(File.join(testbase, 'dir')).mode & 07777)
224
+ begin
225
+ # Test to see if lchmod is implemented on this platform. If not then
226
+ # tpkg won't have been able to use it and we can't check if it worked.
227
+ lchmodtestfile = Tempfile.new('lchmodtest')
228
+ File.lchmod(0555, lchmodtestfile.path)
229
+ # If that didn't raise an exception then we can proceed with
230
+ # assertions related to lchmod
231
+ assert_equal(0444, File.lstat(File.join(testbase, 'brokenlink')).mode & 07777)
232
+ assert_equal(0444, File.lstat(File.join(testbase, 'filelink')).mode & 07777)
233
+ assert_equal(0444, File.lstat(File.join(testbase, 'dirlink')).mode & 07777)
234
+ rescue NotImplementedError
235
+ warn "lchmod not available on this platform, link permissions not tested"
236
+ end
237
+ # The mktmpdir cleanup process doesn't seem to like cleaning up
238
+ # non-writeable directories and links. Note that any assertion failures
239
+ # will cause this to get skipped. So if you start getting permission
240
+ # errors from the cleanup process look to see if you might have caused
241
+ # an assertion to fail.
242
+ Find.find(testroot) do |f|
243
+ if File.symlink?(f)
244
+ begin
245
+ File.lchmod(0700, f)
246
+ rescue NotImplementedError
247
+ end
248
+ else
249
+ File.chmod(0700, f)
250
+ end
251
+ end
252
+ end
253
+ FileUtils.rm_f(pkg)
254
+
255
+ # Test that symlinks are not followed when applying permissions to
256
+ # specific files
257
+ pkg = nil
258
+ Dir.mktmpdir('srcdir') do |srcdir|
259
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
260
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
261
+ # Broken link to ensure that nothing attempts to traverse the link and
262
+ # fails as a result
263
+ File.symlink('/path/to/nowhere', File.join(srcdir, 'reloc', 'brokenlink'))
264
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc', 'dir'))
265
+ File.symlink('dir', File.join(srcdir, 'reloc', 'dirlink'))
266
+ File.open(File.join(srcdir, 'reloc', 'file'), 'w') do |file|
267
+ file.puts 'Hello'
268
+ end
269
+ File.chmod(0400, File.join(srcdir, 'reloc', 'file'))
270
+ File.symlink('file', File.join(srcdir, 'reloc', 'filelink'))
271
+ pkg = make_package(:change => { 'name' => 'specific-perms-with-links' }, :files => {'brokenlink' => {'perms' => '0555'}, 'dirlink' => {'perms' => '0770'}, 'filelink' => {'perms' => '0666'}}, :source_directory => srcdir, :output_directory => @tempoutdir, :remove => ['operatingsystem', 'architecture'])
272
+ end
273
+ Dir.mktmpdir('testroot') do |testroot|
274
+ testbase = File.join(testroot, 'home', 'tpkg')
275
+ FileUtils.mkdir_p(testbase)
276
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
277
+ assert_nothing_raised { tpkg.unpack(pkg) }
278
+ assert_equal(Tpkg::DEFAULT_DIR_PERMS, File.stat(File.join(testbase, 'dir')).mode & 07777)
279
+ assert_equal(0400, File.stat(File.join(testbase, 'file')).mode & 07777)
280
+ begin
281
+ # Test to see if lchmod is implemented on this platform. If not then
282
+ # tpkg won't have been able to use it and we can't check if it worked.
283
+ lchmodtestfile = Tempfile.new('lchmodtest')
284
+ File.lchmod(0555, lchmodtestfile.path)
285
+ # If that didn't raise an exception then we can proceed with
286
+ # assertions related to lchmod
287
+ assert_equal(0555, File.lstat(File.join(testbase, 'brokenlink')).mode & 07777)
288
+ assert_equal(0666, File.lstat(File.join(testbase, 'filelink')).mode & 07777)
289
+ assert_equal(0770, File.lstat(File.join(testbase, 'dirlink')).mode & 07777)
290
+ rescue NotImplementedError
291
+ warn "lchmod not available on this platform, link permissions not tested"
292
+ end
293
+ end
294
+ FileUtils.rm_f(pkg)
295
+
296
+ # Test that preinstall/postinstall are run at the right points
297
+ # Make up a package with scripts that create files so we can check timestamps
298
+ # Also, test that tpkg will chdir to package unpack directory before
299
+ # calling pre/post/install/remove scripts
300
+ scriptfiles = {}
301
+ pkgfile = nil
302
+ Dir.mktmpdir('srcdir') do |srcdir|
303
+ # Include the stock test package contents
304
+ system("#{Tpkg::find_tar} -C #{TESTPKGDIR} --exclude .svn -cf - . | #{Tpkg::find_tar} -C #{srcdir} -xf -")
305
+
306
+ # Add some dummy file for testing relative path
307
+ File.open(File.join(srcdir, "dummyfile"), 'w') do |file|
308
+ file.puts("hello world")
309
+ end
310
+
311
+ # Then add scripts
312
+ ['preinstall', 'postinstall'].each do |script|
313
+ File.open(File.join(srcdir, script), 'w') do |scriptfile|
314
+ # We have each script write to a temporary file (so that we can
315
+ # check the timestamp of that file to ensure proper ordering) and
316
+ # print out the name of the file (just to aid debugging)
317
+ tmpfile = Tempfile.new('tpkgtest_script')
318
+ scriptfiles[script] = tmpfile
319
+ scriptfile.puts('#!/bin/sh')
320
+ scriptfile.puts('set -e')
321
+ # Test that tpkg set $TPKG_HOME before running the script
322
+ scriptfile.puts('test -n "$TPKG_HOME"')
323
+ # Test that we had chdir'ed to package unpack directory
324
+ scriptfile.puts('test -e dummyfile')
325
+ scriptfile.puts("echo #{script} > #{tmpfile.path}")
326
+ scriptfile.puts('sleep 1')
327
+ end
328
+ File.chmod(0755, File.join(srcdir, script))
329
+ end
330
+ # Change name of package so that the file doesn't conflict with @pkgfile
331
+ pkgfile = make_package(:output_directory => @tempoutdir, :source_directory => srcdir, :change => {'name' => 'scriptpkg'})
332
+ end
333
+ # Install the script package
334
+ Dir.mktmpdir('testroot') do |testroot|
335
+ testbase = File.join(testroot, 'home', 'tpkg')
336
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkgfile])
337
+ assert_nothing_raised { tpkg.unpack(pkgfile, :passphrase => PASSPHRASE) }
338
+ # FIXME: Need a way to test that the package install occurred between the two scripts
339
+ assert(File.stat(scriptfiles['preinstall'].path).mtime < File.stat(scriptfiles['postinstall'].path).mtime)
340
+ end
341
+ FileUtils.rm_f(pkgfile)
342
+
343
+ # Test init script handling
344
+ pkg = nil
345
+ pkg2 = nil
346
+ pkg3 = nil
347
+ Dir.mktmpdir('srcdir') do |srcdir|
348
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
349
+ FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
350
+ # These packages have different init scripts of the same name
351
+ (1..3).each do | i |
352
+ FileUtils.mkdir(File.join(srcdir, 'reloc', i.to_s))
353
+ File.open(File.join(srcdir, 'reloc', i.to_s, "myinit"), 'w') do |file|
354
+ file.puts('init script')
355
+ end
356
+ end
357
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'initpkg' }, :source_directory => srcdir, :files => { File.join('1','myinit') => { 'init' => {} } }, :remove => ['operatingsystem', 'architecture'])
358
+ pkg2 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'initpkg2' }, :source_directory => srcdir, :files => { File.join('2','myinit') => { 'init' => {} } }, :remove => ['operatingsystem', 'architecture'])
359
+ pkg3 = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'initpkg3' }, :source_directory => srcdir, :files => { File.join('3','myinit') => { 'init' => {} } }, :remove => ['operatingsystem', 'architecture'])
360
+ end
361
+ Dir.mktmpdir('testroot') do |testroot|
362
+ testbase = File.join(testroot, 'home', 'tpkg')
363
+ FileUtils.mkdir_p(testbase)
364
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg,pkg2,pkg3])
365
+ metadata = Tpkg::metadata_from_package(pkg)
366
+ metadata2 = Tpkg::metadata_from_package(pkg2)
367
+ metadata3 = Tpkg::metadata_from_package(pkg3)
368
+ tpkg.install([pkg], PASSPHRASE)
369
+ tpkg.init_links(metadata).each do |link, init_script|
370
+ assert(File.symlink?(link))
371
+ assert_equal(init_script, File.readlink(link))
372
+ end
373
+ # Test the handling of packages with conflicting init scripts.
374
+ # We should end up with a link named with a '1' at the end and a
375
+ # link named with a '2' at the end.
376
+ tpkg.install([pkg2], PASSPHRASE)
377
+ tpkg.install([pkg3], PASSPHRASE)
378
+ tpkg.init_links(metadata2).each do |link, init_script|
379
+ assert(File.symlink?(link + '1'))
380
+ assert_equal(init_script, File.readlink(link + '1'))
381
+ end
382
+ tpkg.init_links(metadata3).each do |link, init_script|
383
+ assert(File.symlink?(link + '2'))
384
+ assert_equal(init_script, File.readlink(link + '2'))
385
+ end
386
+ end
387
+ FileUtils.rm_f(pkg)
388
+ FileUtils.rm_f(pkg2)
389
+ FileUtils.rm_f(pkg3)
390
+
391
+ # Test external handling
392
+ extname = 'testext'
393
+ extdata = "This is a test of an external hook\nwith multiple lines\nof data"
394
+ pkg = nil
395
+ Dir.mktmpdir('srcdir') do |srcdir|
396
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
397
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'externalpkg' }, :externals => { extname => { 'data' => extdata } }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
398
+ end
399
+ Dir.mktmpdir('testroot') do |testroot|
400
+ testbase = File.join(testroot, 'home', 'tpkg')
401
+ FileUtils.mkdir_p(testbase)
402
+ # Make an external script which writes the data it receives to a temporary
403
+ # file, so that we can verify the external script received the data
404
+ # properly.
405
+ exttmpfile = Tempfile.new('tpkgtest_external')
406
+ externalsdir = File.join(testroot, 'usr', 'lib', 'tpkg', 'externals')
407
+ FileUtils.mkdir_p(externalsdir)
408
+ extscript = File.join(externalsdir, extname)
409
+ File.open(extscript, 'w') do |file|
410
+ file.puts('#!/bin/sh')
411
+ file.puts("cat >> #{exttmpfile.path}")
412
+ end
413
+ File.chmod(0755, extscript)
414
+ # And run the test
415
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
416
+ metadata = Tpkg::metadata_from_package(pkg)
417
+ assert_nothing_raised { tpkg.unpack(pkg, :passphrase => PASSPHRASE) }
418
+ assert_equal(extdata, IO.read(exttmpfile.path))
419
+ end
420
+ FileUtils.rm_f(pkg)
421
+
422
+ # Test handling of external with datafile
423
+ extname = 'testext'
424
+ extdata = "This is a test of an external hook\nwith multiple lines\nof data from a datafile"
425
+ pkg = nil
426
+ Dir.mktmpdir('srcdir') do |srcdir|
427
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
428
+ # Create the datafile
429
+ File.open(File.join(srcdir, 'datafile'), 'w') do |file|
430
+ file.print(extdata)
431
+ end
432
+ File.chmod(0755, File.join(srcdir, 'datafile'))
433
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'externalpkg' }, :externals => { extname => { 'datafile' => './datafile' } }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
434
+ end
435
+ Dir.mktmpdir('testroot') do |testroot|
436
+ testbase = File.join(testroot, 'home', 'tpkg')
437
+ FileUtils.mkdir_p(testbase)
438
+ # Make an external script which writes the data it receives to a temporary
439
+ # file, so that we can verify the external script received the data
440
+ # properly.
441
+ exttmpfile = Tempfile.new('tpkgtest_external')
442
+ externalsdir = File.join(testroot, 'usr', 'lib', 'tpkg', 'externals')
443
+ FileUtils.mkdir_p(externalsdir)
444
+ extscript = File.join(externalsdir, extname)
445
+ File.open(extscript, 'w') do |file|
446
+ file.puts('#!/bin/sh')
447
+ file.puts("cat > #{exttmpfile.path}")
448
+ end
449
+ File.chmod(0755, extscript)
450
+ # And run the test
451
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
452
+ metadata = Tpkg::metadata_from_package(pkg)
453
+ assert_nothing_raised { tpkg.unpack(pkg, :passphrase => PASSPHRASE) }
454
+ assert_equal(extdata, IO.read(exttmpfile.path))
455
+ end
456
+ FileUtils.rm_f(pkg)
457
+
458
+ # Test handling of external with datascript
459
+ extname = 'testext'
460
+ extdata = "This is a test of an external hook\nwith multiple lines\nof data from a datascript"
461
+ pkg = nil
462
+ Dir.mktmpdir('srcdir') do |srcdir|
463
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
464
+ # Create the datascript
465
+ File.open(File.join(srcdir, 'datascript'), 'w') do |file|
466
+ file.puts('#!/bin/sh')
467
+ # echo may or may not add a trailing \n depending on which echo we end
468
+ # up, so use printf, which doesn't add things.
469
+ file.puts("printf \"#{extdata}\"")
470
+ end
471
+ File.chmod(0755, File.join(srcdir, 'datascript'))
472
+ pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'externalpkg' }, :externals => { extname => { 'datascript' => './datascript' } }, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
473
+ end
474
+ Dir.mktmpdir('testroot') do |testroot|
475
+ testbase = File.join(testroot, 'home', 'tpkg')
476
+ FileUtils.mkdir_p(testbase)
477
+ # Make an external script which writes the data it receives to a temporary
478
+ # file, so that we can verify the external script received the data
479
+ # properly.
480
+ exttmpfile = Tempfile.new('tpkgtest_external')
481
+ externalsdir = File.join(testroot, 'usr', 'lib', 'tpkg', 'externals')
482
+ FileUtils.mkdir_p(externalsdir)
483
+ extscript = File.join(externalsdir, extname)
484
+ File.open(extscript, 'w') do |file|
485
+ file.puts('#!/bin/sh')
486
+ file.puts("cat > #{exttmpfile.path}")
487
+ end
488
+ File.chmod(0755, extscript)
489
+ # And run the test
490
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
491
+ metadata = Tpkg::metadata_from_package(pkg)
492
+ assert_nothing_raised { tpkg.unpack(pkg, :passphrase => PASSPHRASE) }
493
+ assert_equal(extdata, IO.read(exttmpfile.path))
494
+ end
495
+ FileUtils.rm_f(pkg)
496
+
497
+ # Test that existing files/directories' perm and ownership are preserved
498
+ # unless specified by user
499
+ Dir.mktmpdir('testroot') do |testroot|
500
+ FileUtils.mkdir_p(File.join(testroot, 'home', 'tpkg'))
501
+ FileUtils.mkdir_p(File.join(testroot, 'etc'))
502
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
503
+
504
+ # set up 2 existing files for the test
505
+ File.open(File.join(testroot, 'home', 'tpkg', 'file'), 'w') do |file|
506
+ file.puts "Hello"
507
+ end
508
+ #system("chmod 707 #{File.join(testroot, 'home', 'tpkg', 'file')}")
509
+ File.chmod(0707, File.join(testroot, 'home', 'tpkg', 'file'))
510
+
511
+ File.open(File.join(testroot, 'etc', 'rootfile'), 'w') do |file|
512
+ file.puts "Hello"
513
+ end
514
+ File.chmod(0707, File.join(testroot, 'etc', 'rootfile'))
515
+ # system("chmod 707 #{File.join(testroot, 'etc', 'rootfile')}")
516
+
517
+ assert_nothing_raised { tpkg.unpack(@pkgfile, :passphrase => PASSPHRASE) }
518
+
519
+ # This file should have the default 0444 perms
520
+ # but the file already exists. So it should keep its old perms, which is 707
521
+ assert(File.exist?(File.join(testroot, 'home', 'tpkg', 'file')))
522
+ assert_equal(0707, File.stat(File.join(testroot, 'home', 'tpkg', 'file')).mode & 07777)
523
+
524
+ # Even if this file exists, we specifically set the perm. So the perm should be set to what
525
+ # we want
526
+ assert(File.exist?(File.join(testroot, 'etc', 'rootfile')))
527
+ assert_equal(0666, File.stat(File.join(testroot, 'etc', 'rootfile')).mode & 07777)
528
+ end
529
+ end
530
+
531
+ # Test that the unpack method calls install_crontabs as appropriate
532
+ def test_unpack_install_crontabs
533
+ # FIXME
534
+ end
535
+
536
+ # Check that if a config file already existed in the system, then we don't
537
+ # overwrite it. Instead we save the new one with a .tpkgnew extension.
538
+ def test_config_files_handling
539
+ pkgfile = nil
540
+ Dir.mktmpdir('srcdir') do |srcdir|
541
+ # The stock test package has a reloc directory we can use
542
+ system("#{Tpkg::find_tar} -C #{TESTPKGDIR} --exclude .svn -cf - . | #{Tpkg::find_tar} -C #{srcdir} -xf -")
543
+ # Then add some configuration files
544
+ FileUtils.mkdir_p(File.join(srcdir, 'root'))
545
+ ['conf1', 'conf2'].each do |conf|
546
+ File.open(File.join(srcdir, 'root', conf), 'w') do |file|
547
+ file.puts conf
548
+ end
549
+ end
550
+ pkgfile = make_package(:output_directory => @tempoutdir, :source_directory => srcdir,
551
+ :files => {'/conf1' => {'config' => true}, '/conf2' => {'config' => true}})
552
+ end
553
+
554
+ Dir.mktmpdir('testroot') do |testroot|
555
+ # Create an existing configuration file
556
+ File.open(File.join(testroot, 'conf1'), 'w') do |file|
557
+ file.puts "Existing conf file"
558
+ end
559
+
560
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
561
+ assert_nothing_raised { tpkg.unpack(pkgfile, :passphrase => PASSPHRASE) }
562
+ assert(File.exists?(File.join(testroot, 'conf1.tpkgnew')))
563
+ assert(!File.exists?(File.join(testroot, 'conf2.tpkgnew')))
564
+ end
565
+ end
566
+
567
+ def test_install_init_scripts
568
+ metadata = nil
569
+ Dir.mktmpdir('srcdir') do |srcdir|
570
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
571
+ create_metadata_file(File.join(srcdir, 'tpkg.xml'), :change => { 'name' => 'initpkg' }, :files => { 'etc/init.d/initscript' => { 'init' => {} } })
572
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
573
+ end
574
+
575
+ Dir.mktmpdir('testroot') do |testroot|
576
+ testbase = File.join(testroot, 'home', 'tpkg')
577
+ FileUtils.mkdir_p(testbase)
578
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'))
579
+
580
+ link = nil
581
+ init_script = nil
582
+ tpkg.init_links(metadata).each do |l, is|
583
+ link = l
584
+ init_script = is
585
+ end
586
+
587
+ # init_links returns an empty list on platforms where tpkg doesn't have
588
+ # init script support
589
+ if link
590
+ # Directory for link doesn't exist, directory and link are created
591
+ tpkg.install_init_scripts(metadata)
592
+ assert(File.symlink?(link))
593
+ assert_equal(init_script, File.readlink(link))
594
+
595
+ # Link already exists, nothing is done
596
+ sleep 2
597
+ beforetime = File.lstat(link).mtime
598
+ tpkg.install_init_scripts(metadata)
599
+ assert(File.symlink?(link))
600
+ assert_equal(init_script, File.readlink(link))
601
+ assert_equal(beforetime, File.lstat(link).mtime)
602
+
603
+ # Existing files or links up to 8 already exist, link created with appropriate suffix
604
+ File.delete(link)
605
+ File.symlink('somethingelse', link)
606
+ 0.upto(8) do |i|
607
+ File.delete(link + i.to_s) if (i != 0)
608
+ File.symlink('somethingelse', link + i.to_s)
609
+ tpkg.install_init_scripts(metadata)
610
+ assert(File.symlink?(link + (i + 1).to_s))
611
+ assert_equal(init_script, File.readlink(link + (i + 1).to_s))
612
+ end
613
+
614
+ # Existing files or links up to 9 already exist, exception raised
615
+ File.delete(link + '9')
616
+ File.symlink('somethingelse', link + '9')
617
+ assert_raise(RuntimeError) { tpkg.install_init_scripts(metadata) }
618
+
619
+ # Running as non-root, permissions issues prevent link creation, warning
620
+ FileUtils.rm(Dir.glob(link + '*'))
621
+ File.chmod(0000, File.dirname(link))
622
+ # assert_nothing_raised { tpkg.install_init_scripts(metadata) }
623
+ tpkg.install_init_scripts(metadata)
624
+ # FIXME: look for warning in stderr
625
+ assert(!File.exist?(link) && !File.symlink?(link))
626
+ File.chmod(0755, File.dirname(link))
627
+
628
+ # Running as root, permissions issues prevent link creation, exception raised
629
+ # FIXME: I don't actually know of a way to trigger EACCES in this
630
+ # situation when running as root, and we never run the unit tests as
631
+ # root anyway.
632
+ end
633
+ end
634
+ end
635
+ def test_install_init_script
636
+ # FIXME
637
+ end
638
+
639
+ def test_run_preinstall
640
+ Dir.mktmpdir('testroot') do |testroot|
641
+ testbase = File.join(testroot, 'home', 'tpkg')
642
+ FileUtils.mkdir_p(testbase)
643
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'))
644
+
645
+ Dir.mktmpdir('test_run_preinstall') do |workdir|
646
+ FileUtils.mkdir(File.join(workdir, 'tpkg'))
647
+
648
+ # workdir/preinstall doesn't exist, nothing done
649
+ assert_nothing_raised { tpkg.run_preinstall('mypkg.tpkg', workdir) }
650
+
651
+ # Now test when preinstall does exist
652
+ outputfile = Tempfile.new('test_run_preinstall')
653
+ File.open(File.join(workdir, 'tpkg', 'preinstall'), 'w') do |file|
654
+ file.puts '#!/bin/sh'
655
+ file.puts "echo preinstall >> #{outputfile.path}"
656
+ file.puts "cat otherfile >> #{outputfile.path}"
657
+ end
658
+ File.chmod(0755, File.join(workdir, 'tpkg', 'preinstall'))
659
+ File.open(File.join(workdir, 'tpkg', 'otherfile'), 'w') do |file|
660
+ file.puts 'otherfile contents'
661
+ end
662
+ pwd = Dir.pwd
663
+ r = tpkg.run_preinstall('mypkg.tpkg', workdir)
664
+ # Verify that the script was run and the working directory was changed
665
+ # such that the script's relative path to otherfile was valid.
666
+ assert_match(/preinstall/, File.read(outputfile.path))
667
+ assert_match(/otherfile contents/, File.read(outputfile.path))
668
+ # Verify that our pwd was restored
669
+ assert_equal(pwd, Dir.pwd)
670
+
671
+ # Ensure that the user is warned of a non-executable script
672
+ File.chmod(0644, File.join(workdir, 'tpkg', 'preinstall'))
673
+ assert_raise(RuntimeError) { tpkg.run_preinstall('mypkg.tpkg', workdir) }
674
+ # FIXME: need to capture stderr to confirm that a warning was displayed
675
+
676
+ # Verify that by default run_preinstall raises an exception if the script
677
+ # did not run succesfully
678
+ File.open(File.join(workdir, 'tpkg', 'preinstall'), 'w') do |file|
679
+ file.puts '#!/bin/sh'
680
+ file.puts "exit 1"
681
+ end
682
+ File.chmod(0755, File.join(workdir, 'tpkg', 'preinstall'))
683
+ assert_raise(RuntimeError) { tpkg.run_preinstall('mypkg.tpkg', workdir) }
684
+ # And verify that our pwd was restored
685
+ assert_equal(pwd, Dir.pwd)
686
+
687
+ # Verify that run_preinstall only displays a warning if the script
688
+ # did not run succesfully and the user specified the force option.
689
+ tpkgforce = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :force => true)
690
+ assert_nothing_raised { tpkg.run_postinstall('mypkg.tpkg', workdir) }
691
+ # FIXME: need to capture stderr to confirm that a warning was displayed
692
+ # And verify that our pwd was restored
693
+ assert_equal(pwd, Dir.pwd)
694
+ end
695
+ end
696
+ end
697
+
698
+ def test_run_postinstall
699
+ Dir.mktmpdir('testroot') do |testroot|
700
+ testbase = File.join(testroot, 'home', 'tpkg')
701
+ FileUtils.mkdir_p(testbase)
702
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'))
703
+
704
+ Dir.mktmpdir('test_run_postinstall') do |workdir|
705
+ FileUtils.mkdir(File.join(workdir, 'tpkg'))
706
+
707
+ # workdir/postinstall doesn't exist, nothing done
708
+ assert_nothing_raised { tpkg.run_postinstall('mypkg.tpkg', workdir) }
709
+
710
+ # Now test when postinstall does exist
711
+ outputfile = Tempfile.new('test_run_postinstall')
712
+ File.open(File.join(workdir, 'tpkg', 'postinstall'), 'w') do |file|
713
+ file.puts '#!/bin/sh'
714
+ file.puts "echo postinstall >> #{outputfile.path}"
715
+ file.puts "cat otherfile >> #{outputfile.path}"
716
+ end
717
+ File.chmod(0755, File.join(workdir, 'tpkg', 'postinstall'))
718
+ File.open(File.join(workdir, 'tpkg', 'otherfile'), 'w') do |file|
719
+ file.puts 'otherfile contents'
720
+ end
721
+ pwd = Dir.pwd
722
+ r = tpkg.run_postinstall('mypkg.tpkg', workdir)
723
+ # Verify that the script was run and the working directory was changed
724
+ # such that the script's relative path to otherfile was valid.
725
+ assert_match(/postinstall/, File.read(outputfile.path))
726
+ assert_match(/otherfile contents/, File.read(outputfile.path))
727
+ # Verify that run_postinstall returns 0 if the script ran succesfully
728
+ assert_equal(0, r)
729
+ # Verify that our pwd was restored
730
+ assert_equal(pwd, Dir.pwd)
731
+
732
+ # Ensure that the user is warned of a non-executable script
733
+ File.chmod(0644, File.join(workdir, 'tpkg', 'postinstall'))
734
+ tpkg.run_postinstall('mypkg.tpkg', workdir)
735
+ # FIXME: need to capture stderr to confirm that a warning was displayed
736
+
737
+ # Verify that run_postinstall returns Tpkg::POSTINSTALL_ERR if the script
738
+ # did not run succesfully
739
+ File.open(File.join(workdir, 'tpkg', 'postinstall'), 'w') do |file|
740
+ file.puts '#!/bin/sh'
741
+ file.puts "exit 1"
742
+ end
743
+ File.chmod(0755, File.join(workdir, 'tpkg', 'postinstall'))
744
+ r = tpkg.run_postinstall('mypkg.tpkg', workdir)
745
+ assert_equal(Tpkg::POSTINSTALL_ERR, r)
746
+ # And verify that our pwd was restored
747
+ assert_equal(pwd, Dir.pwd)
748
+ end
749
+ end
750
+ end
751
+
752
+ def test_run_externals_for_install
753
+ Dir.mktmpdir('testroot') do |testroot|
754
+ testbase = File.join(testroot, 'home', 'tpkg')
755
+ FileUtils.mkdir_p(testbase)
756
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'))
757
+ tpkg_force = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :force => true)
758
+
759
+ Dir.mktmpdir('run_externals_for_install') do |workdir|
760
+ FileUtils.mkdir(File.join(workdir, 'tpkg'))
761
+
762
+ pwd = Dir.pwd
763
+
764
+ # No metadata[:externals], no problem
765
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(workdir, 'tpkg', 'tpkg.xml'))
766
+ create_metadata_file(File.join(workdir, 'tpkg', 'tpkg.xml'), :change => { 'name' => 'run_externals_for_install' })
767
+ metadata = Metadata.new(File.read(File.join(workdir, 'tpkg', 'tpkg.xml')), 'xml')
768
+ # value is nil
769
+ metadata[:externals] = nil
770
+ assert_nothing_raised { tpkg.run_externals_for_install(metadata, workdir) }
771
+ assert_equal(pwd, Dir.pwd)
772
+ # value is empty array
773
+ metadata[:externals] = []
774
+ assert_nothing_raised { tpkg.run_externals_for_install(metadata, workdir) }
775
+ assert_equal(pwd, Dir.pwd)
776
+
777
+ # Make up a package metadata with a mix of externals with inline data, a
778
+ # datafile, and a datascript
779
+ output = {}
780
+ # Inline data
781
+ inlineextname = 'inlineextname'
782
+ inlinedata = "This is a test of an external hook\nwith multiple lines\nof data"
783
+ output[inlineextname] = {}
784
+ output[inlineextname][:data] = inlinedata
785
+ # datafile
786
+ fileextname = 'fileextname'
787
+ filedata = "This is a test of an external hook\nwith multiple lines\nof data from a datafile"
788
+ File.open(File.join(workdir, 'tpkg', 'datafile'), 'w') do |file|
789
+ file.print(filedata)
790
+ end
791
+ output[fileextname] = {}
792
+ output[fileextname][:data] = filedata
793
+ # datascript
794
+ scriptextname = 'scriptextname'
795
+ scriptdata = "This is a test of an external hook\nwith multiple lines\nof data from a datascript"
796
+ File.open(File.join(workdir, 'tpkg', 'datascript'), 'w') do |file|
797
+ file.puts('#!/bin/sh')
798
+ # echo may or may not add a trailing \n depending on which echo we end
799
+ # up, so use printf, which doesn't add things.
800
+ file.puts("printf \"#{scriptdata}\"")
801
+ end
802
+ File.chmod(0755, File.join(workdir, 'tpkg', 'datascript'))
803
+ output[scriptextname] = {}
804
+ output[scriptextname][:data] = scriptdata
805
+
806
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(workdir, 'tpkg', 'tpkg.xml'))
807
+ create_metadata_file(File.join(workdir, 'tpkg', 'tpkg.xml'),
808
+ :change => { 'name' => 'run_externals_for_install' },
809
+ :externals => { inlineextname => { 'data' => inlinedata },
810
+ fileextname => { 'datafile' => 'datafile' },
811
+ scriptextname => { 'datascript' => './datascript' } })
812
+ metadata = Metadata.new(File.read(File.join(workdir, 'tpkg', 'tpkg.xml')), 'xml')
813
+ metadata[:filename] = 'test_run_externals_for_install'
814
+
815
+ # We need a copy of these later
816
+ original_externals = metadata[:externals].collect {|e| e.dup}
817
+
818
+ # Make external scripts which write the data they receive to temporary
819
+ # files so that we can verify that run_externals_for_install called
820
+ # run_external with the proper parameters.
821
+ externalsdir = File.join(testroot, 'usr', 'lib', 'tpkg', 'externals')
822
+ FileUtils.mkdir_p(externalsdir)
823
+ [inlineextname, fileextname, scriptextname].each do |extname|
824
+ exttmpfile = Tempfile.new('tpkgtest_external')
825
+ extscript = File.join(externalsdir, extname)
826
+ File.open(extscript, 'w') do |file|
827
+ file.puts('#!/bin/sh')
828
+ file.puts("cat >> #{exttmpfile.path}")
829
+ end
830
+ File.chmod(0755, extscript)
831
+ output[extname][:file] = exttmpfile
832
+ end
833
+
834
+ # Make sure the hash keys we expect are in metadata, so that when we check
835
+ # later that they are gone we know run_externals_for_install removed them.
836
+ fileext = metadata[:externals].find {|e| e[:name] == fileextname}
837
+ assert(fileext.has_key?(:datafile))
838
+ assert(!fileext.has_key?(:data))
839
+ scriptext = metadata[:externals].find {|e| e[:name] == scriptextname}
840
+ assert(scriptext.has_key?(:datascript))
841
+ assert(!scriptext.has_key?(:data))
842
+
843
+ tpkg.run_externals_for_install(metadata, workdir)
844
+
845
+ assert_equal(pwd, Dir.pwd)
846
+ output.each do |extname, extinfo|
847
+ assert_equal(extinfo[:data], File.read(extinfo[:file].path))
848
+ end
849
+
850
+ # Make sure run_externals_for_install performed the expected switcheroo on
851
+ # these hash entries
852
+ fileext = metadata[:externals].find {|e| e[:name] == fileextname}
853
+ assert(!fileext.has_key?(:datafile))
854
+ assert(fileext.has_key?(:data))
855
+ fileext = metadata[:externals].find {|e| e[:name] == scriptextname}
856
+ assert(!scriptext.has_key?(:datascript))
857
+ assert(scriptext.has_key?(:data))
858
+
859
+ # Cleanup for another run
860
+ output.each do |extname, extinfo|
861
+ File.delete(extinfo[:file].path)
862
+ end
863
+
864
+ # externals_to_skip skipped
865
+ tpkg.run_externals_for_install(metadata, workdir, [scriptext])
866
+ assert_equal(pwd, Dir.pwd)
867
+ output.each do |extname, extinfo|
868
+ if extname != scriptextname
869
+ assert_equal(extinfo[:data], File.read(extinfo[:file].path))
870
+ else
871
+ assert(!File.exist?(extinfo[:file].path))
872
+ end
873
+ end
874
+
875
+ # Error reading datafile raises exception
876
+ FileUtils.mv(File.join(workdir, 'tpkg', 'datafile'), File.join(workdir, 'datafile'))
877
+ # Previous runs of run_externals_for_install using metadata will have
878
+ # resulted in the data for the datafile and datascript externals being
879
+ # read in and cached. Revert to a copy where that hasn't been done yet so
880
+ # this test is effective.
881
+ metadata[:externals] = original_externals
882
+ assert_raise(Errno::ENOENT) { tpkg.run_externals_for_install(metadata, workdir) }
883
+ assert_equal(pwd, Dir.pwd)
884
+ # Unless forced
885
+ assert_nothing_raised { tpkg_force.run_externals_for_install(metadata, workdir) }
886
+ # Put datafile back
887
+ FileUtils.mv(File.join(workdir, 'datafile'), File.join(workdir, 'tpkg', 'datafile'))
888
+
889
+ # Error running datascript raises exception
890
+ FileUtils.mv(File.join(workdir, 'tpkg', 'datascript'), File.join(workdir, 'datascript'))
891
+ # Same deal as last test, revert to unmodified copy
892
+ metadata[:externals] = original_externals
893
+ # RuntimeError in ruby 1.8 as popen doesn't fail, so the failure is
894
+ # caught by our exit status check
895
+ # Errno::ENOENT in ruby 1.9, raised by popen
896
+ assert_raise(RuntimeError, Errno::ENOENT) { tpkg.run_externals_for_install(metadata, workdir) }
897
+ assert_equal(pwd, Dir.pwd)
898
+ # Unless forced
899
+ assert_nothing_raised { tpkg_force.run_externals_for_install(metadata, workdir) }
900
+ # Put datascript back
901
+ FileUtils.mv(File.join(workdir, 'datascript'), File.join(workdir, 'tpkg', 'datascript'))
902
+
903
+ # Check non-executable datascript permissions case too
904
+ File.chmod(0644, File.join(workdir, 'tpkg', 'datascript'))
905
+ metadata[:externals] = original_externals
906
+ # RuntimeError in ruby 1.8 as popen doesn't fail, so the failure is
907
+ # caught by our exit status check
908
+ # Errno::EACCES in ruby 1.9, raised by popen
909
+ assert_raise(RuntimeError, Errno::EACCES) { tpkg.run_externals_for_install(metadata, workdir) }
910
+ assert_equal(pwd, Dir.pwd)
911
+ # Unless forced
912
+ assert_nothing_raised { tpkg_force.run_externals_for_install(metadata, workdir) }
913
+ # Restore permissions
914
+ File.chmod(0755, File.join(workdir, 'tpkg', 'datascript'))
915
+
916
+ # Datascript that exits with error raises exception
917
+ File.open(File.join(workdir, 'tpkg', 'datascript'), 'w') do |file|
918
+ file.puts('#!/bin/sh')
919
+ file.puts("exit 1")
920
+ end
921
+ File.chmod(0755, File.join(workdir, 'tpkg', 'datascript'))
922
+ # Same deal as last test, revert to unmodified copy
923
+ metadata[:externals] = original_externals
924
+ assert_raise(RuntimeError) { tpkg.run_externals_for_install(metadata, workdir) }
925
+ assert_equal(pwd, Dir.pwd)
926
+ # Unless forced
927
+ assert_nothing_raised { tpkg_force.run_externals_for_install(metadata, workdir) }
928
+ end
929
+ end
930
+ end
931
+
932
+ # This method only tests that we can save pkg metadata and pkg file metadata. The rest of the
933
+ # unit tests for file metadata are in test_filemetadata.rb
934
+ def test_save_package_metadata
935
+ metadata = nil
936
+ Dir.mktmpdir('srcdir') do |srcdir|
937
+ FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
938
+ create_metadata_file(File.join(srcdir, 'tpkg.xml'), :change => { 'name' => 'save_pkg_metadata' })
939
+ metadata = Metadata.new(File.read(File.join(srcdir, 'tpkg.xml')), 'xml')
940
+ end
941
+
942
+ Dir.mktmpdir('testroot') do |testroot|
943
+ package_file = '/tmp/save_pkg_metadata-1.0-1.tpkg'
944
+ tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'))
945
+
946
+ Dir.mktmpdir('workdir') do |workdir|
947
+ FileUtils.cp_r(File.join(TESTPKGDIR, 'reloc'), workdir)
948
+
949
+ # FIXME: add in some test data for these hashes
950
+ # generate files_info
951
+ files_info = {}
952
+ # generate checksums_of_decrypted_files
953
+ checksums_of_decrypted_files = {}
954
+
955
+ FileUtils.mkdir_p(File.join(workdir, 'tpkg'))
956
+ File.open(File.join(File.join(workdir, 'tpkg', 'file_metadata.bin')), 'w') do |f|
957
+ filemetadata = Tpkg::get_filemetadata_from_directory(workdir)
958
+ data = filemetadata.to_hash.recursively{|h| h.stringify_keys }
959
+ Marshal::dump(data, f)
960
+ end
961
+
962
+ tpkg.save_package_metadata(package_file, workdir, metadata, files_info, checksums_of_decrypted_files)
963
+
964
+ # verify metadata and file_metadata are actually there
965
+ assert(File.exists?(File.join(tpkg.instance_variable_get(:@metadata_directory), 'save_pkg_metadata-1.0-1', 'tpkg.yml')))
966
+ assert(File.exists?(File.join(tpkg.instance_variable_get(:@metadata_directory), 'save_pkg_metadata-1.0-1', 'file_metadata.bin')))
967
+ end
968
+ end
969
+ end
970
+
971
+ def teardown
972
+ Facter.unstub(:[])
973
+ FileUtils.rm_f(@pkgfile)
974
+ FileUtils.rm_rf(@tempoutdir)
975
+ end
976
+ end
977
+