mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 06:54:01 +00:00
Merge pull request #98883 from fedepaol/netexecmultilisten
Agnhost: make it possible to pass the addresses to listen on for udp
This commit is contained in:
commit
55a5d4faf3
@ -18,7 +18,7 @@ dependencies:
|
|||||||
|
|
||||||
# agnhost: bump this one first
|
# agnhost: bump this one first
|
||||||
- name: "agnhost"
|
- name: "agnhost"
|
||||||
version: "2.28"
|
version: "2.29"
|
||||||
refPaths:
|
refPaths:
|
||||||
- path: test/images/agnhost/VERSION
|
- path: test/images/agnhost/VERSION
|
||||||
match: \d.\d
|
match: \d.\d
|
||||||
|
@ -1 +1 @@
|
|||||||
2.28
|
2.29
|
||||||
|
@ -51,7 +51,7 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
rootCmd := &cobra.Command{
|
rootCmd := &cobra.Command{
|
||||||
Use: "app",
|
Use: "app",
|
||||||
Version: "2.28",
|
Version: "2.29",
|
||||||
}
|
}
|
||||||
|
|
||||||
rootCmd.AddCommand(auditproxy.CmdAuditProxy)
|
rootCmd.AddCommand(auditproxy.CmdAuditProxy)
|
||||||
|
@ -37,19 +37,23 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
httpPort = 8080
|
httpPort = 8080
|
||||||
udpPort = 8081
|
udpPort = 8081
|
||||||
sctpPort = -1
|
sctpPort = -1
|
||||||
shellPath = "/bin/sh"
|
shellPath = "/bin/sh"
|
||||||
serverReady = &atomicBool{0}
|
serverReady = &atomicBool{0}
|
||||||
certFile = ""
|
certFile = ""
|
||||||
privKeyFile = ""
|
privKeyFile = ""
|
||||||
httpOverride = ""
|
httpOverride = ""
|
||||||
|
udpListenAddresses = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const bindToAny = ""
|
||||||
|
|
||||||
// CmdNetexec is used by agnhost Cobra.
|
// CmdNetexec is used by agnhost Cobra.
|
||||||
var CmdNetexec = &cobra.Command{
|
var CmdNetexec = &cobra.Command{
|
||||||
Use: "netexec",
|
Use: "netexec",
|
||||||
@ -123,6 +127,7 @@ func init() {
|
|||||||
CmdNetexec.Flags().IntVar(&udpPort, "udp-port", 8081, "UDP Listen Port")
|
CmdNetexec.Flags().IntVar(&udpPort, "udp-port", 8081, "UDP Listen Port")
|
||||||
CmdNetexec.Flags().IntVar(&sctpPort, "sctp-port", -1, "SCTP Listen Port")
|
CmdNetexec.Flags().IntVar(&sctpPort, "sctp-port", -1, "SCTP Listen Port")
|
||||||
CmdNetexec.Flags().StringVar(&httpOverride, "http-override", "", "Override the HTTP handler to always respond as if it were a GET with this path & params")
|
CmdNetexec.Flags().StringVar(&httpOverride, "http-override", "", "Override the HTTP handler to always respond as if it were a GET with this path & params")
|
||||||
|
CmdNetexec.Flags().StringVar(&udpListenAddresses, "udp-listen-addresses", "", "A comma separated list of ip addresses the udp servers listen from")
|
||||||
}
|
}
|
||||||
|
|
||||||
// atomicBool uses load/store operations on an int32 to simulate an atomic boolean.
|
// atomicBool uses load/store operations on an int32 to simulate an atomic boolean.
|
||||||
@ -162,7 +167,14 @@ func main(cmd *cobra.Command, args []string) {
|
|||||||
addRoutes(http.DefaultServeMux, exitCh)
|
addRoutes(http.DefaultServeMux, exitCh)
|
||||||
}
|
}
|
||||||
|
|
||||||
go startUDPServer(udpPort)
|
udpBindTo, err := parseAddresses(udpListenAddresses)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, address := range udpBindTo {
|
||||||
|
go startUDPServer(address, udpPort)
|
||||||
|
}
|
||||||
if sctpPort != -1 {
|
if sctpPort != -1 {
|
||||||
go startSCTPServer(sctpPort)
|
go startSCTPServer(sctpPort)
|
||||||
}
|
}
|
||||||
@ -539,15 +551,15 @@ func redirectHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// udp server supports the hostName, echo and clientIP commands.
|
// udp server supports the hostName, echo and clientIP commands.
|
||||||
func startUDPServer(udpPort int) {
|
func startUDPServer(address string, udpPort int) {
|
||||||
serverAddress, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", udpPort))
|
serverAddress, err := net.ResolveUDPAddr("udp", net.JoinHostPort(address, strconv.Itoa(udpPort)))
|
||||||
assertNoError(err, fmt.Sprintf("failed to resolve UDP address for port %d", sctpPort))
|
assertNoError(err, fmt.Sprintf("failed to resolve UDP address for port %d", sctpPort))
|
||||||
serverConn, err := net.ListenUDP("udp", serverAddress)
|
serverConn, err := net.ListenUDP("udp", serverAddress)
|
||||||
assertNoError(err, fmt.Sprintf("failed to create listener for UDP address %v", serverAddress))
|
assertNoError(err, fmt.Sprintf("failed to create listener for UDP address %v", serverAddress))
|
||||||
defer serverConn.Close()
|
defer serverConn.Close()
|
||||||
buf := make([]byte, 2048)
|
buf := make([]byte, 2048)
|
||||||
|
|
||||||
log.Printf("Started UDP server on port %d", udpPort)
|
log.Printf("Started UDP server on port %s %d", address, udpPort)
|
||||||
// Start responding to readiness probes.
|
// Start responding to readiness probes.
|
||||||
serverReady.set(true)
|
serverReady.set(true)
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -639,3 +651,21 @@ func assertNoError(err error, detail string) {
|
|||||||
log.Fatalf("Error occurred: %s:%v", detail, err)
|
log.Fatalf("Error occurred: %s:%v", detail, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseAddresses(addresses string) ([]string, error) {
|
||||||
|
if addresses == "" {
|
||||||
|
return []string{bindToAny}, nil
|
||||||
|
}
|
||||||
|
// Using a set to remove duplicates
|
||||||
|
res := make([]string, 0)
|
||||||
|
split := strings.Split(addresses, ",")
|
||||||
|
for _, address := range split {
|
||||||
|
netAddr := net.ParseIP(address)
|
||||||
|
if netAddr == nil {
|
||||||
|
return nil, fmt.Errorf("parseAddress: invalid address %s", address)
|
||||||
|
}
|
||||||
|
res = append(res, address)
|
||||||
|
}
|
||||||
|
set := sets.NewString(res...)
|
||||||
|
return set.List(), nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user