package com.tylerstonge.honeypot.ftp import java.net.InetSocketAddress import java.nio.file.{Files, Paths} import akka.actor.{Actor, Props} import akka.event.{Logging, LoggingAdapter} import akka.io.Tcp._ import akka.io.{IO, Tcp} import akka.util.{ByteString, ByteStringBuilder} object FtpFileRetriever { def props(remote: InetSocketAddress): Props = Props(new FtpFileRetriever(remote)) } class FtpFileRetriever(remote: InetSocketAddress) extends Actor { val log: LoggingAdapter = Logging(context.system, this) IO(Tcp)(context.system) ! Connect(remote) val fileData: ByteStringBuilder = ByteString.newBuilder override def preStart(): Unit = { super.preStart() log.info("started retrieving from {}:{}", remote.getHostString, remote.getPort) } override def receive: Receive = { case CommandFailed(_: Connect) => context.stop(self) case c@Connected(_, _) => val connection = sender() connection ! Register(self) context.become { case data: ByteString => log.info("received {} bytes", data.length) fileData.addAll(data) case CommandFailed(w: Write) => log.info("command failed") case Received(data) => log.info("received {} bytes", data.length) fileData.addAll(data) case _: ConnectionClosed => log.info("peer closed connection, writing file to disk") val out = Files.newByteChannel(Paths.get("testfile.txt")) out.write(fileData.result().toByteBuffer) out.close() context.stop(self) } } }