Skip to content

Commit

Permalink
Merge pull request #892 from jbcraig/feature/ips
Browse files Browse the repository at this point in the history
Add support for Solaris 11 style IPS packages using *.p5p format
  • Loading branch information
jordansissel committed Apr 14, 2015
2 parents 531ed41 + c80ba22 commit 715ab62
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/fpm.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@
require "fpm/package/python"
require "fpm/package/osxpkg"
require "fpm/package/solaris"
require "fpm/package/p5p"
require "fpm/package/pkgin"
124 changes: 124 additions & 0 deletions lib/fpm/package/p5p.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
require "erb"
require "fpm/namespace"
require "fpm/package"
require "fpm/errors"
require "fpm/util"

class FPM::Package::P5P < FPM::Package

option "--user", "USER",
"Set the user to USER in the prototype files.",
:default => 'root'

option "--group", "GROUP",
"Set the group to GROUP in the prototype file.",
:default => 'root'

option "--zonetype", "ZONETYPE",
"Set the allowed zone types (global, nonglobal, both)",
:default => 'value=global value=nonglobal' do |value|
case @value
when "both"
value = "value=global value=nonglobal"
else
value = "value=#{value}"
end
end # value

option "--publisher", "PUBLISHER",
"Set the publisher name for the repository",
:default => 'FPM'

option "--lint" , :flag, "Check manifest with pkglint",
:default => true

option "--validate", :flag, "Validate with pkg install",
:default => true

def architecture
case @architecture
when nil, "native"
@architecture = %x{uname -p}.chomp
when "all"
@architecture = 'i386 value=sparc'
end

return @architecture
end # def architecture

def output(output_path)

# Fixup the category to an acceptable solaris category
case @category
when nil, "default"
@category = 'Applications/System Utilities'
end

# Manifest Filename
manifest_fn = build_path("#{name}.p5m")

# Generate a package manifest.
pkg_generate = safesystemout("pkgsend", "generate", "#{staging_path}")
File.write(build_path("#{name}.p5m.1"), pkg_generate)

# Add necessary metadata to the generated manifest.
metadata_template = template("p5p_metadata.erb").result(binding)
File.write(build_path("#{name}.mog"), metadata_template)

# Combine template and filelist; allow user to edit before proceeding
File.open(manifest_fn, "w") do |manifest|
manifest.write metadata_template
manifest.write pkg_generate
end
edit_file(manifest_fn) if attributes[:edit?]

# Execute the transmogrification on the manifest
pkg_mogrify = safesystemout("pkgmogrify", manifest_fn)
File.write(build_path("#{name}.p5m.2"), pkg_mogrify)
safesystem("cp", build_path("#{name}.p5m.2"), manifest_fn)

# Evaluate dependencies.
if !attributes[:no_auto_depends?]
pkgdepend_gen = safesystemout("pkgdepend", "generate", "-md", "#{staging_path}", manifest_fn)
File.write(build_path("#{name}.p5m.3"), pkgdepend_gen)

# Allow user to review added dependencies
edit_file(build_path("#{name}.p5m.3")) if attributes[:edit?]

safesystem("pkgdepend", "resolve", "-m", build_path("#{name}.p5m.3"))
safesystem("cp", build_path("#{name}.p5m.3.res"), manifest_fn)
end

# Final format of manifest
safesystem("pkgfmt", manifest_fn)

# Final edit for lint check and packaging
edit_file(manifest_fn) if attributes[:edit?]

# Add any facets or actuators that are needed.
# TODO(jcraig): add manpage actuator to enable install wo/ man pages

# Verify the package.
if attributes[:p5p_lint] then
safesystem("pkglint", manifest_fn)
end

# Publish the package.
repo_path = build_path("#{name}_repo")
safesystem("pkgrepo", "create", repo_path)
safesystem("pkgrepo", "set", "-s", repo_path, "publisher/prefix=#{attributes[:p5p_publisher]}")
safesystem("pkgsend", "-s", repo_path,
"publish", "-d", "#{staging_path}", "#{build_path}/#{name}.p5m")
safesystem("pkgrecv", "-s", repo_path, "-a",
"-d", build_path("#{name}.p5p"), name)

# Test the package
if attributes[:p5p_validate] then
safesystem("pkg", "install", "-nvg", build_path("#{name}.p5p"), name)
end

# Cleanup
safesystem("mv", build_path("#{name}.p5p"), output_path)

end # def output
end # class FPM::Package::IPS
12 changes: 12 additions & 0 deletions templates/p5p_metadata.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
set name=pkg.fmri value="<%=@name%>@<%=@version%>"
set name=pkg.summary value="<%=@description%>"
set name=pkg.human-version value="<%=@version%>"
set name=pkg.description value="<%=@description%>"
set name=info.classification value="org.opensolaris.category.2008:<%=@category%>"
set name=variant.opensolaris.zone <%= attributes[:p5p_zonetype] %>
set name=variant.arch value=<%=@architecture%>
<transform file dir -> set owner <%= attributes[:p5p_user] %>>
<transform file dir -> set group <%= attributes[:p5p_group] %>>
<transform dir path=opt$->drop>
<transform dir path=etc$->drop>
<transform dir path=usr(?:|/bin)$->drop>

0 comments on commit 715ab62

Please sign in to comment.