Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import socket
- import os
- import datetime
- PORT = 58002
- BUFFER_SIZE = 1024
- #backup_list.txt: <user>|<dir>|<bsip>|<bsport>
- #BS_registry.txt: <bsip>:<bsport>
- #------------------------------------
- #| INIT |
- #------------------------------------
- if len(sys.argv) == 3:
- PORT = int(sys.argv[2])
- print [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
- if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)),
- s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET,
- socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
- print socket.gethostname()
- f = open("BS_registry.txt","w")
- f.close()
- f = open("backup_list.txt","w")
- f.close()
- f = open("user_reg.txt","w")
- f.close()
- s_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s_tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s_tcp.bind(("", PORT))
- s_tcp.listen(1)
- s_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s_udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s_udp.bind(("", PORT))
- class File:
- def __init__(self, name, date, time, size):
- self.name = name
- self.datetime = datetime.datetime(int(date.split(".")[2]),int(date.split(".")[1]),int(date.split(".")[0]),int(time.split(":")[0]),int(time.split(":")[1]),int(time.split(":")[2]))
- self.size=int(size)
- def is_more_recent_than(self, file):
- return self.datetime > file.datetime
- def is_the_same_file(self, file):
- return self.name == file.name
- def __str__(self):
- return "{0:s} {1:02d}.{2:02d}.{3:04d} {4:02d}.{5:02d}.{6:02d} {7:d}".format(self.name, self.datetime.day, self.datetime.month, self.datetime.year, self.datetime.hour, self.datetime.minute, self.datetime.second, self.size)
- #------------------------------------
- #| Communication Interface |
- #------------------------------------
- def receive_tcp(conn, addr):
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+']TCP: Connection address:', addr
- data = conn.recv(BUFFER_SIZE)
- data.decode()
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]TCP: Received "+ data+" from ",addr
- return data
- def send_tcp(message, conn, addr):
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]TCP: Sending "+message+" to ",addr
- message.encode()
- conn.send(message)
- #Implement receive from wrong address gets buffered
- #Timed resend
- def receive_udp():
- data, addr = s_udp.recvfrom(1024)
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]UDP: Received "+ data+" from ",addr
- data.decode()
- return data, addr
- """def send_udp(message, addr):
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]UDP: Sending "+message+" to ",addr
- message.encode()
- s_udp.sendto(message, addr)
- """
- def send_udp(message, ip, port):
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]UDP: Sending "+message+" to "+ip+":",port
- message.encode()
- s_udp.sendto(message, (ip,int(port)))
- def send_udp_request(message, ip, port):
- print datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]UDP: Sending "+message+" to "+ip+":",port
- message.encode()
- s_udp_requests.sendto(message, (ip,int(port)))
- def send(message):
- print "sending "+message
- def receive():
- message = raw_input("receiving... ")
- return message
- #------------------------------------
- #| Auxiliary funciotions |
- #------------------------------------
- def create_user(user,password):
- f = open("user_reg.txt","a")
- f.write(user+"|"+password+"\n")
- f.close()
- def check_user(user,password):
- f = open("user_reg.txt","r")
- for line in f:
- if line.split("|")[0] == user:
- f.close()
- if line.split("|")[1] == password:
- return "OK"
- else:
- return "NOK"
- f.close()
- create_user(user,password)
- return "NEW"
- def fetch_user(user):
- f=open("user_reg.txt","r")
- for lin in f:
- if lin.split("|")[0] == user:
- f.close()
- return lin.split("|")[1][:-1]
- f.close()
- return False
- def del_user(user):
- f = open("user_reg.txt","r")
- lines = f.readlines()
- f.close()
- f = open("user_reg.txt","w")
- for line in lines:
- if line.split("|")[0] != user:
- f.write(line)
- f.close()
- #dir_stored: checks within the internal registry if dir belonging to user exists.
- # returns info on the bs storing it, or False in case file isnt registered
- def dir_stored(user, dir):
- f = open("backup_list.txt","r")
- for line in f:
- if line.split("|")[1] == dir and line.split("|")[0] == user:
- f.close()
- return (line.split("|")[2],line.split("|")[3])
- f.close()
- return False
- #store_dir: stores the dir in the internal registry
- def store_dir(user, dir, bsip, bsport):
- f = open("backup_list.txt","a")
- f.write(user+"|"+dir+"|"+bsip+"|"+bsport+"\n")
- f.close()
- def format_files(n,files):
- Files = []
- if len(files.split(" ")) != n*4:
- return False
- for i in range(n):
- file = File(files.split(" ")[i*4], files.split(" ")[i*4+1], files.split(" ")[i*4+2], files.split(" ")[i*4+3])
- Files.append(file)
- return Files,(UDP_IP,UDP_PORT)
- def get_new_files(files, stored_files):
- new_files = []
- for file in files:
- is_new=True
- for stored_file in stored_files:
- if file.is_the_same_file(stored_file) and not file.is_more_recent_than(stored_file):
- is_new=False
- break
- if is_new:
- new_files.append(file)
- return new_files
- #------------------------------------
- #| USER interactions |
- #------------------------------------
- def authenticate(user, password):
- return "AUR "+check_user(user, password)+"\n"
- def delete_user(user):
- f = open("backup_list.txt","r")
- for line in f:
- if user == line.split("|")[0]:
- f.close()
- return "DLR NOK\n"
- print("deleting user "+user)
- f.close()
- del_user(user)
- return "DLR OK\n"
- def list_dir(user):
- f = open("backup_list.txt","r")
- n=0
- dirs = ""
- for line in f:
- if line.split("|")[0]==user:
- n+=1
- dirs = dirs + line.split("|")[1] + " "
- f.close()
- return str(n) + " " + dirs[:-1]
- def bs_available():
- if (os.stat("BS_registry.txt").st_size == 0):
- return False
- else:
- return True
- def get_bs():
- f = open("BS_registry.txt","r")
- bs = f.readline()
- lines =f.readlines()
- f.close()
- f = open("BS_registry.txt","w")
- for line in lines:
- f.write(line)
- f.write(bs)
- f.close()
- return (bs.split(":")[0],bs.split(":")[1][:-1])
- def find_bs(user, dir):
- f = open("backup_list.txt","r")
- for line in f:
- if line.split("|")[0] == user and line.split("|")[1] == dir:
- bsip = line.split("|")[2]
- bsport = line.split("|")[3]
- f.close()
- return (bsip,bsport)
- f.close()
- return False
- #------------------------------------
- #| BS interactions |
- #------------------------------------
- def register_bs(ipaddr,port):
- f = open("BS_registry.txt","r")
- bs_ip_port = ipaddr + ":" + port
- if bs_ip_port in f.read():
- f.close()
- return "RGR NOK\n"
- f.close()
- f = open("BS_registry.txt","a")
- f.write(bs_ip_port + "\n")
- f.close()
- return "RGR OK\n"
- def unregister_bs(ipaddr,port):
- found = False
- f = open("BS_registry.txt","r")
- lines = f.readlines()
- f.close()
- f = open("BS_registry.txt","w")
- for line in lines:
- if line!=ipaddr+":"+port+"\n":
- print line + " != " + ipaddr + ":" + port + "\n"
- f.write(line)
- else:
- print line + " == " + ipaddr + ":" + port + "\n"
- found = True
- f.close()
- if found:
- return "UAR OK\n"
- else:
- return "UAR NOK\n"
- def list_files(user,dir):
- f = open("backup_list.txt","r")
- for line in f:
- if line.split("|")[0] == user and line.split("|")[1] == dir:
- bsip = line.split("|")[2]
- bsport = line.split("|")[3]
- send_udp("LSF "+user+" "+dir+"\n", bsip, bsport)
- message, addr = receive_udp()
- f.close()
- if addr[0]== bsip and addr[1]==bsport and message.split(" ")[0] == "LFD" and message.split(" ")[1] != "NOK":
- return "LFD "+bsip+" "+bsport+" "+ message[4:]+"\n"
- else:
- return "LFD NOK\n"
- f.close()
- return "LFD NOK\n"
- def check_files(user,dir,n,files):
- stored_files = list_files(user,dir)
- stored_n = int(stored_files.split(" ")[3])
- if stored_files != "LFD NOK":
- bsip = files.split(" ")[1]
- bsport = files.split(" ")[2]
- new_files = get_new_files(format_files(n,files),format_files(stored_n,stored_files[5+len(str(stored_n)):-1]))
- new_files_str = str(len(new_files)) + " "
- for file in new_files:
- new_files_str += str(file) +" "
- return new_files_str[:-1]
- #else:
- #TODO
- def create_dir(user,dir,bsip,bsport):
- send_udp("LSU "+user+" "+fetch_user(user)+"\n", bsip, bsport)
- print "[DEBUG:LUR]"
- #message, addr = receive_udp()
- print "[DEBUG:LUR]"+message
- if message == "LUR OK\n":
- print "[DEBUG]Storing dir"
- store_dir(user,dir,bsip,bsport)
- return True
- return False
- def del_dir(user, dir):
- f = open("backup_list.txt","r")
- for line in f:
- if line.split("|")[0] == user and line.split("|")[1] == dir:
- bsip = line.split("|")[2]
- bsport = line.split("|")[3]
- f.close()
- send_udp("DLB "+user+" "+dir+"\n", bsip, bsport)
- message, addr = receive_udp()
- if message == "DBR OK\n":
- f = open("backup_list.txt","r")
- lines = f.readlines()
- f.close()
- f = open("backup_list.txt","w")
- for line in lines:
- if line!=user+"|"+dir+"|"+bsip+"|"+bsport+"\n":
- f.write(line)
- f.close()
- return "DDR OK\n"
- else:
- return "DDR NOK\n"
- f.close()
- return "DDR NOK\n"
- #------------------------------------
- #| CS UDP operation |
- #------------------------------------
- def child():
- while True:
- code, addr =receive_udp()
- if code.split(" ")[0] == "REG":
- if len(code.split(" "))!=3:
- send_udp("RGR ERR\n",addr[0],addr[1])
- else:
- send_udp(register_bs(code.split(" ")[1],code.split(" ")[2]),addr[0],addr[1])
- elif code.split(" ")[0] == "UNR":
- if len(code.split(" "))!=3:
- send_udp("UAR ERR\n",addr[0],addr[1])
- else:
- send_udp(unregister_bs(code.split(" ")[1],code.split(" ")[2]),addr[0],addr[1])
- #------------------------------------
- #| CS TCP operation |
- #------------------------------------
- for i in range(len(sys.argv)):
- if sys.argv[i] == "-p":
- TCP_PORT = sys.argv[i+1]
- print("Port: " + TCP_PORT)
- pid = os.fork()
- if pid==0:
- child()
- else:
- while True:
- print(datetime.datetime.now().strftime("[%H:%M:%S.%f")+"]Awaiting connection...")
- conn, addr = s_tcp.accept()
- code = receive_tcp(conn, addr)
- if code.split(" ")[0] == "AUT":
- aut = authenticate(code.split(" ")[1], code.split(" ")[2])
- if aut == "AUR NEW\n" or aut == "AUR OK\n":
- user = code.split(" ")[1]
- send_tcp(aut, conn, addr)
- code = receive_tcp(conn, addr)
- if code.split(" ")[0] == "DLU\n":
- send_tcp(delete_user(user), conn, addr)
- elif code.split(" ")[0] == "LSD\n":
- send_tcp("LDR "+list_dir(user) +"\n", conn, addr)
- elif code.split(" ")[0] == "LSF":
- send_tcp(list_files(user,code.split(" ")[1]), conn, addr)
- elif code.split(" ")[0] == "DEL":
- send_tcp(del_dir(user,code.split(" ")[1]), conn, addr)
- elif code.split(" ")[0] == "BCK":
- if len(code.split(" "))<3:
- send_tcp("BKR ERR", conn, addr)
- else:
- dir = code.split(" ")[1]
- n = code.split(" ")[2]
- files = code.split(" ")[3:]
- if not bs_available():
- send_tcp("BKR EOF", conn, addr)
- elif dir_stored(user,dir):#TODO if user_stored
- bsip, bsport = dir_stored(user,dir)
- send_tcp("BKR " + bsip + " " + bsport + " " + check_files(user,dir,n,files), conn, addr)
- else:
- new_bs = get_bs()
- if create_dir(user,dir,new_bs[0],new_bs[1]):
- send("BKR "+new_bs[0]+" "+new_bs[1]+code[3:])
- elif code.split(" ")[0] == "RST":
- send_tcp("RSR " + dir_stored(user,code.split(" ")[1])[0] + " " + dir_stored(user,code.split(" ")[1])[1], conn, addr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement