summaryrefslogtreecommitdiff
path: root/src/main/scala/com/tylerstonge/honeypot/Supervisor.scala
blob: d5c59fe0acaf3730bb3168475e6ed8c91fc28c59 (plain)
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)
    }
  }
}