summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2018-02-19 11:19:39 +0000
committerGeorge Goldberg <george@gberg.me>2018-02-19 11:19:39 +0000
commitf8289eb286d00c29859a8df495b957c7b46cb249 (patch)
tree1bc18d6a3a795482c7229786f7ab427fabbcd007 /cmd
parent8891fa2a5e9e08eb9fa99ec163c47a6e9761a816 (diff)
parent30197584d5a215a3b25bffa79a034ed9e360cf52 (diff)
downloadchat-f8289eb286d00c29859a8df495b957c7b46cb249.tar.gz
chat-f8289eb286d00c29859a8df495b957c7b46cb249.tar.bz2
chat-f8289eb286d00c29859a8df495b957c7b46cb249.zip
Merge branch 'master' into advanced-permissions-phase-1
Diffstat (limited to 'cmd')
-rw-r--r--cmd/platform/mattermost.go3
-rw-r--r--cmd/platform/server.go52
-rw-r--r--cmd/platform/server_test.go64
3 files changed, 114 insertions, 5 deletions
diff --git a/cmd/platform/mattermost.go b/cmd/platform/mattermost.go
index b0190011b..e4a120e1e 100644
--- a/cmd/platform/mattermost.go
+++ b/cmd/platform/mattermost.go
@@ -25,6 +25,9 @@ import (
_ "github.com/prometheus/client_golang/prometheus/promhttp"
_ "github.com/tylerb/graceful"
_ "gopkg.in/olivere/elastic.v5"
+
+ // Temp imports for new dependencies
+ _ "github.com/gorilla/schema"
)
func main() {
diff --git a/cmd/platform/server.go b/cmd/platform/server.go
index c3001a77d..1ea38455c 100644
--- a/cmd/platform/server.go
+++ b/cmd/platform/server.go
@@ -4,6 +4,7 @@
package main
import (
+ "net"
"os"
"os/signal"
"syscall"
@@ -132,11 +133,21 @@ func runServer(configFileLocation string, disableConfigWatch bool, interruptChan
a.EnsureDiagnosticId()
- go runSecurityJob(a)
- go runDiagnosticsJob(a)
- go runSessionCleanupJob(a)
- go runTokenCleanupJob(a)
- go runCommandWebhookCleanupJob(a)
+ a.Go(func() {
+ runSecurityJob(a)
+ })
+ a.Go(func() {
+ runDiagnosticsJob(a)
+ })
+ a.Go(func() {
+ runSessionCleanupJob(a)
+ })
+ a.Go(func() {
+ runTokenCleanupJob(a)
+ })
+ a.Go(func() {
+ runCommandWebhookCleanupJob(a)
+ })
if complianceI := a.Compliance; complianceI != nil {
complianceI.StartComplianceDailyJob()
@@ -166,6 +177,8 @@ func runServer(configFileLocation string, disableConfigWatch bool, interruptChan
a.Jobs.StartSchedulers()
}
+ notifyReady()
+
// wait for kill signal before attempting to gracefully shutdown
// the running service
signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
@@ -236,6 +249,35 @@ func doDiagnostics(a *app.App) {
}
}
+func notifyReady() {
+ // If the environment vars provide a systemd notification socket,
+ // notify systemd that the server is ready.
+ systemdSocket := os.Getenv("NOTIFY_SOCKET")
+ if systemdSocket != "" {
+ l4g.Info("Sending systemd READY notification.")
+
+ err := sendSystemdReadyNotification(systemdSocket)
+ if err != nil {
+ l4g.Error(err.Error())
+ }
+ }
+}
+
+func sendSystemdReadyNotification(socketPath string) error {
+ msg := "READY=1"
+ addr := &net.UnixAddr{
+ Name: socketPath,
+ Net: "unixgram",
+ }
+ conn, err := net.DialUnix(addr.Net, nil, addr)
+ if err != nil {
+ return err
+ }
+ defer conn.Close()
+ _, err = conn.Write([]byte(msg))
+ return err
+}
+
func doTokenCleanup(a *app.App) {
a.Srv.Store.Token().Cleanup()
}
diff --git a/cmd/platform/server_test.go b/cmd/platform/server_test.go
index 15f9a357a..2f04e7d15 100644
--- a/cmd/platform/server_test.go
+++ b/cmd/platform/server_test.go
@@ -5,6 +5,7 @@ package main
import (
"io/ioutil"
+ "net"
"os"
"syscall"
"testing"
@@ -70,3 +71,66 @@ func TestRunServerInvalidConfigFile(t *testing.T) {
err = runServer(unreadableConfigFile.Name(), th.disableConfigWatch, th.interruptChan)
require.Error(t, err)
}
+
+func TestRunServerSystemdNotification(t *testing.T) {
+ th := SetupServerTest()
+ defer th.TearDownServerTest()
+
+ // Get a random temporary filename for using as a mock systemd socket
+ socketFile, err := ioutil.TempFile("", "mattermost-systemd-mock-socket-")
+ if err != nil {
+ panic(err)
+ }
+ socketPath := socketFile.Name()
+ os.Remove(socketPath)
+
+ // Set the socket path in the process environment
+ originalSocket := os.Getenv("NOTIFY_SOCKET")
+ os.Setenv("NOTIFY_SOCKET", socketPath)
+ defer os.Setenv("NOTIFY_SOCKET", originalSocket)
+
+ // Open the socket connection
+ addr := &net.UnixAddr{
+ Name: socketPath,
+ Net: "unixgram",
+ }
+ connection, err := net.ListenUnixgram("unixgram", addr)
+ if err != nil {
+ panic(err)
+ }
+ defer connection.Close()
+ defer os.Remove(socketPath)
+
+ // Listen for socket data
+ socketReader := make(chan string)
+ go func(ch chan string) {
+ buffer := make([]byte, 512)
+ count, err := connection.Read(buffer)
+ if err != nil {
+ panic(err)
+ }
+ data := buffer[0:count]
+ ch<- string(data)
+ }(socketReader)
+
+ // Start and stop the server
+ err = runServer(th.configPath, th.disableConfigWatch, th.interruptChan)
+ require.NoError(t, err)
+
+ // Ensure the notification has been sent on the socket and is correct
+ notification := <-socketReader
+ require.Equal(t, notification, "READY=1")
+}
+
+func TestRunServerNoSystemd(t *testing.T) {
+ th := SetupServerTest()
+ defer th.TearDownServerTest()
+
+ // Temporarily remove any Systemd socket defined in the environment
+ originalSocket := os.Getenv("NOTIFY_SOCKET")
+ os.Unsetenv("NOTIFY_SOCKET")
+ defer os.Setenv("NOTIFY_SOCKET", originalSocket)
+
+ err := runServer(th.configPath, th.disableConfigWatch, th.interruptChan)
+ require.NoError(t, err)
+}