Beispiel #1
0
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))
Beispiel #2
0
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))
Beispiel #3
0
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))
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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))
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
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)
Beispiel #13
0
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)
Beispiel #14
0
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))
Beispiel #15
0
        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')