Skip to content

Commit

Permalink
fixed bad permissions for debian maintainer scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
kardapoltsev committed Dec 17, 2013
1 parent 72e38aa commit ed74cb0
Showing 1 changed file with 37 additions and 15 deletions.
52 changes: 37 additions & 15 deletions src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
val Debian = config("debian") extend Linux

import com.typesafe.sbt.packager.universal.Archives
import DebianPlugin.Names

private[this] final def copyAndFixPerms(from: File, to: File, perms: LinuxFileMetaData, zipped: Boolean = false): Unit = {
if (zipped) {
Expand All @@ -39,13 +40,20 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
script
}

private[this] def scriptMapping(scriptName: String)(script: Option[File], controlDir: File): Seq[(File, String)] = {
private[this] def scriptMapping(scriptName: String)(script: Option[File], controlDir: File, target: File): (File, String) = {
(script, controlDir) match {
// check if user defined script exists
case (_, dir) if (dir / scriptName).exists =>
Seq(file((dir / scriptName).getAbsolutePath) -> scriptName)
file((dir / scriptName).getAbsolutePath) -> scriptName
// create mappings for generated script
case (scr, _) => scr.toSeq.map(_ -> scriptName)
case (Some(scr), _) => scr -> scriptName
// create empty control script because sometimes we want append to control files in debianExploadedPackage task
case (None, _) =>
val d = target / Names.Debian
d.mkdirs()
val empty = d / scriptName
empty.createNewFile()
empty -> scriptName
}
}

Expand All @@ -67,17 +75,17 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
// Debian Control Scripts
debianControlScriptsReplacements <<= (maintainer in Debian, packageSummary in Debian, normalizedName, version) apply DebianControlScriptReplacements,

debianControlScriptsDirectory <<= (sourceDirectory) apply (_ / "debian" / "DEBIAN"),
debianControlScriptsDirectory <<= (sourceDirectory) apply (_ / "debian" / Names.Debian),
debianMaintainerScripts := Seq.empty,
debianMakePreinstScript := None,
debianMakePrermScript := None,
debianMakePostinstScript := None,
debianMakePostrmScript := None,

debianMaintainerScripts <++= (debianMakePrermScript, debianControlScriptsDirectory) map scriptMapping("prerm"),
debianMaintainerScripts <++= (debianMakePreinstScript, debianControlScriptsDirectory) map scriptMapping("preinst"),
debianMaintainerScripts <++= (debianMakePostinstScript, debianControlScriptsDirectory) map scriptMapping("postinst"),
debianMaintainerScripts <++= (debianMakePostrmScript, debianControlScriptsDirectory) map scriptMapping("postrm")) ++ inConfig(Debian)(Seq(
debianMaintainerScripts <+= (debianMakePrermScript, debianControlScriptsDirectory, target in Debian) map scriptMapping(Names.Prerm),
debianMaintainerScripts <+= (debianMakePreinstScript, debianControlScriptsDirectory, target in Debian) map scriptMapping(Names.Preinst),
debianMaintainerScripts <+= (debianMakePostinstScript, debianControlScriptsDirectory, target in Debian) map scriptMapping(Names.Postinst),
debianMaintainerScripts <+= (debianMakePostrmScript, debianControlScriptsDirectory, target in Debian) map scriptMapping(Names.Postrm)) ++ inConfig(Debian)(Seq(
packageArchitecture := "all",
debianPackageInfo <<=
(name, version, maintainer, packageSummary, packageDescription) apply PackageInfo,
Expand All @@ -95,14 +103,14 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
},
debianControlFile <<= (debianPackageMetadata, debianPackageInstallSize, target) map {
(data, size, dir) =>
val cfile = dir / "DEBIAN" / "control"
val cfile = dir / Names.Debian / Names.Control
IO.write(cfile, data.makeContent(size), java.nio.charset.Charset.defaultCharset)
chmod(cfile, "0644")
cfile
},
debianConffilesFile <<= (linuxPackageMappings, target) map {
(mappings, dir) =>
val cfile = dir / "DEBIAN" / "conffiles"
val cfile = dir / Names.Debian / Names.Conffiles
val conffiles = for {
LinuxPackageMapping(files, meta, _) <- mappings
if meta.config != "false"
Expand Down Expand Up @@ -139,7 +147,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
// Put the maintainer files in `dir / "DEBIAN"` named as specified.
// Valid values for the name are preinst,postinst,prerm,postrm
for ((file, name) <- maintScripts) {
val targetFile = t / "DEBIAN" / name
val targetFile = t / Names.Debian / name
copyAndFixPerms(file, targetFile, LinuxFileMetaData())
filterAndFixPerms(targetFile, replacements, LinuxFileMetaData())
}
Expand All @@ -154,8 +162,8 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
} groupBy (_._1) foreach {
case ((user, group), pathList) =>
streams.log info ("Altering postrm/postinst files to add user " + user + " and group " + group)
val postinst = t / "DEBIAN" / "postinst"
val postrm = t / "DEBIAN" / "postrm"
val postinst = t / Names.Debian / Names.Postinst
val postrm = t / Names.Debian / Names.Postrm

val replacements = Seq("group" -> group, "user" -> user)
IO.append(postinst, TemplateWriter.generateScript(DebianPlugin.postinstGroupaddTemplateSource, replacements))
Expand All @@ -174,11 +182,11 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
},
debianMD5sumsFile <<= (debianExplodedPackage, target) map {
(mappings, dir) =>
val md5file = dir / "DEBIAN" / "md5sums"
val md5file = dir / Names.Debian / "md5sums"
val md5sums = for {
(file, name) <- (dir.*** --- dir x relativeTo(dir))
if file.isFile
if !(name startsWith "DEBIAN")
if !(name startsWith Names.Debian)
if !(name contains "debian-binary")
// TODO - detect symlinks with Java7 (when we can) rather than hackery...
if file.getCanonicalPath == file.getAbsolutePath
Expand Down Expand Up @@ -210,6 +218,20 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
}

object DebianPlugin {
object Names {
val Debian = "DEBIAN"

//maintainer script names
val Postinst = "postinst"
val Postrm = "postrm"
val Prerm = "prerm"
val Preinst = "preinst"

val Control = "control"
val Conffiles = "conffiles"
}


private def postinstGroupaddTemplateSource: java.net.URL = getClass.getResource("postinst-groupadd")
private def postinstUseraddTemplateSource: java.net.URL = getClass.getResource("postinst-useradd")
private def postinstChownTemplateSource: java.net.URL = getClass.getResource("postinst-chown")
Expand Down

0 comments on commit ed74cb0

Please sign in to comment.