From c9ef2a2d8811c0372c4d62b9f3dc3ca2f3688906 Mon Sep 17 00:00:00 2001 From: Alexey Kardapoltsev Date: Wed, 27 Nov 2013 13:35:52 +0600 Subject: [PATCH 1/2] generating etc default, different postinst script for sysvinit --- .../packager/archetypes/etc-default-template | 4 +++ .../archetypes/postinst-sysvinit-template | 1 + .../sbt/packager/archetypes/sysvinit-template | 4 +-- .../archetypes/JavaAppUpstartScript.scala | 11 +++++--- .../archetypes/JavaServerApplication.scala | 26 ++++++++++++++++--- .../typesafe/sbt/packager/debian/Keys.scala | 1 + 6 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template create mode 100644 src/main/resources/com/typesafe/sbt/packager/archetypes/postinst-sysvinit-template diff --git a/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template b/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template new file mode 100644 index 000000000..3c7835904 --- /dev/null +++ b/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template @@ -0,0 +1,4 @@ +#Some start script options could be overridden here +#$RUN_OPTS="" +#$DAEMON_USER="" +#$JAVA_CMD="" \ No newline at end of file diff --git a/src/main/resources/com/typesafe/sbt/packager/archetypes/postinst-sysvinit-template b/src/main/resources/com/typesafe/sbt/packager/archetypes/postinst-sysvinit-template new file mode 100644 index 000000000..57c805210 --- /dev/null +++ b/src/main/resources/com/typesafe/sbt/packager/archetypes/postinst-sysvinit-template @@ -0,0 +1 @@ +service ${{app_name}} start || echo "${{app_name}} could not be started. Try manually with service ${{app_name}} start" diff --git a/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template b/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template index b269ea7a2..1ef3dc64a 100644 --- a/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template +++ b/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template @@ -17,7 +17,7 @@ get_java_cmd() { if [ -x "$JAVA_HOME/bin/java" ]; then echo "$JAVA_HOME/bin/java" else - echo `which java` + echo $(which java) fi } @@ -37,7 +37,7 @@ RUN_CMD="-cp ${{app_classpath}} ${{app_main_class}} $RUN_OPTS" start_daemon() { log_daemon_msg "Starting ${{app_name}}" - start-stop-daemon --background --start --chuid "$DAEMON_USER" --make-pidfile --pidfile "$PIDFILE" --exec "$JAVA_CMD" --start -- $RUN_CMD + start-stop-daemon --background --start --chuid "$DAEMON_USER" --make-pidfile --pidfile "$PIDFILE" --exec "$JAVA_CMD" --start -- "$RUN_CMD" } diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppUpstartScript.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppUpstartScript.scala index bfbdff0fc..3c22bca89 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppUpstartScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppUpstartScript.scala @@ -10,8 +10,8 @@ object JavaAppStartScript { protected def upstartTemplateSource: java.net.URL = getClass.getResource("upstart-template") protected def sysvinitTemplateSource: java.net.URL = getClass.getResource("sysvinit-template") - protected def postinstTemplateSource: java.net.URL = getClass.getResource("postinst-template") + protected def postinstSysvinitTemplateSource: java.net.URL = getClass.getResource("postinst-sysvinit-template") protected def preremTemplateSource: java.net.URL = getClass.getResource("prerem-template") @@ -28,8 +28,13 @@ object JavaAppStartScript { TemplateWriter.generateScript(preremTemplateSource, Seq("app_name" -> appName)) - def generatePostinst(appName: String): String = - TemplateWriter.generateScript(postinstTemplateSource, Seq("app_name" -> appName)) + def generatePostinst(appName: String, loader: ServerLoader): String = + loader match { + case Upstart => + TemplateWriter.generateScript(postinstTemplateSource, Seq("app_name" -> appName)) + case SystemV => + TemplateWriter.generateScript(postinstSysvinitTemplateSource, Seq("app_name" -> appName)) + } /** 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 a8e7dd77b..7d19e4dc2 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala @@ -21,6 +21,7 @@ object JavaServerAppPackaging { import ServerLoader._ def settings: Seq[Setting[_]] = JavaAppPackaging.settings ++ debianSettings + protected def etcDefaultTemplateSource: java.net.URL = getClass.getResource("etc-default-template") def debianSettings: Seq[Setting[_]] = Seq( @@ -46,6 +47,11 @@ object JavaServerAppPackaging { }, debianMakeStartScript <<= (debianStartScriptReplacements, normalizedName, target in Universal, serverLoading in Debian) map makeDebianStartScript, + debianMakeEtcDefault <<= (normalizedName, target in Universal, serverLoading in Debian) + map makeEtcDefaultScript, + linuxPackageMappings in Debian <++= (debianMakeEtcDefault, normalizedName) map {(conf, name) => + conf.map(c => LinuxPackageMapping(Seq(c -> s"/etc/default/$name"))).toSeq + }, linuxPackageMappings in Debian <++= (debianMakeStartScript, normalizedName, serverLoading in Debian) map { (script, name, loader) => val (path, permissions) = loader match { @@ -59,13 +65,14 @@ object JavaServerAppPackaging { }, // TODO - only make these if the upstart config exists... debianMakePrermScript <<= (normalizedName, target in Universal) map makeDebianPrermScript, - debianMakePostinstScript <<= (normalizedName, target in Universal) map makeDebianPostinstScript) + debianMakePostinstScript <<= (normalizedName, target in Universal, serverLoading in Debian) map makeDebianPostinstScript) private def makeDebianStartScript( replacements: Seq[(String, String)], name: String, tmpDir: File, loader: ServerLoader): Option[File] = if (replacements.isEmpty) None else { + println(s"generating start script") val scriptBits = JavaAppStartScript.generateScript(replacements, loader) val script = tmpDir / "tmp" / "bin" / s"$name.$loader" IO.write(script, scriptBits) @@ -81,10 +88,23 @@ object JavaServerAppPackaging { } - protected def makeDebianPostinstScript(name: String, tmpDir: File): Option[File] = { - val scriptBits = JavaAppStartScript.generatePostinst(name) + protected def makeDebianPostinstScript(name: String, tmpDir: File, loader: ServerLoader): Option[File] = { + val scriptBits = JavaAppStartScript.generatePostinst(name, loader) val script = tmpDir / "tmp" / "bin" / "debian-postinst" IO.write(script, scriptBits) Some(script) } + + protected def makeEtcDefaultScript(name: String, tmpDir: File, loader: ServerLoader): Option[File] = { + println(s"generating etc default") + loader match { + case Upstart => None + case SystemV => { + val scriptBits = TemplateWriter.generateScript(etcDefaultTemplateSource, Seq.empty) + val script = tmpDir / "tmp" / "bin" / "etc-default" + IO.write(script, scriptBits) + Some(script) + } + } + } } diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala index 166e4d540..63fefdfdb 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala @@ -61,6 +61,7 @@ trait DebianKeys { | appMainClass - main class to start | daemonUser - daemon user """.stripMargin) + val debianMakeEtcDefault = TaskKey[Option[File]]("makeEtcDefault", "Creates or discovers the /etc/default/ script") } From c91ecb3b4f2b16cd79ed8766be49f2faa6866ce5 Mon Sep 17 00:00:00 2001 From: Alexey Kardapoltsev Date: Wed, 27 Nov 2013 16:00:12 +0600 Subject: [PATCH 2/2] etc default added to conffiles --- .../typesafe/sbt/packager/archetypes/etc-default-template | 6 +++--- .../com/typesafe/sbt/packager/archetypes/sysvinit-template | 3 +-- .../sbt/packager/archetypes/JavaServerApplication.scala | 6 ++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template b/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template index 3c7835904..2cd74fe08 100644 --- a/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template +++ b/src/main/resources/com/typesafe/sbt/packager/archetypes/etc-default-template @@ -1,4 +1,4 @@ #Some start script options could be overridden here -#$RUN_OPTS="" -#$DAEMON_USER="" -#$JAVA_CMD="" \ No newline at end of file +#RUN_OPTS="" +#DAEMON_USER="" +#JAVA_CMD="" \ No newline at end of file diff --git a/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template b/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template index 1ef3dc64a..737859767 100644 --- a/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template +++ b/src/main/resources/com/typesafe/sbt/packager/archetypes/sysvinit-template @@ -37,7 +37,7 @@ RUN_CMD="-cp ${{app_classpath}} ${{app_main_class}} $RUN_OPTS" start_daemon() { log_daemon_msg "Starting ${{app_name}}" - start-stop-daemon --background --start --chuid "$DAEMON_USER" --make-pidfile --pidfile "$PIDFILE" --exec "$JAVA_CMD" --start -- "$RUN_CMD" + start-stop-daemon --background --chuid "$DAEMON_USER" --make-pidfile --pidfile "$PIDFILE" --exec "$JAVA_CMD" --start -- $RUN_CMD } @@ -50,7 +50,6 @@ stop_daemon() { exit 2 } - case "$1" in start) 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 7d19e4dc2..e02dbcef8 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala @@ -6,7 +6,7 @@ import Keys._ import sbt._ import sbt.Keys.{ target, mainClass, normalizedName } import SbtNativePackager._ -import com.typesafe.sbt.packager.linux.LinuxPackageMapping +import com.typesafe.sbt.packager.linux.{LinuxFileMetaData, LinuxPackageMapping} /** * This class contains the default settings for creating and deploying an archetypical Java application. @@ -50,7 +50,7 @@ object JavaServerAppPackaging { debianMakeEtcDefault <<= (normalizedName, target in Universal, serverLoading in Debian) map makeEtcDefaultScript, linuxPackageMappings in Debian <++= (debianMakeEtcDefault, normalizedName) map {(conf, name) => - conf.map(c => LinuxPackageMapping(Seq(c -> s"/etc/default/$name"))).toSeq + conf.map(c => LinuxPackageMapping(Seq(c -> s"/etc/default/$name")).withConfig()).toSeq }, linuxPackageMappings in Debian <++= (debianMakeStartScript, normalizedName, serverLoading in Debian) map { (script, name, loader) => @@ -72,7 +72,6 @@ object JavaServerAppPackaging { replacements: Seq[(String, String)], name: String, tmpDir: File, loader: ServerLoader): Option[File] = if (replacements.isEmpty) None else { - println(s"generating start script") val scriptBits = JavaAppStartScript.generateScript(replacements, loader) val script = tmpDir / "tmp" / "bin" / s"$name.$loader" IO.write(script, scriptBits) @@ -96,7 +95,6 @@ object JavaServerAppPackaging { } protected def makeEtcDefaultScript(name: String, tmpDir: File, loader: ServerLoader): Option[File] = { - println(s"generating etc default") loader match { case Upstart => None case SystemV => {