-
Notifications
You must be signed in to change notification settings - Fork 640
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/release' into develop
- Loading branch information
Showing
30 changed files
with
1,336 additions
and
481 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,121 +20,150 @@ lazy val thehive = (project in file(".")) | |
.enablePlugins(PlayScala) | ||
.dependsOn(thehiveBackend, thehiveMetrics, thehiveMisp, thehiveCortex) | ||
.aggregate(thehiveBackend, thehiveMetrics, thehiveMisp, thehiveCortex) | ||
.settings(aggregate in Debian := false) | ||
.settings(aggregate in Rpm := false) | ||
.settings(aggregate in Docker := false) | ||
.settings(PublishToBinTray.settings: _*) | ||
.settings(Release.settings: _*) | ||
|
||
releaseVersionUIFile := baseDirectory.value / "ui" / "package.json" | ||
|
||
changelogFile := baseDirectory.value / "CHANGELOG.md" | ||
Release.releaseVersionUIFile := baseDirectory.value / "ui" / "package.json" | ||
Release.changelogFile := baseDirectory.value / "CHANGELOG.md" | ||
|
||
// Front-end // | ||
run := { | ||
(run in Compile).evaluated | ||
frontendDev.value | ||
} | ||
|
||
mappings in packageBin in Assets ++= frontendFiles.value | ||
|
||
mappings in Universal ~= { _.filterNot { | ||
case (_, name) => name == "conf/application.conf" | ||
}} | ||
// Remove conf files | ||
// Install service files | ||
mappings in Universal ~= { | ||
_.flatMap { | ||
case (file, "conf/application.conf") => Nil | ||
case (file, "conf/application.sample") => Seq(file -> "conf/application.conf") | ||
case other => Seq(other) | ||
} ++ Seq( | ||
file("install/thehive.service") -> "install/thehive.service", | ||
file("install/thehive.conf") -> "install/thehive.conf", | ||
file("install/thehive") -> "install/thehive" | ||
) | ||
} | ||
|
||
// Install files // | ||
// Package // | ||
maintainer := "Thomas Franco <[email protected]" | ||
packageSummary := "Scalable, Open Source and Free Security Incident Response Solutions" | ||
packageDescription := """TheHive is a scalable 3-in-1 open source and free security incident response platform designed to make life easier | ||
| for SOCs, CSIRTs, CERTs and any information security practitioner dealing with security incidents that need to be | ||
| investigated and acted upon swiftly.""".stripMargin | ||
defaultLinuxInstallLocation := "/opt" | ||
linuxPackageMappings ~= { _.map { pm => | ||
val mappings = pm.mappings.filterNot { | ||
case (file, path) => path.startsWith("/opt/thehive/install") || path.startsWith("/opt/thehive/conf") | ||
} | ||
com.typesafe.sbt.packager.linux.LinuxPackageMapping(mappings, pm.fileData).withConfig() | ||
} :+ packageMapping( | ||
file("install/thehive.service") -> "/etc/systemd/system/thehive.service", | ||
file("install/thehive.conf") -> "/etc/init/thehive.conf", | ||
file("install/thehive") -> "/etc/init.d/thehive", | ||
file("conf/application.sample") -> "/etc/thehive/application.conf", | ||
file("conf/logback.xml") -> "/etc/thehive/logback.xml" | ||
).withConfig() | ||
} | ||
|
||
mappings in Universal ++= { | ||
val dir = baseDirectory.value / "install" | ||
(dir.***) pair relativeTo(dir.getParentFile) | ||
packageBin := { | ||
(packageBin in Universal).value | ||
(packageBin in Debian).value | ||
//(packageBin in Rpm).value | ||
} | ||
// DEB // | ||
debianPackageRecommends := Seq("elasticsearch") | ||
debianPackageDependencies += "java8-runtime-headless | java8-runtime" | ||
maintainerScripts in Debian := maintainerScriptsFromDirectory( | ||
baseDirectory.value / "install" / "debian", | ||
Seq(DebianConstants.Postinst, DebianConstants.Prerm, DebianConstants.Postrm) | ||
) | ||
linuxEtcDefaultTemplate in Debian := (baseDirectory.value / "install" / "etc_default_thehive").asURL | ||
linuxMakeStartScript in Debian := None | ||
|
||
// RPM // | ||
rpmRelease := "8" | ||
rpmVendor in Rpm := "TheHive Project" | ||
rpmUrl := Some("http://thehive-project.org/") | ||
rpmLicense := Some("AGPL") | ||
rpmRequirements += "java-1.8.0-openjdk-headless" | ||
maintainerScripts in Rpm := maintainerScriptsFromDirectory( | ||
baseDirectory.value / "install" / "rpm", | ||
Seq(RpmConstants.Pre, RpmConstants.Preun, RpmConstants.Postun) | ||
) | ||
linuxPackageSymlinks in Rpm := Nil | ||
rpmPrefix := Some(defaultLinuxInstallLocation.value) | ||
linuxEtcDefaultTemplate in Rpm := (baseDirectory.value / "install" / "etc_default_thehive").asURL | ||
|
||
// Release // | ||
import ReleaseTransformations._ | ||
// DOCKER // | ||
import com.typesafe.sbt.packager.docker.{ Cmd, ExecCmd } | ||
|
||
import Release._ | ||
defaultLinuxInstallLocation in Docker := "/opt/thehive" | ||
dockerRepository := Some("certbdf") | ||
dockerUpdateLatest := true | ||
dockerEntrypoint := Seq("/opt/thehive/entrypoint") | ||
dockerExposedPorts := Seq(9000) | ||
mappings in Docker ++= Seq( | ||
file("install/docker/entrypoint") -> "/opt/thehive/entrypoint", | ||
file("conf/logback.xml") -> "/etc/thehive/logback.xml", | ||
file("install/empty") -> "/var/log/thehive/application.log") | ||
mappings in Docker ~= (_.filterNot { | ||
case (_, filepath) => filepath == "/opt/thehive/conf/application.conf" | ||
}) | ||
dockerCommands ~= { dc => | ||
val (dockerInitCmds, dockerTailCmds) = dc.splitAt(4) | ||
dockerInitCmds ++ | ||
Seq( | ||
Cmd("ADD", "var", "/var"), | ||
Cmd("ADD", "etc", "/etc"), | ||
ExecCmd("RUN", "chown", "-R", "daemon:daemon", "/var/log/thehive")) ++ | ||
dockerTailCmds | ||
} | ||
|
||
// Bintray // | ||
bintrayOrganization := Some("cert-bdf") | ||
|
||
bintrayRepository := "thehive" | ||
|
||
publish := { | ||
(publish in Docker).value | ||
PublishToBinTray.publishRelease.value | ||
PublishToBinTray.publishLatest.value | ||
} | ||
|
||
releaseProcess := Seq[ReleaseStep]( | ||
checkUncommittedChanges, | ||
checkSnapshotDependencies, | ||
getVersionFromBranch, | ||
runTest, | ||
releaseMerge, | ||
checkoutMaster, | ||
setReleaseVersion, | ||
setReleaseUIVersion, | ||
generateChangelog, | ||
commitChanges, | ||
tagRelease, | ||
publishArtifacts, | ||
checkoutDevelop, | ||
setNextVersion, | ||
setNextUIVersion, | ||
commitChanges, | ||
//commitNextVersion, | ||
pushChanges) | ||
|
||
// DOCKER // | ||
|
||
dockerBaseImage := "elasticsearch:2.3" | ||
|
||
dockerExposedVolumes += "/data" | ||
|
||
dockerRepository := Some("certbdf") | ||
|
||
dockerUpdateLatest := true | ||
|
||
mappings in Universal += file("docker/entrypoint") -> "bin/entrypoint" | ||
|
||
import com.typesafe.sbt.packager.docker.{ ExecCmd, Cmd } | ||
|
||
dockerCommands := dockerCommands.value.map { | ||
case ExecCmd("ENTRYPOINT", _*) => ExecCmd("ENTRYPOINT", "bin/entrypoint") | ||
case cmd => cmd | ||
} | ||
|
||
dockerCommands := (dockerCommands.value.head +: | ||
Cmd("EXPOSE", "9000") +: | ||
dockerCommands.value.tail) | ||
|
||
// Scalariform // | ||
import scalariform.formatter.preferences._ | ||
import com.typesafe.sbt.SbtScalariform | ||
import com.typesafe.sbt.SbtScalariform.ScalariformKeys | ||
|
||
ScalariformKeys.preferences in ThisBuild := ScalariformKeys.preferences.value | ||
.setPreference(AlignParameters, false) | ||
// .setPreference(FirstParameterOnNewline, Force) | ||
// .setPreference(FirstParameterOnNewline, Force) | ||
.setPreference(AlignArguments, true) | ||
// .setPreference(FirstArgumentOnNewline, true) | ||
// .setPreference(FirstArgumentOnNewline, true) | ||
.setPreference(AlignSingleLineCaseStatements, true) | ||
.setPreference(AlignSingleLineCaseStatements.MaxArrowIndent, 60) | ||
.setPreference(CompactControlReadability, true) | ||
.setPreference(CompactStringConcatenation, false) | ||
.setPreference(DoubleIndentClassDeclaration, true) | ||
// .setPreference(DoubleIndentMethodDeclaration, true) | ||
// .setPreference(DoubleIndentMethodDeclaration, true) | ||
.setPreference(FormatXml, true) | ||
.setPreference(IndentLocalDefs, false) | ||
.setPreference(IndentPackageBlocks, false) | ||
.setPreference(IndentSpaces, 2) | ||
.setPreference(IndentWithTabs, false) | ||
.setPreference(MultilineScaladocCommentsStartOnFirstLine, false) | ||
// .setPreference(NewlineAtEndOfFile, true) | ||
// .setPreference(NewlineAtEndOfFile, true) | ||
.setPreference(PlaceScaladocAsterisksBeneathSecondAsterisk, false) | ||
.setPreference(PreserveSpaceBeforeArguments, false) | ||
// .setPreference(PreserveDanglingCloseParenthesis, false) | ||
// .setPreference(PreserveDanglingCloseParenthesis, false) | ||
.setPreference(DanglingCloseParenthesis, Prevent) | ||
.setPreference(RewriteArrowSymbols, true) | ||
.setPreference(SpaceBeforeColon, false) | ||
// .setPreference(SpaceBeforeContextColon, false) | ||
// .setPreference(SpaceBeforeContextColon, false) | ||
.setPreference(SpaceInsideBrackets, false) | ||
.setPreference(SpaceInsideParentheses, false) | ||
.setPreference(SpacesWithinPatternBinders, true) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
# Secret key | ||
# ~~~~~ | ||
# The secret key is used to secure cryptographics functions. | ||
# If you deploy your application to several instances be sure to use the same key! | ||
#play.crypto.secret="***changeme***" | ||
|
||
|
||
# ElasticSearch | ||
search { | ||
# Name of the index | ||
index = the_hive | ||
# Name of the ElasticSearch cluster | ||
cluster = hive | ||
# Address of the ElasticSearch instance | ||
host = ["127.0.0.1:9300"] | ||
# Scroll keepalive | ||
keepalive = 1m | ||
# Size of the page for scroll | ||
pagesize = 50 | ||
} | ||
|
||
# Authentication | ||
auth { | ||
# "type" parameter contains authentication provider. It can be multi-valued (useful for migration) | ||
# available auth types are: | ||
# services.LocalAuthSrv : passwords are stored in user entity (in ElasticSearch). No configuration are required. | ||
# ad : use ActiveDirectory to authenticate users. Configuration is under "auth.ad" key | ||
# ldap : use LDAP to authenticate users. Configuration is under "auth.ldap" key | ||
type = [local] | ||
|
||
ad { | ||
# Domain Windows name using DNS format. This parameter is required. | ||
#domainFQDN = "mydomain.local" | ||
|
||
# Domain Windows name using short format. This parameter is required. | ||
#domainName = "MYDOMAIN" | ||
|
||
# Use SSL to connect to domain controller | ||
#useSSL = true | ||
} | ||
|
||
ldap { | ||
# LDAP server name or address. Port can be specified (host:port). This parameter is required. | ||
#serverName = "ldap.mydomain.local:389" | ||
|
||
# Use SSL to connect to directory server | ||
#useSSL = true | ||
|
||
# Account to use to bind on LDAP server. This parameter is required. | ||
#bindDN = "cn=thehive,ou=services,dc=mydomain,dc=local" | ||
|
||
# Password of the binding account. This parameter is required. | ||
#bindPW = "***secret*password***" | ||
|
||
# Base DN to search users. This parameter is required. | ||
#baseDN = "ou=users,dc=mydomain,dc=local" | ||
|
||
# Filter to search user {0} is replaced by user name. This parameter is required. | ||
#filter = "(cn={0})" | ||
} | ||
} | ||
|
||
# Cortex | ||
cortex { | ||
#"CORTEX-SERVER-ID" { | ||
# # URL of MISP server | ||
# url = "" | ||
#} | ||
} | ||
|
||
# MISP | ||
misp { | ||
#"MISP-SERVER-ID" { | ||
# # URL of MISP server | ||
# url = "" | ||
# # authentication key | ||
# key = "" | ||
# #tags to be added to imported artifact | ||
# tags = ["misp"] | ||
#} | ||
|
||
# truststore to used to validate MISP certificate (if default truststore is not suffisient) | ||
#cert = /path/to/truststore.jsk | ||
|
||
# Interval between two MISP event import | ||
interval = 1h | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,39 +1,39 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<configuration debug="false"> | ||
|
||
<conversionRule conversionWord="coloredLevel" | ||
converterClass="play.api.libs.logback.ColoredLevel" /> | ||
|
||
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> | ||
<file>${application.home:-.}/logs/application.log</file> | ||
<encoder> | ||
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern> | ||
</encoder> | ||
</appender> | ||
|
||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | ||
<encoder> | ||
<pattern>%coloredLevel %logger{15} - %message%n%xException{10} | ||
</pattern> | ||
</encoder> | ||
</appender> | ||
|
||
<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender"> | ||
<appender-ref ref="FILE" /> | ||
</appender> | ||
|
||
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender"> | ||
<appender-ref ref="STDOUT" /> | ||
</appender> | ||
|
||
<logger name="play" level="INFO" /> | ||
<logger name="application" level="INFO" /> | ||
|
||
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" /> | ||
|
||
<root level="INFO"> | ||
<appender-ref ref="ASYNCFILE" /> | ||
<appender-ref ref="ASYNCSTDOUT" /> | ||
</root> | ||
|
||
<?xml version="1.0" encoding="UTF-8"?> | ||
<configuration debug="false"> | ||
|
||
<conversionRule conversionWord="coloredLevel" | ||
converterClass="play.api.libs.logback.ColoredLevel" /> | ||
|
||
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> | ||
<file>/var/log/thehive/application.log</file> | ||
<encoder> | ||
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern> | ||
</encoder> | ||
</appender> | ||
|
||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | ||
<encoder> | ||
<pattern>%coloredLevel %logger{15} - %message%n%xException{10} | ||
</pattern> | ||
</encoder> | ||
</appender> | ||
|
||
<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender"> | ||
<appender-ref ref="FILE" /> | ||
</appender> | ||
|
||
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender"> | ||
<appender-ref ref="STDOUT" /> | ||
</appender> | ||
|
||
<logger name="play" level="INFO" /> | ||
<logger name="application" level="INFO" /> | ||
|
||
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" /> | ||
|
||
<root level="INFO"> | ||
<appender-ref ref="ASYNCFILE" /> | ||
<appender-ref ref="ASYNCSTDOUT" /> | ||
</root> | ||
|
||
</configuration> |
Oops, something went wrong.