1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package com.tylerstonge.honeypot
import java.nio.file.Paths
import akka.actor.{Actor, Props}
import akka.event.{Logging, LoggingAdapter}
import com.tylerstonge.honeypot.ftp.FtpListener
import com.tylerstonge.honeypot.messages.{MStartComponent, MStartReporter}
import com.tylerstonge.honeypot.reporter.{LogReporter, DiscordReporter}
import org.typelevel.jawn.ast.{JArray, JParser}
class Supervisor extends Actor {
val log: LoggingAdapter = Logging(context.system, this)
override def preStart: Unit = {
val cfg = JParser.parseFromFile(Paths.get("config.json").toFile).get
cfg.get("reporters").asInstanceOf[JArray].vs.foreach(r => {
self ! MStartReporter(r.get("name").asString, r.get("type").asString, r.get("options"))
})
cfg.get("components").asInstanceOf[JArray].vs.foreach(c => {
self ! MStartComponent(c.get("name").asString, c.get("type").asString, c.get("port").asInt)
})
}
override def postStop {
log.debug("supervisor is shutting down")
}
override def receive: Receive = {
case msg: MStartComponent => startComponent(msg)
case msg: MStartReporter => startReporter(msg)
case _ => log.debug("supervisor received unhandled message")
}
private def startComponent(msg: MStartComponent) {
log.info("starting component :: {}", msg.name)
msg.ctype match {
case "ftp" => context.actorOf(FtpListener.props(msg.port), name = msg.name)
case _ => log.error("unknown component type: {}", msg.ctype)
}
}
private def startReporter(msg: MStartReporter): Unit = {
log.info("starting reporter :: {}", msg.name)
msg.rtype match {
case "console-logger" => context.actorOf(Props[LogReporter], name = msg.name)
case "discord-logger" => context.actorOf(DiscordReporter.props(msg.options.get("webhook").asString), name = msg.name)
case _ => log.error("unknown reporter type: {}", msg.rtype)
}
}
}
|