Beispiel #1
0
ipv4_datagram_server.socket.setsockopt(
    socket.IPPROTO_IP,
    socket.IP_ADD_MEMBERSHIP,
    socket.inet_pton(socket.AF_INET, settings.IPV4_MULTICAST_GROUP) + struct.pack("=I", socket.INADDR_ANY),
)
ipv4_datagram_server.start()

# Set up the v6 UDP server
ipv6_datagram_server = datagram.TrummaDatagramServer(
    settings.IPV6_MULTICAST_GROUP, (settings.IPV6_BIND_INTERFACE, settings.UDP_PORT)
)
ipv6_datagram_server.family = socket.AF_INET6
ipv6_datagram_server.init_socket()
ipv6_datagram_server.socket.setsockopt(
    socket.IPPROTO_IPV6,
    socket.IPV6_JOIN_GROUP,
    socket.inet_pton(socket.AF_INET6, settings.IPV6_MULTICAST_GROUP) + struct.pack("=I", 0),
)
ipv6_datagram_server.start()

datagram.datagram_servers.append(ipv4_datagram_server)
datagram.datagram_servers.append(ipv6_datagram_server)

gevent.sleep(0.2)
datagram.send_hi_message_to_multicast_group()
Greenlet.spawn(run_ui()).join()

connection_server.stop()
ipv4_datagram_server.stop()
ipv6_datagram_server.stop()
Beispiel #2
0
def run_ui():
    while True:
        try:
            cmd = raw_input("> ")

            # split command
            if cmd != "":
                scmd = cmd.split()
                # some alias commands first:
                if cmd == "list my files":
                    cmd = "list files " + settings.LOOPBACK_IP_ADDRESS
                elif cmd == "listpeers":
                    cmd = "list peers"
                elif ((scmd[0] == "refresh" or scmd[0] == "update") and
                    scmd[1] == "filelist" and len(scmd) == 3):
                    cmd = "get filelist " + scmd[2]
                # split again, we may have changed cmd

            if cmd != "":
                scmd = cmd.split()

            if cmd == "list peers":
                print(*peerlist, sep="\n")
            elif cmd == "self":
                print(peerlist.self_peer)
            elif cmd.startswith("list files ") and len(scmd) >= 3:
                try:
                    peer = findpeer(' '.join(scmd[2:]))
                    print("Peer {alias} has {numfiles} files:".format(
                        alias=peer.alias,
                        numfiles=len(peer.files)
                        ))
                    for f in peer.files:
                        print("{name} {length} {sha_hash}".format(
                            name=f.name,
                            length=f.length,
                            sha_hash=f.sha_hash
                            ))
                except NameError as e:
                    print(e)
            elif cmd.startswith("get filelist ") and len(scmd) >= 3:
                peer = findpeer(' '.join(scmd[2:]))
                get_filelist_task = Greenlet.spawn(get_file_list, peer)
                get_filelist_task.join()
            elif cmd.startswith("get file ") and len(scmd) == 4:
                peer = findpeer(' '.join(scmd[3:]))
                matching_files = filter(lambda f: (scmd[2] in f.sha_hash or
                    scmd[2] in f.name), peer.files)
                if len(matching_files) > 1:
                    raise UserInputException("Multiple matching files")
                elif len(matching_files) == 0:
                    raise UserInputException("No matching file")
                else:
                    download_task = Greenlet.spawn(get_file, peer,
                        matching_files[0])
                    # wait until completion
                    download_task.join()
            elif cmd.startswith("find peers"):
                datagram.send_hi_message_to_multicast_group()
                print("finding peers … please check peerlist to " +
                    "see if somebody answered")
            elif cmd.startswith("share "):
                try:
                    newly_shared = share_file(scmd[1])
                    for f in newly_shared:
                        print("added to share: " + f.name)
                        datagram \
                        .send_file_announcement_message_to_multicast_group(f)
                except EOFError:
                    print("No such file or directory " + scmd[1])
            elif cmd == "announce all":
                for f in peerlist.self_peer.files:
                    datagram \
                    .send_file_announcement_message_to_multicast_group(f)
            elif cmd.startswith("announce "):
                matching_files = filter(lambda f: (scmd[1] in f.sha_hash
                    or scmd[1] in f.name), peerlist.self_peer.files)
                if len(matching_files) > 1:
                    raise UserInputException("Multiple matching files")
                elif len(matching_files) == 0:
                    raise UserInputException("No matching file")
                else:
                    datagram.send_file_announcement_message_to_multicast_group(
                        matching_files[0])

            elif cmd == "exit" or cmd == "quit" or cmd == "q":
                datagram.send_bye_message_to_multicast_group()
                break
            elif cmd == "help" or cmd == "h":
                #todo: implement
                print("there should be some help here…")
            else:
                print("No such command - type help to get a list of commands")
        except EOFError:
            break
        except PeerNotFoundException, e:
            print(e)