1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package main
- import (
- "flag"
- "fmt"
- "log"
- "net"
- "os"
- "os/signal"
- "syscall"
- "github.com/docker/docker/dockerversion"
- "github.com/ishidawataru/sctp"
- )
- func main() {
- f := os.NewFile(3, "signal-parent")
- host, container := parseFlags()
- p, err := NewProxy(host, container)
- if err != nil {
- fmt.Fprintf(f, "1\n%s", err)
- f.Close()
- os.Exit(1)
- }
- go handleStopSignals(p)
- fmt.Fprint(f, "0\n")
- f.Close()
- // Run will block until the proxy stops
- p.Run()
- }
- // parseFlags parses the flags passed on reexec to create the TCP/UDP/SCTP
- // net.Addrs to map the host and container ports.
- func parseFlags() (host net.Addr, container net.Addr) {
- var (
- proto = flag.String("proto", "tcp", "proxy protocol")
- hostIP = flag.String("host-ip", "", "host ip")
- hostPort = flag.Int("host-port", -1, "host port")
- containerIP = flag.String("container-ip", "", "container ip")
- containerPort = flag.Int("container-port", -1, "container port")
- printVer = flag.Bool("v", false, "print version information and quit")
- printVersion = flag.Bool("version", false, "print version information and quit")
- )
- flag.Parse()
- if *printVer || *printVersion {
- fmt.Printf("docker-proxy (commit %s) version %s\n", dockerversion.GitCommit, dockerversion.Version)
- os.Exit(0)
- }
- switch *proto {
- case "tcp":
- host = &net.TCPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort}
- container = &net.TCPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort}
- case "udp":
- host = &net.UDPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort}
- container = &net.UDPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort}
- case "sctp":
- host = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*hostIP)}}, Port: *hostPort}
- container = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*containerIP)}}, Port: *containerPort}
- default:
- log.Fatalf("unsupported protocol %s", *proto)
- }
- return host, container
- }
- func handleStopSignals(p Proxy) {
- s := make(chan os.Signal, 10)
- signal.Notify(s, os.Interrupt, syscall.SIGTERM)
- for range s {
- p.Close()
- os.Exit(0)
- }
- }
|