You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
3.1 KiB

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