diff --git a/ConfigurationDB/CheckConfiguration.go b/ConfigurationDB/CheckConfiguration.go index 19876fd..755d0e5 100644 --- a/ConfigurationDB/CheckConfiguration.go +++ b/ConfigurationDB/CheckConfiguration.go @@ -10,6 +10,11 @@ func checkConfiguration() { Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameDATABASE, `Check now the configuration database.`) defer Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameDATABASE, `Done checking the configuration database.`) + CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerBinding`, `127.0.0.1:60000`) + CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerEnabled`, `True`) + CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerReadTimeoutSeconds`, `10`) + CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerWriteTimeoutSeconds`, `10`) + CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerMaxHeaderLenBytes`, `1048576`) CheckSingleConfigurationPresentsAndAddIfMissing(`InternalCommPassword`, `please replace this with e.g. a random GUID, etc.`) CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBHost`, `localhost:27017`) CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBDatabase`, `Ocean`) diff --git a/ICCC/SystemMessages/ICCCStartup.go b/ICCC/SystemMessages/ICCCStartup.go new file mode 100644 index 0000000..52a040f --- /dev/null +++ b/ICCC/SystemMessages/ICCCStartup.go @@ -0,0 +1,6 @@ +package SystemMessages + +type ICCCStartUpMessage struct { + PublicIPAddressAndPort string + AdminIPAddressAndPort string +} diff --git a/Main.go b/Main.go new file mode 100644 index 0000000..c0daf8b --- /dev/null +++ b/Main.go @@ -0,0 +1,14 @@ +package main + +import ( + "github.com/SommerEngineering/Ocean/Log" + LM "github.com/SommerEngineering/Ocean/Log/Meta" + "github.com/SommerEngineering/Ocean/System" +) + +func main() { + + Log.LogShort(senderName, LM.CategoryAPP, LM.LevelINFO, LM.MessageNameSTARTUP, `VRStudiePT is starting.`) + System.InitHandlers() + System.StartAndBlockForever() +} diff --git a/System/ICCCStart.go b/System/ICCCStart.go index de8d88d..5b5bd91 100644 --- a/System/ICCCStart.go +++ b/System/ICCCStart.go @@ -2,12 +2,13 @@ package System import ( "github.com/SommerEngineering/Ocean/ICCC" + "github.com/SommerEngineering/Ocean/ICCC/SystemMessages" "github.com/SommerEngineering/Ocean/Log" LM "github.com/SommerEngineering/Ocean/Log/Meta" ) func icccSystemStart(data map[string][]string) { - _, _, obj := ICCC.Data2Message(&ICCCStartUpMessage{}, data) - messageData := obj.(*ICCCStartUpMessage) - Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The server is now up and ready.`, messageData.IPAddressAndPort) + _, _, obj := ICCC.Data2Message(&SystemMessages.ICCCStartUpMessage{}, data) + messageData := obj.(*SystemMessages.ICCCStartUpMessage) + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The server is now up and ready.`, messageData.PublicIPAddressAndPort, messageData.AdminIPAddressAndPort) } diff --git a/Variables.go b/Variables.go new file mode 100644 index 0000000..678e9ae --- /dev/null +++ b/Variables.go @@ -0,0 +1,9 @@ +package main + +import ( + LM "github.com/SommerEngineering/Ocean/Log/Meta" +) + +var ( + senderName LM.Sender = `Ocean` +) diff --git a/WebServer/ICCCStartup.go b/WebServer/ICCCStartup.go deleted file mode 100644 index 58e4895..0000000 --- a/WebServer/ICCCStartup.go +++ /dev/null @@ -1,5 +0,0 @@ -package WebServer - -type ICCCStartUpMessage struct { - IPAddressAndPort string -} diff --git a/WebServer/Init.go b/WebServer/Init.go index 3e769b7..5a38993 100644 --- a/WebServer/Init.go +++ b/WebServer/Init.go @@ -1,11 +1,15 @@ package WebServer import ( + "fmt" + "github.com/SommerEngineering/Ocean/ConfigurationDB" "github.com/SommerEngineering/Ocean/Handlers" "github.com/SommerEngineering/Ocean/Log" LM "github.com/SommerEngineering/Ocean/Log/Meta" "github.com/SommerEngineering/Ocean/Tools" "net/http" + "strconv" + "strings" "time" ) @@ -14,21 +18,48 @@ func init() { Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Init the web server now.`) defer Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Done init the web server.`) - serverPublicAddressPort := Tools.LocalIPAddressAndPort() + serverPublicAddressPort = Tools.LocalIPAddressAndPort() + serverAdminAddressPort = ConfigurationDB.Read(`AdminWebServerBinding`) serverPublic = &http.Server{} serverPublic.Addr = serverPublicAddressPort serverPublic.Handler = Handlers.GetPublicMux() + serverPublic.SetKeepAlivesEnabled(true) + serverPublic.ReadTimeout = 10 * time.Second serverPublic.WriteTimeout = 10 * time.Second serverPublic.MaxHeaderBytes = 1024 - serverPublic.SetKeepAlivesEnabled(true) - serverAdmin = &http.Server{} - serverAdmin.Addr = serverAdminAddressPort - serverAdmin.Handler = Handlers.GetAdminMux() - serverAdmin.ReadTimeout = 10 * time.Second - serverAdmin.WriteTimeout = 10 * time.Second - serverAdmin.MaxHeaderBytes = 1024 - serverAdmin.SetKeepAlivesEnabled(true) + if strings.ToLower(ConfigurationDB.Read(`AdminWebServerEnabled`)) == `true` { + serverAdmin = &http.Server{} + serverAdmin.Addr = serverAdminAddressPort + serverAdmin.Handler = Handlers.GetAdminMux() + serverAdmin.SetKeepAlivesEnabled(true) + + if readTimeoutSeconds, errTimeout := strconv.Atoi(ConfigurationDB.Read(`AdminWebServerReadTimeoutSeconds`)); errTimeout != nil { + Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityLow, LM.ImpactLow, LM.MessageNameCONFIGURATION, `Was not able to read the admin server's read timeout value. Use the default of 10 seconds instead.`, errTimeout.Error()) + serverAdmin.ReadTimeout = 10 * time.Second + } else { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, fmt.Sprintf("The admin web server's read timeout was set to %d seconds.", readTimeoutSeconds)) + serverAdmin.ReadTimeout = time.Duration(readTimeoutSeconds) * time.Second + } + + if writeTimeoutSeconds, errTimeout := strconv.Atoi(ConfigurationDB.Read(`AdminWebServerWriteTimeoutSeconds`)); errTimeout != nil { + Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityLow, LM.ImpactLow, LM.MessageNameCONFIGURATION, `Was not able to read the admin server's write timeout value. Use the default of 10 seconds instead.`, errTimeout.Error()) + serverAdmin.WriteTimeout = 10 * time.Second + } else { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, fmt.Sprintf("The admin web server's write timeout was set to %d seconds.", writeTimeoutSeconds)) + serverAdmin.WriteTimeout = time.Duration(writeTimeoutSeconds) * time.Second + } + + if maxHeaderBytes, errHeaderBytes := strconv.Atoi(ConfigurationDB.Read(`AdminWebServerMaxHeaderLenBytes`)); errHeaderBytes != nil { + Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityLow, LM.ImpactLow, LM.MessageNameCONFIGURATION, `Was not able to read the admin server's maximum count of bytes for the headers. Use the default of 1048576 bytes instead.`, errHeaderBytes.Error()) + serverAdmin.MaxHeaderBytes = 1048576 + } else { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, fmt.Sprintf("The admin web server's count of maximal bytes for the headers was set to %d bytes.", maxHeaderBytes)) + serverAdmin.MaxHeaderBytes = maxHeaderBytes + } + } else { + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `The admin web server is disabled.`) + } } diff --git a/WebServer/Start.go b/WebServer/Start.go index 5c0567b..3fe75d0 100644 --- a/WebServer/Start.go +++ b/WebServer/Start.go @@ -2,22 +2,26 @@ package WebServer import ( "github.com/SommerEngineering/Ocean/ICCC" + "github.com/SommerEngineering/Ocean/ICCC/SystemMessages" "github.com/SommerEngineering/Ocean/Log" LM "github.com/SommerEngineering/Ocean/Log/Meta" ) func Start() { - if serverPublic != nil { - // Tell the whole cluster, that we are up and ready: - data := ICCCStartUpMessage{} - data.IPAddressAndPort = serverPublicAddressPort - ICCC.WriteMessage2All(ICCC.ChannelSYSTEM, `System::Start`, data) - Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Web server is now listening.`, `Configuration for hostname and port.`, serverPublicAddressPort) + // Tell the whole cluster, that we are up and ready: + data := SystemMessages.ICCCStartUpMessage{} + defer ICCC.WriteMessage2All(ICCC.ChannelSYSTEM, `System::Start`, data) + + if serverPublic != nil { + data.PublicIPAddressAndPort = serverPublicAddressPort + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Public web server is now listening.`, `Configuration for hostname and port.`, serverPublicAddressPort) go serverPublic.ListenAndServe() } if serverAdmin != nil { + data.AdminIPAddressAndPort = serverAdminAddressPort + Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Admin web server is now listening.`, `Configuration for hostname and port.`, serverAdminAddressPort) go serverAdmin.ListenAndServe() } }