main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net"
  7. "os"
  8. "os/signal"
  9. "syscall"
  10. "github.com/ishidawataru/sctp"
  11. )
  12. func main() {
  13. f := os.NewFile(3, "signal-parent")
  14. host, container := parseHostContainerAddrs()
  15. p, err := NewProxy(host, container)
  16. if err != nil {
  17. fmt.Fprintf(f, "1\n%s", err)
  18. f.Close()
  19. os.Exit(1)
  20. }
  21. go handleStopSignals(p)
  22. fmt.Fprint(f, "0\n")
  23. f.Close()
  24. // Run will block until the proxy stops
  25. p.Run()
  26. }
  27. // parseHostContainerAddrs parses the flags passed on reexec to create the TCP/UDP/SCTP
  28. // net.Addrs to map the host and container ports
  29. func parseHostContainerAddrs() (host net.Addr, container net.Addr) {
  30. var (
  31. proto = flag.String("proto", "tcp", "proxy protocol")
  32. hostIP = flag.String("host-ip", "", "host ip")
  33. hostPort = flag.Int("host-port", -1, "host port")
  34. containerIP = flag.String("container-ip", "", "container ip")
  35. containerPort = flag.Int("container-port", -1, "container port")
  36. )
  37. flag.Parse()
  38. switch *proto {
  39. case "tcp":
  40. host = &net.TCPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort}
  41. container = &net.TCPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort}
  42. case "udp":
  43. host = &net.UDPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort}
  44. container = &net.UDPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort}
  45. case "sctp":
  46. host = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*hostIP)}}, Port: *hostPort}
  47. container = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*containerIP)}}, Port: *containerPort}
  48. default:
  49. log.Fatalf("unsupported protocol %s", *proto)
  50. }
  51. return host, container
  52. }
  53. func handleStopSignals(p Proxy) {
  54. s := make(chan os.Signal, 10)
  55. signal.Notify(s, os.Interrupt, syscall.SIGTERM)
  56. for range s {
  57. p.Close()
  58. os.Exit(0)
  59. }
  60. }