Admin Interface & Handlers

* Is not done yet
+ Add configuration for the admin web server
+ Refactor the ICCC messages to an own namespace
+ Added a main to Ocean. It can be used by just ICCC!
+ Added proper logging for the servers' start up
This commit is contained in:
Thorsten 2014-11-07 10:46:33 +01:00
parent c1e8ca4b07
commit 96bcb5da8f
8 changed files with 88 additions and 23 deletions

View File

@ -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`)

View File

@ -0,0 +1,6 @@
package SystemMessages
type ICCCStartUpMessage struct {
PublicIPAddressAndPort string
AdminIPAddressAndPort string
}

14
Main.go Normal file
View File

@ -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()
}

View File

@ -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)
}

9
Variables.go Normal file
View File

@ -0,0 +1,9 @@
package main
import (
LM "github.com/SommerEngineering/Ocean/Log/Meta"
)
var (
senderName LM.Sender = `Ocean`
)

View File

@ -1,5 +0,0 @@
package WebServer
type ICCCStartUpMessage struct {
IPAddressAndPort string
}

View File

@ -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)
if strings.ToLower(ConfigurationDB.Read(`AdminWebServerEnabled`)) == `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 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.`)
}
}

View File

@ -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()
}
}