Skip to content

Commit

Permalink
FIX #214 Making rpm scriptlets overrideable
Browse files Browse the repository at this point in the history
  • Loading branch information
muuki88 committed Apr 6, 2014
1 parent 27d5b4c commit 9dadc29
Show file tree
Hide file tree
Showing 18 changed files with 273 additions and 40 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
service ${{app_name}} start
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Removing system user/group : ${{daemon_user}} and ${{daemon_group}}
echo "Try deleting system user and group [${{daemon_user}}:${{daemon_group}}]"
if getent passwd | grep -q "^${{daemon_user}}:";
then
echo "Deleting system user: ${{daemon_user}}"
userdel ${{daemon_user}}
fi
if getent group | grep -q "^${{daemon_group}}:" ;
then
echo "Deleting system group: ${{daemon_group}}"
groupdel ${{daemon_group}}
fi
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Adding system user/group : ${{daemon_user}} and ${{daemon_group}}
if ! getent group | grep -q "^${{daemon_group}}:" ;
then
echo "Creating system group: ${{daemon_group}}"
groupadd --system ${{daemon_group}}
fi
if ! getent passwd | grep -q "^${{daemon_user}}:";
then
echo "Creating system user: ${{daemon_user}}"
useradd --gid ${{daemon_group}} --no-create-home --system -c '${{descr}}' ${{daemon_user}}
fi
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Halting ${{app_name}}
echo "Shutdown ${{app_name}}"
service ${{app_name}} stop
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Halting ${{app_name}}
echo "Shutdown ${{app_name}}"
service ${{app_name}} stop
service ${{app_name}} stop
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,12 @@ trait JavaAppStartScriptBuilder {
object JavaAppStartScript {

object Rpm extends JavaAppStartScriptBuilder {
import com.typesafe.sbt.packager.rpm.RpmPlugin.Names._

val name = "rpm"
val startScript = "start-rpm"
val upstartScripts = Seq(startScript)
val systemvScripts = Seq(startScript)
val systemvScripts = Seq(startScript, Pre, Post, Preun, Postun)
}

object Debian extends JavaAppStartScriptBuilder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import com.typesafe.sbt.packager.rpm.RpmPlugin
object JavaServerAppPackaging {
import ServerLoader._
import LinuxPlugin.Users
import DebianPlugin.Names.{ Preinst, Postinst, Prerm, Postrm }

def settings: Seq[Setting[_]] = JavaAppPackaging.settings ++ linuxSettings ++ debianSettings ++ rpmSettings
protected def etcDefaultTemplateSource: java.net.URL = getClass.getResource("etc-default-template")
Expand Down Expand Up @@ -61,7 +60,8 @@ object JavaServerAppPackaging {
packageTemplateMapping("/var/run/" + name)() withUser user withGroup group withPerms "755"
})

def debianSettings: Seq[Setting[_]] =
def debianSettings: Seq[Setting[_]] = {
import DebianPlugin.Names.{ Preinst, Postinst, Prerm, Postrm }
Seq(
linuxJavaAppStartScriptBuilder in Debian := JavaAppStartScript.Debian,
serverLoading := Upstart,
Expand All @@ -82,41 +82,45 @@ object JavaServerAppPackaging {
debianMakePostinstScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements, linuxJavaAppStartScriptBuilder in Debian) map makeMaintainerScript(Postinst),
debianMakePrermScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements, linuxJavaAppStartScriptBuilder in Debian) map makeMaintainerScript(Prerm),
debianMakePostrmScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements, linuxJavaAppStartScriptBuilder in Debian) map makeMaintainerScript(Postrm))
}

def rpmSettings: Seq[Setting[_]] = Seq(
linuxJavaAppStartScriptBuilder in Rpm := JavaAppStartScript.Rpm,
serverLoading in Rpm := SystemV,
def rpmSettings: Seq[Setting[_]] = {
import RpmPlugin.Names.{ Pre, Post, Preun, Postun }
Seq(
linuxJavaAppStartScriptBuilder in Rpm := JavaAppStartScript.Rpm,
serverLoading in Rpm := SystemV,

// === Startscript creation ===
linuxStartScriptTemplate in Rpm <<= (serverLoading in Rpm, sourceDirectory, linuxJavaAppStartScriptBuilder in Rpm) map {
(loader, dir, builder) =>
builder.defaultStartScriptTemplate(loader, dir / "templates" / "start")
},
linuxMakeStartScript in Rpm <<= (target in Universal, serverLoading in Rpm, linuxScriptReplacements, linuxStartScriptTemplate in Rpm, linuxJavaAppStartScriptBuilder in Rpm)
map { (tmpDir, loader, replacements, template, builder) =>
makeMaintainerScript(builder.startScript, Some(template))(tmpDir, loader, replacements, builder)
// === Startscript creation ===
linuxStartScriptTemplate in Rpm <<= (serverLoading in Rpm, sourceDirectory, linuxJavaAppStartScriptBuilder in Rpm) map {
(loader, dir, builder) =>
builder.defaultStartScriptTemplate(loader, dir / "templates" / "start")
},
linuxPackageMappings in Rpm <++= (normalizedName, linuxMakeStartScript in Rpm, serverLoading in Rpm) map startScriptMapping,
linuxMakeStartScript in Rpm <<= (target in Universal, serverLoading in Rpm, linuxScriptReplacements, linuxStartScriptTemplate in Rpm, linuxJavaAppStartScriptBuilder in Rpm)
map { (tmpDir, loader, replacements, template, builder) =>
makeMaintainerScript(builder.startScript, Some(template))(tmpDir, loader, replacements, builder)
},
linuxPackageMappings in Rpm <++= (normalizedName, linuxMakeStartScript in Rpm, serverLoading in Rpm) map startScriptMapping,

// == Maintainer scripts ===
// TODO this is very basic - align debian and rpm plugin
rpmPre <<= (rpmPre, linuxScriptReplacements) apply { (pre, replacements) =>
val scriptBits = TemplateWriter.generateScript(RpmPlugin.preinstTemplateSource, replacements)
Some(pre.map(_ + "\n").getOrElse("") + scriptBits)
},
rpmPost <<= (rpmPost, linuxScriptReplacements) apply { (pre, replacements) =>
val scriptBits = TemplateWriter.generateScript(RpmPlugin.postinstTemplateSource, replacements)
Some(pre.map(_ + "\n").getOrElse("") + scriptBits)
},
rpmPostun <<= (rpmPostun, linuxScriptReplacements) apply { (post, replacements) =>
val scriptBits = TemplateWriter.generateScript(RpmPlugin.postuninstallTemplateSource, replacements)
Some(post.map(_ + "\n").getOrElse("") + scriptBits)
},
rpmPreun <<= (rpmPostun, linuxScriptReplacements) apply { (post, replacements) =>
val scriptBits = TemplateWriter.generateScript(RpmPlugin.preuninstallTemplateSource, replacements)
Some(post.map(_ + "\n").getOrElse("") + scriptBits)
}
)
// == Maintainer scripts ===
// TODO this is very basic - align debian and rpm plugin
rpmPre <<= (rpmScriptsDirectory, rpmPre, linuxScriptReplacements, serverLoading in Rpm, linuxJavaAppStartScriptBuilder in Rpm) apply {
(dir, pre, replacements, loader, builder) =>
Some(pre.map(_ + "\n").getOrElse("") + rpmScriptletContent(dir, Pre, loader, replacements, builder))
},
rpmPost <<= (rpmScriptsDirectory, rpmPost, linuxScriptReplacements, serverLoading in Rpm, linuxJavaAppStartScriptBuilder in Rpm) apply {
(dir, post, replacements, loader, builder) =>
Some(post.map(_ + "\n").getOrElse("") + rpmScriptletContent(dir, Post, loader, replacements, builder))
},
rpmPostun <<= (rpmScriptsDirectory, rpmPostun, linuxScriptReplacements, serverLoading in Rpm, linuxJavaAppStartScriptBuilder in Rpm) apply {
(dir, postun, replacements, loader, builder) =>
Some(postun.map(_ + "\n").getOrElse("") + rpmScriptletContent(dir, Postun, loader, replacements, builder))
},
rpmPreun <<= (rpmScriptsDirectory, rpmPostun, linuxScriptReplacements, serverLoading in Rpm, linuxJavaAppStartScriptBuilder in Rpm) apply {
(dir, preun, replacements, loader, builder) =>
Some(preun.map(_ + "\n").getOrElse("") + rpmScriptletContent(dir, Preun, loader, replacements, builder))
}
)
}

/* ========================================== */
/* ============ Helper Methods ============== */
Expand Down Expand Up @@ -147,4 +151,11 @@ object JavaServerAppPackaging {
IO.write(script, scriptBits)
Some(script)
}

protected def rpmScriptletContent(dir: File, script: String,
loader: ServerLoader, replacements: Seq[(String, String)], builder: JavaAppStartScriptBuilder): String = {
val file = (dir / script)
val template = if (file exists) Some(file.toURI.toURL) else None
builder.generateTemplate(script, loader, replacements, template).getOrElse(sys.error("Could generate content for script: " + script))
}
}
2 changes: 2 additions & 0 deletions src/main/scala/com/typesafe/sbt/packager/rpm/Keys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ trait RpmKeys {

// SCRIPTS
val rpmScripts = SettingKey[RpmScripts]("rpm-scripts", "Configuration of pre- and post-integration scripts.")
val rpmScriptsDirectory = SettingKey[File]("debian-control-scripts-directory",
"Directory where all debian control scripts reside. Default is 'src/rpm/scriptlets'")

val rpmPretrans = SettingKey[Option[String]]("rpm-pretrans", "%pretrans scriptlet")
val rpmPre = SettingKey[Option[String]]("rpm-pre", "%pre scriptlet")
Expand Down
18 changes: 14 additions & 4 deletions src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@ package rpm
import Keys._
import linux._
import sbt._
import sbt.Keys.sourceDirectory
import java.nio.charset.Charset

/** Plugin trait containing all generic values used for packaging linux software. */
trait RpmPlugin extends Plugin with LinuxPlugin {
val Rpm = config("rpm") extend Linux

import RpmPlugin.Names

def rpmSettings: Seq[Setting[_]] = Seq(
rpmOs := "Linux", // TODO - default to something else?
rpmRelease := "0",
Expand All @@ -36,6 +39,7 @@ trait RpmPlugin extends Plugin with LinuxPlugin {
rpmPreun := None,
rpmPostun := None,
rpmBrpJavaRepackJars := false,
rpmScriptsDirectory <<= sourceDirectory apply (_ / "rpm" / Names.Scriptlets),
packageSummary in Rpm <<= packageSummary in Linux,
packageDescription in Rpm <<= packageDescription in Linux,
target in Rpm <<= target(_ / "rpm")
Expand Down Expand Up @@ -72,9 +76,15 @@ trait RpmPlugin extends Plugin with LinuxPlugin {

object RpmPlugin {

def preinstTemplateSource: java.net.URL = getClass getResource "preinstall"
def postinstTemplateSource: java.net.URL = getClass getResource "postinstall"
def preuninstallTemplateSource: java.net.URL = getClass getResource "preuninstall"
def postuninstallTemplateSource: java.net.URL = getClass getResource "postuninstall"
def osPostInstallMacro: java.net.URL = getClass getResource "brpJavaRepackJar"

object Names {
val Scriptlets = "scriptlets"

//maintainer script names
val Post = "post-rpm"
val Pre = "pre-rpm"
val Postun = "postun-rpm"
val Preun = "preun-rpm"
}
}
35 changes: 35 additions & 0 deletions src/sbt-test/rpm/scriptlets-override-rpm/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import NativePackagerKeys._

packageArchetype.java_server

name := "rpm-test"

version := "0.1.0"

maintainer := "Josh Suereth <joshua.suereth@typesafe.com>"

packageSummary := "Test rpm package"

packageDescription := "Description"

rpmRelease := "1"

rpmVendor := "typesafe"

rpmUrl := Some("http://github.com/sbt/sbt-native-packager")

rpmLicense := Some("BSD")

mainClass in (Compile, run) := Some("com.example.MainApp")

TaskKey[Unit]("unzipAndCheck") <<= (packageBin in Rpm, streams) map { (rpmFile, streams) =>
val rpmPath = Seq(rpmFile.getAbsolutePath)
Process("rpm2cpio" , rpmPath) #| Process("cpio -i --make-directories") ! streams.log
val scriptlets = Process("rpm -qp --scripts " + rpmFile.getAbsolutePath) !! streams.log
assert(scriptlets contains "echo postinst", "'echo 'postinst' not present in \n" + scriptlets)
assert(scriptlets contains "echo preinst", "'echo 'preinst' not present in \n" + scriptlets)
assert(scriptlets contains "echo postun", "'echo 'postun' not present in \n" + scriptlets)
assert(scriptlets contains "echo preun", "'echo 'preun' not present in \n" + scriptlets)
()
}

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
object MainApp extends App {
println("Hello World")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
echo postinst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
echo postun
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
echo preinst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
echo preun
20 changes: 20 additions & 0 deletions src/sbt-test/rpm/scriptlets-override-rpm/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Run the debian packaging.
> rpm:package-bin
$ exists target/rpm/RPMS/noarch/rpm-test-0.1.0-1.noarch.rpm

# Check rpm contents
> unzipAndCheck
$ exists etc/default/rpm-test
$ exists etc/init.d/rpm-test

$ exists usr/share/rpm-test

$ exists usr/share/rpm-test/bin
$ exists usr/share/rpm-test/bin/rpm-test

$ exists usr/share/rpm-test/lib

$ exists var/log/rpm-test
$ exists var/run/rpm-test

# TODO symlinks aren't checked

0 comments on commit 9dadc29

Please sign in to comment.