From ae50f7dcd31428b194570da8a6556438a088b640 Mon Sep 17 00:00:00 2001 From: Thomas Boerger Date: Fri, 13 Sep 2019 14:39:31 +0200 Subject: [PATCH] Optionally listen to unix sockets instead of port binding --- pkg/command/server.go | 102 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/pkg/command/server.go b/pkg/command/server.go index ac1e0ddc89..6978d3b331 100644 --- a/pkg/command/server.go +++ b/pkg/command/server.go @@ -2,9 +2,11 @@ package command import ( "context" + "net" "net/http" "os" "os/signal" + "strings" "time" "github.com/oklog/run" @@ -40,6 +42,45 @@ func Server() *cobra.Command { Str("addr", viper.GetString("debug.addr")). Msg("Starting debug server") + if strings.HasPrefix(viper.GetString("debug.addr"), "unix://") { + socket := strings.TrimPrefix(viper.GetString("debug.addr"), "unix://") + + if err := os.Remove(socket); err != nil && !os.IsNotExist(err) { + log.Error(). + Err(err). + Str("socket", socket). + Msg("Failed to remove existing debug socket") + + return err + } + + listener, err := net.ListenUnix( + "unix", + &net.UnixAddr{ + Name: socket, + Net: "unix", + }, + ) + + if err != nil { + log.Error(). + Err(err). + Msg("Failed to initialize debug unix socket") + + return err + } + + if err = os.Chmod(socket, os.FileMode(0666)); err != nil { + log.Error(). + Err(err). + Msg("Failed to change debug socket permissions") + + return err + } + + return server.Serve(listener) + } + return server.ListenAndServe() }, func(reason error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) @@ -53,6 +94,17 @@ func Server() *cobra.Command { return } + if strings.HasPrefix(viper.GetString("debug.addr"), "unix://") { + socket := strings.TrimPrefix(viper.GetString("debug.addr"), "unix://") + + if err := os.Remove(socket); err != nil && !os.IsNotExist(err) { + log.Error(). + Err(err). + Str("socket", socket). + Msg("Failed to remove debug server socket") + } + } + log.Info(). Err(reason). Msg("Shutdown debug server gracefully") @@ -76,6 +128,45 @@ func Server() *cobra.Command { Str("addr", viper.GetString("http.addr")). Msg("Starting http server") + if strings.HasPrefix(viper.GetString("http.addr"), "unix://") { + socket := strings.TrimPrefix(viper.GetString("http.addr"), "unix://") + + if err := os.Remove(socket); err != nil && !os.IsNotExist(err) { + log.Error(). + Err(err). + Str("socket", socket). + Msg("Failed to remove existing http socket") + + return err + } + + listener, err := net.ListenUnix( + "unix", + &net.UnixAddr{ + Name: socket, + Net: "unix", + }, + ) + + if err != nil { + log.Error(). + Err(err). + Msg("Failed to initialize http unix socket") + + return err + } + + if err = os.Chmod(socket, os.FileMode(0666)); err != nil { + log.Error(). + Err(err). + Msg("Failed to change http socket permissions") + + return err + } + + return server.Serve(listener) + } + return server.ListenAndServe() }, func(reason error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) @@ -89,6 +180,17 @@ func Server() *cobra.Command { return } + if strings.HasPrefix(viper.GetString("http.addr"), "unix://") { + socket := strings.TrimPrefix(viper.GetString("http.addr"), "unix://") + + if err := os.Remove(socket); err != nil && !os.IsNotExist(err) { + log.Error(). + Err(err). + Str("socket", socket). + Msg("Failed to remove http server socket") + } + } + log.Info(). Err(reason). Msg("Shutdown http server gracefully")