vanagon 0.4.1 → 0.5.0
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.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/bin/build +1 -1
- data/lib/makefile.rb +67 -0
- data/lib/vanagon/component.rb +16 -2
- data/lib/vanagon/component/dsl.rb +34 -3
- data/lib/vanagon/component/rules.rb +217 -0
- data/lib/vanagon/component/source/http.rb +8 -3
- data/lib/vanagon/driver.rb +12 -5
- data/lib/vanagon/engine/hardware.rb +64 -0
- data/lib/vanagon/optparse.rb +16 -33
- data/lib/vanagon/patch.rb +39 -0
- data/lib/vanagon/platform.rb +3 -2
- data/lib/vanagon/platform/dsl.rb +23 -5
- data/lib/vanagon/platform/rpm/eos.rb +83 -0
- data/lib/vanagon/platform/solaris_10.rb +19 -4
- data/lib/vanagon/utilities/shell_utilities.rb +29 -0
- data/spec/lib/makefile_spec.rb +50 -0
- data/spec/lib/vanagon/component/dsl_spec.rb +61 -2
- data/spec/lib/vanagon/component/rules_spec.rb +302 -0
- data/spec/lib/vanagon/component_spec.rb +17 -0
- data/spec/lib/vanagon/engine/hardware_spec.rb +48 -0
- data/spec/lib/vanagon/optparse_spec.rb +40 -0
- data/spec/lib/vanagon/utilities/shell_utilities_spec.rb +32 -0
- data/templates/Makefile.erb +1 -58
- data/templates/rpm/project.spec.erb +1 -1
- metadata +33 -4
- data/lib/vanagon/platform/swix.rb +0 -35
@@ -10,10 +10,10 @@ class Vanagon
|
|
10
10
|
attr_accessor :url, :sum, :file, :extension, :workdir, :cleanup
|
11
11
|
|
12
12
|
# Extensions for files we intend to unpack during the build
|
13
|
-
ARCHIVE_EXTENSIONS = '.tar.gz', '.tgz'
|
13
|
+
ARCHIVE_EXTENSIONS = '.tar.gz', '.tgz', '.zip'
|
14
14
|
|
15
15
|
# Extensions for files we aren't going to unpack during the build
|
16
|
-
NON_ARCHIVE_EXTENSIONS = '.gem', '.ru', '.txt', '.conf', '.ini', '.gpg', '.rb', '.sh', '.csh', '.xml'
|
16
|
+
NON_ARCHIVE_EXTENSIONS = '.gem', '.ru', '.txt', '.conf', '.ini', '.gpg', '.rb', '.sh', '.csh', '.xml', '.vim', '.json', '.service'
|
17
17
|
|
18
18
|
# Constructor for the Http source type
|
19
19
|
#
|
@@ -100,7 +100,12 @@ class Vanagon
|
|
100
100
|
# @raise [RuntimeError] an exception is raised if there is no known extraction method for @extension
|
101
101
|
def extract(tar)
|
102
102
|
if ARCHIVE_EXTENSIONS.include?(@extension)
|
103
|
-
|
103
|
+
case @extension
|
104
|
+
when ".tar.gz", ".tgz"
|
105
|
+
return "gunzip -c '#{@file}' | '#{tar}' xf -"
|
106
|
+
when ".zip"
|
107
|
+
return "unzip '#{@file}'"
|
108
|
+
end
|
104
109
|
elsif NON_ARCHIVE_EXTENSIONS.include?(@extension)
|
105
110
|
# Don't need to unpack gems, ru, txt, conf, ini, gpg
|
106
111
|
return nil
|
data/lib/vanagon/driver.rb
CHANGED
@@ -12,7 +12,7 @@ class Vanagon
|
|
12
12
|
include Vanagon::Utilities
|
13
13
|
attr_accessor :platform, :project, :target, :workdir, :verbose, :preserve
|
14
14
|
|
15
|
-
def initialize(platform, project, options = { :configdir => nil, :target => nil, :engine => nil, :components => nil })
|
15
|
+
def initialize(platform, project, options = { :configdir => nil, :target => nil, :engine => nil, :components => nil, :skipcheck => false })
|
16
16
|
@verbose = false
|
17
17
|
@preserve = false
|
18
18
|
|
@@ -23,16 +23,19 @@ class Vanagon
|
|
23
23
|
|
24
24
|
@platform = Vanagon::Platform.load_platform(platform, File.join(@@configdir, "platforms"))
|
25
25
|
@project = Vanagon::Project.load_project(project, File.join(@@configdir, "projects"), @platform, components)
|
26
|
+
@project.settings[:skipcheck] = options[:skipcheck]
|
27
|
+
@@logger = Logger.new('vanagon_hosts.log')
|
28
|
+
@@logger.progname = 'vanagon'
|
26
29
|
|
27
30
|
# If a target has been given, we don't want to make any assumptions about how to tear it down.
|
28
31
|
engine = 'base' if target
|
32
|
+
# Hardware has explicit teardown to unlock the node
|
33
|
+
engine = 'hardware' if @platform.build_hosts
|
29
34
|
require "vanagon/engine/#{engine}"
|
30
35
|
@engine = Object.const_get("Vanagon::Engine::#{engine.capitalize}").new(@platform, target)
|
31
36
|
|
32
|
-
@@logger = Logger.new('vanagon_hosts.log')
|
33
|
-
@@logger.progname = 'vanagon'
|
34
37
|
rescue LoadError => e
|
35
|
-
raise Vanagon::Error.wrap(e, "Could not load the desired engine '#{
|
38
|
+
raise Vanagon::Error.wrap(e, "Could not load the desired engine '#{engine}'")
|
36
39
|
end
|
37
40
|
|
38
41
|
def cleanup_workdir
|
@@ -88,7 +91,11 @@ class Vanagon
|
|
88
91
|
puts e
|
89
92
|
puts e.backtrace.join("\n")
|
90
93
|
raise e
|
91
|
-
|
94
|
+
ensure
|
95
|
+
if @engine == "hardware"
|
96
|
+
@engine.teardown
|
97
|
+
end
|
98
|
+
end
|
92
99
|
|
93
100
|
def prepare(workdir = nil)
|
94
101
|
@workdir = workdir ? FileUtils.mkdir_p(workdir).first : Dir.mktmpdir
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'vanagon/engine/base'
|
2
|
+
require 'json'
|
3
|
+
require 'lock_manager'
|
4
|
+
|
5
|
+
LOCK_MANAGER_HOST = ENV['LOCK_MANAGER_HOST'] || 'redis'
|
6
|
+
LOCK_MANAGER_PORT = ENV['LOCK_MANAGER_PORT'] || 6379
|
7
|
+
VANAGON_LOCK_USER = ENV['USER']
|
8
|
+
|
9
|
+
|
10
|
+
class Vanagon
|
11
|
+
class Engine
|
12
|
+
# Class to use when building on a hardware device (e.g. AIX, Switch, etc)
|
13
|
+
#
|
14
|
+
class Hardware < Base
|
15
|
+
|
16
|
+
# This method is used to obtain a vm to build upon
|
17
|
+
# For the base class we just return the target that was passed in
|
18
|
+
def select_target
|
19
|
+
@target = node_lock(@build_hosts)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Poll for a lock
|
23
|
+
def polling_lock(host)
|
24
|
+
Vanagon::Driver.logger.info "Polling for a lock on #{host}."
|
25
|
+
@lockman.polling_lock(host, VANAGON_LOCK_USER, "Vanagon automated lock")
|
26
|
+
Vanagon::Driver.logger.info "Lock acquired on #{host}."
|
27
|
+
puts "Lock acquired on #{host} for #{VANAGON_LOCK_USER}."
|
28
|
+
host
|
29
|
+
end
|
30
|
+
|
31
|
+
# Iterarte over the options and find a node open to lock.
|
32
|
+
def node_lock(hosts)
|
33
|
+
hosts.each do |h|
|
34
|
+
Vanagon::Driver.logger.info "Attempting to lock #{h}."
|
35
|
+
if @lockman.lock(h, VANAGON_LOCK_USER, "Vanagon automated lock")
|
36
|
+
Vanagon::Driver.logger.info "Lock acquired on #{h}."
|
37
|
+
puts "Lock acquired on #{h} for #{VANAGON_LOCK_USER}."
|
38
|
+
return h
|
39
|
+
end
|
40
|
+
end
|
41
|
+
# If they are all locked, fall back to a polling lock on last item
|
42
|
+
polling_lock(hosts.pop)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Steps needed to tear down or clean up the system after the build is
|
46
|
+
# complete. In this case, we'll attempt to unlock the hardware
|
47
|
+
def teardown
|
48
|
+
Vanagon::Driver.logger.info "Removing lock on #{@target}."
|
49
|
+
puts "Removing lock on #{@target}."
|
50
|
+
@lockman.unlock(@target, VANAGON_LOCK_USER)
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(platform, target)
|
54
|
+
Vanagon::Driver.logger.debug "Hardware engine invoked."
|
55
|
+
@platform = platform
|
56
|
+
@build_hosts = platform.build_hosts
|
57
|
+
# Redis is the only backend supported in lock_manager currently
|
58
|
+
@lockman = LockManager.new(type: 'redis', server: LOCK_MANAGER_HOST)
|
59
|
+
super
|
60
|
+
@required_attributes << "build_hosts"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/vanagon/optparse.rb
CHANGED
@@ -2,44 +2,27 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
class Vanagon
|
4
4
|
class OptParse
|
5
|
+
|
6
|
+
FLAGS = {
|
7
|
+
:workdir => ['-w DIR', '--workdir DIR', "Working directory where build source should be put (defaults to a tmpdir)"],
|
8
|
+
:configdir => ['-c', '--configdir DIR', 'Configs dir (defaults to $pwd/configs)'],
|
9
|
+
:target => ['-t HOST', '--target HOST', 'Configure a target machine for build and packaging (defaults to grabbing one from the pooler)'],
|
10
|
+
:engine => ['-e ENGINE', '--engine ENGINE', "A custom engine to use (defaults to the pooler) [base, local, docker, pooler currently supported]"],
|
11
|
+
:skipcheck => ['--skipcheck', 'Ship the `check` stage when building components'],
|
12
|
+
:preserve => ['-p', '--preserve', 'Whether to tear down the VM on success or not (defaults to false)'],
|
13
|
+
:verbose => ['-v', '--verbose', 'Verbose output (does nothing)'],
|
14
|
+
}
|
15
|
+
|
5
16
|
def initialize(banner, options = [])
|
6
17
|
@options = Hash[options.map { |v| [v, nil] }]
|
7
18
|
@optparse = OptionParser.new do |opts|
|
8
19
|
opts.banner = banner
|
9
20
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if @options.include?(:configdir)
|
17
|
-
opts.on('-c', '--configdir DIR', 'Configs dir (defaults to $pwd/configs)') do |dir|
|
18
|
-
@options[:configdir] = dir
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
if @options.include?(:target)
|
23
|
-
opts.on('-t HOST', '--target HOST', 'Configure a target machine for build and packaging (defaults to grabbing one from the pooler)') do |name|
|
24
|
-
@options[:target] = name
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
if @options.include?(:engine)
|
29
|
-
opts.on('-e ENGINE', '--engine ENGINE', "A custom engine to use (defaults to the pooler) [base, local, docker, pooler currently supported]") do |engine|
|
30
|
-
@options[:engine] = engine
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
if @options.include?(:preserve)
|
35
|
-
opts.on('-p', '--preserve', 'Whether to tear down the VM on success or not (defaults to false)') do |flag|
|
36
|
-
@options[:preserve] = flag
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
if @options.include?(:verbose)
|
41
|
-
opts.on('-v', '--verbose', 'Verbose output (does nothing)') do |flag|
|
42
|
-
@options[:verbose] = flag
|
21
|
+
FLAGS.each_pair do |name, args|
|
22
|
+
if @options.include?(name)
|
23
|
+
opts.on(*args) do |value|
|
24
|
+
@options[name] = value
|
25
|
+
end
|
43
26
|
end
|
44
27
|
end
|
45
28
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'vanagon/errors'
|
2
|
+
|
3
|
+
class Vanagon
|
4
|
+
class Patch
|
5
|
+
|
6
|
+
# @!attribute [r] path
|
7
|
+
# @return [String] The path to the patch
|
8
|
+
attr_reader :path
|
9
|
+
|
10
|
+
# @!attribute [r] strip
|
11
|
+
# @return [Integer] the number of path components to strip from the patch path
|
12
|
+
attr_reader :strip
|
13
|
+
|
14
|
+
# @!attribute [r] fuzz
|
15
|
+
# @return [Integer] The fuzz factor for applying the patch
|
16
|
+
attr_reader :fuzz
|
17
|
+
|
18
|
+
# @!attribute [r] after
|
19
|
+
# @return [String] What step should this patch be applied to, one of ["unpack", "install"]
|
20
|
+
attr_reader :after
|
21
|
+
|
22
|
+
# @!attribute [r] destination
|
23
|
+
# @return [String] The working directory where this patch will be applied. Only used for post-installation patches.
|
24
|
+
attr_reader :destination
|
25
|
+
|
26
|
+
def initialize(path, strip, fuzz, after, destination)
|
27
|
+
raise Vanagon::Error, "We can only apply patches after the source is unpacked or after installation" unless ['unpack', 'install'].include?(after)
|
28
|
+
@path = path
|
29
|
+
@strip = strip
|
30
|
+
@fuzz = fuzz
|
31
|
+
@after = after
|
32
|
+
@destination = destination
|
33
|
+
end
|
34
|
+
|
35
|
+
def cmd(platform)
|
36
|
+
"#{platform.patch} --strip=#{@strip} --fuzz=#{@fuzz} --ignore-whitespace < $(workdir)/patches/#{File.basename(@path)}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/vanagon/platform.rb
CHANGED
@@ -6,6 +6,7 @@ class Vanagon
|
|
6
6
|
attr_accessor :build_dependencies, :name, :vmpooler_template, :cflags, :ldflags, :settings
|
7
7
|
attr_accessor :servicetype, :patch, :architecture, :codename, :os_name, :os_version
|
8
8
|
attr_accessor :docker_image, :ssh_port, :rpmbuild, :install, :platform_triple
|
9
|
+
attr_accessor :package_type, :build_hosts
|
9
10
|
|
10
11
|
# Platform names currently contain some information about the platform. Fields
|
11
12
|
# within the name are delimited by the '-' character, and this regex can be used to
|
@@ -137,7 +138,7 @@ class Vanagon
|
|
137
138
|
#
|
138
139
|
# @return [true, false] true if it is a debian variety, false otherwise
|
139
140
|
def is_deb?
|
140
|
-
return !!@name.match(/^(debian|ubuntu|cumulus)-.*$/)
|
141
|
+
return !!@name.match(/^(debian|ubuntu|cumulus|huaweios)-.*$/)
|
141
142
|
end
|
142
143
|
|
143
144
|
# Utility matcher to determine is the platform is a redhat variety or
|
@@ -146,7 +147,7 @@ class Vanagon
|
|
146
147
|
# @return [true, false] true if it is a redhat variety or uses rpm
|
147
148
|
# under the hood, false otherwise
|
148
149
|
def is_rpm?
|
149
|
-
return !!@name.match(/^(aix|cisco-wrlinux|el|eos|fedora|
|
150
|
+
return !!@name.match(/^(aix|cisco-wrlinux|el|eos|fedora|sles)-.*$/)
|
150
151
|
end
|
151
152
|
|
152
153
|
# Utility matcher to determine is the platform is an enterprise linux variety
|
data/lib/vanagon/platform/dsl.rb
CHANGED
@@ -3,7 +3,7 @@ require 'vanagon/platform/rpm'
|
|
3
3
|
require 'vanagon/platform/rpm/aix'
|
4
4
|
require 'vanagon/platform/rpm/sles'
|
5
5
|
require 'vanagon/platform/rpm/wrl'
|
6
|
-
require 'vanagon/platform/
|
6
|
+
require 'vanagon/platform/rpm/eos'
|
7
7
|
require 'vanagon/platform/osx'
|
8
8
|
require 'vanagon/platform/solaris_10'
|
9
9
|
require 'vanagon/platform/solaris_11'
|
@@ -33,12 +33,10 @@ class Vanagon
|
|
33
33
|
Vanagon::Platform::RPM.new(@name)
|
34
34
|
when /^sles-/
|
35
35
|
Vanagon::Platform::RPM::SLES.new(@name)
|
36
|
-
when /^huaweios-/
|
37
|
-
Vanagon::Platform::RPM::WRL.new(@name)
|
38
|
-
when /^(cumulus|debian|ubuntu)-/
|
36
|
+
when /^(cumulus|debian|huaweios|ubuntu)-/
|
39
37
|
Vanagon::Platform::DEB.new(@name)
|
40
38
|
when /^eos-/
|
41
|
-
Vanagon::Platform::RPM::
|
39
|
+
Vanagon::Platform::RPM::EOS.new(@name)
|
42
40
|
when /^osx-/
|
43
41
|
Vanagon::Platform::OSX.new(@name)
|
44
42
|
when /^solaris-10/
|
@@ -92,6 +90,13 @@ class Vanagon
|
|
92
90
|
@platform.tar = tar_cmd
|
93
91
|
end
|
94
92
|
|
93
|
+
# Set the type of package we are going to build for this platform
|
94
|
+
#
|
95
|
+
# @param pkg_type [String] The type of package we are going to build for this platform
|
96
|
+
def package_type(pkg_type)
|
97
|
+
@platform.package_type = pkg_type
|
98
|
+
end
|
99
|
+
|
95
100
|
# Set the path to rpmbuild for the platform
|
96
101
|
#
|
97
102
|
# @param rpmbuild_cmd [String] Full path to rpmbuild with arguments to be used by default
|
@@ -156,6 +161,19 @@ class Vanagon
|
|
156
161
|
@platform.servicetype = type
|
157
162
|
end
|
158
163
|
|
164
|
+
# Set the list of possible host to perform a build on (when not using
|
165
|
+
# pooler or CLI flags)
|
166
|
+
#
|
167
|
+
# @param type [Array] the names of the hosts (must be resolvable)
|
168
|
+
# @rase ArgumentError if builds_hosts has no arguments
|
169
|
+
def build_hosts(*args)
|
170
|
+
raise ArgumentError, "build_hosts requires at least one host to be a build target." if args.empty?
|
171
|
+
@platform.build_hosts = Array(args).flatten
|
172
|
+
end
|
173
|
+
|
174
|
+
# Because single vs plural is annoying to remember
|
175
|
+
alias_method :build_host, :build_hosts
|
176
|
+
|
159
177
|
# Set the name of this platform as the vm pooler expects it
|
160
178
|
#
|
161
179
|
# @param name [String] name of the target template to use from the vmpooler
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class Vanagon
|
2
|
+
class Platform
|
3
|
+
class RPM
|
4
|
+
class EOS < Vanagon::Platform::RPM
|
5
|
+
# The specific bits used to generate an EOS package for a given project
|
6
|
+
#
|
7
|
+
# @param project [Vanagon::Project] project to build an EOS package of
|
8
|
+
# @return [Array] list of commands required to build the EOS package
|
9
|
+
# for the given project from an rpm or a swix
|
10
|
+
def generate_package(project)
|
11
|
+
# If nothing is passed in as platform type, default to building a swix package
|
12
|
+
if project.platform.package_type.nil? || project.platform.package_type.empty?
|
13
|
+
return generate_swix_package(project)
|
14
|
+
else
|
15
|
+
case project.platform.package_type
|
16
|
+
when "rpm"
|
17
|
+
return super(project)
|
18
|
+
when "swix"
|
19
|
+
return generate_swix_package(project)
|
20
|
+
else
|
21
|
+
fail "I don't know how to build package type '#{project.platform.package_type}' for EOS. Teach me?"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Method to derive the package name for the project
|
27
|
+
#
|
28
|
+
# @param project [Vanagon::Project] project to name
|
29
|
+
# @return [String] name of the EOS package for this project
|
30
|
+
def package_name(project)
|
31
|
+
# If nothing is passed in as platform type, default to building a swix package
|
32
|
+
if project.platform.package_type.nil? || project.platform.package_type.empty?
|
33
|
+
return swix_package_name(project)
|
34
|
+
else
|
35
|
+
case project.platform.package_type
|
36
|
+
when "rpm"
|
37
|
+
return super(project)
|
38
|
+
when "swix"
|
39
|
+
return swix_package_name(project)
|
40
|
+
else
|
41
|
+
fail "I don't know how to name package type '#{project.platform.package_type}' for EOS. Teach me?"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# The specific bits used to generate an SWIX package for a given project
|
47
|
+
#
|
48
|
+
# @param project [Vanagon::Project] project to build a SWIX package of
|
49
|
+
# @return [Array] list of commands required to build the SWIX package
|
50
|
+
# for the given project from an rpm
|
51
|
+
def generate_swix_package(project)
|
52
|
+
target_dir = project.repo ? output_dir(project.repo) : output_dir
|
53
|
+
commands = ["bash -c 'mkdir -p $(tempdir)/rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS}'",
|
54
|
+
"cp #{project.name}-#{project.version}.tar.gz $(tempdir)/rpmbuild/SOURCES",
|
55
|
+
"cp file-list-for-rpm $(tempdir)/rpmbuild/SOURCES",
|
56
|
+
"cp #{project.name}.spec $(tempdir)/rpmbuild/SPECS",
|
57
|
+
"PATH=/opt/freeware/bin:$$PATH #{@rpmbuild} -bb --target #{@architecture} #{rpm_defines} $(tempdir)/rpmbuild/SPECS/#{project.name}.spec",
|
58
|
+
"mkdir -p output/#{target_dir}",
|
59
|
+
"cp $(tempdir)/rpmbuild/*RPMS/**/*.rpm ./output/#{target_dir}"]
|
60
|
+
|
61
|
+
|
62
|
+
pkgname_swix = swix_package_name(project)
|
63
|
+
pkgname_rpm = pkgname_swix.sub(/swix$/, 'rpm')
|
64
|
+
commands += ["echo 'format: 1' > ./output/#{target_dir}/manifest.txt",
|
65
|
+
"echo \"primaryRpm: #{pkgname_rpm}\" >> ./output/#{target_dir}/manifest.txt",
|
66
|
+
"echo #{pkgname_rpm}-sha1: `sha1sum ./output/#{target_dir}/#{pkgname_rpm}`",
|
67
|
+
"cd ./output/#{target_dir}/ && zip #{pkgname_swix} manifest.txt #{pkgname_rpm}",
|
68
|
+
"rm ./output/#{target_dir}/manifest.txt ./output/#{target_dir}/#{pkgname_rpm}"]
|
69
|
+
|
70
|
+
commands
|
71
|
+
end
|
72
|
+
|
73
|
+
# Method to derive the package name for the project
|
74
|
+
#
|
75
|
+
# @param project [Vanagon::Project] project to name
|
76
|
+
# @return [String] name of the SWIX package for this project
|
77
|
+
def swix_package_name(project)
|
78
|
+
"#{project.name}-#{project.version}-#{project.release}.#{os_name}#{os_version}.#{project.noarch ? 'noarch' : @architecture}.swix"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -10,6 +10,19 @@ class Vanagon
|
|
10
10
|
name_and_version = "#{project.name}-#{project.version}"
|
11
11
|
pkg_name = package_name(project)
|
12
12
|
|
13
|
+
# Generate list of dirs in the package and create an exlplicit search
|
14
|
+
# string for AWK to use in order to explicitly define which directories
|
15
|
+
# to put in to the prototype file. Note that the Regexp object was avoided
|
16
|
+
# because the output from Regexp would create failures from AWK as the conversion
|
17
|
+
# from a Regexp obj to a string is formatted in a sub-optimal way that would have
|
18
|
+
# required more string manipulation anyway. the string should be formatted like so:
|
19
|
+
# && ($$3 ~ /directory\/regex.*/ || $$3 ~ /another\/directory\/regex.*/)
|
20
|
+
# for as many iterations as there are directries in the package
|
21
|
+
pkgdirs = project.get_root_directories.map { |dir| dir.sub(/^\//, "").gsub(/([\/\.])+/, '\\\\\1') + '.*' }
|
22
|
+
explicit_search_string = pkgdirs.map do |dir_regex|
|
23
|
+
" $$3 ~ /" + dir_regex + "/ "
|
24
|
+
end.join("||")
|
25
|
+
|
13
26
|
# Here we maintain backward compatibility with older vanagon versions
|
14
27
|
# that did this by default. This shim should get removed at some point
|
15
28
|
# in favor of just letting the makefile deliver the bill-of-materials
|
@@ -42,14 +55,16 @@ class Vanagon
|
|
42
55
|
# - The bin directory and all bin files are owned by root:bin instead of root:sys
|
43
56
|
# - All files under lib are owned by root:bin instead of root:sys
|
44
57
|
# - All .so files are owned by root:bin instead of root:sys
|
58
|
+
# - Explicity only include directories in the package contents
|
59
|
+
# (this should exclude things like root/bin root/var and such)
|
45
60
|
%((cd $(tempdir)/#{name_and_version}; pkgproto . | sort | awk ' \
|
46
|
-
$$1 ~ /^d$$/ {print "d",$$2,$$3,"0755 root sys";} \
|
61
|
+
$$1 ~ /^d$$/ && (#{explicit_search_string}) {print "d",$$2,$$3,"0755 root sys";} \
|
47
62
|
$$1 ~ /^s$$/ {print;} \
|
48
63
|
$$1 ~ /^f$$/ {print "f",$$2,$$3,$$4,"root sys";} \
|
49
64
|
$$1 !~ /^[dfs]$$/ {print;} ' | /opt/csw/bin/gsed \
|
50
|
-
-e '/^[fd] [^ ]\\+ .*[/]s\\?bin
|
51
|
-
-e '/^[fd] [^ ]\\+ .*[/]lib[/][
|
52
|
-
-e '/^[fd] [^ ]\\+ .*[/][^ ]\\+[.]so
|
65
|
+
-e '/^[fd] [^ ]\\+ .*[/]s\\?bin[^ ]\\+/ {s/root sys$$/root bin/}' \
|
66
|
+
-e '/^[fd] [^ ]\\+ .*[/]lib[/][^ ]\\+/ {s/root sys$$/root bin/}' \
|
67
|
+
-e '/^[fd] [^ ]\\+ .*[/][^ ]\\+[.]so/ {s/root sys$$/root bin/}' >> ../packaging/proto)),
|
53
68
|
%((cd $(tempdir); #{project.get_directories.map { |dir| "/opt/csw/bin/ggrep -q 'd none #{dir.path.sub(/^\//, '')}' packaging/proto || echo 'd none #{dir.path.sub(/^\//, '')} #{dir.mode || '0755'} #{dir.owner || 'root'} #{dir.group || 'sys'}' >> packaging/proto" }.join('; ')})),
|
54
69
|
|
55
70
|
# Actually build the package
|