From 1938cd348777276348c8869466bf7221534e9a58 Mon Sep 17 00:00:00 2001 From: Alexey Kardapoltsev Date: Wed, 25 Nov 2015 10:39:24 +0500 Subject: [PATCH] Different start script replacements for different system loaders --- .../archetypes/JavaServerApplication.scala | 35 ++++++++++++------- .../debian/override-start-script/build.sbt | 35 +++++++++++++++++++ .../override-start-script/project/plugins.sbt | 1 + .../src/templates/debian/systemv | 1 + .../src/templates/debian/upstart | 1 + .../override-start-script/src/templates/start | 2 ++ .../debian/override-start-script/test | 6 ++++ src/sphinx/archetypes/cheatsheet.rst | 13 ++++--- .../archetypes/java_server/customize.rst | 9 +++-- 9 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 src/sbt-test/debian/override-start-script/build.sbt create mode 100644 src/sbt-test/debian/override-start-script/project/plugins.sbt create mode 100644 src/sbt-test/debian/override-start-script/src/templates/debian/systemv create mode 100644 src/sbt-test/debian/override-start-script/src/templates/debian/upstart create mode 100644 src/sbt-test/debian/override-start-script/src/templates/start create mode 100644 src/sbt-test/debian/override-start-script/test diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala index 6b9e4f066..2794dce11 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala @@ -92,12 +92,14 @@ object JavaServerAppPackaging extends AutoPlugin { linuxScriptReplacements += JavaServerLoaderScript.loaderFunctionsReplacement(serverLoading.value, ARCHETYPE), linuxScriptReplacements ++= bashScriptEnvConfigLocation.value.map(ENV_CONFIG_REPLACEMENT -> _).toSeq, - linuxStartScriptTemplate := JavaServerLoaderScript( - script = startScriptName(serverLoading.value, Debian), - loader = serverLoading.value, - archetype = ARCHETYPE, - template = Option(sourceDirectory.value / "templates" / "start") - ), + linuxStartScriptTemplate <<= (serverLoading in Debian, sourceDirectory) map { (loader, srcDir) => + JavaServerLoaderScript( + script = defaultTemplateName(loader, Debian), + loader = loader, + archetype = ARCHETYPE, + template = overrideTemplate(srcDir, loader, Debian) + ) + }, defaultLinuxStartScriptLocation <<= serverLoading apply getStartScriptLocation, linuxMakeStartScript in Debian <<= (linuxStartScriptTemplate in Debian, linuxScriptReplacements in Debian, @@ -143,12 +145,14 @@ object JavaServerAppPackaging extends AutoPlugin { daemonGroup in Rpm <<= daemonGroup in Linux, daemonGroupGid in Rpm <<= daemonGroupGid in Linux, // === Startscript creation === - linuxStartScriptTemplate := JavaServerLoaderScript( - script = startScriptName((serverLoading in Rpm).value, Rpm), - loader = (serverLoading in Rpm).value, - archetype = ARCHETYPE, - template = Option(sourceDirectory.value / "templates" / "start") - ), + linuxStartScriptTemplate <<= (serverLoading in Rpm, sourceDirectory) map { (loader, srcDir) => + JavaServerLoaderScript( + script = defaultTemplateName(loader, Rpm), + loader = loader, + archetype = ARCHETYPE, + template = overrideTemplate(srcDir, loader, Rpm) + ) + }, linuxMakeStartScript in Rpm <<= (linuxStartScriptTemplate in Rpm, linuxScriptReplacements in Rpm, target in Universal, @@ -179,12 +183,17 @@ object JavaServerAppPackaging extends AutoPlugin { /* ============ Helper Methods ============== */ /* ========================================== */ - private[this] def startScriptName(loader: ServerLoader, config: Configuration): String = (loader, config.name) match { + private[this] def defaultTemplateName(loader: ServerLoader, config: Configuration): String = (loader, config.name) match { // SystemV has two different start scripts case (SystemV, name) => s"start-$name-template" case _ => "start-template" } + + private[this] def overrideTemplate(sourceDirectory: File, loader: ServerLoader, config: Configuration): Option[File] = { + Option(sourceDirectory / "templates" / config.name / loader.toString.toLowerCase) + } + private[this] def makeStartScriptReplacements( requiredStartFacilities: Option[String], requiredStopFacilities: Option[String], diff --git a/src/sbt-test/debian/override-start-script/build.sbt b/src/sbt-test/debian/override-start-script/build.sbt new file mode 100644 index 000000000..f416fe4c1 --- /dev/null +++ b/src/sbt-test/debian/override-start-script/build.sbt @@ -0,0 +1,35 @@ +import com.typesafe.sbt.packager.archetypes.ServerLoader + +enablePlugins(JavaServerAppPackaging, JDebPackaging) + +serverLoading in Debian := ServerLoader.Upstart + +// TODO change this after #437 is fixed +daemonUser in Linux := "root" + +daemonGroup in Linux := "app-group" + +mainClass in Compile := Some("empty") + +name := "debian-test" + +name in Debian := "debian-test" + +version := "0.1.0" + +maintainer := "Josh Suereth " + +packageSummary := "Test debian package" + +packageDescription := """A fun package description of our software, + with multiple lines.""" + +TaskKey[Unit]("check-startup-script") <<= (target, streams) map { (target, out) => + val extracted = target / "tmp" / "extracted-package" + extracted.mkdirs() + Seq("dpkg-deb", "-R", (target / "debian-test_0.1.0_all.deb").absolutePath, extracted.absolutePath).! + + val script = IO.read(extracted / "etc" / "init" / "debian-test.conf") + assert(script.startsWith("# right upstart template"), s"override script wasn't picked, script is\n$script") + () +} diff --git a/src/sbt-test/debian/override-start-script/project/plugins.sbt b/src/sbt-test/debian/override-start-script/project/plugins.sbt new file mode 100644 index 000000000..b53de154c --- /dev/null +++ b/src/sbt-test/debian/override-start-script/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version")) diff --git a/src/sbt-test/debian/override-start-script/src/templates/debian/systemv b/src/sbt-test/debian/override-start-script/src/templates/debian/systemv new file mode 100644 index 000000000..067767dbb --- /dev/null +++ b/src/sbt-test/debian/override-start-script/src/templates/debian/systemv @@ -0,0 +1 @@ +# right systemV template \ No newline at end of file diff --git a/src/sbt-test/debian/override-start-script/src/templates/debian/upstart b/src/sbt-test/debian/override-start-script/src/templates/debian/upstart new file mode 100644 index 000000000..9df173c18 --- /dev/null +++ b/src/sbt-test/debian/override-start-script/src/templates/debian/upstart @@ -0,0 +1 @@ +# right upstart template \ No newline at end of file diff --git a/src/sbt-test/debian/override-start-script/src/templates/start b/src/sbt-test/debian/override-start-script/src/templates/start new file mode 100644 index 000000000..50e3a4ede --- /dev/null +++ b/src/sbt-test/debian/override-start-script/src/templates/start @@ -0,0 +1,2 @@ +# check that old start template isn't picked +# wrong upstart start template \ No newline at end of file diff --git a/src/sbt-test/debian/override-start-script/test b/src/sbt-test/debian/override-start-script/test new file mode 100644 index 000000000..baf9b1d9d --- /dev/null +++ b/src/sbt-test/debian/override-start-script/test @@ -0,0 +1,6 @@ +# Run the debian packaging. +> debian:packageBin +$ exists target/debian-test_0.1.0_all.deb + +# Check files for defaults +> check-startup-script diff --git a/src/sphinx/archetypes/cheatsheet.rst b/src/sphinx/archetypes/cheatsheet.rst index ea86f7bf4..8874063fe 100644 --- a/src/sphinx/archetypes/cheatsheet.rst +++ b/src/sphinx/archetypes/cheatsheet.rst @@ -191,13 +191,16 @@ the ``bashScriptExtraDefines`` that will be used in addition to the default set: -Service Manager - ``src/templates/start`` +Service Manager ----------------------------------------- -Creating a file here will override either the init.d startup script or -the upstart start script. It will either be located at -``/etc/init/`` or ``/etc/init.d/`` depending on which -serverLoader is being used. +It's also possible to override the entire script/configuration for your service manager. +Create a file ``src/templates/$format/$loader`` and it will be used instead. + +Possible values: + +* ``$format`` - ``debian`` or ``rpm`` +* ``$loader`` - ``upstart``, ``systemv`` or ``systemd`` **Syntax** diff --git a/src/sphinx/archetypes/java_server/customize.rst b/src/sphinx/archetypes/java_server/customize.rst index bdf765133..0ad34b5ca 100644 --- a/src/sphinx/archetypes/java_server/customize.rst +++ b/src/sphinx/archetypes/java_server/customize.rst @@ -116,11 +116,16 @@ which will add the following resource file to use start/stop instead of initctl The :doc:`debian ` and :doc:`redhat ` pages have further information on overriding distribution specific actions. -Override Start Script - ``src/templates/start`` +Override Start Script ----------------------------------------------- It's also possible to override the entire script/configuration for your service manager. -Create a file ``src/templates/start`` and it will be used instead. +Create a file ``src/templates/$format/$loader`` and it will be used instead. + +Possible values: + +* ``$format`` - ``debian`` or ``rpm`` +* ``$loader`` - ``upstart``, ``systemv`` or ``systemd`` **Syntax**