package com.tylerstonge.honeypot.ftp import java.net.InetSocketAddress import java.nio.file.{Files, OpenOption, Paths, StandardOpenOption} 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 FtpFileReceiver { def props(port: Int): Props = Props(new FtpFileReceiver(port)) } class FtpFileReceiver(port: Int) extends Actor { val log: LoggingAdapter = Logging(context.system, this) IO(Tcp)(context.system) ! Bind(self, new InetSocketAddress("localhost", port)) val fileData: ByteStringBuilder = ByteString.newBuilder override def receive: Receive = { case Bound(localAddress) => log.info("listening on {}", localAddress) case CommandFailed(_: Bind) => context.stop(self) case Connected(_, _) => log.info("peer connected") context.become { case Received(data) => fileData.addAll(data) case PeerClosed => log.info("peer closed connection, writing file to disk") val out = Files.newByteChannel(Paths.get("testfile.txt"), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE) out.write(fileData.result().toByteBuffer) out.close() context.stop(self) } } }