main.go 2.0 KB

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