tpkg 1.22.1 → 1.23.2

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 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 = '1.22.1'
8
+ s.version = '1.23.2'
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'
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/ruby -w
2
2
 
3
3
  # Ensure we can find tpkg.rb
4
- $:.unshift File.dirname(__FILE__)
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
 
6
6
  require 'fileutils' # FileUtils.cp, rm, etc.
7
7
  require 'tempfile' # Tempfile
@@ -321,10 +321,16 @@ def package(gem)
321
321
  end
322
322
  when '~>'
323
323
  # ~> 2.2 is equivalent to >= 2.2 and < 3
324
+ # ~> 2.2.0 is equivalent to >= 2.2.0 and < 2.3.0
324
325
  deps[depgem][:minimum_version] = depver
325
- majorver = depver.split('.').first.to_i
326
- maxver = "#{majorver}.9999.9999"
327
- deps[depgem][:maximum_version] = maxver
326
+ # '2.2.0' -> ['2', '2', '0']
327
+ depverparts = depver.split('.')
328
+ # ['2', '2', '0'] -> ['2', '2']
329
+ depverparts.pop
330
+ # ['2', '2'] -> ['2', '2', '9999']
331
+ depverparts << '9999'
332
+ # ['2', '2', '9999'] -> '2.2.9999'
333
+ deps[depgem][:maximum_version] = depverparts.join('.')
328
334
  end
329
335
  end
330
336
  end
data/bin/tpkg CHANGED
@@ -239,9 +239,13 @@ end
239
239
  opts.on('--force', 'Force the execution of a given task') do |opt|
240
240
  @force = opt
241
241
  end
242
- opts.on('--use-ssh-key', 'Use ssh key for deploying instead of password') do |opt|
243
- @deploy_options["use-ssh-key"] = opt
244
- @deploy_params = @deploy_params - ['--use-ssh-key']
242
+ opts.on('-o', '--out', '=DIR', 'Output directory for the -m option') do |opt|
243
+ @other_options[:out] = opt
244
+ end
245
+ opts.on('--use-ssh-key [FILE]', 'Use ssh key for deploying instead of password') do |opt|
246
+ @deploy_options["use-ssh-key"] = true
247
+ @deploy_options["ssh-key"] = opt
248
+ @deploy_params = @deploy_params - ['--use-ssh-key', opt, "--use-ssh-key=#{opt}"]
245
249
  end
246
250
  opts.on('--deploy-as', '=USERNAME', 'What username to use for deploying to remote server') do |opt|
247
251
  @deploy_options["deploy-as"] = opt
@@ -341,6 +345,18 @@ if @deploy
341
345
  # puts "Creating deployer with #{@worker_count} number of worker"
342
346
  @deploy_options["max-worker"] = @worker_count
343
347
  @deploy_options["abort-on-fail"] = false
348
+
349
+ # check to see if ssh-key is accessible
350
+ ssh_key = @deploy_options["use-ssh-key"]
351
+ if ssh_key && ssh_key.is_a?(String)
352
+ if !File.readable?(ssh_key) && Process.euid == 0
353
+ raise "Unable to read ssh key from #{ssh_key}"
354
+ elsif !File.readable?(ssh_key)
355
+ warn "Warning: Unable to read ssh key from #{ssh_key}. Attempting to rerun tpkg with sudo."
356
+ rerun_with_sudo_if_necessary
357
+ end
358
+ end
359
+
344
360
  Tpkg::deploy(@deploy_params, @deploy_options, @servers)
345
361
  exit
346
362
  end
@@ -349,10 +365,17 @@ if @action_value.is_a?(Array)
349
365
  @action_value.uniq!
350
366
  end
351
367
 
368
+ # tell tpkg not to prompt if stdin is not tty
369
+ if !$stdin.tty?
370
+ Tpkg::set_prompt(false)
371
+ end
372
+
352
373
  ret_val = 0
353
374
  case @action
354
375
  when :make
355
- pkgfile = Tpkg::make_package(@action_value, passphrase_callback, {:force => @force, :compress => @compress})
376
+ @other_options[:force] = @force
377
+ @other_options[:compress] = @compress
378
+ pkgfile = Tpkg::make_package(@action_value, passphrase_callback, @other_options)
356
379
  if pkgfile
357
380
  puts "Package is #{pkgfile}"
358
381
  else
@@ -493,7 +516,7 @@ when :query_who_owns_file
493
516
  tpkg = instantiate_tpkg(@tpkg_options)
494
517
  tpkg.files_for_installed_packages.each do |pkgfile, fip|
495
518
  fip[:normalized].each do |file|
496
- if file == @action_value
519
+ if file == File.expand_path(@action_value)
497
520
  puts "#{file}: #{pkgfile}"
498
521
  end
499
522
  end
@@ -56,7 +56,7 @@ require 'kwalify' # for validating yaml
56
56
 
57
57
  class Tpkg
58
58
 
59
- VERSION = '1.22.1'
59
+ VERSION = '1.23.2'
60
60
  CONFIGDIR = '/etc'
61
61
 
62
62
  GENERIC_ERR = 1
@@ -225,6 +225,17 @@ class Tpkg
225
225
  # Makes a package from a directory containing the files to put into the package
226
226
  def self.make_package(pkgsrcdir, passphrase=nil, options = {})
227
227
  pkgfile = nil
228
+
229
+ # validate the output directory if the user has specified one
230
+ outdir = options[:out]
231
+ if outdir
232
+ outdir = File.expand_path(outdir)
233
+ if !File.directory?(outdir)
234
+ raise "#{outdir} is not a valid directory"
235
+ elsif !File.writable?(outdir)
236
+ raise "#{outdir} is not writable"
237
+ end
238
+ end
228
239
 
229
240
  # Make a working directory
230
241
  workdir = nil
@@ -341,7 +352,13 @@ class Tpkg
341
352
  package_filename = metadata.generate_package_filename
342
353
  package_directory = File.join(workdir, package_filename)
343
354
  Dir.mkdir(package_directory)
344
- pkgfile = File.join(File.dirname(pkgsrcdir), package_filename + '.tpkg')
355
+
356
+ if outdir
357
+ pkgfile = File.join(outdir, package_filename + '.tpkg')
358
+ else
359
+ pkgfile = File.join(File.dirname(pkgsrcdir), package_filename + '.tpkg')
360
+ end
361
+
345
362
  if File.exist?(pkgfile) || File.symlink?(pkgfile)
346
363
  if @@prompt
347
364
  print "Package file #{pkgfile} already exists, overwrite? [y/N]"
@@ -383,7 +400,7 @@ class Tpkg
383
400
  # Remove our working directory
384
401
  FileUtils.rm_rf(workdir)
385
402
  end
386
-
403
+
387
404
  # Return the filename of the package
388
405
  pkgfile
389
406
  end
@@ -1382,9 +1399,10 @@ class Tpkg
1382
1399
  if Tpkg::get_os =~ /RedHat|CentOS|Fedora/
1383
1400
  [ {:arg => 'installed', :header => 'Installed', :source => :native_installed},
1384
1401
  {:arg => 'available', :header => 'Available', :source => :native_available} ].each do |yum|
1385
- puts "available_native_packages running 'yum list #{yum[:arg]} #{pkgname}'" if @@debug
1402
+ cmd = "yum info #{yum[:arg]} #{pkgname}"
1403
+ puts "available_native_packages running '#{cmd}'" if @@debug
1386
1404
  stderr_first_line = nil
1387
- Open3.popen3("yum info #{yum[:arg]} #{pkgname}") do |stdin, stdout, stderr|
1405
+ Open3.popen3(cmd) do |stdin, stdout, stderr|
1388
1406
  stdin.close
1389
1407
  read_packages = false
1390
1408
  name = version = package_version = nil
@@ -3784,7 +3802,7 @@ class Tpkg
3784
3802
  if options[:remove_all_dep]
3785
3803
  packages_to_remove |= get_dependents(packages_to_remove)
3786
3804
  elsif options[:remove_all_prereq]
3787
- puts "Attemping to remove #{packages_to_remove.map do |pkg| pkg[:metadata][:filename] end} and all prerequisites."
3805
+ puts "Attempting to remove #{packages_to_remove.map do |pkg| pkg[:metadata][:filename] end} and all prerequisites."
3788
3806
  # Get list of dependency prerequisites
3789
3807
  ptr = packages_to_remove | get_prerequisites(packages_to_remove)
3790
3808
  pkg_files_to_remove = ptr.map { |pkg| pkg[:metadata][:filename] }
@@ -4113,10 +4131,14 @@ class Tpkg
4113
4131
  packages_to_execute_on.concat(installed_packages_that_meet_requirement(req))
4114
4132
  end
4115
4133
  end
4116
-
4117
- packages_to_execute_on.each do |pkg|
4118
- ret_val |= execute_init_for_package(pkg, action, requested_init_scripts)
4119
- end
4134
+
4135
+ if packages_to_execute_on.empty?
4136
+ warn "Warning: Unable to find package(s) \"#{requested_packages.join(",")}\"."
4137
+ else
4138
+ packages_to_execute_on.each do |pkg|
4139
+ ret_val |= execute_init_for_package(pkg, action, requested_init_scripts)
4140
+ end
4141
+ end
4120
4142
  return ret_val
4121
4143
  end
4122
4144
 
@@ -34,6 +34,7 @@ class Deployer
34
34
  @max_worker = options["max-worker"]
35
35
  @abort_on_failure = options["abort-on-failure"]
36
36
  @use_ssh_key = options["use-ssh-key"]
37
+ @ssh_key = options["ssh-key"]
37
38
  end
38
39
  end
39
40
 
@@ -79,13 +80,17 @@ class Deployer
79
80
  end
80
81
 
81
82
  # Return a block that can be used for executing a cmd on the remote server
82
- def ssh_execute(server, username, password, cmd)
83
+ def ssh_execute(server, username, password, key, cmd)
83
84
  return lambda {
84
85
  exit_status = 0
85
86
  result = []
86
87
 
88
+ params = {}
89
+ params[:password] = password if password
90
+ params[:keys] = [key] if key
91
+
87
92
  begin
88
- Net::SSH.start(server, username, :password => password) do |ssh|
93
+ Net::SSH.start(server, username, params) do |ssh|
89
94
  puts "Connecting to #{server}"
90
95
  ch = ssh.open_channel do |channel|
91
96
  # now we request a "pty" (i.e. interactive) session so we can send data
@@ -176,6 +181,7 @@ class Deployer
176
181
  if servers.kind_of?(Proc)
177
182
  deploy_to = servers.call
178
183
  elsif servers.size == 1 && File.exists?(servers[0])
184
+ puts "Reading server list from file #{servers[0]}"
179
185
  File.open(servers[0], 'r') do |f|
180
186
  while line = f.gets
181
187
  deploy_to << line.chomp.split(",")
@@ -188,7 +194,7 @@ class Deployer
188
194
 
189
195
  deploy_to.each do | server |
190
196
  tp.process do
191
- status = ssh_execute(server, @user, @password, cmd).call
197
+ status = ssh_execute(server, @user, @password, @ssh_key, cmd).call
192
198
  statuses[server] = status
193
199
  end
194
200
  end
@@ -0,0 +1,87 @@
1
+ type: map
2
+ mapping:
3
+ "schema_file": { type: text }
4
+ "name": { type: str, required: yes }
5
+ "version": { type: text, required: yes }
6
+ "package_version": { type: text }
7
+ "maintainer": { type: str, required: yes }
8
+ "operatingsystem": { type: seq, sequence: [ {type: str} ] }
9
+ "architecture": { type: seq, sequence: [ {type: str} ] }
10
+ "description": { type: str }
11
+ "bugreporting": { type: str }
12
+ "dependencies":
13
+ type: seq
14
+ sequence:
15
+ - type: map
16
+ mapping:
17
+ "name": { type: str, required: yes }
18
+ "minimum_version": { type: text }
19
+ "maximum_version": { type: text }
20
+ "minimum_package_version": { type: text }
21
+ "maximum_package_version": { type: text }
22
+ "allowed_versions": { type: text }
23
+ "native": { type: bool }
24
+ "type": { type: any, pattern: /(native|tpkg)$/ }
25
+ "conflicts":
26
+ type: seq
27
+ sequence:
28
+ - type: map
29
+ mapping:
30
+ "name": { type: str, required: yes }
31
+ "minimum_version": { type: text }
32
+ "maximum_version": { type: text }
33
+ "minimum_package_version": { type: text }
34
+ "maximum_package_version": { type: text }
35
+ "native": { type: bool }
36
+ "type": { type: any, pattern: /(native|tpkg)$/ }
37
+ "externals":
38
+ type: seq
39
+ sequence:
40
+ - type: map
41
+ mapping:
42
+ "name": { type: text, required: yes }
43
+ "data": { type: text }
44
+ "datascript": { type: text }
45
+ "datafile": { type: text }
46
+ "files":
47
+ type: map
48
+ mapping:
49
+ "file_defaults":
50
+ type: map
51
+ mapping:
52
+ "posix":
53
+ type: map
54
+ mapping:
55
+ "owner": { type: text }
56
+ "group": { type: text }
57
+ "perms": { type: text }
58
+ "dirs_defaults":
59
+ type: map
60
+ mapping:
61
+ "posix":
62
+ type: map
63
+ mapping:
64
+ "owner": { type: text }
65
+ "group": { type: text }
66
+ "perms": { type: text }
67
+ "files":
68
+ type: seq
69
+ sequence:
70
+ - type: map
71
+ mapping:
72
+ "path": { type: text, required: yes }
73
+ "encrypt": { type: any, pattern: /^true$|^precrypt$/ }
74
+ "init":
75
+ type: map
76
+ mapping:
77
+ "start": { type: int }
78
+ "levels": { type: seq, sequence: [ { type: int } ] }
79
+ "crontab":
80
+ type: map
81
+ mapping: { "user": { type: str } }
82
+ "posix":
83
+ type: map
84
+ mapping: { "owner": { type: text },
85
+ "group": { type: text },
86
+ "perms": { type: text } }
87
+
@@ -19,6 +19,7 @@ mapping:
19
19
  "maximum_version": { type: text }
20
20
  "minimum_package_version": { type: text }
21
21
  "maximum_package_version": { type: text }
22
+ "allowed_versions": { type: text }
22
23
  "native": { type: bool }
23
24
  "type": { type: any, pattern: /(native|tpkg)$/ }
24
25
  "conflicts":
@@ -0,0 +1,42 @@
1
+ <!ELEMENT tpkg (name, version, package_version?, maintainer+, operatingsystem*, architecture*, description?, bugreporting?, dependencies?, externals?, files?)>
2
+
3
+ <!ELEMENT name (#PCDATA)>
4
+ <!ELEMENT version (#PCDATA)>
5
+ <!ELEMENT package_version (#PCDATA)>
6
+ <!ELEMENT maintainer (#PCDATA)>
7
+ <!ELEMENT operatingsystem (#PCDATA)>
8
+ <!ELEMENT architecture (#PCDATA)>
9
+ <!ELEMENT description (#PCDATA)>
10
+ <!ELEMENT bugreporting (#PCDATA)>
11
+
12
+ <!ELEMENT dependencies (dependency*)>
13
+ <!ELEMENT dependency (name, minimum_version?, maximum_version?, minimum_package_version?, maximum_package_version?, allowed_versions?, native?)>
14
+ <!ELEMENT minimum_version (#PCDATA)>
15
+ <!ELEMENT maximum_version (#PCDATA)>
16
+ <!ELEMENT minimum_package_version (#PCDATA)>
17
+ <!ELEMENT maximum_package_version (#PCDATA)>
18
+ <!ELEMENT allowed_versions (#PCDATA)>
19
+ <!ELEMENT native EMPTY>
20
+
21
+ <!ELEMENT externals (external*)>
22
+ <!ELEMENT external (name, (data|datafile|datascript))>
23
+ <!ELEMENT data (#PCDATA)>
24
+ <!ELEMENT datafile (#PCDATA)>
25
+ <!ELEMENT datascript (#PCDATA)>
26
+
27
+ <!ELEMENT files (file_defaults?, file*)>
28
+ <!ELEMENT file_defaults (posix?)>
29
+ <!ELEMENT posix (owner?, group?, perms?)>
30
+ <!ELEMENT owner (#PCDATA)>
31
+ <!ELEMENT group (#PCDATA)>
32
+ <!ELEMENT perms (#PCDATA)>
33
+ <!ELEMENT file (path, encrypt?, init?, crontab?, posix?)>
34
+ <!ELEMENT path (#PCDATA)>
35
+ <!ELEMENT encrypt EMPTY>
36
+ <!ATTLIST encrypt precrypt (true|false) #IMPLIED>
37
+ <!ELEMENT init (start?, levels?)>
38
+ <!ELEMENT start (#PCDATA)>
39
+ <!ELEMENT levels (#PCDATA)>
40
+ <!ELEMENT crontab (user?)>
41
+ <!ELEMENT user (#PCDATA)>
42
+
@@ -10,11 +10,12 @@
10
10
  <!ELEMENT bugreporting (#PCDATA)>
11
11
 
12
12
  <!ELEMENT dependencies (dependency*)>
13
- <!ELEMENT dependency (name, minimum_version?, maximum_version?, minimum_package_version?, maximum_package_version?, native?)>
13
+ <!ELEMENT dependency (name, minimum_version?, maximum_version?, minimum_package_version?, maximum_package_version?, allowed_versions?, native?)>
14
14
  <!ELEMENT minimum_version (#PCDATA)>
15
15
  <!ELEMENT maximum_version (#PCDATA)>
16
16
  <!ELEMENT minimum_package_version (#PCDATA)>
17
17
  <!ELEMENT maximum_package_version (#PCDATA)>
18
+ <!ELEMENT allowed_versions (#PCDATA)>
18
19
  <!ELEMENT native EMPTY>
19
20
 
20
21
  <!ELEMENT externals (external*)>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tpkg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.22.1
4
+ version: 1.23.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Dao
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-04-23 00:00:00 +00:00
13
+ date: 2010-05-17 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -68,7 +68,9 @@ files:
68
68
  - schema/tpkg-1.0.3.dtd
69
69
  - schema/schema.yml
70
70
  - schema/tpkg-1.0.2.dtd
71
+ - schema/schema-1.0.6.yml
71
72
  - schema/schema-1.0.yml
73
+ - schema/tpkg-1.0.6.dtd
72
74
  - schema/schema-1.0.5.yml
73
75
  - bin/tpkg
74
76
  - bin/cpan2tpkg