From baaf0580f56262d67b3697dc18f1be2189c81580 Mon Sep 17 00:00:00 2001 From: ltdk Date: Wed, 27 Apr 2022 09:03:45 -0400 Subject: [PATCH 1/4] Add unix socket support Enables listening on unix sockets by specifying a file path for the bind address --- app.go | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/app.go b/app.go index 4c4aeb9..aef1fe3 100644 --- a/app.go +++ b/app.go @@ -16,6 +16,7 @@ import ( "fmt" "html/template" "io/ioutil" + "net" "net/http" "net/url" "os" @@ -503,9 +504,44 @@ requests. We recommend supplying a valid host name.`) err = http.ListenAndServeTLS(fmt.Sprintf("%s:443", bindAddress), app.cfg.Server.TLSCertPath, app.cfg.Server.TLSKeyPath, r) } } else { - log.Info("Serving on http://%s:%d\n", bindAddress, app.cfg.Server.Port) + var network string + var protocol string + + if strings.HasPrefix(bindAddress, "/") { + network = "unix" + protocol = "http+unix" + + // old sockets will remain after server closes; + // we need to delete them in order to open new ones + removeSocketErr := os.Remove(bindAddress) + if removeSocketErr != nil && !os.IsNotExist(removeSocketErr) { + log.Error("%s already exists but could not be removed: %v", bindAddress, removeSocketErr) + os.Exit(1) + } + } else { + network = "tcp" + protocol = "http" + bindAddress = fmt.Sprintf("%s:%d", bindAddress, app.cfg.Server.Port) + } + + log.Info("Serving on %s://%s", protocol, bindAddress) log.Info("---") - err = http.ListenAndServe(fmt.Sprintf("%s:%d", bindAddress, app.cfg.Server.Port), r) + listener, listenErr := net.Listen(network, bindAddress) + if listenErr != nil { + log.Error("Could not bind to address: %v", listenErr) + os.Exit(1) + } + + if network == "unix" { + chmodSocketErr := os.Chmod(bindAddress, 0o666) + if chmodSocketErr != nil { + log.Error("Could not update socket permissions: %v", chmodSocketErr) + os.Exit(1) + } + } + + defer listener.Close() + err = http.Serve(listener, r) } if err != nil { log.Error("Unable to start: %v", err) From 7a84d27dca8ca85edf039e01c188a9d02f97fbb8 Mon Sep 17 00:00:00 2001 From: Matt Baer Date: Mon, 26 Dec 2022 13:17:56 -0500 Subject: [PATCH 2/4] Re-use err variable, instead of creating new error vars --- app.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app.go b/app.go index aef1fe3..303cb36 100644 --- a/app.go +++ b/app.go @@ -513,9 +513,9 @@ requests. We recommend supplying a valid host name.`) // old sockets will remain after server closes; // we need to delete them in order to open new ones - removeSocketErr := os.Remove(bindAddress) - if removeSocketErr != nil && !os.IsNotExist(removeSocketErr) { - log.Error("%s already exists but could not be removed: %v", bindAddress, removeSocketErr) + err = os.Remove(bindAddress) + if err != nil && !os.IsNotExist(err) { + log.Error("%s already exists but could not be removed: %v", bindAddress, err) os.Exit(1) } } else { @@ -526,16 +526,16 @@ requests. We recommend supplying a valid host name.`) log.Info("Serving on %s://%s", protocol, bindAddress) log.Info("---") - listener, listenErr := net.Listen(network, bindAddress) - if listenErr != nil { - log.Error("Could not bind to address: %v", listenErr) + listener, err := net.Listen(network, bindAddress) + if err != nil { + log.Error("Could not bind to address: %v", err) os.Exit(1) } if network == "unix" { - chmodSocketErr := os.Chmod(bindAddress, 0o666) - if chmodSocketErr != nil { - log.Error("Could not update socket permissions: %v", chmodSocketErr) + err = os.Chmod(bindAddress, 0o666) + if err != nil { + log.Error("Could not update socket permissions: %v", err) os.Exit(1) } } From f84b4b0f74e803504304d441ccd18aea900c0816 Mon Sep 17 00:00:00 2001 From: Matt Baer Date: Mon, 26 Dec 2022 13:18:45 -0500 Subject: [PATCH 3/4] Use more idiomatic variable initialization for network/protocol --- app.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app.go b/app.go index 303cb36..990f71c 100644 --- a/app.go +++ b/app.go @@ -504,9 +504,8 @@ requests. We recommend supplying a valid host name.`) err = http.ListenAndServeTLS(fmt.Sprintf("%s:443", bindAddress), app.cfg.Server.TLSCertPath, app.cfg.Server.TLSKeyPath, r) } } else { - var network string - var protocol string - + network := "tcp" + protocol := "http" if strings.HasPrefix(bindAddress, "/") { network = "unix" protocol = "http+unix" @@ -519,8 +518,6 @@ requests. We recommend supplying a valid host name.`) os.Exit(1) } } else { - network = "tcp" - protocol = "http" bindAddress = fmt.Sprintf("%s:%d", bindAddress, app.cfg.Server.Port) } From a0f1e1821f8f3efe7a5d90120176ddec34562713 Mon Sep 17 00:00:00 2001 From: Matt Baer Date: Mon, 26 Dec 2022 13:20:28 -0500 Subject: [PATCH 4/4] Delete socket file on server shutdown --- app.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app.go b/app.go index 990f71c..1e48b90 100644 --- a/app.go +++ b/app.go @@ -845,6 +845,16 @@ func connectToDatabase(app *App) { func shutdown(app *App) { log.Info("Closing database connection...") app.db.Close() + if strings.HasPrefix(app.cfg.Server.Bind, "/") { + // Clean up socket + log.Info("Removing socket file...") + err := os.Remove(app.cfg.Server.Bind) + if err != nil { + log.Error("Unable to remove socket: %s", err) + os.Exit(1) + } + log.Info("Success.") + } } // CreateUser creates a new admin or normal user from the given credentials.