rendered paste bodyimport socket
import sys
import sha
import re
# Program call: ./ft.py [a|c][r|s] source_host source_port remote_host remote_port file_name
#
# Variable list:
#
# bm = '' # exchange mode
# sh = '' # source port
# sp = '' # source port
# rh = '' # remote host
# rp = '' # remote port
# fn = '' # file name
# fd = open() # file object
# mmr = re.compile() # mode-match-re
# hsh = sha.new() # hash object
# sck = socket.socket() # connection socket
bm = sys.argv[1]
sh = sys.argv[2]
sp = sys.argv[3]
rh = sys.argv[4]
rp = sys.argv[5]
fn = sys.argv[6]
class FileShare:
def __init__(self, bm, sh, sp, rh, rp, fn):
self.sp = int(sp)
self.rp = int(rp)
self.sh = socket.gethostbyname(sh)
self.rh = socket.gethostbyname(rh)
self.mmr = re.compile(r'(a|c)(r|s)')
self.bm = bm
self.fn = fn
self.fd = None
self.hsh = sha.new()
self.sck = socket.socket()
def await(self):
self.sck.bind((self.sh, self.sp))
self.sck.listen(1)
self.sck, ra = self.sck.accept()
ra = (socket.gethostbyname(ra[0]), ra[1])
if ra == (self.rh, self.rp):
rt = 0
else:
self.sck.close()
rt = 1
return(rt)
def connect(self):
self.sck.bind((self.sh, self.sp))
self.sck.connect((self.rh, self.rp))
return(0)
def recieve(self):
self.fd = open(self.fn, 'wb')
tmp = self.sck.recv(1024)
while tmp:
self.hsh.update(tmp)
self.fd.write(tmp)
tmp = self.sck.recv(1024)
self.close()
self.mkhash()
return(0)
def send(self):
self.fd = open(self.fn, 'rb')
tmp = self.fd.read(1024)
while tmp:
self.hsh.update(tmp)
self.sck.sendall(tmp)
tmp = self.fd.read(1024)
self.close()
self.mkhash()
return(0)
def close(self):
self.fd.close()
self.sck.close()
return(0)
def mkhash(self):
hash = self.hsh.hexdigest() + ' ' + '*' + self.fn
print hash
return(0)
def barter(self):
mmrm = self.mmr.search(self.bm)
if mmrm:
if mmrm.groups()[0] == 'a': self.await()
elif mmrm.groups()[0] == 'c': self.connect()
if mmrm.groups()[1] == 'r': self.recieve()
elif mmrm.groups()[1] == 's': self.send()
rt = 0
else:
rt = 1
return(rt)
fs = FileShare(bm, sh, sp, rh, rp, fn)
fs.barter()