tpkg 2.0.0 → 2.0.1
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.
- data/Rakefile +1 -1
- data/bin/tpkg +36 -4
- data/lib/tpkg.rb +59 -7
- metadata +17 -42
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ spec = Gem::Specification.new do |s|
|
|
5
5
|
s.add_dependency('facter')
|
6
6
|
s.add_dependency('net-ssh')
|
7
7
|
s.add_dependency('ddao-kwalify')
|
8
|
-
s.version = '2.0.
|
8
|
+
s.version = '2.0.1'
|
9
9
|
s.authors = ['Darren Dao', 'Jason Heiss']
|
10
10
|
s.email = 'tpkg-users@lists.sourceforge.net'
|
11
11
|
s.homepage = 'http://tpkg.sourceforge.net'
|
data/bin/tpkg
CHANGED
@@ -9,6 +9,7 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
|
9
9
|
|
10
10
|
require 'optparse'
|
11
11
|
require 'tpkg'
|
12
|
+
require 'etc'
|
12
13
|
|
13
14
|
#
|
14
15
|
# Parse the command line options
|
@@ -60,7 +61,8 @@ opts.on('--extract', '-x', '=DIRECTORY', 'Extract the metadata for a directory o
|
|
60
61
|
@action = :extract
|
61
62
|
@action_value = opt
|
62
63
|
end
|
63
|
-
|
64
|
+
installexample = " --install pkgname=version=package_version\n (Example: tpkg --install hive=2.1) Will install hive version 2.1"
|
65
|
+
opts.on('--install', '-i', '=PACKAGES', "Install one or more packages\n#{installexample}", Array) do |opt|
|
64
66
|
@rerun_with_sudo = true
|
65
67
|
@action = :install
|
66
68
|
@action_value = opt
|
@@ -220,6 +222,9 @@ end
|
|
220
222
|
opts.on('--qenv', "Display machine's information") do |opt|
|
221
223
|
@action = :query_env
|
222
224
|
end
|
225
|
+
opts.on('--qconf', "Display tpkg's configuration settings") do |opt|
|
226
|
+
@action = :query_conf
|
227
|
+
end
|
223
228
|
opts.on('--source', '=NAME', 'Sources where packages are located', Array) do |opt|
|
224
229
|
@tpkg_options["sources"] = opt
|
225
230
|
end
|
@@ -332,8 +337,24 @@ def instantiate_tpkg(options = {})
|
|
332
337
|
# if they don't realize there's an environment variable set.
|
333
338
|
warn "Using base '#{base}' base from $TPKG_HOME"
|
334
339
|
end
|
335
|
-
|
336
|
-
|
340
|
+
if !@sudo
|
341
|
+
curruid = Etc.getpwuid.uid
|
342
|
+
if curruid == 0
|
343
|
+
puts "** ERROR **\n--no-sudo cannot be used as 'root' user or with sudo command."
|
344
|
+
exit 1
|
345
|
+
end
|
346
|
+
if !File::exists?(File.join(ENV['HOME'], ".tpkg.conf"))
|
347
|
+
puts "** ERROR **\nWhen specifying --no-sudo, #{File.join(ENV['HOME'], ".tpkg.conf")} and custom 'base' dir with write privileges is required\n" and exit 1
|
348
|
+
elsif base == '/home/t'
|
349
|
+
puts "** ERROR **\nWhen specifying --no-sudo, custom base dir with write privileges is required\n" and exit 1
|
350
|
+
end
|
351
|
+
baseuid = File.stat(base).uid
|
352
|
+
if baseuid != curruid
|
353
|
+
puts "** ERROR **\nbase dir (#{base}) not owned by you.\n"
|
354
|
+
exit 1
|
355
|
+
end
|
356
|
+
end
|
357
|
+
tpkg = Tpkg.new(:base => base, :sources => sources, :report_server => report_server, :lockforce => @lockforce, :force => @force, :sudo => @sudo)
|
337
358
|
end
|
338
359
|
|
339
360
|
passphrase_callback = lambda do | package |
|
@@ -503,7 +524,7 @@ when :query_list_files
|
|
503
524
|
if File.exist?(@action_value)
|
504
525
|
fip = Tpkg::files_in_package(@action_value)
|
505
526
|
tpkg.normalize_paths(fip)
|
506
|
-
puts "#{
|
527
|
+
puts "#{@action_value}:"
|
507
528
|
fip[:normalized].each { |file| puts file }
|
508
529
|
else
|
509
530
|
pkgfiles = []
|
@@ -629,6 +650,17 @@ when :query_tpkg_metadata
|
|
629
650
|
when :query_env
|
630
651
|
puts "Operating System: #{Tpkg::get_os}"
|
631
652
|
puts "Architecture: #{Tpkg::get_arch}"
|
653
|
+
when :query_conf
|
654
|
+
# This is somewhat arbitrarily limited to the options read from the
|
655
|
+
# tpkg.conf config files. The reason it exists at all is that it is
|
656
|
+
# difficult for users to programatically find out what these will be set to
|
657
|
+
# without recreating all of our logic about deciding which config files to
|
658
|
+
# read, which order to read them in, what environment variables override the
|
659
|
+
# config files, etc.
|
660
|
+
tpkg = instantiate_tpkg(@tpkg_options)
|
661
|
+
puts "Base: #{tpkg.base}"
|
662
|
+
puts "Sources: #{tpkg.sources.inspect}"
|
663
|
+
puts "Report server: #{tpkg.report_server}"
|
632
664
|
when :query_history
|
633
665
|
tpkg = instantiate_tpkg(@tpkg_options)
|
634
666
|
tpkg.installation_history
|
data/lib/tpkg.rb
CHANGED
@@ -56,7 +56,7 @@ require 'kwalify' # for validating yaml
|
|
56
56
|
|
57
57
|
class Tpkg
|
58
58
|
|
59
|
-
VERSION = '2.0.
|
59
|
+
VERSION = '2.0.1'
|
60
60
|
CONFIGDIR = '/etc'
|
61
61
|
|
62
62
|
GENERIC_ERR = 1
|
@@ -1126,7 +1126,7 @@ class Tpkg
|
|
1126
1126
|
metadata = data[:metadata]
|
1127
1127
|
if (metadata && metadata[:files] && metadata[:files][:file_defaults] && metadata[:files][:file_defaults][:posix])
|
1128
1128
|
uid = Tpkg::lookup_uid(metadata[:files][:file_defaults][:posix][:owner]) if metadata[:files][:file_defaults][:posix][:owner]
|
1129
|
-
gid = Tpkg::
|
1129
|
+
gid = Tpkg::lookup_gid(metadata[:files][:file_defaults][:posix][:group]) if metadata[:files][:file_defaults][:posix][:group]
|
1130
1130
|
perms = metadata[:files][:file_defaults][:posix][:perms] if metadata[:files][:file_defaults][:posix][:perms]
|
1131
1131
|
end
|
1132
1132
|
|
@@ -1134,7 +1134,7 @@ class Tpkg
|
|
1134
1134
|
file_metadata = data[:file_metadata]
|
1135
1135
|
if file_metadata && file_metadata[:posix]
|
1136
1136
|
uid = Tpkg::lookup_uid(file_metadata[:posix][:owner]) if file_metadata[:posix][:owner]
|
1137
|
-
gid = Tpkg::
|
1137
|
+
gid = Tpkg::lookup_gid(file_metadata[:posix][:group]) if file_metadata[:posix][:group]
|
1138
1138
|
perms = file_metadata[:posix][:perms] if file_metadata[:posix][:perms]
|
1139
1139
|
end
|
1140
1140
|
return perms, uid, gid
|
@@ -1233,6 +1233,10 @@ class Tpkg
|
|
1233
1233
|
if options.has_key?(:force)
|
1234
1234
|
@force = options[:force]
|
1235
1235
|
end
|
1236
|
+
@sudo = true
|
1237
|
+
if options.has_key?(:sudo)
|
1238
|
+
@sudo = options[:sudo]
|
1239
|
+
end
|
1236
1240
|
|
1237
1241
|
@file_system_root = '/' # Not sure if this needs to be more portable
|
1238
1242
|
# This option is only intended for use by the test suite
|
@@ -1293,6 +1297,14 @@ class Tpkg
|
|
1293
1297
|
@available_packages_cache = {}
|
1294
1298
|
end
|
1295
1299
|
|
1300
|
+
attr_reader :base
|
1301
|
+
attr_reader :sources
|
1302
|
+
attr_reader :report_server
|
1303
|
+
attr_reader :lockforce
|
1304
|
+
attr_reader :force
|
1305
|
+
attr_reader :sudo
|
1306
|
+
attr_reader :file_system_root
|
1307
|
+
|
1296
1308
|
def source_to_local_directory(source)
|
1297
1309
|
source_as_directory = source.gsub(/[^a-zA-Z0-9]/, '')
|
1298
1310
|
File.join(@sources_directory, source_as_directory)
|
@@ -2774,6 +2786,11 @@ class Tpkg
|
|
2774
2786
|
|
2775
2787
|
def install_crontabs(metadata)
|
2776
2788
|
crontab_destinations(metadata).each do |crontab, destination|
|
2789
|
+
if !@sudo && (destination[destination.keys.first] =~ /\/var\/spool\/cron/)
|
2790
|
+
install_crontab_bycmd(metadata, crontab, destination)
|
2791
|
+
next
|
2792
|
+
end
|
2793
|
+
|
2777
2794
|
begin
|
2778
2795
|
if destination[:link]
|
2779
2796
|
install_crontab_link(metadata, crontab, destination)
|
@@ -2868,8 +2885,25 @@ class Tpkg
|
|
2868
2885
|
# FIXME: On Solaris we should bounce cron or use the crontab
|
2869
2886
|
# command, otherwise cron won't pick up the changes
|
2870
2887
|
end
|
2888
|
+
def install_crontab_bycmd(metadata, crontab, destination)
|
2889
|
+
oldcron = `crontab -l`
|
2890
|
+
tmpf = '/tmp/tpkg_cron.' + rand.to_s
|
2891
|
+
tmpfh = File.open(tmpf,'w')
|
2892
|
+
tmpfh.write(oldcron) unless oldcron.empty?
|
2893
|
+
tmpfh.puts "### TPKG START - #{@base} - #{File.basename(metadata[:filename].to_s)}"
|
2894
|
+
tmpfh.write File.readlines(crontab)
|
2895
|
+
tmpfh.puts "### TPKG END - #{@base} - #{File.basename(metadata[:filename].to_s)}"
|
2896
|
+
tmpfh.close
|
2897
|
+
`crontab #{tmpf}`
|
2898
|
+
FileUtils.rm(tmpf)
|
2899
|
+
end
|
2871
2900
|
def remove_crontabs(metadata)
|
2872
2901
|
crontab_destinations(metadata).each do |crontab, destination|
|
2902
|
+
if !@sudo && (destination[destination.keys.first] =~ /\/var\/spool\/cron/)
|
2903
|
+
remove_crontab_bycmd(metadata, crontab, destination)
|
2904
|
+
next
|
2905
|
+
end
|
2906
|
+
|
2873
2907
|
begin
|
2874
2908
|
if destination[:link]
|
2875
2909
|
remove_crontab_link(metadata, crontab, destination)
|
@@ -2937,6 +2971,24 @@ class Tpkg
|
|
2937
2971
|
# command, otherwise cron won't pick up the changes
|
2938
2972
|
end
|
2939
2973
|
end
|
2974
|
+
def remove_crontab_bycmd(metadata, crontab, destination)
|
2975
|
+
oldcron = `crontab -l`
|
2976
|
+
tmpf = '/tmp/tpkg_cron.' + rand.to_s
|
2977
|
+
tmpfh = File.open(tmpf,'w')
|
2978
|
+
skip = false
|
2979
|
+
oldcron.each do |line|
|
2980
|
+
if line == "### TPKG START - #{@base} - #{File.basename(metadata[:filename].to_s)}\n"
|
2981
|
+
skip = true
|
2982
|
+
elsif line == "### TPKG END - #{@base} - #{File.basename(metadata[:filename].to_s)}\n"
|
2983
|
+
skip = false
|
2984
|
+
elsif !skip
|
2985
|
+
tmpfh.write(line)
|
2986
|
+
end
|
2987
|
+
end
|
2988
|
+
tmpfh.close
|
2989
|
+
`crontab #{tmpf}`
|
2990
|
+
FileUtils.rm(tmpf)
|
2991
|
+
end
|
2940
2992
|
|
2941
2993
|
def run_preinstall(package_file, workdir)
|
2942
2994
|
if File.exist?(File.join(workdir, 'tpkg', 'preinstall'))
|
@@ -3222,7 +3274,7 @@ class Tpkg
|
|
3222
3274
|
|
3223
3275
|
if !all_requests_satisfied
|
3224
3276
|
puts errors.join("\n")
|
3225
|
-
raise "Unable to satisfy the request(s)"
|
3277
|
+
raise "Unable to satisfy the request(s). Try running with --debug for more info"
|
3226
3278
|
end
|
3227
3279
|
end
|
3228
3280
|
|
@@ -3412,7 +3464,7 @@ class Tpkg
|
|
3412
3464
|
#solution_packages = best_solution(requirements.dup, packages.dup)
|
3413
3465
|
solution_packages = best_solution(requirements, packages, core_packages)
|
3414
3466
|
if !solution_packages
|
3415
|
-
raise "Unable to resolve dependencies"
|
3467
|
+
raise "Unable to resolve dependencies. Try running with --debug for more info"
|
3416
3468
|
end
|
3417
3469
|
|
3418
3470
|
success = handle_conflicting_pkgs(installed_packages, solution_packages, options)
|
@@ -3634,7 +3686,7 @@ class Tpkg
|
|
3634
3686
|
solution_packages = best_solution(requirements, packages, core_packages)
|
3635
3687
|
|
3636
3688
|
if solution_packages.nil?
|
3637
|
-
raise "Unable to find solution for upgrading. Please verify that you specified the correct package(s) for upgrade."
|
3689
|
+
raise "Unable to find solution for upgrading. Please verify that you specified the correct package(s) for upgrade. Try running with --debug for more info"
|
3638
3690
|
end
|
3639
3691
|
|
3640
3692
|
success = handle_conflicting_pkgs(installed_packages, solution_packages, options)
|
@@ -4387,7 +4439,7 @@ class Tpkg
|
|
4387
4439
|
parse_requests(requests, requirements, packages)
|
4388
4440
|
packages = packages.values.flatten
|
4389
4441
|
if packages.size < 1
|
4390
|
-
puts "Unable to find any packages that satisfy your request."
|
4442
|
+
puts "Unable to find any packages that satisfy your request. Try running with --debug for more info"
|
4391
4443
|
Dir.chdir(original_dir)
|
4392
4444
|
return GENERIC_ERR
|
4393
4445
|
end
|
metadata
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tpkg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease: false
|
6
|
-
segments:
|
7
|
-
- 2
|
8
|
-
- 0
|
9
|
-
- 0
|
10
|
-
version: 2.0.0
|
4
|
+
version: 2.0.1
|
11
5
|
platform: ruby
|
12
6
|
authors:
|
13
7
|
- Darren Dao
|
@@ -16,51 +10,39 @@ autorequire:
|
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
12
|
|
19
|
-
date: 2010-
|
13
|
+
date: 2010-10-22 00:00:00 -07:00
|
20
14
|
default_executable:
|
21
15
|
dependencies:
|
22
16
|
- !ruby/object:Gem::Dependency
|
23
17
|
name: facter
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
21
|
requirements:
|
28
22
|
- - ">="
|
29
23
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
|
-
segments:
|
32
|
-
- 0
|
33
24
|
version: "0"
|
34
|
-
|
35
|
-
version_requirements: *id001
|
25
|
+
version:
|
36
26
|
- !ruby/object:Gem::Dependency
|
37
27
|
name: net-ssh
|
38
|
-
|
39
|
-
|
40
|
-
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
31
|
requirements:
|
42
32
|
- - ">="
|
43
33
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 3
|
45
|
-
segments:
|
46
|
-
- 0
|
47
34
|
version: "0"
|
48
|
-
|
49
|
-
version_requirements: *id002
|
35
|
+
version:
|
50
36
|
- !ruby/object:Gem::Dependency
|
51
37
|
name: ddao-kwalify
|
52
|
-
|
53
|
-
|
54
|
-
|
38
|
+
type: :runtime
|
39
|
+
version_requirement:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
41
|
requirements:
|
56
42
|
- - ">="
|
57
43
|
- !ruby/object:Gem::Version
|
58
|
-
hash: 3
|
59
|
-
segments:
|
60
|
-
- 0
|
61
44
|
version: "0"
|
62
|
-
|
63
|
-
version_requirements: *id003
|
45
|
+
version:
|
64
46
|
description:
|
65
47
|
email: tpkg-users@lists.sourceforge.net
|
66
48
|
executables:
|
@@ -111,28 +93,21 @@ rdoc_options: []
|
|
111
93
|
require_paths:
|
112
94
|
- lib
|
113
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
96
|
requirements:
|
116
97
|
- - ">="
|
117
98
|
- !ruby/object:Gem::Version
|
118
|
-
hash: 31
|
119
|
-
segments:
|
120
|
-
- 1
|
121
|
-
- 8
|
122
99
|
version: "1.8"
|
100
|
+
version:
|
123
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
-
none: false
|
125
102
|
requirements:
|
126
103
|
- - ">="
|
127
104
|
- !ruby/object:Gem::Version
|
128
|
-
hash: 3
|
129
|
-
segments:
|
130
|
-
- 0
|
131
105
|
version: "0"
|
106
|
+
version:
|
132
107
|
requirements: []
|
133
108
|
|
134
109
|
rubyforge_project: tpkg
|
135
|
-
rubygems_version: 1.3.
|
110
|
+
rubygems_version: 1.3.5
|
136
111
|
signing_key:
|
137
112
|
specification_version: 3
|
138
113
|
summary: tpkg Application Packaging & Deployment
|