local.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package action
  2. import (
  3. "ehang.io/nps/lib/lb"
  4. "net"
  5. )
  6. type LocalAction struct {
  7. DefaultAction
  8. TargetAddr []string `json:"target_addr" placeholder:"1.1.1.1:80\n1.1.1.2:80" zh_name:"目标地址"`
  9. UnixSocket bool `json:"unix_sock" placeholder:"" zh_name:"转发到unix socket"`
  10. networkTcp string
  11. localLb lb.Algo
  12. }
  13. func (la *LocalAction) GetName() string {
  14. return "local"
  15. }
  16. func (la *LocalAction) GetZhName() string {
  17. return "转发到本地"
  18. }
  19. func (la *LocalAction) Init() error {
  20. la.localLb = lb.GetLbAlgo("roundRobin")
  21. for _, v := range la.TargetAddr {
  22. _ = la.localLb.Append(v)
  23. }
  24. la.networkTcp = "tcp"
  25. if la.UnixSocket {
  26. // just support unix
  27. la.networkTcp = "unix"
  28. }
  29. return nil
  30. }
  31. func (la *LocalAction) RunConn(clientConn net.Conn) error {
  32. serverConn, err := la.GetServerConn()
  33. if err != nil {
  34. return err
  35. }
  36. la.startCopy(clientConn, serverConn)
  37. return nil
  38. }
  39. func (la *LocalAction) RunConnWithAddr(clientConn net.Conn, addr string) error {
  40. serverConn, err := la.GetServeConnWithAddr(addr)
  41. if err != nil {
  42. return err
  43. }
  44. la.startCopy(clientConn, serverConn)
  45. return nil
  46. }
  47. func (la *LocalAction) CanServe() bool {
  48. return true
  49. }
  50. func (la *LocalAction) GetServerConn() (net.Conn, error) {
  51. addr, err := la.localLb.Next()
  52. if err != nil {
  53. return nil, err
  54. }
  55. return la.GetServeConnWithAddr(addr.(string))
  56. }
  57. func (la *LocalAction) GetServeConnWithAddr(addr string) (net.Conn, error) {
  58. return net.Dial(la.networkTcp, addr)
  59. }
  60. func (la *LocalAction) RunPacketConn(pc net.PacketConn) error {
  61. localPacketConn, err := net.ListenPacket("udp", "127.0.0.1:0")
  62. if err != nil {
  63. return err
  64. }
  65. return la.startCopyPacketConn(pc, localPacketConn)
  66. }