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  }