From 64472cb75d0393954ff9f071eb456316cf5d675d Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sat, 26 Apr 2014 19:02:45 +0200 Subject: [PATCH 1/2] New setting daemonShell. Used in debian package to create user with specified shell. FIX #235 --- .../sbt/packager/debian/postinst-useradd | 2 +- .../archetypes/JavaAppStartScript.scala | 4 ++- .../sbt/packager/debian/DebianPlugin.scala | 8 ++--- .../typesafe/sbt/packager/linux/Keys.scala | 1 + .../sbt/packager/linux/LinuxPlugin.scala | 8 +++-- .../typesafe/sbt/packager/rpm/RpmHelper.scala | 6 ++-- .../debian/daemon-user-shell-deb/build.sbt | 34 +++++++++++++++++++ .../daemon-user-shell-deb/project/plugins.sbt | 1 + .../debian/daemon-user-shell-deb/test | 10 ++++++ 9 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 src/sbt-test/debian/daemon-user-shell-deb/build.sbt create mode 100644 src/sbt-test/debian/daemon-user-shell-deb/project/plugins.sbt create mode 100644 src/sbt-test/debian/daemon-user-shell-deb/test diff --git a/src/main/resources/com/typesafe/sbt/packager/debian/postinst-useradd b/src/main/resources/com/typesafe/sbt/packager/debian/postinst-useradd index 3b8a75da0..20a39efb3 100644 --- a/src/main/resources/com/typesafe/sbt/packager/debian/postinst-useradd +++ b/src/main/resources/com/typesafe/sbt/packager/debian/postinst-useradd @@ -1,5 +1,5 @@ # Adding ${{user}} if ! id -u ${{user}} > /dev/null 2>&1; then echo "Creating user ${{user}} in group ${{group}}" - useradd --system --no-create-home --gid ${{group}} --shell /bin/false ${{user}} + useradd --system --no-create-home --gid ${{group}} --shell ${{shell}} ${{user}} fi 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 587650901..72429792d 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppStartScript.scala @@ -88,6 +88,7 @@ trait JavaAppStartScriptBuilder { appName: String, daemonUser: String, daemonGroup: String, + daemonShell: String, retries: Int = 0, retryTimeout: Int = 60): Seq[(String, String)] = Seq( @@ -99,7 +100,8 @@ trait JavaAppStartScriptBuilder { "retryTimeout" -> retryTimeout.toString, "app_name" -> appName, "daemon_user" -> daemonUser, - "daemon_group" -> daemonGroup) + "daemon_group" -> daemonGroup, + "daemon_shell" -> daemonShell) } /** 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 6dd3c3c27..4e91c249f 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala @@ -6,7 +6,7 @@ import Keys._ import sbt._ import sbt.Keys.{ target, name, normalizedName, TaskStreams } import linux.{ LinuxFileMetaData, LinuxPackageMapping, LinuxSymlink } -import linux.Keys.{ linuxScriptReplacements } +import linux.Keys.{ linuxScriptReplacements, daemonShell } import com.typesafe.sbt.packager.Hashing import com.typesafe.sbt.packager.archetypes.TemplateWriter @@ -145,8 +145,8 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin { chmod(cfile, "0644") cfile }, - debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, linuxScriptReplacements, linuxPackageSymlinks, target, streams) - map { (mappings, _, maintScripts, _, replacements, symlinks, t, streams) => + debianExplodedPackage <<= (linuxPackageMappings, debianControlFile, debianMaintainerScripts, debianConffilesFile, daemonShell in Linux, linuxScriptReplacements, linuxPackageSymlinks, target, streams) + map { (mappings, _, maintScripts, _, shell, replacements, symlinks, t, streams) => // Create files and directories mappings foreach { @@ -191,7 +191,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin { val prerm = createFileIfRequired(t / Names.Debian / Names.Prerm, LinuxFileMetaData()) val headerScript = IO.readLinesURL(DebianPlugin.headerSource) - val replacements = Seq("group" -> group, "user" -> user) + val replacements = Seq("group" -> group, "user" -> user, "shell" -> shell) prependAndFixPerms(prerm, headerScript, LinuxFileMetaData()) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala index 249f7813e..05c76a13b 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala @@ -14,6 +14,7 @@ trait Keys { val maintainer = SettingKey[String]("maintainer", "The name/email address of a maintainer for the native package.") val daemonUser = SettingKey[String]("daemon-user", "User to start application daemon") val daemonGroup = SettingKey[String]("daemon-group", "Group to start application daemon") + val daemonShell = SettingKey[String]("daemon-shell", "Shell provided for the daemon user") val serverLoading = SettingKey[ServerLoader]("server-loader", "Loading system to be used for application start script") val linuxPackageMappings = TaskKey[Seq[LinuxPackageMapping]]("linux-package-mappings", "File to install location mappings including owner and privileges.") val linuxPackageSymlinks = TaskKey[Seq[LinuxSymlink]]("linux-package-symlinks", "Symlinks we should produce in the underlying package.") 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 4e406bf8d..59f1e7a16 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -36,15 +36,16 @@ trait LinuxPlugin extends Plugin { packageDescription in Linux <<= packageDescription, daemonUser in Linux <<= normalizedName, daemonGroup in Linux <<= daemonUser in Linux, + daemonShell in Linux := "bin/false", defaultLinuxInstallLocation := "/usr/share", defaultLinuxLogsLocation := "/var/log", defaultLinuxConfigLocation := "/etc", // This one is begging for sbt 0.13 syntax... linuxScriptReplacements <<= ( - maintainer in Linux, packageSummary in Linux, daemonUser in Linux, daemonGroup in Linux, normalizedName, + maintainer in Linux, packageSummary in Linux, daemonUser in Linux, daemonGroup in Linux, daemonShell in Linux, normalizedName, sbt.Keys.version, defaultLinuxInstallLocation) - apply { (author, descr, daemonUser, daemonGroup, name, version, installLocation) => + apply { (author, descr, daemonUser, daemonGroup, daemonShell, name, version, installLocation) => val appDir = installLocation + "/" + name // TODO Making replacements should be done somewhere else. Maybe TemplateWriter @@ -55,7 +56,8 @@ trait LinuxPlugin extends Plugin { chdir = appDir, appName = name, daemonUser = daemonUser, - daemonGroup = daemonGroup) + daemonGroup = daemonGroup, + daemonShell = daemonShell) } ) diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala index f647d35e8..104a98fc7 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala @@ -80,9 +80,9 @@ object RpmHelper { "--define", "_topdir " + workArea.getAbsolutePath, "--define", "_tmppath " + tmpRpmBuildDir.getAbsolutePath ) ++ ( - if (gpg) Seq("--define", "_gpg_name " + "", "--sign") - else Seq.empty - ) ++ Seq(spec.meta.name + ".spec") + if (gpg) Seq("--define", "_gpg_name " + "", "--sign") + else Seq.empty + ) ++ Seq(spec.meta.name + ".spec") log.debug("Executing rpmbuild with: " + args.mkString(" ")) (Process(args, Some(specsDir)) ! log) match { case 0 => () diff --git a/src/sbt-test/debian/daemon-user-shell-deb/build.sbt b/src/sbt-test/debian/daemon-user-shell-deb/build.sbt new file mode 100644 index 000000000..a4b8024cc --- /dev/null +++ b/src/sbt-test/debian/daemon-user-shell-deb/build.sbt @@ -0,0 +1,34 @@ +import NativePackagerKeys._ +import com.typesafe.sbt.packager.archetypes.ServerLoader + +packageArchetype.java_server + +serverLoading in Debian := ServerLoader.Upstart + +daemonUser in Linux := "daemonuser" + +daemonGroup in Linux := "daemongroup" + +daemonShell in Linux := "/bin/bash" + +mainClass in Compile := Some("empty") + +name := "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-control-files") <<= (target, streams) map { (target, out) => + val debian = target / "debian-test-0.1.0" / "DEBIAN" + val postinst = IO.read(debian / "postinst") + val postrm = IO.read(debian / "postrm") + assert(postinst contains "useradd --system --no-create-home --gid daemongroup --shell /bin/bash daemonuser", "postinst misses useradd for daemonuser: " + postinst) + () +} + diff --git a/src/sbt-test/debian/daemon-user-shell-deb/project/plugins.sbt b/src/sbt-test/debian/daemon-user-shell-deb/project/plugins.sbt new file mode 100644 index 000000000..b53de154c --- /dev/null +++ b/src/sbt-test/debian/daemon-user-shell-deb/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version")) diff --git a/src/sbt-test/debian/daemon-user-shell-deb/test b/src/sbt-test/debian/daemon-user-shell-deb/test new file mode 100644 index 000000000..435f18177 --- /dev/null +++ b/src/sbt-test/debian/daemon-user-shell-deb/test @@ -0,0 +1,10 @@ +# Run the debian packaging. +> debian:package-bin +$ exists target/debian-test-0.1.0.deb + +# Check defaults +$ exists target/debian-test-0.1.0/DEBIAN/prerm +$ exists target/debian-test-0.1.0/DEBIAN/postinst + +# Check files for defaults +> check-control-files From 892ff453dd731f44f0848abab2b26f5b1fb3c1f3 Mon Sep 17 00:00:00 2001 From: Nepomuk Seiler Date: Sat, 26 Apr 2014 22:42:00 +0200 Subject: [PATCH 2/2] Add missing slash --- .../scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 59f1e7a16..b86b2cbc6 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -36,7 +36,7 @@ trait LinuxPlugin extends Plugin { packageDescription in Linux <<= packageDescription, daemonUser in Linux <<= normalizedName, daemonGroup in Linux <<= daemonUser in Linux, - daemonShell in Linux := "bin/false", + daemonShell in Linux := "/bin/false", defaultLinuxInstallLocation := "/usr/share", defaultLinuxLogsLocation := "/var/log", defaultLinuxConfigLocation := "/etc",