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