Skip to content

Commit

Permalink
Merge branch 'feature/release' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed May 5, 2017
2 parents 41dd7bc + 7cc4148 commit ae7da1f
Show file tree
Hide file tree
Showing 30 changed files with 1,336 additions and 481 deletions.
159 changes: 94 additions & 65 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
87 changes: 87 additions & 0 deletions conf/application.sample
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
}
76 changes: 38 additions & 38 deletions thehive-backend/conf/logback.xml → conf/logback.xml
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>
Loading

0 comments on commit ae7da1f

Please sign in to comment.