A common and reliable pattern in service unit files is thus:
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
DevicePolicy=closed
ProtectSystem=strict
| def buildFiles(b: File) = ((b * "*.sbt") +++ ((b / "project") ** ("*.scala" | "*.sbt")) filter (_.isFile)) | |
| def genBuildFilesHashesAt(base: File) = buildFiles(base).get.map(f => f -> (Hash toHex Hash(f))).toMap | |
| def genBuildFilesHashes(units: Map[URI, LoadedBuildUnit]) = | |
| (units.values flatMap (_.defined) map (_._2.base) flatMap genBuildFilesHashesAt).toMap.## | |
| val buildFilesHashes = settingKey[Int]("") in Global | |
| buildFilesHashes := genBuildFilesHashes(loadedBuild.value.units) | |
| shellPrompt in Global := (s => |
| #!/usr/bin/env bash | |
| set -Eeuo pipefail | |
| trap cleanup SIGINT SIGTERM ERR EXIT | |
| script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) | |
| usage() { | |
| cat <<EOF | |
| Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-v] [-f] -p param_value arg1 [arg2...] |