def remove(fd, addr, req): del file_ip[req['file']] file_list.remove(req['file']) res = {} res['status'] = 0 res['length'] = 0 fd.sendall(difuse_response.build(res))
def truncate(fd, req, addr): with open('/'.join((file_dir, req['file'])), 'w+') as f: f.truncate(req['size']) res = {} res['status'] = 0 res['length'] = 0 fd.sendall(difuse_response.build(res))
def create(fd, addr, req): file_ip[req['file']] = [addr[0], 8080] file_list.append(req['file']) res = {} res['status'] = 0 res['length'] = 0 fd.sendall(difuse_response.build(res))
def list_files(fd, req, addr): data = dumps(os.listdir(file_dir)).encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) res = difuse_response.build(res) fd.sendall(res + data)
def read(fd, req, addr): with open('/'.join((file_dir, req['file'])), 'rb') as f: f.seek(req['offset']) data = f.read(req['size']) res = {} res['status'] = 0 res['length'] = len(data) fd.sendall(difuse_response.build(res) + data)
def rm(fd, req, addr): data = {'file': req['file']} os.unlink('/'.join((file_dir, req['file']))) res = {} res['status'] = 0 res['length'] = 0 h = difuse_response.build(res) fd.sendall(h)
def rename(fd, req, addr): os.rename('/'.join((file_dir, req['file'])), '/'.join((file_dir, req['newname']))) res = {} res['status'] = 0 res['length'] = 0 h = difuse_response.build(res) fd.sendall(h)
def write(fd, req, addr): with open('/'.join((file_dir, req['file'])), 'r+b') as f: f.seek(req['offset']) data = req['data'].encode('utf-8') data = b64decode(data) f.write(data) res = {} res['status'] = 0 res['length'] = 0 fd.sendall(difuse_response.build(res))
def stat(fd, req, addr): filepath = '/'.join((file_dir, req['file'])) data = {} if(os.path.isfile(filepath)): info = os.stat(filepath) stat = dict(st_mode=info.st_mode, st_nlink=info.st_nlink, st_size=info.st_size, st_ctime=info.st_ctime, st_mtime=info.st_mtime, st_atime=info.st_atime) data = stat data = dumps(data).encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) h = difuse_response.build(res) fd.sendall(h + data)
def lookup(fd, addr, req): print('lookup', req['file']) filename = req['file'] file_hash = sha1(filename.encode('utf-8')).digest() file_hash = int.from_bytes(file_hash, byteorder='little') print(file_hash) ip = host_list[0] for h in host_list: if file_hash < h: ip = h break ip = hash2ip[ip] data = (dumps({'ip': ip})).encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) res = difuse_response.build(res) fd.sendall(res+data)
def list_dir(fd, addr, req): ips = hash2ip.values() file_list = [] for ip in ips: with socket.create_connection((ip, 8080)) as s: req = {} req['op'] = 0x18 req['length'] = 0 req = difuse_request.build(req) s.sendall(req) res = difuse_response.parse(s.recv(difuse_response.sizeof())) file_list += loads(s.recv(res.length)) data = dumps(file_list).encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) fd.sendall(difuse_response.build(res)+data)
def join(fd, addr, req): t = str(time()).encode('utf-8') logging.debug(t) logging.debug(f'address = {addr[0]}') ip_hash = sha1(addr[0].encode('utf-8') + t).digest() logging.debug(f'hash = {ip_hash}') ip_hash = int.from_bytes(ip_hash, byteorder='little') logging.debug(f'hash = {ip_hash}') host_list.append(ip_hash) host_list.sort() hash2ip[ip_hash] = addr[0] # send ip of successor data = {'id': ip_hash} if len(host_list) > 1: index = (host_list.index(ip_hash) + 1) % len(host_list) data['ip'] = hash2ip[host_list[index]] data = dumps(data) data = data.encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) fd.sendall(difuse_response.build(res) + data)
def leave(fd, addr, req): global file_ip file_ip = {k: v for k, v in file_ip.items() if v == addr} res = {} res['status'] = 0 res['length'] = 0 ip_hash = [key for key, value in hash2ip.items() if value == addr[0]][0] index = (host_list.index(ip_hash) + 1) % len(host_list) succ = hash2ip[host_list[index]] host_list.remove(ip_hash) del hash2ip[ip_hash] # send ip of successor to migrate # send ip of successor data = {'id': ip_hash} if len(host_list) > 0: data['ip'] = succ data = dumps(data) data = data.encode('utf-8') res = {} res['status'] = 0 res['length'] = len(data) fd.sendall(difuse_response.build(res) + data)
def create(fd, req, addr): f = open('/'.join((file_dir, req['file'])), 'w') f.close() res = {'status': 0, 'length': 0} fd.sendall(difuse_response.build(res))
file_dir = 'difuse.local' join() while not done: read, _, _ = select.select([sock, r], [], []) if leaving and not left: leave() leaving = False left = True continue elif sock in read: fd, addr = sock.accept() payload = None header = difuse_request.parse(fd.recv(size)) if left and header.op != 0x16: res = {} res['status'] = -1 res['length'] = 0 res = difuse_response.build(res) fd.sendall(res) fd.close() continue if header.length: payload = fd.recv(header.length) payload = loads((payload).decode('utf-8')) handle[header.op](fd, payload, addr) fd.close() logging.debug('leaving')