mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
Merge branch 'master' into advanced-permissions-phase-1
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user