slowlorisdb/peer/peer.go
peer/peer.goRaw
1package peer
2
3import (
4 "bufio"
5 "context"
6 "crypto/rand"
7 "fmt"
8 "io"
9 "os"
10
11 "github.com/libp2p/go-libp2p"
12 crypto "github.com/libp2p/go-libp2p-crypto"
13 inet "github.com/libp2p/go-libp2p-net"
14 peerstore "github.com/libp2p/go-libp2p-peerstore"
15 "github.com/multiformats/go-multiaddr"
16 log "github.com/sirupsen/logrus"
17)
18
19func handleStream(stream inet.Stream) {
20 log.Info("Got a new stream!")
21
22 rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))
23
24 go readData(rw)
25 go writeData(rw)
26}
27
28func readData(rw *bufio.ReadWriter) {
29 for {
30 str, err := rw.ReadString('\n')
31 if err != nil {
32 log.Error("Error reading from buffer")
33 panic(err)
34 }
35 if str == "" {
36 return
37 }
38 if str != "\n" {
39 fmt.Printf("\x1b[32m%s\x1b[0m> ", str)
40 }
41 }
42}
43
44func writeData(rw *bufio.ReadWriter) {
45 stdReader := bufio.NewReader(os.Stdin)
46 for {
47 fmt.Print("> ")
48 sendData, err := stdReader.ReadString('\n')
49 if err != nil {
50 log.Error("Error reading from stdin")
51 panic(err)
52 }
53
54 _, err = rw.WriteString(fmt.Sprintf("%s\n", sendData))
55 if err != nil {
56 log.Error("Error writing to buffer")
57 panic(err)
58 }
59 err = rw.Flush()
60 if err != nil {
61 log.Error("Error flushing buffer")
62 panic(err)
63 }
64 }
65}
66
67func Start(port int, dest string) error {
68 var r io.Reader
69 r = rand.Reader
70
71 prvKey, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
72 if err != nil {
73 return err
74 }
75
76 sourceMultiAddr, _ := multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port))
77
78 host, err := libp2p.New(
79 context.Background(),
80 libp2p.ListenAddrs(sourceMultiAddr),
81 libp2p.Identity(prvKey),
82 )
83 if err != nil {
84 return err
85 }
86 if dest == "" {
87 host.SetStreamHandler("/slowlorisdb/0.0.1", handleStream)
88
89 var port string
90 for _, la := range host.Network().ListenAddresses() {
91 if p, err := la.ValueForProtocol(multiaddr.P_TCP); err == nil {
92 port = p
93 break
94 }
95 }
96
97 if port == "" {
98 panic("was not able to find actual local port")
99 }
100
101 fmt.Printf("Run './slowlorisdb -d /ip4/127.0.0.1/tcp/%v/p2p/%s' on another console.\n", port, host.ID().Pretty())
102 fmt.Printf("\nWaiting for incoming connection\n\n")
103
104 // Hang forever
105 <-make(chan struct{})
106 } else {
107 fmt.Println("This node's multiaddresses:")
108 for _, la := range host.Addrs() {
109 fmt.Printf(" - %v\n", la)
110 }
111 fmt.Println()
112
113 maddr, err := multiaddr.NewMultiaddr(dest)
114 if err != nil {
115 log.Fatalln(err)
116 }
117
118 info, err := peerstore.InfoFromP2pAddr(maddr)
119 if err != nil {
120 log.Fatalln(err)
121 }
122
123 host.Peerstore().AddAddrs(info.ID, info.Addrs, peerstore.PermanentAddrTTL)
124
125 s, err := host.NewStream(context.Background(), info.ID, "/slowlorisdb/0.0.1")
126 if err != nil {
127 panic(err)
128 }
129
130 rw := bufio.NewReadWriter(bufio.NewReader(s), bufio.NewWriter(s))
131
132 go writeData(rw)
133 go readData(rw)
134
135 select {}
136 }
137 return nil
138}