blob: 1e441ddd116c7b7e857aa94a4cd5b4a656c74dcc (
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
|
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)
}
}
}
|