/
server.py
executable file
·156 lines (129 loc) · 5.6 KB
/
server.py
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# -*- coding: utf-8 -*-
import Lftp
import Event
from vsftp import VsPacket
import time
import sys
import Logging
def getCurrentMills():
return int(round(time.time() * 1000))
class Receiver:
files = []
def __init__(self, host, port):
self.port = port
self.host = host
self.packetcount = 0
self.validPort = port + 1
def start(self):
self.lftpSocket = Lftp.createSocket(self.host, self.port)
Lftp.registerReceiveHandler(self.lftpSocket, self.prereceiveHandler)
print("Started Receiver on " + str(self.lftpSocket.socket.getsockname()))
Event.eventLoop()
def prereceiveHandler(self, lftpSocket, senderAddress, data):
packet = VsPacket().unpack(data)
print(">> " + str(packet))
''' Get or create file info object'''
''' Handle different VSFTP pacekt types'''
if packet.type == VsPacket.TYPE_BEGIN:
#func = packet.data.split('/')[0]
filename = packet.data
if packet.Rt == VsPacket.RT_GET:
newR = Lftp.createSocket(self.host, self.validPort)
self.validPort = self.validPort + 1
newR.addPeer(senderAddress)
fileToSend = open(filename)
Event.eventFd(fileToSend.fileno(), self.handleFileDataAvailable, (fileToSend, newR), "FileDataAvailable")
elif packet.Rt == VsPacket.RT_PUT:
fileInfo = None
for fInfoTmp in self.files:
if fInfoTmp.sender == senderAddress:
fileInfo = fInfoTmp
if fileInfo is None:
fileInfo = FileInfo()
fileInfo.sender = senderAddress
self.files.append(fileInfo)
Lftp.registerReceiveHandler(self.lftpSocket, self.receiveHandler)
if fileInfo.filename is not None:
print("File already open !!!!")
sys.exit(1)
print("GOT PACKET BEGIN, openning fileToWrite for writing:" + str(filename))
fileInfo.filename = filename
fileInfo.filehandle = open(filename,'w')
fileInfo.sendStarted = Event.getCurrentMills()
pass
def handleFileDataAvailable(self,fd, Args):
print("lalalalalaalalalalalalalallaalalalalalala")
fileToSend = Args[0]
# fileToSend = open(")
lftpSocket = Args[1]
print(lftpSocket.__str__())
data = fileToSend.read(800)
print("datais:" + data)
if data:
vsFtpPacket = VsPacket()
vsFtpPacket.type = VsPacket.TYPE_DATA
vsFtpPacket.data = data
if lftpSocket.sendToAll(vsFtpPacket.pack()) == False:
print("Transmission error, quiting")
sys.exit()
else:
''' Send END packet'''
vsFtpPacket = VsPacket()
vsFtpPacket.type = VsPacket.TYPE_END
vsFtpPacket.data = data
if lftpSocket.sendToAll(vsFtpPacket.pack()) == False:
print("Transmission error, quiting")
Event.eventFdDelete(self.handleFileDataAvailable, (fileToSend, lftpSocket))
Lftp.closeSocket(lftpSocket)
def receiveHandler(self, lftpSocket, senderAddress, data):
packet = VsPacket().unpack(data)
print(">> " + str(packet))
''' Get or create file info object'''
fileInfo = None
for fInfoTmp in self.files:
if fInfoTmp.sender == senderAddress:
fileInfo = fInfoTmp
if fileInfo is None:
fileInfo = FileInfo()
fileInfo.sender = senderAddress
self.files.append(fileInfo)
''' Handle different VSFTP pacekt types'''
if packet.type == VsPacket.TYPE_BEGIN:
if fileInfo.filename is not None:
print("File already open !!!!")
sys.exit(1)
filename = packet.data
print("GOT PACKET BEGIN, openning fileToWrite for writing:" + filename)
fileInfo.filename = filename
fileInfo.filehandle = open(filename,'w')
fileInfo.sendStarted = Event.getCurrentMills()
pass
elif packet.type == VsPacket.TYPE_DATA:
fileInfo.filehandle.write(packet.data)
pass
elif packet.type == VsPacket.TYPE_END:
print("GOT PACKET END, closing file")
fileInfo.filehandle.close()
self.files.remove(fileInfo)
print("Socket closed event received on " + str(lftpSocket))
print("Lost Packets:" + str(lftpSocket.packetloss))
print("Sent Data packets:" + str(lftpSocket.packetsSentData))
print("Sent Control packets:" + str(lftpSocket.packetsSentControl))
print("Received packets(total):" + str(lftpSocket.packetsReceived))
print("Received data packets:" + str(lftpSocket.packetsReceivedData))
print("Received and skipped packets:" + str(lftpSocket.packetsReceivedIgnored))
print("Fake loss:" + str(lftpSocket.packetFakeLoss))
print("Time taken: " + str((Event.getCurrentMills() - fileInfo.sendStarted)))
pass
pass
class FileInfo:
sender = None
filename = None
filehandle = None
sendStarted = None
if __name__ == '__main__':
Logging.Logger.setFile("server.log") # Set file for log messages
if len(sys.argv) < 2:
print("Please provide port number, ex: python LftpReceiver.py 5000")
else:
Receiver("0.0.0.0", int(sys.argv[1])).start()