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) } } }