From 5bf139bb881d8197669141a6bdd312d244a5d5be Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Wed, 12 Mar 2014 11:09:53 +0100 Subject: [PATCH 1/2] Unify linux script replacements #182 --- .../archetypes/JavaAppStartScript.scala | 1 + .../archetypes/JavaServerApplication.scala | 17 ------------- .../sbt/packager/debian/DebianPlugin.scala | 14 ++++------- .../typesafe/sbt/packager/debian/Keys.scala | 25 ------------------- .../sbt/packager/linux/LinuxPlugin.scala | 24 +++++++++++++++++- .../debian/override-control-files/build.sbt | 3 ++- .../src/debian/DEBIAN/postinst | 2 +- 7 files changed, 32 insertions(+), 54 deletions(-) diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala index fd4207743..796b25536 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala @@ -70,6 +70,7 @@ trait JavaAppStartScriptBuilder { } /** + * TODO move this to TemplateWriter or case class * * @param author - * @param description - short description 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 bda8120c9..09aeb4a10 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala @@ -35,23 +35,6 @@ object JavaServerAppPackaging { * - config directory */ def linuxSettings: Seq[Setting[_]] = Seq( - // This one is begging for sbt 0.13 syntax... - linuxScriptReplacements <<= ( - // TODO do we need to separated rpm and debian maintainers? - maintainer in Linux, packageSummary in Linux, daemonUser in Linux, daemonGroup in Linux, normalizedName, - sbt.Keys.version, defaultLinuxInstallLocation, linuxJavaAppStartScriptBuilder in Debian) - apply { (author, descr, daemonUser, daemonGroup, name, version, installLocation, builder) => - val appDir = installLocation + "/" + name - - builder.makeReplacements( - author = author, - description = descr, - execScript = name, - chdir = appDir, - appName = name, - daemonUser = daemonUser, - daemonGroup = daemonGroup) - }, // === logging directory mapping === linuxPackageMappings <+= (normalizedName, defaultLinuxLogsLocation, daemonUser in Linux, daemonGroup in Linux) map { (name, logsDir, user, group) => packageTemplateMapping(logsDir + "/" + name)() withUser user withGroup group withPerms "755" diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala index 6d9cb4d77..9dfe4aa04 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala @@ -5,10 +5,9 @@ package debian import Keys._ import sbt._ import sbt.Keys.{ target, name, normalizedName, TaskStreams } -import linux.LinuxPackageMapping -import linux.LinuxFileMetaData +import linux.{ LinuxFileMetaData, LinuxPackageMapping, LinuxSymlink } +import linux.Keys.{ linuxScriptReplacements } import com.typesafe.sbt.packager.Hashing -import com.typesafe.sbt.packager.linux.LinuxSymlink import com.typesafe.sbt.packager.archetypes.TemplateWriter trait DebianPlugin extends Plugin with linux.LinuxPlugin { @@ -33,8 +32,8 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin { // TODO - Can we do anything about user/group ownership? } - private[this] def filterAndFixPerms(script: File, replacements: DebianControlScriptReplacements, perms: LinuxFileMetaData): File = { - val filtered = TemplateWriter.generateScript(script.toURI.toURL, replacements.makeReplacements) + private[this] def filterAndFixPerms(script: File, replacements: Seq[(String, String)], perms: LinuxFileMetaData): File = { + val filtered = TemplateWriter.generateScript(script.toURI.toURL, replacements) IO.delete(script) IO.write(script, filtered) chmod(script, perms.permissions) @@ -95,9 +94,6 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin { packageSummary in Debian <<= packageSummary in Linux, maintainer in Debian <<= maintainer in Linux, - // Debian Control Scripts - debianControlScriptsReplacements <<= (maintainer in Debian, packageSummary in Debian, normalizedName, version) apply DebianControlScriptReplacements, - debianControlScriptsDirectory <<= (sourceDirectory) apply (_ / "debian" / Names.Debian), debianMaintainerScripts := Seq.empty, debianMakePreinstScript := None, @@ -149,7 +145,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin { chmod(cfile, "0644") cfile }, - debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, debianControlScriptsReplacements, linuxPackageSymlinks, target, streams) + debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, linuxScriptReplacements, linuxPackageSymlinks, target, streams) map { (mappings, _, maintScripts, _, replacements, symlinks, t, streams) => // Create files and directories 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 a9a115c07..59bf5fa52 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala @@ -36,31 +36,6 @@ trait DebianKeys { val debianMakePostinstScript = TaskKey[Option[File]]("makePostInstScript", "Creates or discovers the postinst script used by this project") val debianMakePostrmScript = TaskKey[Option[File]]("makePostrmScript", "Creates or discovers the postrm script used by this project") - // Debian upstart scripts - val debianControlScriptsReplacements = SettingKey[DebianControlScriptReplacements]("debianControlScriptsReplacements", - """|Replacements of template parameters used in the upstart script. - | Default supported templates: - | author - author of this project - | descr - description - | name - normalized name of the app - | version - app version - """.stripMargin) - - @deprecated("use linuxScriptReplacements", "0.7.0") - val debianScriptReplacements = TaskKey[Seq[(String, String)]]("upstartScriptReplacements", - """|Replacements of template parameters used in the upstart script. - | Default supported templates: - | execScript - name of the script in /usr/bin - | author - author of this project - | descr - short description - | chdir - execution path of the script - | retries - on fail, how often should a restart be tried - | retryTimeout - pause between retries - | appName - name of application - | appClasspath - application classpath - | appMainClass - main class to start - | daemonUser - daemon user - """.stripMargin) } /** Keys used for Debian specific settings. */ diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index 230e084fb..220432012 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -5,7 +5,9 @@ package linux import Keys._ import sbt._ import sbt.Keys.{ normalizedName } +import packager.Keys.{ defaultLinuxInstallLocation, defaultLinuxConfigLocation } import com.typesafe.sbt.packager.linux.LinuxPlugin.Users +import com.typesafe.sbt.packager.archetypes.JavaAppStartScript /** * Plugin trait containing all the generic values used for @@ -29,7 +31,27 @@ trait LinuxPlugin extends Plugin { packageSummary in Linux <<= packageSummary, packageDescription in Linux <<= packageDescription, daemonUser in Linux <<= normalizedName, - daemonGroup <<= daemonUser in Linux) + daemonGroup <<= daemonUser in Linux, + + // This one is begging for sbt 0.13 syntax... + linuxScriptReplacements <<= ( + maintainer in Linux, packageSummary in Linux, daemonUser in Linux, daemonGroup in Linux, normalizedName, + sbt.Keys.version, defaultLinuxInstallLocation) + apply { (author, descr, daemonUser, daemonGroup, name, version, installLocation) => + val appDir = installLocation + "/" + name + + // TODO Making replacements should be done somewhere else. Maybe TemplateWriter + JavaAppStartScript.Debian.makeReplacements( + author = author, + description = descr, + execScript = name, + chdir = appDir, + appName = name, + daemonUser = daemonUser, + daemonGroup = daemonGroup) + } + + ) /** DSL for packaging files into .deb */ def packageMapping(files: (File, String)*) = LinuxPackageMapping(files) diff --git a/src/sbt-test/debian/override-control-files/build.sbt b/src/sbt-test/debian/override-control-files/build.sbt index 9a7a756cd..48cd4b449 100644 --- a/src/sbt-test/debian/override-control-files/build.sbt +++ b/src/sbt-test/debian/override-control-files/build.sbt @@ -27,7 +27,8 @@ TaskKey[Unit]("check-control-files") <<= (target, streams) map { (target, out) = val postrm = IO.read(debian / "postrm") val prerm = IO.read(debian / "prerm") // This is a fragile test - assert(postinst equals "echo 'custom postinst'\n", "Wrong postinst:\n" + postinst) + // echo 'custom postinst ${{app_name}} ${{chdir}} ${{daemonUser}} ${{daemonGroup}}' + assert(postinst equals "echo 'custom postinst debian-test /usr/share/debian-test root root'\n", "Wrong postinst:\n" + postinst) assert(preinst equals "echo 'custom preinst'\n", "Wrong preinst:\n" + preinst) assert(postrm equals "echo 'custom postrm'\n", "Wrong postrm:\n" + postrm) assert(prerm equals "echo 'custom prerm'\n", "Wrong prerm:\n" + prerm) diff --git a/src/sbt-test/debian/override-control-files/src/debian/DEBIAN/postinst b/src/sbt-test/debian/override-control-files/src/debian/DEBIAN/postinst index ecb755047..d3893ff70 100644 --- a/src/sbt-test/debian/override-control-files/src/debian/DEBIAN/postinst +++ b/src/sbt-test/debian/override-control-files/src/debian/DEBIAN/postinst @@ -1 +1 @@ -echo 'custom postinst' +echo 'custom postinst ${{app_name}} ${{chdir}} ${{daemon_user}} ${{daemon_group}}' From ae501690505d7fe6eb6a0ed3552adb4d560da45c Mon Sep 17 00:00:00 2001 From: Josh Suereth Date: Wed, 12 Mar 2014 10:15:20 -0400 Subject: [PATCH 2/2] Migrate linux install location defaults into the Linux section of the plugin. * Before linux installation details were in the GenericPackageMappings * Now, we include template generation for linux control scripts in the linux plugin. This means, we need the settings we depend on in the more generic location, as not all usages of the plugin will include the generic mappings. Review by @muuki88 --- .../typesafe/sbt/packager/GenericPackageSettings.scala | 5 ----- .../com/typesafe/sbt/packager/linux/LinuxPlugin.scala | 9 ++++++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/typesafe/sbt/packager/GenericPackageSettings.scala b/src/main/scala/com/typesafe/sbt/packager/GenericPackageSettings.scala index 8fcc54987..58086a691 100644 --- a/src/main/scala/com/typesafe/sbt/packager/GenericPackageSettings.scala +++ b/src/main/scala/com/typesafe/sbt/packager/GenericPackageSettings.scala @@ -61,11 +61,6 @@ trait GenericPackageSettings def mapGenericFilesToLinux: Seq[Setting[_]] = Seq( - // Default place to install code. - defaultLinuxInstallLocation := "/usr/share", - defaultLinuxLogsLocation := "/var/log", - defaultLinuxConfigLocation := "/etc", - // First we look at the src/linux files linuxPackageMappings <++= (sourceDirectory in Linux) map { dir => mapGenericMappingsToLinux(MappingsHelper contentOf dir, Users.Root, Users.Root)(identity) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index 220432012..4805f149f 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -5,7 +5,11 @@ package linux import Keys._ import sbt._ import sbt.Keys.{ normalizedName } -import packager.Keys.{ defaultLinuxInstallLocation, defaultLinuxConfigLocation } +import packager.Keys.{ + defaultLinuxInstallLocation, + defaultLinuxConfigLocation, + defaultLinuxLogsLocation +} import com.typesafe.sbt.packager.linux.LinuxPlugin.Users import com.typesafe.sbt.packager.archetypes.JavaAppStartScript @@ -32,6 +36,9 @@ trait LinuxPlugin extends Plugin { packageDescription in Linux <<= packageDescription, daemonUser in Linux <<= normalizedName, daemonGroup <<= daemonUser in Linux, + defaultLinuxInstallLocation := "/usr/share", + defaultLinuxLogsLocation := "/var/log", + defaultLinuxConfigLocation := "/etc", // This one is begging for sbt 0.13 syntax... linuxScriptReplacements <<= (