import 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()