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