tpkg 2.3.3 → 2.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/Portfile +39 -0
- data/Portfile.template +39 -0
- data/README.md +43 -0
- data/Rakefile +468 -18
- data/bin/gem2tpkg +2 -2
- data/bin/tpkg +18 -13
- data/bin/tpkg_uploader +132 -0
- data/ca.pem +1 -0
- data/control +7 -0
- data/depend +3 -0
- data/externals-etch/authorized_keys +40 -0
- data/externals-etch/group +9 -0
- data/externals-etch/iptables +38 -0
- data/externals-etch/limits +30 -0
- data/externals-etch/nfs +30 -0
- data/externals-etch/sudo +30 -0
- data/externals-etch/supplemental_groups +8 -0
- data/externals-etch/sysctl +30 -0
- data/externals-etch/user +41 -0
- data/externals/group +39 -0
- data/externals/supplemental_groups +48 -0
- data/externals/user +39 -0
- data/lib/tpkg.rb +260 -991
- data/lib/tpkg/os.rb +164 -0
- data/lib/tpkg/os/debian.rb +159 -0
- data/lib/tpkg/os/freebsd.rb +113 -0
- data/lib/tpkg/os/macosx.rb +113 -0
- data/lib/tpkg/os/redhat.rb +173 -0
- data/lib/tpkg/os/solaris.rb +101 -0
- data/lib/tpkg/os/windows.rb +26 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify.rb +67 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/errors.rb +127 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/kwalify.schema.yaml +58 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/main.rb +442 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/messages.rb +173 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/meta-validator.rb +275 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/base.rb +127 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/parser/yaml.rb +841 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/rule.rb +559 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-java.eruby +222 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-php.eruby +104 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/templates/genclass-ruby.eruby +113 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/types.rb +156 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util.rb +158 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/assert-text-equal.rb +46 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hash-interface.rb +18 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/hashlike.rb +51 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/option-parser.rb +220 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/ordered-hash.rb +57 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/util/testcase-helper.rb +112 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/validator.rb +282 -0
- data/lib/tpkg/thirdparty/kwalify-0.7.2/lib/kwalify/yaml-parser.rb +870 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh.rb +219 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/agent.rb +179 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/key_manager.rb +219 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/pageant.rb +183 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/authentication/session.rb +134 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffer.rb +340 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/buffered_io.rb +198 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/config.rb +205 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/channel.rb +630 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/constants.rb +33 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/session.rb +597 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/connection/term.rb +178 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/errors.rb +85 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/key_factory.rb +102 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/loggable.rb +61 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/packet.rb +102 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/prompt.rb +93 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/command.rb +75 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/errors.rb +14 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/http.rb +94 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks4.rb +70 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/proxy/socks5.rb +142 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/ruby_compat.rb +43 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/service/forward.rb +288 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test.rb +89 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/channel.rb +129 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/kex.rb +44 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/packet.rb +81 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/script.rb +157 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/test/socket.rb +64 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/cipher_factory.rb +97 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/constants.rb +30 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/abstract.rb +79 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/identity_cipher.rb +55 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/openssl.rb +127 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/packet_stream.rb +235 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/server_version.rb +71 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/session.rb +276 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/transport/state.rb +206 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/tpkg/thirdparty/net-ssh-2.1.0/lib/net/ssh/version.rb +62 -0
- data/lib/tpkg/version.rb +3 -0
- data/man/man1/cpan2tpkg.1 +82 -0
- data/man/man1/gem2tpkg.1 +120 -0
- data/man/man1/tpkg.1 +411 -0
- data/pkginfo +8 -0
- data/postinstall.solaris +11 -0
- data/postremove.solaris +16 -0
- data/schema/schema-1.0.5.yml +0 -0
- data/schema/schema-1.0.6.yml +0 -0
- data/schema/schema-1.0.7.yml +0 -0
- data/schema/schema-1.0.8.yml +0 -0
- data/schema/schema-1.0.9.yml +0 -0
- data/schema/schema.yml +0 -0
- data/schema/tpkg-1.0.0.dtd +0 -0
- data/schema/tpkg-1.0.1.dtd +0 -0
- data/schema/tpkg-1.0.2.dtd +0 -0
- data/schema/tpkg-1.0.3.dtd +0 -0
- data/schema/tpkg-1.0.4.dtd +0 -0
- data/schema/tpkg-1.0.5.dtd +0 -0
- data/schema/tpkg-1.0.6.dtd +0 -0
- data/schema/tpkg-1.0.7.dtd +0 -0
- data/schema/tpkg-1.0.8.dtd +0 -0
- data/schema/tpkg-1.0.9.dtd +0 -0
- data/schema/tpkg.dtd +0 -0
- data/test/TODO +30 -0
- data/test/premadetestpkg/pkg_without_file_metadata-1.0-1.tpkg +0 -0
- data/test/test_checksum.rb +53 -0
- data/test/test_compress.rb +55 -0
- data/test/test_conflict.rb +41 -0
- data/test/test_crontabs.rb +398 -0
- data/test/test_dependency.rb +1113 -0
- data/test/test_downgrade.rb +80 -0
- data/test/test_download.rb +95 -0
- data/test/test_encrypt.rb +136 -0
- data/test/test_filemetadata.rb +131 -0
- data/test/test_initscript.rb +93 -0
- data/test/test_install.rb +186 -0
- data/test/test_lock.rb +82 -0
- data/test/test_make.rb +410 -0
- data/test/test_metadata.rb +805 -0
- data/test/test_misc.rb +379 -0
- data/test/test_options.rb +1711 -0
- data/test/test_os.rb +193 -0
- data/test/test_os_debian.rb +99 -0
- data/test/test_os_freebsd.rb +89 -0
- data/test/test_os_macosx.rb +79 -0
- data/test/test_os_redhat.rb +124 -0
- data/test/test_os_solaris.rb +85 -0
- data/test/test_os_windows.rb +26 -0
- data/test/test_query.rb +134 -0
- data/test/test_remove.rb +539 -0
- data/test/test_tar.rb +99 -0
- data/test/test_unpack.rb +977 -0
- data/test/test_upgrade.rb +398 -0
- data/test/test_version.rb +54 -0
- data/test/testcmds/crontab +14 -0
- data/test/testcmds/debian/apt-cache +145 -0
- data/test/testcmds/debian/dpkg-query +16 -0
- data/test/testcmds/freebsd/pkg_info +13 -0
- data/test/testcmds/macosx/port +35 -0
- data/test/testcmds/redhat/rpmbuild +6 -0
- data/test/testcmds/redhat/yum +90 -0
- data/test/testcmds/solaris/pkginfo +25 -0
- data/test/testcmds/solaris/pkgutil +36 -0
- data/test/testpkg/reloc/encfile +2 -0
- data/test/testpkg/reloc/file +2 -0
- data/test/testpkg/reloc/precryptfile +1 -0
- data/test/testpkg/reloc/precryptfile.plaintext +3 -0
- data/test/testpkg/tpkg-bad-ownergroup.xml +25 -0
- data/test/testpkg/tpkg-bad-ownergroup.yml +18 -0
- data/test/testpkg/tpkg-default-perms.xml +28 -0
- data/test/testpkg/tpkg-default-perms.yml +20 -0
- data/test/testpkg/tpkg-good-ownergroup.xml +25 -0
- data/test/testpkg/tpkg-good-ownergroup.yml +18 -0
- data/test/testpkg/tpkg-nativedeps.yml +13 -0
- data/test/testpkg/tpkg-nofiles.xml +14 -0
- data/test/testpkg/tpkg-nofiles.yml +9 -0
- data/test/testpkg/tpkg.xml +35 -0
- data/test/testpkg/tpkg.yml +25 -0
- data/test/tpkgtest.rb +300 -0
- data/tpkg.conf +16 -0
- data/tpkg.gemspec +24 -0
- data/tpkg.spec +28 -0
- data/tpkg.xml +17 -0
- data/tpkg_profile.sh +32 -0
- metadata +306 -31
@@ -0,0 +1,80 @@
|
|
1
|
+
#
|
2
|
+
# Test tpkg's ability to upgrade packages
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
6
|
+
|
7
|
+
class TpkgDowngradeTests < Test::Unit::TestCase
|
8
|
+
include TpkgTests
|
9
|
+
|
10
|
+
def setup
|
11
|
+
Tpkg::set_prompt(false)
|
12
|
+
|
13
|
+
@pkgfiles = []
|
14
|
+
Dir.mktmpdir('srcdir') do |srcdir|
|
15
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
|
16
|
+
FileUtils.mkdir(File.join(srcdir, 'reloc'))
|
17
|
+
|
18
|
+
# Creating packages that will be used for testing
|
19
|
+
|
20
|
+
# Package a-1 and a-2. No dependency.
|
21
|
+
@pkgfiles << make_package(:change => {'name' => 'a', 'version' => '1', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
22
|
+
@pkgfiles << make_package(:change => {'name' => 'a', 'version' => '2', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
23
|
+
|
24
|
+
# Package b-1 and b-2. b-1 depends on c-1
|
25
|
+
@pkgfiles << make_package(:change => {'name' => 'b', 'version' => '1', 'package_version' => '1'}, :dependencies => {'c' => {}}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
26
|
+
@pkgfiles << make_package(:change => {'name' => 'b', 'version' => '2', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
27
|
+
@pkgfiles << make_package(:change => {'name' => 'c', 'version' => '1', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
28
|
+
|
29
|
+
# Package d-1 and d-2. d-1 depends on nonexistingpkg
|
30
|
+
@pkgfiles << make_package(:change => {'name' => 'd', 'version' => '1', 'package_version' => '1'}, :dependencies => {'nonexistingpkg' => {}}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
31
|
+
@pkgfiles << make_package(:change => {'name' => 'd', 'version' => '2', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
32
|
+
|
33
|
+
# Package e-1, e-2 and f-1. f-1 depends on e-2
|
34
|
+
@pkgfiles << make_package(:change => {'name' => 'e', 'version' => '1', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
35
|
+
@pkgfiles << make_package(:change => {'name' => 'e', 'version' => '2', 'package_version' => '1'}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
36
|
+
@pkgfiles << make_package(:change => {'name' => 'f', 'version' => '1', 'package_version' => '1'}, :dependencies => {'e' => {'minimum_version' => '2.0', 'maximum_version' => '2.0'}}, :source_directory => srcdir, :remove => ['operatingsystem', 'architecture'])
|
37
|
+
end
|
38
|
+
|
39
|
+
@testroot = Dir.mktmpdir('testroot')
|
40
|
+
@testbase = File.join(@testroot, 'home', 'tpkg')
|
41
|
+
FileUtils.mkdir_p(@testbase)
|
42
|
+
@tpkg = Tpkg.new(:file_system_root => @testroot, :base => File.join('home', 'tpkg'), :sources => @pkgfiles)
|
43
|
+
@tpkg.install(['a', 'b', 'd', 'e', 'f'], PASSPHRASE)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_downgrade
|
47
|
+
|
48
|
+
# should be able to downgrade to a-1
|
49
|
+
assert_nothing_raised {@tpkg.upgrade(['a=1'], PASSPHRASE, {:downgrade => true})}
|
50
|
+
|
51
|
+
# should be able to downgrade to b-1,
|
52
|
+
assert_nothing_raised {@tpkg.upgrade(['b=1'], PASSPHRASE, {:downgrade => true})}
|
53
|
+
|
54
|
+
# should not be able to downgrade to d-1 since it depends on non-existing pkg
|
55
|
+
assert_raise(RuntimeError) {@tpkg.upgrade(['d=1'], PASSPHRASE, {:downgrade => true})}
|
56
|
+
|
57
|
+
# should not be able to downgrade to e-1 since f-1 depends on e-2
|
58
|
+
assert_raise(RuntimeError) {@tpkg.upgrade(['e=1'], PASSPHRASE, {:downgrade => true})}
|
59
|
+
|
60
|
+
# There should be 6 packages installed
|
61
|
+
metadata = @tpkg.metadata_for_installed_packages
|
62
|
+
assert_equal(6, metadata.size)
|
63
|
+
# a, b, c and f should be version 1
|
64
|
+
metadata.each do | m |
|
65
|
+
if ['a','b','c','f'].include?(m[:name])
|
66
|
+
assert_equal('1', m[:version])
|
67
|
+
elsif ['d', 'e'].include?(m[:name])
|
68
|
+
assert_equal('2', m[:version])
|
69
|
+
else
|
70
|
+
assert(false)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def teardown
|
76
|
+
@pkgfiles.each { |pkgfile| FileUtils.rm_f(pkgfile) }
|
77
|
+
FileUtils.rm_rf(@testroot)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#
|
2
|
+
# Test tpkg's ability to download packages
|
3
|
+
#
|
4
|
+
|
5
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
6
|
+
require 'webrick'
|
7
|
+
|
8
|
+
class TpkgDownloadTests < Test::Unit::TestCase
|
9
|
+
include TpkgTests
|
10
|
+
|
11
|
+
def setup
|
12
|
+
Tpkg::set_prompt(false)
|
13
|
+
|
14
|
+
# Make up our regular test package
|
15
|
+
@pkgfile = make_package
|
16
|
+
|
17
|
+
# Copy the package into a directory to test directory-related operations
|
18
|
+
@pkgdir = Dir.mktmpdir('pkgdir')
|
19
|
+
FileUtils.cp(@pkgfile, @pkgdir)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_download
|
23
|
+
Tpkg::extract_metadata(@pkgdir)
|
24
|
+
|
25
|
+
s = WEBrick::HTTPServer.new(:Port => 3500, :DocumentRoot => @pkgdir)
|
26
|
+
# There may be an easier way to push WEBrick into the background, but
|
27
|
+
# the WEBrick docs are mostly non-existent so I'm taking the quick and
|
28
|
+
# dirty route.
|
29
|
+
t = Thread.new { s.start }
|
30
|
+
|
31
|
+
Dir.mktmpdir('testbase') do |testbase|
|
32
|
+
source = 'http://localhost:3500/'
|
33
|
+
tpkg = Tpkg.new(:base => testbase, :sources => [source])
|
34
|
+
# Download and verify
|
35
|
+
assert_nothing_raised { tpkg.download(source, File.basename(@pkgfile)) }
|
36
|
+
localpath = File.join(tpkg.source_to_local_directory(source), File.basename(@pkgfile))
|
37
|
+
assert(File.exist?(localpath))
|
38
|
+
assert_equal(0644, File.stat(localpath).mode & 07777)
|
39
|
+
assert(Tpkg::verify_package_checksum(localpath))
|
40
|
+
|
41
|
+
# Mess with the package so that it doesn't verify, then confirm that
|
42
|
+
# calling download again re-downloads it
|
43
|
+
File.open(localpath, 'w') do |file|
|
44
|
+
file.puts "Bogus package now"
|
45
|
+
end
|
46
|
+
assert_raise(RuntimeError, NoMethodError) { Tpkg::verify_package_checksum(localpath) }
|
47
|
+
assert_nothing_raised { tpkg.download(source, File.basename(@pkgfile)) }
|
48
|
+
assert(File.exist?(localpath))
|
49
|
+
assert(Tpkg::verify_package_checksum(localpath))
|
50
|
+
end
|
51
|
+
|
52
|
+
s.shutdown
|
53
|
+
t.kill
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_download_pkgs
|
57
|
+
# set up multiple packages
|
58
|
+
['pkga', 'pkgb'].each do |name|
|
59
|
+
pkgfile = make_package(:change => {'name' => name}, :remove => ['operatingsystem', 'architecture'])
|
60
|
+
FileUtils.cp(pkgfile, @pkgdir)
|
61
|
+
end
|
62
|
+
|
63
|
+
Tpkg::extract_metadata(@pkgdir)
|
64
|
+
|
65
|
+
s = WEBrick::HTTPServer.new(:Port => 3500, :DocumentRoot => @pkgdir)
|
66
|
+
# There may be an easier way to push WEBrick into the background, but
|
67
|
+
# the WEBrick docs are mostly non-existent so I'm taking the quick and
|
68
|
+
# dirty route.
|
69
|
+
t = Thread.new { s.start }
|
70
|
+
|
71
|
+
Dir.mktmpdir('testbase') do |testbase|
|
72
|
+
Dir.mktmpdir('destdir') do |destdir|
|
73
|
+
source = 'http://localhost:3500/'
|
74
|
+
tpkg = Tpkg.new(:base => testbase, :sources => [source])
|
75
|
+
|
76
|
+
# Try to request a download of a non-existing package
|
77
|
+
result = tpkg.download_pkgs(['non-existing'], {:out => destdir})
|
78
|
+
assert_equal(Tpkg::GENERIC_ERR, result)
|
79
|
+
|
80
|
+
# Try to request a download of existing packages
|
81
|
+
result = tpkg.download_pkgs(['pkga', 'pkgb'], {:out => destdir})
|
82
|
+
assert_equal(0, result)
|
83
|
+
assert_equal(2, Dir.glob(File.join(destdir, '*')).size) # we have downloaded 2 packages
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
s.shutdown
|
88
|
+
t.kill
|
89
|
+
end
|
90
|
+
|
91
|
+
def teardown
|
92
|
+
FileUtils.rm_f(@pkgfile)
|
93
|
+
FileUtils.rm_rf(@pkgdir)
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
#
|
4
|
+
# Test tpkg's encrypt/decrypt methods
|
5
|
+
#
|
6
|
+
# The methods are supposed to be compatible with openssl's 'enc' utility,
|
7
|
+
# so we test them by encrypting some plaintext with openssl and then using
|
8
|
+
# the method to decrypt it or vice-versa.
|
9
|
+
#
|
10
|
+
|
11
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
12
|
+
|
13
|
+
class TpkgEncryptTests < Test::Unit::TestCase
|
14
|
+
include TpkgTests
|
15
|
+
|
16
|
+
def setup
|
17
|
+
Tpkg::set_prompt(false)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_encrypt
|
21
|
+
plaintext = 'This is the plaintext'
|
22
|
+
cipher = 'aes-256-cbc'
|
23
|
+
|
24
|
+
tmpfile = Tempfile.new('tpkgtest')
|
25
|
+
tmpfile.write(plaintext)
|
26
|
+
tmpfile.close
|
27
|
+
File.chmod(0604, tmpfile.path)
|
28
|
+
|
29
|
+
# Test encrypt
|
30
|
+
Tpkg::encrypt('tpkgtest', tmpfile.path, PASSPHRASE, cipher)
|
31
|
+
decrypted = `openssl enc -d -#{cipher} -pass pass:#{PASSPHRASE} -in #{tmpfile.path}`
|
32
|
+
assert_equal(plaintext, decrypted)
|
33
|
+
assert_equal(0604, File.stat(tmpfile.path).mode & 07777)
|
34
|
+
|
35
|
+
# Test using a callback to supply the passphrase
|
36
|
+
File.open(tmpfile.path, 'w') do |file|
|
37
|
+
file.write(plaintext)
|
38
|
+
end
|
39
|
+
callback = lambda { |pkgname| PASSPHRASE }
|
40
|
+
Tpkg::encrypt('tpkgtest', tmpfile.path, callback, cipher)
|
41
|
+
decrypted = `openssl enc -d -#{cipher} -pass pass:#{PASSPHRASE} -in #{tmpfile.path}`
|
42
|
+
assert_equal(plaintext, decrypted)
|
43
|
+
|
44
|
+
# Test encrypting on a directory
|
45
|
+
Dir.mktmpdir('testdir') do |testdir|
|
46
|
+
File.open(File.join(testdir, 'file1'), 'w') do |file|
|
47
|
+
file.write(plaintext)
|
48
|
+
end
|
49
|
+
File.open(File.join(testdir, 'file2'), 'w') do |file|
|
50
|
+
file.write(plaintext)
|
51
|
+
end
|
52
|
+
Tpkg::encrypt('tpkgtest', testdir, PASSPHRASE, cipher)
|
53
|
+
decrypted = `openssl enc -d -#{cipher} -pass pass:#{PASSPHRASE} -in #{File.join(testdir, 'file1')}`
|
54
|
+
assert_equal(plaintext, decrypted)
|
55
|
+
decrypted = `openssl enc -d -#{cipher} -pass pass:#{PASSPHRASE} -in #{File.join(testdir, 'file2')}`
|
56
|
+
assert_equal(plaintext, decrypted)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Test encrypting an empty file
|
60
|
+
File.open(tmpfile.path, 'w') do |file|
|
61
|
+
end
|
62
|
+
Tpkg::encrypt('tpkgtest', tmpfile.path, callback, cipher)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_decrypt
|
66
|
+
plaintext = 'This is the plaintext'
|
67
|
+
cipher = 'aes-256-cbc'
|
68
|
+
|
69
|
+
tmpfile = Tempfile.new('tpkgtest')
|
70
|
+
tmpfile.close
|
71
|
+
File.chmod(0604, tmpfile.path)
|
72
|
+
|
73
|
+
# Test decrypt
|
74
|
+
IO.popen(
|
75
|
+
"openssl enc -#{cipher} -salt -pass pass:#{PASSPHRASE} -out #{tmpfile.path}",
|
76
|
+
'w') do |pipe|
|
77
|
+
pipe.write(plaintext)
|
78
|
+
end
|
79
|
+
Tpkg::decrypt('tpkgtest', tmpfile.path, PASSPHRASE, cipher)
|
80
|
+
decrypted = IO.read(tmpfile.path)
|
81
|
+
assert_equal(plaintext, decrypted)
|
82
|
+
assert_equal(0604, File.stat(tmpfile.path).mode & 07777)
|
83
|
+
|
84
|
+
# Test using a callback to supply the passphrase
|
85
|
+
IO.popen(
|
86
|
+
"openssl enc -#{cipher} -salt -pass pass:#{PASSPHRASE} -out #{tmpfile.path}",
|
87
|
+
'w') do |pipe|
|
88
|
+
pipe.write(plaintext)
|
89
|
+
end
|
90
|
+
callback = lambda { |pkgname| PASSPHRASE }
|
91
|
+
Tpkg::decrypt('tpkgtest', tmpfile.path, callback, cipher)
|
92
|
+
decrypted = IO.read(tmpfile.path)
|
93
|
+
assert_equal(plaintext, decrypted)
|
94
|
+
|
95
|
+
# Test decrypting on a directory
|
96
|
+
Dir.mktmpdir('testdir') do |testdir|
|
97
|
+
IO.popen(
|
98
|
+
"openssl enc -#{cipher} -salt -pass pass:#{PASSPHRASE} -out #{File.join(testdir, 'file1')}",
|
99
|
+
'w') do |pipe|
|
100
|
+
pipe.write(plaintext)
|
101
|
+
end
|
102
|
+
Tpkg::decrypt('tpkgtest', testdir, PASSPHRASE, cipher)
|
103
|
+
decrypted = IO.read(File.join(testdir, 'file1'))
|
104
|
+
assert_equal(plaintext, decrypted)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Test decrypting an empty file
|
108
|
+
IO.popen(
|
109
|
+
"openssl enc -#{cipher} -salt -pass pass:#{PASSPHRASE} -out #{tmpfile.path}",
|
110
|
+
'w') do |pipe|
|
111
|
+
end
|
112
|
+
Tpkg::decrypt('tpkgtest', tmpfile.path, callback, cipher)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_verify_precrypt_file
|
116
|
+
plaintext = 'This is the plaintext'
|
117
|
+
cipher = 'aes-256-cbc'
|
118
|
+
|
119
|
+
tmpfile = Tempfile.new('tpkgtest')
|
120
|
+
tmpfile.close
|
121
|
+
|
122
|
+
IO.popen(
|
123
|
+
"openssl enc -#{cipher} -salt -pass pass:#{PASSPHRASE} -out #{tmpfile.path}",
|
124
|
+
'w') do |pipe|
|
125
|
+
pipe.write(plaintext)
|
126
|
+
end
|
127
|
+
|
128
|
+
assert(Tpkg::verify_precrypt_file(tmpfile.path))
|
129
|
+
|
130
|
+
File.open(tmpfile.path, 'w') do |file|
|
131
|
+
file.puts plaintext
|
132
|
+
end
|
133
|
+
|
134
|
+
assert_raise(RuntimeError) { Tpkg::verify_precrypt_file(tmpfile.path) }
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class TpkgFileMetadataTests < Test::Unit::TestCase
|
4
|
+
include TpkgTests
|
5
|
+
|
6
|
+
def setup
|
7
|
+
Tpkg::set_prompt(false)
|
8
|
+
|
9
|
+
# Make up our regular test package
|
10
|
+
@pkgfile = make_package(:remove => ['operatingsystem', 'architecture'], :files => {'file' => {'perms' => '0641'}})
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_file_metadata
|
14
|
+
Dir.mktmpdir('testroot') do |testroot|
|
15
|
+
testbase = File.join(testroot, 'home', 'tpkg')
|
16
|
+
FileUtils.mkdir_p(testbase)
|
17
|
+
tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
|
18
|
+
|
19
|
+
assert_nothing_raised { tpkg.install([@pkgfile], PASSPHRASE) }
|
20
|
+
|
21
|
+
# check that we can get read file_metadata for the newly installed package
|
22
|
+
assert_nothing_raised { @file_metadata = tpkg.file_metadata_for_installed_packages[File.basename(@pkgfile)]}
|
23
|
+
|
24
|
+
# checking content of file_metadata
|
25
|
+
assert_equal(@file_metadata[:package_file], File.basename(@pkgfile))
|
26
|
+
|
27
|
+
# check file's ownership and permissions are ok
|
28
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg']) }
|
29
|
+
puts @errors.inspect
|
30
|
+
@errors.each do | file, error |
|
31
|
+
assert(error.empty?)
|
32
|
+
end
|
33
|
+
|
34
|
+
# modify a file's perms and verify that tpkg can detect it
|
35
|
+
File.chmod(07777, File.join(testroot, 'home','tpkg','file'))
|
36
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
37
|
+
@errors.each do | file, error |
|
38
|
+
if File.basename(file) == "file"
|
39
|
+
assert(!error.empty?)
|
40
|
+
else
|
41
|
+
assert(error.empty?)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# modify a file content and verify that tpkg can detect it
|
46
|
+
File.open(File.join(testroot, 'home','tpkg','file'), 'w') do |file|
|
47
|
+
file.puts "Hello"
|
48
|
+
end
|
49
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
50
|
+
@errors.each do | file, error |
|
51
|
+
if File.basename(file) == "file"
|
52
|
+
assert(!error.empty?)
|
53
|
+
assert(error.length == 2) # error 1 is for bad perm, error 2 is for bad checksum
|
54
|
+
else
|
55
|
+
assert(error.empty?)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# remove a file and verify that tpkg can detect it
|
60
|
+
FileUtils.rm(File.join(testroot, 'home','tpkg','file'))
|
61
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
62
|
+
@errors.each do | file, error |
|
63
|
+
if File.basename(file) == "file"
|
64
|
+
assert(!error.empty?)
|
65
|
+
else
|
66
|
+
assert(error.empty?)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# TODO: modify a file owner, group and verify that tpkg can detect it
|
72
|
+
# Dir.mktmpdir('testroot') do |testroot|
|
73
|
+
# testbase = File.join(testroot, 'home', 'tpkg')
|
74
|
+
# FileUtils.mkdir_p(testbase)
|
75
|
+
# tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
|
76
|
+
# assert_nothing_raised { tpkg.install([@pkgfile], PASSPHRASE) }
|
77
|
+
# uid = Tpkg::lookup_uid("bogus")
|
78
|
+
# gid = Tpkg::lookup_gid("bogus")
|
79
|
+
# File.chown(uid, gid, File.join(testroot, 'home','tpkg','file'))
|
80
|
+
# assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
81
|
+
# @errors.each do | file, error |
|
82
|
+
# if File.basename(file) == "file"
|
83
|
+
# assert(!error.empty?)
|
84
|
+
# assert(error.length == 2) # 2 errors: 1 for gid and 1 for uid
|
85
|
+
# else
|
86
|
+
# assert(error.empty?)
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_backward_compatibility
|
93
|
+
# Test that tpkg doesn't break when user wants to verify old installed packages
|
94
|
+
# that were created without file_metadata.xml
|
95
|
+
Dir.mktmpdir('testroot') do |testroot|
|
96
|
+
testbase = File.join(testroot, 'home', 'tpkg')
|
97
|
+
FileUtils.mkdir_p(testbase)
|
98
|
+
tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [@pkgfile])
|
99
|
+
|
100
|
+
assert_nothing_raised { tpkg.install([@pkgfile], PASSPHRASE) }
|
101
|
+
|
102
|
+
# remove file_metadata
|
103
|
+
pkgname = File.basename(@pkgfile, File.extname(@pkgfile))
|
104
|
+
FileUtils.rm(File.join(testroot, 'home','tpkg', 'var', 'tpkg', 'installed', 'metadata', pkgname, 'file_metadata.bin'))
|
105
|
+
|
106
|
+
# verify nothing bad when user try to run -V
|
107
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
108
|
+
|
109
|
+
# remove metadata directory and check the verify method doesn't break
|
110
|
+
FileUtils.rm_r(File.join(testroot, 'home','tpkg', 'var', 'tpkg', 'installed', 'metadata', pkgname))
|
111
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['testpkg'])}
|
112
|
+
|
113
|
+
# Test that tpkg doesn't break when user try to install old packages that were created without file_metadata.xml
|
114
|
+
pkg_without_file_metadata = File.join(File.dirname(__FILE__), 'premadetestpkg', 'pkg_without_file_metadata-1.0-1.tpkg')
|
115
|
+
assert_nothing_raised { tpkg.install([pkg_without_file_metadata], PASSPHRASE) }
|
116
|
+
# Check that the files from the package ended up in the right place
|
117
|
+
assert(File.exist?(File.join(testbase, 'file')))
|
118
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'file')), IO.read(File.join(testbase, 'file')))
|
119
|
+
assert(File.exist?(File.join(testbase, 'encfile')))
|
120
|
+
assert_equal(IO.read(File.join(TESTPKGDIR, 'reloc', 'encfile')), IO.read(File.join(testbase, 'encfile')))
|
121
|
+
|
122
|
+
# verify nothing bad when user try to run -V
|
123
|
+
assert_nothing_raised { @errors = tpkg.verify_file_metadata(['pkg_without_file_metadata'])}
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def teardown
|
128
|
+
FileUtils.rm_f(@pkgfile)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
#
|
4
|
+
# Test tpkg's ability to execute init scripts
|
5
|
+
#
|
6
|
+
|
7
|
+
require File.expand_path('tpkgtest', File.dirname(__FILE__))
|
8
|
+
|
9
|
+
class TpkgInitScriptsTests < Test::Unit::TestCase
|
10
|
+
include TpkgTests
|
11
|
+
|
12
|
+
def setup
|
13
|
+
Tpkg::set_prompt(false)
|
14
|
+
|
15
|
+
# temp dir that will automatically get deleted at end of test run, can be
|
16
|
+
# used for storing packages
|
17
|
+
@tempoutdir = Dir.mktmpdir('tempoutdir')
|
18
|
+
# Make up a package with both relocatable and non-relocatable
|
19
|
+
# directory trees so that we can ensure both types are unpacked
|
20
|
+
# properly.
|
21
|
+
Dir.mktmpdir('srcdir') do |srcdir|
|
22
|
+
# The stock test package has a reloc directory we can use
|
23
|
+
system("#{Tpkg::find_tar} -C #{TESTPKGDIR} --exclude .svn -cf - . | #{Tpkg::find_tar} -C #{srcdir} -xf -")
|
24
|
+
# Then add a root directory
|
25
|
+
FileUtils.mkdir_p(File.join(srcdir, 'root', 'etc'))
|
26
|
+
File.open(File.join(srcdir, 'root', 'etc', 'rootfile'), 'w') do |file|
|
27
|
+
file.puts "Hello"
|
28
|
+
end
|
29
|
+
@pkgfile = make_package(:output_directory => @tempoutdir, :source_directory => srcdir, :files => {'/etc/rootfile' => {'perms' => '0666'}})
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Test init script start/stop init scripts in correct order
|
34
|
+
def test_order
|
35
|
+
pkg = nil
|
36
|
+
tmpfile = Tempfile.new('initscripttest')
|
37
|
+
Dir.mktmpdir('srcdir') do |srcdir|
|
38
|
+
FileUtils.cp(File.join(TESTPKGDIR, 'tpkg-nofiles.xml'), File.join(srcdir, 'tpkg.xml'))
|
39
|
+
FileUtils.mkdir_p(File.join(srcdir, 'reloc'))
|
40
|
+
(1..3).each do | i |
|
41
|
+
File.open(File.join(srcdir, 'reloc', "myinit#{i}"), 'w') do |file|
|
42
|
+
file.puts("#!/bin/sh\necho myinit#{i} >> #{tmpfile.path}")
|
43
|
+
end
|
44
|
+
File.chmod(0755, File.join(srcdir, 'reloc', "myinit#{i}"))
|
45
|
+
end
|
46
|
+
|
47
|
+
pkg = make_package(:output_directory => @tempoutdir, :change => { 'name' => 'initpkg' }, :source_directory => srcdir,
|
48
|
+
:files => { "myinit1" => { 'init' => {'start' => '1' }} , "myinit2" => { 'init' => {'start' => '2' }}, "myinit3" => { 'init' => {'start' => '3' }}},
|
49
|
+
:remove => ['operatingsystem', 'architecture'])
|
50
|
+
end
|
51
|
+
Dir.mktmpdir('testroot') do |testroot|
|
52
|
+
testbase = File.join(testroot, 'home', 'tpkg')
|
53
|
+
FileUtils.mkdir_p(testbase)
|
54
|
+
tpkg = Tpkg.new(:file_system_root => testroot, :base => File.join('home', 'tpkg'), :sources => [pkg])
|
55
|
+
metadata = Tpkg::metadata_from_package(pkg)
|
56
|
+
begin
|
57
|
+
tpkg.install([pkg], PASSPHRASE)
|
58
|
+
tpkg.init_links(metadata).each do |link, init_script|
|
59
|
+
assert(File.symlink?(link))
|
60
|
+
assert_equal(init_script, File.readlink(link))
|
61
|
+
end
|
62
|
+
|
63
|
+
# check that init scripts are started in correct order
|
64
|
+
tpkg.execute_init(["initpkg"], "start")
|
65
|
+
lines = File.open(tmpfile.path).readlines
|
66
|
+
assert_equal("myinit1", lines[0].chomp)
|
67
|
+
assert_equal("myinit2", lines[1].chomp)
|
68
|
+
assert_equal("myinit3", lines[2].chomp)
|
69
|
+
|
70
|
+
# clear out the file
|
71
|
+
system("cat /dev/null > #{tmpfile.path}")
|
72
|
+
# check that init scripts are stopped in correct order
|
73
|
+
tpkg.execute_init(["initpkg"], "stop")
|
74
|
+
lines = File.open(tmpfile.path).readlines
|
75
|
+
assert_equal("myinit3", lines[0].chomp)
|
76
|
+
assert_equal("myinit2", lines[1].chomp)
|
77
|
+
assert_equal("myinit1", lines[2].chomp)
|
78
|
+
rescue RuntimeError => e
|
79
|
+
if e.message =~ /No init script support/
|
80
|
+
warn "No init script support on this platform, init script handling will not be tested (#{e.message})"
|
81
|
+
else
|
82
|
+
raise
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
FileUtils.rm_f(pkg)
|
87
|
+
end
|
88
|
+
|
89
|
+
def teardown
|
90
|
+
FileUtils.rm_rf(@tempoutdir)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|