Skip to content

Commit 1174ad3

Browse files
committed
Merge pull request #110 from kardapoltsev/wip/bad-permissions
fixed bad permissions for debian maintainer scripts
2 parents 4a457cf + bfa8e0a commit 1174ad3

File tree

2 files changed

+50
-19
lines changed

2 files changed

+50
-19
lines changed

src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ object JavaServerAppPackaging {
4949
debianMakeEtcDefault <<= (normalizedName, target in Universal, serverLoading in Debian)
5050
map makeEtcDefaultScript,
5151
linuxPackageMappings in Debian <++= (debianMakeEtcDefault, normalizedName) map { (conf, name) =>
52-
conf.map(c => LinuxPackageMapping(Seq(c -> s"/etc/default/$name")).withConfig()).toSeq
52+
conf.map(c => LinuxPackageMapping(Seq(c -> ("/etc/default/" + name))).withConfig()).toSeq
5353
},
5454
linuxPackageMappings in Debian <++= (debianMakeStartScript, normalizedName, serverLoading in Debian)
5555
map { (script, name, loader) =>
@@ -82,7 +82,7 @@ object JavaServerAppPackaging {
8282
if (replacements.isEmpty) None
8383
else {
8484
val scriptBits = JavaAppStartScript.generateScript(replacements, loader)
85-
val script = tmpDir / "tmp" / "bin" / s"$name.$loader"
85+
val script = tmpDir / "tmp" / "init" / name
8686
IO.write(script, scriptBits)
8787
Some(script)
8888
}
@@ -106,7 +106,7 @@ object JavaServerAppPackaging {
106106
case Upstart => None
107107
case SystemV => {
108108
val scriptBits = TemplateWriter.generateScript(etcDefaultTemplateSource, Seq.empty)
109-
val script = tmpDir / "tmp" / "bin" / "etc-default"
109+
val script = tmpDir / "tmp" / "etc" / "default" / name
110110
IO.write(script, scriptBits)
111111
Some(script)
112112
}

src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala

+47-16
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
1616
val Debian = config("debian") extend Linux
1717

1818
import com.typesafe.sbt.packager.universal.Archives
19+
import DebianPlugin.Names
1920

2021
private[this] final def copyAndFixPerms(from: File, to: File, perms: LinuxFileMetaData, zipped: Boolean = false): Unit = {
2122
if (zipped) {
@@ -39,6 +40,15 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
3940
script
4041
}
4142

43+
44+
private[this] def prependAndFixPerms(script: File, lines: Seq[String], perms: LinuxFileMetaData): File = {
45+
val old = IO.readLines(script)
46+
IO.writeLines(script, lines ++ old, append = false)
47+
chmod(script, perms.permissions)
48+
script
49+
}
50+
51+
4252
private[this] def scriptMapping(scriptName: String)(script: Option[File], controlDir: File): Seq[(File, String)] = {
4353
(script, controlDir) match {
4454
// check if user defined script exists
@@ -67,17 +77,17 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
6777
// Debian Control Scripts
6878
debianControlScriptsReplacements <<= (maintainer in Debian, packageSummary in Debian, normalizedName, version) apply DebianControlScriptReplacements,
6979

70-
debianControlScriptsDirectory <<= (sourceDirectory) apply (_ / "debian" / "DEBIAN"),
80+
debianControlScriptsDirectory <<= (sourceDirectory) apply (_ / "debian" / Names.Debian),
7181
debianMaintainerScripts := Seq.empty,
7282
debianMakePreinstScript := None,
7383
debianMakePrermScript := None,
7484
debianMakePostinstScript := None,
7585
debianMakePostrmScript := None,
7686

77-
debianMaintainerScripts <++= (debianMakePrermScript, debianControlScriptsDirectory) map scriptMapping("prerm"),
78-
debianMaintainerScripts <++= (debianMakePreinstScript, debianControlScriptsDirectory) map scriptMapping("preinst"),
79-
debianMaintainerScripts <++= (debianMakePostinstScript, debianControlScriptsDirectory) map scriptMapping("postinst"),
80-
debianMaintainerScripts <++= (debianMakePostrmScript, debianControlScriptsDirectory) map scriptMapping("postrm")) ++ inConfig(Debian)(Seq(
87+
debianMaintainerScripts <++= (debianMakePrermScript, debianControlScriptsDirectory) map scriptMapping(Names.Prerm),
88+
debianMaintainerScripts <++= (debianMakePreinstScript, debianControlScriptsDirectory) map scriptMapping(Names.Preinst),
89+
debianMaintainerScripts <++= (debianMakePostinstScript, debianControlScriptsDirectory) map scriptMapping(Names.Postinst),
90+
debianMaintainerScripts <++= (debianMakePostrmScript, debianControlScriptsDirectory) map scriptMapping(Names.Postrm)) ++ inConfig(Debian)(Seq(
8191
packageArchitecture := "all",
8292
debianPackageInfo <<=
8393
(name, version, maintainer, packageSummary, packageDescription) apply PackageInfo,
@@ -95,14 +105,14 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
95105
},
96106
debianControlFile <<= (debianPackageMetadata, debianPackageInstallSize, target) map {
97107
(data, size, dir) =>
98-
val cfile = dir / "DEBIAN" / "control"
108+
val cfile = dir / Names.Debian / Names.Control
99109
IO.write(cfile, data.makeContent(size), java.nio.charset.Charset.defaultCharset)
100110
chmod(cfile, "0644")
101111
cfile
102112
},
103113
debianConffilesFile <<= (linuxPackageMappings, target) map {
104114
(mappings, dir) =>
105-
val cfile = dir / "DEBIAN" / "conffiles"
115+
val cfile = dir / Names.Debian / Names.Conffiles
106116
val conffiles = for {
107117
LinuxPackageMapping(files, meta, _) <- mappings
108118
if meta.config != "false"
@@ -139,7 +149,7 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
139149
// Put the maintainer files in `dir / "DEBIAN"` named as specified.
140150
// Valid values for the name are preinst,postinst,prerm,postrm
141151
for ((file, name) <- maintScripts) {
142-
val targetFile = t / "DEBIAN" / name
152+
val targetFile = t / Names.Debian / name
143153
copyAndFixPerms(file, targetFile, LinuxFileMetaData())
144154
filterAndFixPerms(targetFile, replacements, LinuxFileMetaData())
145155
}
@@ -154,31 +164,38 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
154164
} groupBy (_._1) foreach {
155165
case ((user, group), pathList) =>
156166
streams.log info ("Altering postrm/postinst files to add user " + user + " and group " + group)
157-
val postinst = t / "DEBIAN" / "postinst"
158-
val postrm = t / "DEBIAN" / "postrm"
167+
val postinst = t / Names.Debian / Names.Postinst
168+
val postrm = t / Names.Debian / Names.Postrm
159169

160170
val replacements = Seq("group" -> group, "user" -> user)
161-
IO.append(postinst, TemplateWriter.generateScript(DebianPlugin.postinstGroupaddTemplateSource, replacements))
162-
IO.append(postinst, TemplateWriter.generateScript(DebianPlugin.postinstUseraddTemplateSource, replacements))
171+
172+
val userGroupAdd = Seq(
173+
TemplateWriter.generateScript(DebianPlugin.postinstGroupaddTemplateSource, replacements),
174+
TemplateWriter.generateScript(DebianPlugin.postinstUseraddTemplateSource, replacements)
175+
)
176+
177+
prependAndFixPerms(postinst, userGroupAdd, LinuxFileMetaData())
163178

164179
// remove key, flatten it and then go through each file
165180
pathList.map(_._2).flatten foreach {
166181
case (_, target) =>
167182
val pathReplacements = replacements :+ ("path" -> target.toString)
168-
IO.append(postinst, TemplateWriter.generateScript(DebianPlugin.postinstChownTemplateSource, pathReplacements))
183+
val chownAdd = Seq(TemplateWriter.generateScript(DebianPlugin.postinstChownTemplateSource, pathReplacements))
184+
prependAndFixPerms(postinst, chownAdd, LinuxFileMetaData())
169185
}
170186

171-
IO.append(postrm, TemplateWriter.generateScript(DebianPlugin.postrmPurgeTemplateSource, replacements))
187+
val purgeAdd = Seq(TemplateWriter.generateScript(DebianPlugin.postrmPurgeTemplateSource, replacements))
188+
prependAndFixPerms(postrm, purgeAdd, LinuxFileMetaData())
172189
}
173190
t
174191
},
175192
debianMD5sumsFile <<= (debianExplodedPackage, target) map {
176193
(mappings, dir) =>
177-
val md5file = dir / "DEBIAN" / "md5sums"
194+
val md5file = dir / Names.Debian / "md5sums"
178195
val md5sums = for {
179196
(file, name) <- (dir.*** --- dir x relativeTo(dir))
180197
if file.isFile
181-
if !(name startsWith "DEBIAN")
198+
if !(name startsWith Names.Debian)
182199
if !(name contains "debian-binary")
183200
// TODO - detect symlinks with Java7 (when we can) rather than hackery...
184201
if file.getCanonicalPath == file.getAbsolutePath
@@ -210,6 +227,20 @@ trait DebianPlugin extends Plugin with linux.LinuxPlugin {
210227
}
211228

212229
object DebianPlugin {
230+
object Names {
231+
val Debian = "DEBIAN"
232+
233+
//maintainer script names
234+
val Postinst = "postinst"
235+
val Postrm = "postrm"
236+
val Prerm = "prerm"
237+
val Preinst = "preinst"
238+
239+
val Control = "control"
240+
val Conffiles = "conffiles"
241+
}
242+
243+
213244
private def postinstGroupaddTemplateSource: java.net.URL = getClass.getResource("postinst-groupadd")
214245
private def postinstUseraddTemplateSource: java.net.URL = getClass.getResource("postinst-useradd")
215246
private def postinstChownTemplateSource: java.net.URL = getClass.getResource("postinst-chown")

0 commit comments

Comments
 (0)