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
data/lib/tpkg/os.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
# tpkg package management system
|
2
|
+
# License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
begin
|
5
|
+
# Try loading facter w/o gems first so that we don't introduce a
|
6
|
+
# dependency on rubygems if it is not needed.
|
7
|
+
require 'facter'
|
8
|
+
rescue LoadError
|
9
|
+
require 'rubygems'
|
10
|
+
require 'facter'
|
11
|
+
end
|
12
|
+
|
13
|
+
class Tpkg::OS
|
14
|
+
@@implementations = []
|
15
|
+
def self.register_implementation(impl)
|
16
|
+
@@implementations << impl
|
17
|
+
end
|
18
|
+
Dir.glob(File.expand_path('os/*.rb', File.dirname(__FILE__))).each {|d| require d}
|
19
|
+
def self.create(options={})
|
20
|
+
impl = @@implementations.detect{|i| i.supported?} || raise(NotImplementedError)
|
21
|
+
impl.new(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(options={})
|
25
|
+
@debug = options[:debug]
|
26
|
+
@os = nil
|
27
|
+
@os_name = nil
|
28
|
+
@os_version = nil
|
29
|
+
@arch = nil
|
30
|
+
Facter.loadfacts
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# OS-specific classes should (must?) implement these methods
|
35
|
+
#
|
36
|
+
|
37
|
+
# Given info for a init script from a package's metadata return an array
|
38
|
+
# of paths where that init script should linked to on the system
|
39
|
+
def init_links(installed_path, tpkgfile)
|
40
|
+
# I think users would rather have packages install without their init
|
41
|
+
# scripts enabled than have them fail to install on platforms where we
|
42
|
+
# don't have init script support.
|
43
|
+
# raise NotImplementedError
|
44
|
+
warn "No init script support for OS #{os}"
|
45
|
+
[]
|
46
|
+
end
|
47
|
+
def available_native_packages(pkgname)
|
48
|
+
raise NotImplementedError
|
49
|
+
end
|
50
|
+
def install_native_package(pkg)
|
51
|
+
raise NotImplementedError
|
52
|
+
end
|
53
|
+
def upgrade_native_package(pkg)
|
54
|
+
raise NotImplementedError
|
55
|
+
end
|
56
|
+
# Create and install a native stub package, if pkg has native
|
57
|
+
# dependencies, to express those dependencies to the native package
|
58
|
+
# system. This helps ensure that users don't inadvertently remove native
|
59
|
+
# packages that tpkg packages depend on.
|
60
|
+
def stub_native_pkg(pkg)
|
61
|
+
# I think users would rather have packages install without a native stub
|
62
|
+
# than have them fail to install on platforms where we don't have native
|
63
|
+
# stub support.
|
64
|
+
# raise NotImplementedError
|
65
|
+
native_deps = pkg[:metadata].get_native_deps
|
66
|
+
if !native_deps.empty?
|
67
|
+
warn "No native stub support for OS #{os}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
# Remove the native dependency stub package (if there is one) associated
|
71
|
+
# with pkg
|
72
|
+
def remove_native_stub_pkg(pkg)
|
73
|
+
# raise NotImplementedError
|
74
|
+
warn "No native stub support for OS #{os}"
|
75
|
+
end
|
76
|
+
# This rarely works as-is, most platforms need something more specific
|
77
|
+
def os_version
|
78
|
+
if !@os_version
|
79
|
+
if Facter['operatingsystemrelease'] &&
|
80
|
+
Facter['operatingsystemrelease'].value &&
|
81
|
+
!Facter['operatingsystemrelease'].value.empty?
|
82
|
+
@os_version = Facter['operatingsystemrelease'].value
|
83
|
+
else
|
84
|
+
raise "Unable to determine proper OS value on this platform"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
@os_version.dup
|
88
|
+
end
|
89
|
+
# This also rarely works as-is
|
90
|
+
def native_pkg_to_install_string(pkg)
|
91
|
+
name = pkg[:metadata][:name]
|
92
|
+
version = pkg[:metadata][:version]
|
93
|
+
package_version = pkg[:metadata][:package_version]
|
94
|
+
pkgname = "#{name}-#{version}"
|
95
|
+
if package_version
|
96
|
+
pkgname << "-#{package_version}"
|
97
|
+
end
|
98
|
+
pkgname
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# These methods have implementations that work in most cases, but
|
103
|
+
# OS-specific classes may modify these definitions if needed.
|
104
|
+
#
|
105
|
+
|
106
|
+
def os
|
107
|
+
if !@os
|
108
|
+
@os = "#{os_name}-#{os_version}"
|
109
|
+
end
|
110
|
+
@os.dup
|
111
|
+
end
|
112
|
+
def os_name
|
113
|
+
if !@os_name
|
114
|
+
@os_name = Facter['operatingsystem'].value
|
115
|
+
end
|
116
|
+
@os_name.dup
|
117
|
+
end
|
118
|
+
def arch
|
119
|
+
if !@arch
|
120
|
+
@arch = Facter['hardwaremodel'].value
|
121
|
+
end
|
122
|
+
@arch.dup
|
123
|
+
end
|
124
|
+
def fqdn
|
125
|
+
# Note that we intentionally do not cache the fqdn. The hostname of a
|
126
|
+
# machine can change at any time and it would be unexpected if the user
|
127
|
+
# had to restart a tpkg-based application to pick up a hostname change.
|
128
|
+
if Facter['fqdn'] && Facter['fqdn'].value
|
129
|
+
Facter['fqdn'].value
|
130
|
+
else
|
131
|
+
Facter['hostname'].value << '.' << Facter['domain'].value
|
132
|
+
end
|
133
|
+
end
|
134
|
+
# Systems with cron.d support should override this
|
135
|
+
def cron_dot_d_directory
|
136
|
+
end
|
137
|
+
# Should sudo be on by default?
|
138
|
+
def sudo_default?
|
139
|
+
true
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
# Utility methods
|
144
|
+
#
|
145
|
+
|
146
|
+
def sys_v_init_links(installed_path, tpkgfile, default_levels, init_directory)
|
147
|
+
start = '99'
|
148
|
+
if tpkgfile[:init][:start]
|
149
|
+
start = tpkgfile[:init][:start]
|
150
|
+
end
|
151
|
+
levels = default_levels
|
152
|
+
if tpkgfile[:init][:levels]
|
153
|
+
levels = tpkgfile[:init][:levels]
|
154
|
+
# In case the user specified levels in yaml as string/integer
|
155
|
+
# instead of array
|
156
|
+
if !levels.kind_of?(Array)
|
157
|
+
levels = levels.to_s.split(//)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
levels.collect do |level|
|
161
|
+
File.join(init_directory, "rc#{level}.d", 'S' + start.to_s + File.basename(installed_path))
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# tpkg package management system
|
2
|
+
# License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
class Tpkg::OS::Debian < Tpkg::OS
|
5
|
+
def self.supported?
|
6
|
+
Facter.loadfacts
|
7
|
+
['Debian', 'Ubuntu'].include?(Facter['operatingsystem'].value)
|
8
|
+
end
|
9
|
+
register_implementation(self)
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
@dpkgquerycmd = options[:dpkgquerycmd] || options[:testcmd] || 'dpkg-query'
|
13
|
+
@aptcachecmd = options[:aptcachecmd] || options[:testcmd] || 'apt-cache'
|
14
|
+
@aptgetcmd = options[:aptgetcmd] || options[:testcmd] || 'apt-get'
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def init_links(installed_path, tpkgfile)
|
19
|
+
sys_v_init_links(installed_path, tpkgfile, ['2', '3', '4', '5'], '/etc')
|
20
|
+
end
|
21
|
+
def cron_dot_d_directory
|
22
|
+
'/etc/cron.d'
|
23
|
+
end
|
24
|
+
def available_native_packages(pkgname)
|
25
|
+
native_packages = []
|
26
|
+
# The default 'dpkg -l' format has an optional third column for errors
|
27
|
+
# which makes it hard to parse reliably, so we specify a custom format.
|
28
|
+
cmd = "#{@dpkgquerycmd} -W -f='${Package} ${Version} ${Status}\n' #{pkgname}"
|
29
|
+
puts "available_native_packages running #{cmd}" if @debug
|
30
|
+
stderr_first_line = nil
|
31
|
+
Open3.popen3(cmd) do |stdin, stdout, stderr|
|
32
|
+
stdin.close
|
33
|
+
stdout.each_line do |line|
|
34
|
+
name, debversion, status = line.split(' ', 3)
|
35
|
+
# Seems to be Debian convention that if the package has a
|
36
|
+
# package version you seperate that from the upstream version
|
37
|
+
# with a hyphen.
|
38
|
+
version = nil
|
39
|
+
package_version = nil
|
40
|
+
if debversion =~ /-/
|
41
|
+
version, package_version = debversion.split('-', 2)
|
42
|
+
else
|
43
|
+
version = debversion
|
44
|
+
end
|
45
|
+
# We want packages with a state of "installed". However,
|
46
|
+
# there's also a state of "not-installed", and the state
|
47
|
+
# field contains several space-seperated values, so we have
|
48
|
+
# to be somewhat careful to pick out "installed".
|
49
|
+
if status.split(' ').include?('installed')
|
50
|
+
pkg = Tpkg.pkg_for_native_package(name, version, package_version, :native_installed)
|
51
|
+
native_packages << pkg
|
52
|
+
end
|
53
|
+
end
|
54
|
+
stderr_first_line = stderr.gets
|
55
|
+
end
|
56
|
+
# FIXME: popen3 doesn't set $?
|
57
|
+
if !$?.success?
|
58
|
+
# Ignore 'no matching packages', raise anything else
|
59
|
+
if stderr_first_line !~ 'No packages found matching'
|
60
|
+
raise "available_native_packages error running dpkg-query"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
cmd = "#{@aptcachecmd} show #{pkgname}"
|
65
|
+
puts "available_native_packages running '#{cmd}'" if @debug
|
66
|
+
stderr_first_line = nil
|
67
|
+
Open3.popen3(cmd) do |stdin, stdout, stderr|
|
68
|
+
stdin.close
|
69
|
+
name = nil
|
70
|
+
version = nil
|
71
|
+
package_version = nil
|
72
|
+
skip = false
|
73
|
+
stdout.each_line do |line|
|
74
|
+
if line =~ /^Package: (.*)/
|
75
|
+
name = $1
|
76
|
+
version = nil
|
77
|
+
package_version = nil
|
78
|
+
skip = false
|
79
|
+
elsif line =~ /Status: (.*)/
|
80
|
+
# Packages with status are coming from dpkg rather than apt. They're
|
81
|
+
# either already installed (and thus captured by the dpkg-query
|
82
|
+
# above) or uninstalled and not really available. This seems to be
|
83
|
+
# a new feature of apt-get in Debian 7. On older systems these
|
84
|
+
# packages don't show up in apt-get show, which is why we still need
|
85
|
+
# the dpkg-query command above.
|
86
|
+
skip = true
|
87
|
+
elsif line =~ /^Version: (.*)/ && !skip
|
88
|
+
debversion = $1
|
89
|
+
# Seems to be Debian convention that if the package has a
|
90
|
+
# package version you seperate that from the upstream version
|
91
|
+
# with a hyphen.
|
92
|
+
if debversion =~ /-/
|
93
|
+
version, package_version = debversion.split('-', 2)
|
94
|
+
else
|
95
|
+
version = debversion
|
96
|
+
end
|
97
|
+
pkg = Tpkg.pkg_for_native_package(name, version, package_version, :native_available)
|
98
|
+
native_packages << pkg
|
99
|
+
end
|
100
|
+
end
|
101
|
+
stderr_first_line = stderr.gets
|
102
|
+
end
|
103
|
+
# FIXME: popen3 doesn't set $?
|
104
|
+
if !$?.success?
|
105
|
+
# Ignore 'no matching packages', raise anything else
|
106
|
+
if stderr_first_line !~ 'No packages found'
|
107
|
+
raise "available_native_packages error running apt-cache"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
native_packages
|
111
|
+
end
|
112
|
+
def native_pkg_to_install_string(pkg)
|
113
|
+
name = pkg[:metadata][:name]
|
114
|
+
version = pkg[:metadata][:version]
|
115
|
+
package_version = pkg[:metadata][:package_version]
|
116
|
+
pkgname = "#{name}=#{version}"
|
117
|
+
if package_version
|
118
|
+
pkgname << "-#{package_version}"
|
119
|
+
end
|
120
|
+
pkgname
|
121
|
+
end
|
122
|
+
def install_native_package(pkg)
|
123
|
+
pkgname = native_pkg_to_install_string(pkg)
|
124
|
+
cmd = "#{@aptgetcmd} -y install #{pkgname}"
|
125
|
+
puts "Running '#{cmd}' to install native package" if @debug
|
126
|
+
system(cmd)
|
127
|
+
end
|
128
|
+
def upgrade_native_package(pkg)
|
129
|
+
pkgname = native_pkg_to_install_string(pkg)
|
130
|
+
cmd = "#{@aptgetcmd} -y install #{pkgname}"
|
131
|
+
puts "Running '#{cmd}' to upgrade native package" if @debug
|
132
|
+
system(cmd)
|
133
|
+
end
|
134
|
+
|
135
|
+
def os_version
|
136
|
+
if !@os_version
|
137
|
+
if Facter['lsbmajdistrelease'] &&
|
138
|
+
Facter['lsbmajdistrelease'].value &&
|
139
|
+
!Facter['lsbmajdistrelease'].value.empty?
|
140
|
+
lsbmajdistrelease = Facter['lsbmajdistrelease'].value
|
141
|
+
# Normal wheezy beta returns 'testing', but Raspian on the
|
142
|
+
# Raspberry Pi returns this uglier string. Normalize it.
|
143
|
+
if lsbmajdistrelease == 'testing/unstable'
|
144
|
+
lsbmajdistrelease = 'testing'
|
145
|
+
end
|
146
|
+
@os_version = lsbmajdistrelease
|
147
|
+
elsif Facter['lsbdistrelease'] &&
|
148
|
+
Facter['lsbdistrelease'].value &&
|
149
|
+
!Facter['lsbdistrelease'].value.empty? &&
|
150
|
+
# Work around lack of lsbmajdistrelease on older versions of Ubuntu
|
151
|
+
# due to older version of facter. Support for lsbmajdistrelease on
|
152
|
+
# Ubuntu was added in facter 1.5.3, but there's no good way to force
|
153
|
+
# older Ubuntu systems to a newer version of facter.
|
154
|
+
@os_version = Facter['lsbdistrelease'].value.split('.').first
|
155
|
+
end
|
156
|
+
end
|
157
|
+
super
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# tpkg package management system
|
2
|
+
# License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
class Tpkg::OS::FreeBSD < Tpkg::OS
|
7
|
+
def self.supported?
|
8
|
+
Facter.loadfacts
|
9
|
+
Facter['operatingsystem'].value == 'FreeBSD'
|
10
|
+
end
|
11
|
+
register_implementation(self)
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
@pkginfocmd = options[:pkginfocmd] || options[:testcmd] || 'pkg_info'
|
15
|
+
@pkgaddcmd = options[:pkgaddcmd] || options[:testcmd] || 'pkg_add'
|
16
|
+
@pkgdeletecmd = options[:pkgdeletecmd] || options[:testcmd] || 'pkg_delete'
|
17
|
+
# pkg_add -r defaults to the Latest/ directory, which just has generic
|
18
|
+
# versionless symlinks like curl.tbz. We want to use the All/ directory
|
19
|
+
# so that we can specify a versioned file like curl-7.24.0.tbz.
|
20
|
+
@packagesite = options[:packagesite] ||
|
21
|
+
'ftp://ftp.freebsd.org/pub/FreeBSD/ports/<%= arch %>/packages-<%= os_version %>-stable/All/'
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def packagesite
|
26
|
+
url = ERB.new(@packagesite).result(binding)
|
27
|
+
# pkg_add expects the URL to end with a /
|
28
|
+
url << '/' if (url[-1] != '/')
|
29
|
+
url
|
30
|
+
end
|
31
|
+
|
32
|
+
def init_links(installed_path, tpkgfile)
|
33
|
+
links = []
|
34
|
+
init_directory = '/usr/local/etc/rc.d'
|
35
|
+
if tpkgfile[:init][:levels] && tpkgfile[:init][:levels].empty?
|
36
|
+
# User doesn't want the init script linked in to auto-start
|
37
|
+
else
|
38
|
+
links << File.join(init_directory, File.basename(installed_path))
|
39
|
+
end
|
40
|
+
links
|
41
|
+
end
|
42
|
+
def available_native_packages(pkgname)
|
43
|
+
native_packages = []
|
44
|
+
cmd = "#{@pkginfocmd} -E #{pkgname}-*"
|
45
|
+
puts "available_native_packages running '#{cmd}'" if @debug
|
46
|
+
Open3.popen3(cmd) do |stdin, stdout, stderr|
|
47
|
+
stdin.close
|
48
|
+
stdout.each_line do |line|
|
49
|
+
fbversion = line.sub("#{pkgname}-", '').chomp
|
50
|
+
# Seems to be FreeBSD convention that if the package has a
|
51
|
+
# package version you seperate that from the upstream version
|
52
|
+
# with an underscore.
|
53
|
+
version, package_version = fbversion.split('_', 2)
|
54
|
+
native_packages <<
|
55
|
+
Tpkg.pkg_for_native_package(
|
56
|
+
pkgname, version, package_version, :native_installed)
|
57
|
+
end
|
58
|
+
stderr_first_line = stderr.gets
|
59
|
+
end
|
60
|
+
# FIXME: popen3 doesn't set $?
|
61
|
+
if !$?.success?
|
62
|
+
# Ignore 'no matching packages', raise anything else
|
63
|
+
if stderr_first_line !~ 'No match'
|
64
|
+
raise "available_native_packages error running pkg_info"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
# FIXME: FreeBSD available packages
|
68
|
+
# We could either poke around in the ports tree (if installed), or
|
69
|
+
# try to recreate the URL "pkg_add -r" would use and pull a
|
70
|
+
# directory listing.
|
71
|
+
native_packages
|
72
|
+
end
|
73
|
+
def native_pkg_to_install_string(pkg)
|
74
|
+
name = pkg[:metadata][:name]
|
75
|
+
version = pkg[:metadata][:version]
|
76
|
+
package_version = pkg[:metadata][:package_version]
|
77
|
+
pkgname = "#{name}-#{version}"
|
78
|
+
if package_version
|
79
|
+
pkgname << "_#{package_version}"
|
80
|
+
end
|
81
|
+
pkgname
|
82
|
+
end
|
83
|
+
def install_native_package(pkg)
|
84
|
+
pkgname = native_pkg_to_install_string(pkg)
|
85
|
+
cmd = "PACKAGESITE=#{packagesite} #{@pkgaddcmd} -r #{pkgname}"
|
86
|
+
puts "Running '#{cmd}' to install native package" if @debug
|
87
|
+
system('sh', '-c', cmd)
|
88
|
+
end
|
89
|
+
def upgrade_native_package(pkg)
|
90
|
+
pkgname = native_pkg_to_install_string(pkg)
|
91
|
+
# This is not very ideal. It would be better to download the
|
92
|
+
# new package, and if the download is successful remove the
|
93
|
+
# old package and install the new one. The way we're doing it
|
94
|
+
# here we risk leaving the system with neither version
|
95
|
+
# installed if the download of the new package fails.
|
96
|
+
# However, the FreeBSD package tools don't make it easy to
|
97
|
+
# handle things properly.
|
98
|
+
deletecmd = "#{@pkgdeletecmd} #{pkgname}"
|
99
|
+
addcmd = "PACKAGESITE=#{packagesite} #{@pkgaddcmd} -r #{pkgname}"
|
100
|
+
puts "Running '#{deletecmd}' and '#{addcmd}' to upgrade native package" if @debug
|
101
|
+
system(deletecmd)
|
102
|
+
system('sh', '-c', addcmd)
|
103
|
+
end
|
104
|
+
|
105
|
+
def os_version
|
106
|
+
if !@os_version
|
107
|
+
# Extract 7 from 7.1-RELEASE, for example
|
108
|
+
fbver = Facter['operatingsystemrelease'].value
|
109
|
+
@os_version = fbver.split('.').first
|
110
|
+
end
|
111
|
+
super
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# tpkg package management system
|
2
|
+
# License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
3
|
+
|
4
|
+
class Tpkg::OS::MacOSX < Tpkg::OS
|
5
|
+
def self.supported?
|
6
|
+
Facter.loadfacts
|
7
|
+
Facter['operatingsystem'].value == 'Darwin'
|
8
|
+
end
|
9
|
+
register_implementation(self)
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
@portcmd = options[:portcmd] || options[:testcmd] || '/opt/local/bin/port'
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def available_native_packages(pkgname)
|
17
|
+
native_packages = []
|
18
|
+
if File.exist?(@portcmd)
|
19
|
+
# Ports can also have an "epoch" number, but that appears to be
|
20
|
+
# invisible from the command line
|
21
|
+
# http://guide.macports.org/#reference.keywords
|
22
|
+
cmd = "#{@portcmd} installed #{pkgname}"
|
23
|
+
puts "available_native_packages running '#{cmd}'" if @debug
|
24
|
+
IO.popen(cmd) do |pipe|
|
25
|
+
pipe.each_line do |line|
|
26
|
+
next if line =~ /The following ports are currently installed/
|
27
|
+
next if line =~ /None of the specified ports are installed/
|
28
|
+
next if line !~ /\(active\)/
|
29
|
+
name, portversion = line.split(' ')
|
30
|
+
portversion.sub!(/^@/, '')
|
31
|
+
# Remove variant names
|
32
|
+
portversion.sub!(/\+.*/, '')
|
33
|
+
version, package_version = portversion.split('_', 2)
|
34
|
+
pkg = Tpkg.pkg_for_native_package(name, version, package_version, :native_installed)
|
35
|
+
native_packages << pkg
|
36
|
+
end
|
37
|
+
end
|
38
|
+
if !$?.success?
|
39
|
+
raise "available_native_packages error running port"
|
40
|
+
end
|
41
|
+
cmd = "#{@portcmd} list #{pkgname}"
|
42
|
+
puts "available_native_packages running '#{cmd}'" if @debug
|
43
|
+
IO.popen(cmd) do |pipe|
|
44
|
+
pipe.each_line do |line|
|
45
|
+
name, version = line.split(' ')
|
46
|
+
version.sub!(/^@/, '')
|
47
|
+
package_version = nil
|
48
|
+
pkg = Tpkg.pkg_for_native_package(name, version, package_version, :native_available)
|
49
|
+
native_packages << pkg
|
50
|
+
end
|
51
|
+
end
|
52
|
+
if !$?.success?
|
53
|
+
raise "available_native_packages error running port"
|
54
|
+
end
|
55
|
+
else
|
56
|
+
# Fink, Homebrew support would be nice
|
57
|
+
raise "No supported native package tool available on #{os}"
|
58
|
+
end
|
59
|
+
native_packages
|
60
|
+
end
|
61
|
+
def native_pkg_to_install_string(pkg)
|
62
|
+
pkgname = nil
|
63
|
+
if File.exist?(@portcmd)
|
64
|
+
pkgname = pkg[:metadata][:name]
|
65
|
+
# MacPorts doesn't support installing a specific version (AFAIK)
|
66
|
+
if pkg[:metadata][:version]
|
67
|
+
warn "Ignoring version with MacPorts"
|
68
|
+
end
|
69
|
+
if pkg[:metadata][:package_version]
|
70
|
+
warn "Ignoring package version with MacPorts"
|
71
|
+
end
|
72
|
+
else
|
73
|
+
# Fink, Homebrew support would be nice
|
74
|
+
raise "No supported native package tool available on #{os}"
|
75
|
+
end
|
76
|
+
pkgname
|
77
|
+
end
|
78
|
+
def install_native_package(pkg)
|
79
|
+
pkgname = native_pkg_to_install_string(pkg)
|
80
|
+
if File.exist?(@portcmd)
|
81
|
+
cmd = "#{@portcmd} install #{pkgname}"
|
82
|
+
puts "Running '#{cmd}' to install native package" if @debug
|
83
|
+
system(cmd)
|
84
|
+
else
|
85
|
+
# Fink, Homebrew support would be nice
|
86
|
+
raise "No supported native package tool available on #{os}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
def upgrade_native_package(pkg)
|
90
|
+
pkgname = native_pkg_to_install_string(pkg)
|
91
|
+
if File.exist?(@portcmd)
|
92
|
+
cmd = "#{@portcmd} upgrade #{pkgname}"
|
93
|
+
puts "Running '#{cmd}' to upgrade native package" if @debug
|
94
|
+
system(cmd)
|
95
|
+
else
|
96
|
+
# Fink, Homebrew support would be nice
|
97
|
+
raise "No supported native package tool available on #{os}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def os_version
|
102
|
+
if !@os_version
|
103
|
+
if Facter['macosx_productversion'] &&
|
104
|
+
Facter['macosx_productversion'].value &&
|
105
|
+
!Facter['macosx_productversion'].value.empty?
|
106
|
+
macver = Facter['macosx_productversion'].value
|
107
|
+
# Extract 10.5 from 10.5.6, for example
|
108
|
+
@os_version = macver.split('.')[0,2].join('.')
|
109
|
+
end
|
110
|
+
end
|
111
|
+
super
|
112
|
+
end
|
113
|
+
end
|