Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
aebcb615a5 | ||
|
7901e2ebee |
@ -14,21 +14,13 @@ func checkConfiguration() {
|
|||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`DefaultLanguageCode`, `en-GB`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`DefaultLanguageCode`, `en-GB`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerBinding`, `127.0.0.1:60000`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerBinding`, `127.0.0.1:60000`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerEnabled`, `True`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerEnabled`, `True`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerPassword`, ``)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerUseTLS`, `False`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerTLSCertificateName`, `certificateAdmin.pem`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerTLSPrivateKey`, `privateKeyAdmin.pem`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerReadTimeoutSeconds`, `10`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerReadTimeoutSeconds`, `10`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerWriteTimeoutSeconds`, `10`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerWriteTimeoutSeconds`, `10`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerMaxHeaderLenBytes`, `10485760`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`AdminWebServerMaxHeaderLenBytes`, `10485760`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerPort`, `50000`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerPort`, `50000`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerHostname`, `www.my-site.domain`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerReadTimeoutSeconds`, `10`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerReadTimeoutSeconds`, `10`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerWriteTimeoutSeconds`, `10`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerWriteTimeoutSeconds`, `10`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerMaxHeaderLenBytes`, `1048576`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerMaxHeaderLenBytes`, `1048576`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerUseTLS`, `False`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerTLSCertificateName`, `certificatePublic.pem`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`PublicWebServerTLSPrivateKey`, `privateKeyPublic.pem`)
|
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`InternalCommPassword`, `please replace this with e.g. a random GUID, etc.`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`InternalCommPassword`, `please replace this with e.g. a random GUID, etc.`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBHost`, `localhost:27017`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBHost`, `localhost:27017`)
|
||||||
CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBDatabase`, `Ocean`)
|
CheckSingleConfigurationPresentsAndAddIfMissing(`CustomerDBDatabase`, `Ocean`)
|
||||||
|
@ -14,7 +14,7 @@ func connectDatabase(config Meta.Configuration) {
|
|||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
||||||
os.Exit(1)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ func connectDatabase(config Meta.Configuration) {
|
|||||||
if newSession, errDial := mgo.Dial(config.ConfigDBHostname); errDial != nil {
|
if newSession, errDial := mgo.Dial(config.ConfigDBHostname); errDial != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+config.ConfigDBHostname, errDial.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+config.ConfigDBHostname, errDial.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
||||||
os.Exit(1)
|
os.Exit(0)
|
||||||
} else {
|
} else {
|
||||||
session = newSession
|
session = newSession
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ func connectDatabase(config Meta.Configuration) {
|
|||||||
if errLogin := db.Login(config.ConfigDBConfigurationCollectionUsername, config.ConfigDBConfigurationCollectionPassword); errLogin != nil {
|
if errLogin := db.Login(config.ConfigDBConfigurationCollectionUsername, config.ConfigDBConfigurationCollectionPassword); errLogin != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+config.ConfigDBConfigurationCollectionUsername, errLogin.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+config.ConfigDBConfigurationCollectionUsername, errLogin.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
fmt.Printf("[Error] Was not able to connect to the configuration database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
||||||
os.Exit(1)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// In case of write operations, wait for the majority of servers to be done:
|
// In case of write operations, wait for the majority of servers to be done:
|
||||||
|
@ -13,7 +13,7 @@ func connectDatabase(host, username, password, database string) {
|
|||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ func connectDatabase(host, username, password, database string) {
|
|||||||
if newSession, errDial := mgo.Dial(host); errDial != nil {
|
if newSession, errDial := mgo.Dial(host); errDial != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+host, errDial.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+host, errDial.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
} else {
|
} else {
|
||||||
mainSession = newSession
|
mainSession = newSession
|
||||||
}
|
}
|
||||||
@ -31,14 +31,14 @@ func connectDatabase(host, username, password, database string) {
|
|||||||
if db == nil {
|
if db == nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `Was not able to get the customer database.`)
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `Was not able to get the customer database.`)
|
||||||
fmt.Printf("[Error] Was not able to connect to the customer database. Please read https://github.com/SommerEngineering/Ocean.\n")
|
fmt.Printf("[Error] Was not able to connect to the customer database. Please read https://github.com/SommerEngineering/Ocean.\n")
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Login:
|
// Login:
|
||||||
if errLogin := db.Login(username, password); errLogin != nil {
|
if errLogin := db.Login(username, password); errLogin != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+databaseUsername, errLogin.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+databaseUsername, errLogin.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
fmt.Printf("[Error] Was not able to connect to the customer database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// In case of write operations, wait for the majority of servers to be done:
|
// In case of write operations, wait for the majority of servers to be done:
|
||||||
@ -53,7 +53,7 @@ func connectDatabase(host, username, password, database string) {
|
|||||||
if gridFS == nil {
|
if gridFS == nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `Was not able to get the GridFS from the database.`)
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `Was not able to get the GridFS from the database.`)
|
||||||
fmt.Printf("[Error] Was not able to connect to the customer database. Please read https://github.com/SommerEngineering/Ocean.\n")
|
fmt.Printf("[Error] Was not able to connect to the customer database. Please read https://github.com/SommerEngineering/Ocean.\n")
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the indexes for the GridFS:
|
// Ensure the indexes for the GridFS:
|
||||||
|
@ -2,11 +2,9 @@ package Handlers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/SommerEngineering/Ocean/ConfigurationDB"
|
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Function to add a new public handler.
|
// Function to add a new public handler.
|
||||||
@ -34,5 +32,5 @@ func AddAdminHandler(pattern string, handler func(http.ResponseWriter, *http.Req
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// Add the handler:
|
// Add the handler:
|
||||||
muxAdmin.HandleFunc(pattern, BasicAuth(handler, `admin`, ConfigurationDB.Read(`AdminWebServerPassword`), `Please enter your username and password for this site`))
|
muxAdmin.HandleFunc(pattern, handler)
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
package Handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/subtle"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BasicAuth wraps a handler requiring HTTP basic auth for it using the given
|
|
||||||
// username and password and the specified realm, which shouldn't contain quotes.
|
|
||||||
//
|
|
||||||
// Most web browser display a dialog with something like:
|
|
||||||
//
|
|
||||||
// The website says: "<realm>"
|
|
||||||
//
|
|
||||||
// Which is really stupid so you may want to set the realm to a message rather than
|
|
||||||
// an actual realm.
|
|
||||||
//
|
|
||||||
// Taken from on http://stackoverflow.com/questions/21936332/idiomatic-way-of-requiring-http-basic-auth-in-go/39591234#39591234
|
|
||||||
func BasicAuth(handler http.HandlerFunc, username, password, realm string) http.HandlerFunc {
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
user, pass, ok := r.BasicAuth()
|
|
||||||
if !ok || subtle.ConstantTimeCompare([]byte(user), []byte(username)) != 1 || subtle.ConstantTimeCompare([]byte(pass), []byte(password)) != 1 {
|
|
||||||
w.Header().Set("WWW-Authenticate", `Basic realm="`+realm+`"`)
|
|
||||||
w.WriteHeader(401)
|
|
||||||
w.Write([]byte(http.StatusText(401)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
handler(w, r)
|
|
||||||
}
|
|
||||||
}
|
|
@ -42,6 +42,6 @@ channel=CHANNEL
|
|||||||
checksum=[the SHA512 checksum of the message]
|
checksum=[the SHA512 checksum of the message]
|
||||||
|
|
||||||
Constrains to the environment:
|
Constrains to the environment:
|
||||||
The three field names 'command', 'channel' and 'checksum' are reserved, thus, you cannot use these names.
|
The web server cannot reorder the fields of the request or response. The order of fields at the data object (message) must correspond with the order of fields inside the HTTP message. Therefore, a reorder is not possible at the moment. Also, the three field names 'command', 'channel' and 'checksum' are reserved, thus, you cannot use these names.
|
||||||
*/
|
*/
|
||||||
package ICCC
|
package ICCC
|
||||||
|
@ -56,7 +56,7 @@ func ICCCHandler(response http.ResponseWriter, request *http.Request) {
|
|||||||
|
|
||||||
if listener == nil {
|
if listener == nil {
|
||||||
// Case: No such listener
|
// Case: No such listener
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameCONFIGURATION, `Was not able to find the correct listener for these ICCC message.`, `channel=`+channel, `command=`+command, `hostname=`+Tools.ThisHostname())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameCONFIGURATION, `Was not able to find the correct listener for these ICCC message.`, `channel=`+channel, `command`+command, `hostname=`+Tools.ThisHostname())
|
||||||
http.NotFound(response, request)
|
http.NotFound(response, request)
|
||||||
} else {
|
} else {
|
||||||
// Case: Everything is fine => deliver the message and read the answer:
|
// Case: Everything is fine => deliver the message and read the answer:
|
||||||
|
@ -35,7 +35,6 @@ func ICCCGetHostsReceiver(data map[string][]string) (result map[string][]string)
|
|||||||
answerMessage := SystemMessages.ICCCGetHostsAnswer{}
|
answerMessage := SystemMessages.ICCCGetHostsAnswer{}
|
||||||
answerMessage.Hostnames = make([]string, countHosts, countHosts)
|
answerMessage.Hostnames = make([]string, countHosts, countHosts)
|
||||||
answerMessage.IPAddressesPorts = make([]string, countHosts, countHosts)
|
answerMessage.IPAddressesPorts = make([]string, countHosts, countHosts)
|
||||||
answerMessage.Kinds = make([]byte, countHosts, countHosts)
|
|
||||||
|
|
||||||
// Loop over all hosts which are currently available at the cache:
|
// Loop over all hosts which are currently available at the cache:
|
||||||
n := 0
|
n := 0
|
||||||
@ -43,7 +42,6 @@ func ICCCGetHostsReceiver(data map[string][]string) (result map[string][]string)
|
|||||||
host := entry.Value.(Scheme.Host)
|
host := entry.Value.(Scheme.Host)
|
||||||
answerMessage.Hostnames[n] = host.Hostname
|
answerMessage.Hostnames[n] = host.Hostname
|
||||||
answerMessage.IPAddressesPorts[n] = host.IPAddressPort
|
answerMessage.IPAddressesPorts[n] = host.IPAddressPort
|
||||||
answerMessage.Kinds[n] = host.Kind
|
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,6 @@ func ICCCGetListenersReceiver(data map[string][]string) (result map[string][]str
|
|||||||
answerMessage.Channels = make([]string, countListeners, countListeners)
|
answerMessage.Channels = make([]string, countListeners, countListeners)
|
||||||
answerMessage.Commands = make([]string, countListeners, countListeners)
|
answerMessage.Commands = make([]string, countListeners, countListeners)
|
||||||
answerMessage.IPAddressesPorts = make([]string, countListeners, countListeners)
|
answerMessage.IPAddressesPorts = make([]string, countListeners, countListeners)
|
||||||
answerMessage.Kinds = make([]byte, countListeners, countListeners)
|
|
||||||
|
|
||||||
// Loop over all hosts which are currently available at the cache:
|
// Loop over all hosts which are currently available at the cache:
|
||||||
n := 0
|
n := 0
|
||||||
@ -45,7 +44,6 @@ func ICCCGetListenersReceiver(data map[string][]string) (result map[string][]str
|
|||||||
answerMessage.Channels[n] = listener.Channel
|
answerMessage.Channels[n] = listener.Channel
|
||||||
answerMessage.Commands[n] = listener.Command
|
answerMessage.Commands[n] = listener.Command
|
||||||
answerMessage.IPAddressesPorts[n] = listener.IPAddressPort
|
answerMessage.IPAddressesPorts[n] = listener.IPAddressPort
|
||||||
answerMessage.Kinds[n] = listener.Kind
|
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ func ICCCGetVersionReceiver(data map[string][]string) (result map[string][]strin
|
|||||||
|
|
||||||
// Prepare the answer:
|
// Prepare the answer:
|
||||||
answer := SystemMessages.ICCCGetVersionAnswer{}
|
answer := SystemMessages.ICCCGetVersionAnswer{}
|
||||||
answer.Kind = KindOCEAN
|
answer.Kind = `Ocean`
|
||||||
answer.Name = Tools.ThisHostname()
|
answer.Name = Tools.ThisHostname()
|
||||||
answer.Version = Version.GetVersion()
|
answer.Version = Version.GetVersion()
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@ func ICCCListenerUpdateReceiver(data map[string][]string) (result map[string][]s
|
|||||||
updatedObject.Command = messageData.Command
|
updatedObject.Command = messageData.Command
|
||||||
updatedObject.IPAddressPort = messageData.IPAddressPort
|
updatedObject.IPAddressPort = messageData.IPAddressPort
|
||||||
updatedObject.IsActive = messageData.IsActiveNew
|
updatedObject.IsActive = messageData.IsActiveNew
|
||||||
updatedObject.Kind = messageData.Kind
|
|
||||||
|
|
||||||
// Update the entry:
|
// Update the entry:
|
||||||
if errUpdate := collectionListener.Update(selectionUpdate, updatedObject); errUpdate != nil {
|
if errUpdate := collectionListener.Update(selectionUpdate, updatedObject); errUpdate != nil {
|
||||||
|
@ -31,7 +31,7 @@ func ICCCRegisterHostReceiver(data map[string][]string) (result map[string][]str
|
|||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Register another host.`, fmt.Sprintf("hostname=%s", messageData.Hostname), fmt.Sprintf("ipAddressPort=%s", messageData.IPAddressPort))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Register another host.`, fmt.Sprintf("hostname=%s", messageData.Hostname), fmt.Sprintf("ipAddressPort=%s", messageData.IPAddressPort))
|
||||||
|
|
||||||
// Execute the command:
|
// Execute the command:
|
||||||
registerHost2Database(messageData.Hostname, messageData.IPAddressPort, messageData.Kind)
|
registerHost2Database(messageData.Hostname, messageData.IPAddressPort)
|
||||||
|
|
||||||
// Update the caches:
|
// Update the caches:
|
||||||
InitCacheNow()
|
InitCacheNow()
|
||||||
|
@ -31,7 +31,7 @@ func ICCCRegisterListenerReceiver(data map[string][]string) (result map[string][
|
|||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Should register another listener.`, `channel=`+messageData.Channel, `command=`+messageData.Command, `IPAddressPort=`+messageData.IPAddressPort, fmt.Sprintf(`isActive=%v`, messageData.IsActive))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Should register another listener.`, `channel=`+messageData.Channel, `command=`+messageData.Command, `IPAddressPort=`+messageData.IPAddressPort, fmt.Sprintf(`isActive=%v`, messageData.IsActive))
|
||||||
|
|
||||||
// Execute the command:
|
// Execute the command:
|
||||||
registerListener2Database(messageData.Channel, messageData.Command, messageData.IPAddressPort, messageData.IsActive, messageData.Kind)
|
registerListener2Database(messageData.Channel, messageData.Command, messageData.IPAddressPort, messageData.IsActive)
|
||||||
|
|
||||||
// Update the caches:
|
// Update the caches:
|
||||||
InitCacheNow()
|
InitCacheNow()
|
||||||
|
@ -2,11 +2,9 @@ package ICCC
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
"github.com/SommerEngineering/Ocean/ConfigurationDB"
|
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
"github.com/SommerEngineering/Ocean/Tools"
|
"github.com/SommerEngineering/Ocean/Tools"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Init this package.
|
// Init this package.
|
||||||
@ -24,13 +22,6 @@ func init() {
|
|||||||
// Using the local IP address:
|
// Using the local IP address:
|
||||||
correctAddressWithPort = Tools.LocalIPAddressAndPort()
|
correctAddressWithPort = Tools.LocalIPAddressAndPort()
|
||||||
|
|
||||||
// Determine the correct protocol:
|
|
||||||
if publicTLSEnabled := ConfigurationDB.Read(`PublicWebServerUseTLS`); strings.ToLower(publicTLSEnabled) == `true` {
|
|
||||||
activeProtocol = "https://"
|
|
||||||
} else {
|
|
||||||
activeProtocol = "http://"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init the database:
|
// Init the database:
|
||||||
initDB()
|
initDB()
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ func initDB() {
|
|||||||
//
|
//
|
||||||
// Take care about the indexes for ICCCListener:
|
// Take care about the indexes for ICCCListener:
|
||||||
//
|
//
|
||||||
collectionListener.EnsureIndexKey(`Kind`)
|
|
||||||
collectionListener.EnsureIndexKey(`Command`)
|
collectionListener.EnsureIndexKey(`Command`)
|
||||||
collectionListener.EnsureIndexKey(`Command`, `IsActive`)
|
collectionListener.EnsureIndexKey(`Command`, `IsActive`)
|
||||||
|
|
||||||
@ -53,7 +52,6 @@ func initDB() {
|
|||||||
//
|
//
|
||||||
// Index for hosts:
|
// Index for hosts:
|
||||||
//
|
//
|
||||||
collectionHosts.EnsureIndexKey(`Kind`)
|
|
||||||
collectionHosts.EnsureIndexKey(`Hostname`)
|
collectionHosts.EnsureIndexKey(`Hostname`)
|
||||||
collectionHosts.EnsureIndexKey(`IPAddressPort`)
|
collectionHosts.EnsureIndexKey(`IPAddressPort`)
|
||||||
|
|
||||||
|
@ -8,13 +8,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Function to register a server to the ICCC.
|
// Function to register a server to the ICCC.
|
||||||
func registerHost2Database(hostname, ipAddressPort string, kind byte) {
|
func registerHost2Database(hostname, ipAddressPort string) {
|
||||||
|
|
||||||
// Create the host entry:
|
// Create the host entry:
|
||||||
host := Scheme.Host{}
|
host := Scheme.Host{}
|
||||||
host.Hostname = hostname
|
host.Hostname = hostname
|
||||||
host.IPAddressPort = ipAddressPort
|
host.IPAddressPort = ipAddressPort
|
||||||
host.Kind = kind
|
|
||||||
|
|
||||||
// The query to find already existing entries:
|
// The query to find already existing entries:
|
||||||
selection := bson.D{{`Hostname`, host.Hostname}, {`IPAddressPort`, host.IPAddressPort}}
|
selection := bson.D{{`Hostname`, host.Hostname}, {`IPAddressPort`, host.IPAddressPort}}
|
||||||
|
@ -2,7 +2,6 @@ package ICCC
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/SommerEngineering/Ocean/ConfigurationDB"
|
|
||||||
"github.com/SommerEngineering/Ocean/ICCC/Scheme"
|
"github.com/SommerEngineering/Ocean/ICCC/Scheme"
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
@ -10,38 +9,36 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// The internal function to register an listener to ICCC.
|
// The internal function to register an listener to ICCC.
|
||||||
func registerListener2Database(channel, command, ipAddressPort string, isActive bool, kind byte) {
|
func registerListener2Database(channel, command, ipAddressPort string, isActive bool) {
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Register this ICCC command in to the database.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, fmt.Sprintf("isActive=%v", isActive), `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Register this ICCC command in to the database.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, fmt.Sprintf("isActive=%v", isActive))
|
||||||
|
|
||||||
entry := Scheme.Listener{}
|
entry := Scheme.Listener{}
|
||||||
entry.Channel = channel
|
entry.Channel = channel
|
||||||
entry.Command = command
|
entry.Command = command
|
||||||
entry.IsActive = isActive
|
entry.IsActive = isActive
|
||||||
entry.IPAddressPort = ipAddressPort
|
entry.IPAddressPort = ipAddressPort
|
||||||
entry.Kind = kind
|
|
||||||
entry.Hostname = ConfigurationDB.Read(`PublicWebServerHostname`)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Case: Exists?
|
// Case: Exists?
|
||||||
//
|
//
|
||||||
selection := bson.D{{`Channel`, channel}, {`Command`, command}, {`IPAddressPort`, ipAddressPort}, {`Hostname`, entry.Hostname}}
|
selection := bson.D{{`Channel`, channel}, {`Command`, command}, {`IPAddressPort`, ipAddressPort}}
|
||||||
count1, _ := collectionListener.Find(selection).Count()
|
count1, _ := collectionListener.Find(selection).Count()
|
||||||
if count1 == 1 {
|
if count1 == 1 {
|
||||||
//
|
//
|
||||||
// Case: Exist but maybe not active
|
// Case: Exist but maybe not active
|
||||||
//
|
//
|
||||||
collectionListener.Update(selection, entry)
|
collectionListener.Update(selection, entry)
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `Updating the existing ICCC command.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `Updating the existing ICCC command.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Case: Not exist
|
// Case: Not exist
|
||||||
//
|
//
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactNone, LM.MessageNameCONFIGURATION, `This ICCC command is not known.`, `Create now a new entry!`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`))
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelWARN, LM.SeverityCritical, LM.ImpactNone, LM.MessageNameCONFIGURATION, `This ICCC command is not known.`, `Create now a new entry!`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort)
|
||||||
if err := collectionListener.Insert(entry); err != nil {
|
if err := collectionListener.Insert(entry); err != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `It was not possible to add this ICCC command!`, err.Error(), `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`))
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameDATABASE, `It was not possible to add this ICCC command!`, err.Error(), `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort)
|
||||||
} else {
|
} else {
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `This ICCC command is now known and active.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort, `Hostname=`+ConfigurationDB.Read(`PublicWebServerHostname`))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, `This ICCC command is now known and active.`, `channel=`+channel, `command=`+command, `IPAddressPort=`+ipAddressPort)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,5 +8,5 @@ func registerLocalListener2Database(channel, command string) {
|
|||||||
there would be no server which can execute the ICCC command.
|
there would be no server which can execute the ICCC command.
|
||||||
Therefore, every Ocean server registers the own listeners directly.
|
Therefore, every Ocean server registers the own listeners directly.
|
||||||
*/
|
*/
|
||||||
registerListener2Database(channel, command, correctAddressWithPort, true, KindOCEAN)
|
registerListener2Database(channel, command, correctAddressWithPort, true)
|
||||||
}
|
}
|
||||||
|
@ -12,5 +12,5 @@ func registerThisHost2Database() {
|
|||||||
there would be no server which can execute the ICCC command.
|
there would be no server which can execute the ICCC command.
|
||||||
Therefore, every Ocean server registers the own host directly.
|
Therefore, every Ocean server registers the own host directly.
|
||||||
*/
|
*/
|
||||||
registerHost2Database(Tools.ThisHostname(), correctAddressWithPort, KindOCEAN)
|
registerHost2Database(Tools.ThisHostname(), correctAddressWithPort)
|
||||||
}
|
}
|
||||||
|
@ -4,5 +4,4 @@ package Scheme
|
|||||||
type Host struct {
|
type Host struct {
|
||||||
Hostname string `bson:"Hostname"`
|
Hostname string `bson:"Hostname"`
|
||||||
IPAddressPort string `bson:"IPAddressPort"`
|
IPAddressPort string `bson:"IPAddressPort"`
|
||||||
Kind byte `bson:"Kind"`
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,4 @@ type Listener struct {
|
|||||||
Command string `bson:"Command"`
|
Command string `bson:"Command"`
|
||||||
IsActive bool `bson:"IsActive"`
|
IsActive bool `bson:"IsActive"`
|
||||||
IPAddressPort string `bson:"IPAddressPort"`
|
IPAddressPort string `bson:"IPAddressPort"`
|
||||||
Kind byte `bson:"Kind"`
|
|
||||||
Hostname string `bson:"Hostname"`
|
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ func sendMessage(listener Scheme.Listener, data map[string][]string) (result map
|
|||||||
valuesHTTP := signMessage(data)
|
valuesHTTP := signMessage(data)
|
||||||
|
|
||||||
// Try to deliver the message:
|
// Try to deliver the message:
|
||||||
if response, err := http.PostForm(activeProtocol+listener.Hostname+`/ICCC`, valuesHTTP); err != nil {
|
if response, err := http.PostForm(`http://`+listener.IPAddressPort+`/ICCC`, valuesHTTP); err != nil {
|
||||||
// Case: Was not possible to deliver.
|
// Case: Was not possible to deliver.
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameNETWORK, `Was not able to send the ICCC message.`, err.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactUnknown, LM.MessageNameNETWORK, `Was not able to send the ICCC message.`, err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"github.com/SommerEngineering/Ocean/Tools"
|
"github.com/SommerEngineering/Ocean/Tools"
|
||||||
"net/url"
|
"net/url"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Sign a message to secure it.
|
// Sign a message to secure it.
|
||||||
@ -33,7 +32,7 @@ func signMessage(data map[string][]string) (result url.Values) {
|
|||||||
// Now, loop over all the data:
|
// Now, loop over all the data:
|
||||||
for _, key := range keys {
|
for _, key := range keys {
|
||||||
// Get the value:
|
// Get the value:
|
||||||
value := data[key][0]
|
value := data[key]
|
||||||
|
|
||||||
// Hash each key and value:
|
// Hash each key and value:
|
||||||
fmt.Fprintf(hash, "key=%s :: value=%s\n", key, value)
|
fmt.Fprintf(hash, "key=%s :: value=%s\n", key, value)
|
||||||
@ -43,6 +42,6 @@ func signMessage(data map[string][]string) (result url.Values) {
|
|||||||
result = url.Values(data)
|
result = url.Values(data)
|
||||||
|
|
||||||
// Append the sign:
|
// Append the sign:
|
||||||
result.Add(`checksum`, strings.ToUpper(fmt.Sprintf("%x", hash.Sum(nil))))
|
result.Add(`checksum`, fmt.Sprintf("%x", hash.Sum(nil)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -8,5 +8,4 @@ type ICCCGetHosts struct {
|
|||||||
type ICCCGetHostsAnswer struct {
|
type ICCCGetHostsAnswer struct {
|
||||||
Hostnames []string
|
Hostnames []string
|
||||||
IPAddressesPorts []string
|
IPAddressesPorts []string
|
||||||
Kinds []byte
|
|
||||||
}
|
}
|
||||||
|
@ -9,5 +9,4 @@ type ICCCGetListenersAnswer struct {
|
|||||||
Channels []string
|
Channels []string
|
||||||
Commands []string
|
Commands []string
|
||||||
IPAddressesPorts []string
|
IPAddressesPorts []string
|
||||||
Kinds []byte
|
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ type ICCCGetVersion struct {
|
|||||||
|
|
||||||
// Answer to the version request
|
// Answer to the version request
|
||||||
type ICCCGetVersionAnswer struct {
|
type ICCCGetVersionAnswer struct {
|
||||||
Kind byte // Ocean || Component
|
Kind string // Ocean || Component
|
||||||
Name string // Ocean: Hostname; Components: Name
|
Name string // Ocean: Hostname; Components: Name
|
||||||
Version string // The current version
|
Version string // The current version
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,4 @@ type ICCCListenerUpdate struct {
|
|||||||
Command string
|
Command string
|
||||||
IPAddressPort string
|
IPAddressPort string
|
||||||
IsActiveNew bool
|
IsActiveNew bool
|
||||||
Kind byte
|
|
||||||
}
|
}
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
package SystemMessages
|
|
||||||
|
|
||||||
// The message to send logging events over ICCC.
|
|
||||||
type ICCCNewLogEvent struct {
|
|
||||||
Project string
|
|
||||||
UnixTimestampUTC int64
|
|
||||||
Sender string
|
|
||||||
Category string
|
|
||||||
Level string
|
|
||||||
Severity string
|
|
||||||
Impact string
|
|
||||||
MessageName string
|
|
||||||
MessageDescription string
|
|
||||||
Parameters []string
|
|
||||||
}
|
|
@ -4,5 +4,4 @@ package SystemMessages
|
|||||||
type ICCCRegisterHost struct {
|
type ICCCRegisterHost struct {
|
||||||
Hostname string // The hostname for the end-point
|
Hostname string // The hostname for the end-point
|
||||||
IPAddressPort string // The IP address and port for the end-point
|
IPAddressPort string // The IP address and port for the end-point
|
||||||
Kind byte // Ocean || Component
|
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,4 @@ type ICCCRegisterListener struct {
|
|||||||
Command string // The provided command
|
Command string // The provided command
|
||||||
IsActive bool // Is the command active?
|
IsActive bool // Is the command active?
|
||||||
IPAddressPort string // The IP address and port for the end-point
|
IPAddressPort string // The IP address and port for the end-point
|
||||||
Kind byte // Ocean || Component
|
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,6 @@ const (
|
|||||||
ChannelSTARTUP string = `System::Startup` // A channel for system startup messages.
|
ChannelSTARTUP string = `System::Startup` // A channel for system startup messages.
|
||||||
ChannelICCC string = `System::ICCC` // A common ICCC channel.
|
ChannelICCC string = `System::ICCC` // A common ICCC channel.
|
||||||
ChannelPING string = `System::Ping` // A channel for pings.
|
ChannelPING string = `System::Ping` // A channel for pings.
|
||||||
ChannelLOGGING string = `System::Logging` // A channel for send log events to the logging system
|
|
||||||
KindOCEAN byte = 0x0
|
|
||||||
KindComponent byte = 0x1
|
|
||||||
KindALL byte = 0xFF
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -37,5 +33,4 @@ var (
|
|||||||
startCacheTimerLock sync.Mutex = sync.Mutex{} // Mutex for the start timer
|
startCacheTimerLock sync.Mutex = sync.Mutex{} // Mutex for the start timer
|
||||||
cacheTimerRunning bool = false // Is the timer running?
|
cacheTimerRunning bool = false // Is the timer running?
|
||||||
correctAddressWithPort string = `` // The IP address and port of the this local server
|
correctAddressWithPort string = `` // The IP address and port of the this local server
|
||||||
activeProtocol string = `http://`
|
|
||||||
)
|
)
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Function to broadcast a message to all listeners.
|
// Function to broadcast a message to all listeners.
|
||||||
func WriteMessage2All(channel, command string, kind byte, message interface{}, answerPrototype interface{}) (results []interface{}) {
|
func WriteMessage2All(channel, command string, message interface{}, answerPrototype interface{}) (results []interface{}) {
|
||||||
cacheListenerDatabaseLock.RLock()
|
cacheListenerDatabaseLock.RLock()
|
||||||
defer cacheListenerDatabaseLock.RUnlock()
|
defer cacheListenerDatabaseLock.RUnlock()
|
||||||
|
|
||||||
@ -21,16 +21,10 @@ func WriteMessage2All(channel, command string, kind byte, message interface{}, a
|
|||||||
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
||||||
listener := entry.Value.(Scheme.Listener)
|
listener := entry.Value.(Scheme.Listener)
|
||||||
|
|
||||||
// If the channel, command and kind matches, deliver the message:
|
// If the channel and the command matches, deliver the message:
|
||||||
if kind == KindALL {
|
|
||||||
if listener.Channel == channel && listener.Command == command {
|
if listener.Channel == channel && listener.Command == command {
|
||||||
matchingListener = append(matchingListener, listener)
|
matchingListener = append(matchingListener, listener)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if listener.Channel == channel && listener.Command == command && listener.Kind == kind {
|
|
||||||
matchingListener = append(matchingListener, listener)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Was not able to find any matching listener?
|
// Was not able to find any matching listener?
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Function to write a message to any listener.
|
// Function to write a message to any listener.
|
||||||
func WriteMessage2Any(channel, command string, kind byte, message interface{}, answerPrototype interface{}) (result interface{}) {
|
func WriteMessage2Any(channel, command string, message interface{}, answerPrototype interface{}) (result interface{}) {
|
||||||
cacheListenerDatabaseLock.RLock()
|
cacheListenerDatabaseLock.RLock()
|
||||||
defer cacheListenerDatabaseLock.RUnlock()
|
defer cacheListenerDatabaseLock.RUnlock()
|
||||||
|
|
||||||
@ -22,18 +22,11 @@ func WriteMessage2Any(channel, command string, kind byte, message interface{}, a
|
|||||||
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
||||||
listener := entry.Value.(Scheme.Listener)
|
listener := entry.Value.(Scheme.Listener)
|
||||||
|
|
||||||
// If the channel, command and kind matches, store the listener:
|
// If the channel and the command matches, store the listener:
|
||||||
if kind == KindALL {
|
|
||||||
if listener.Channel == channel && listener.Command == command {
|
if listener.Channel == channel && listener.Command == command {
|
||||||
entries = entries[:len(entries)+1]
|
entries = entries[:len(entries)+1]
|
||||||
entries[counter] = listener
|
entries[counter] = listener
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if listener.Channel == channel && listener.Command == command && listener.Kind == kind {
|
|
||||||
entries = entries[:len(entries)+1]
|
|
||||||
entries[counter] = listener
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
count := len(entries)
|
count := len(entries)
|
||||||
|
@ -18,7 +18,7 @@ func initDatabase() {
|
|||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", err)
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ func initDatabase() {
|
|||||||
if newSession, errDial := mgo.Dial(databaseHost); errDial != nil {
|
if newSession, errDial := mgo.Dial(databaseHost); errDial != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+databaseHost, errDial.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to connect to the MongoDB host `+databaseHost, errDial.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errDial.Error())
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
} else {
|
} else {
|
||||||
logDBSession = newSession
|
logDBSession = newSession
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ func initDatabase() {
|
|||||||
if errLogin := logDB.Login(databaseUsername, databasePassword); errLogin != nil {
|
if errLogin := logDB.Login(databaseUsername, databasePassword); errLogin != nil {
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+databaseUsername, errLogin.Error())
|
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNameDATABASE, `It was not possible to login the user `+databaseUsername, errLogin.Error())
|
||||||
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
fmt.Printf("[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n", errLogin.Error())
|
||||||
os.Exit(2)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the collection:
|
// Get the collection:
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package Log
|
|
||||||
|
|
||||||
// This function provides the project name for e.g. logging events
|
|
||||||
// coming trough the ICCC.
|
|
||||||
func GetProjectName() string {
|
|
||||||
return projectName
|
|
||||||
}
|
|
@ -121,16 +121,10 @@ func clearEntry(entry Meta.Entry) (result Meta.Entry) {
|
|||||||
// Remove white spaces from the parameters.
|
// Remove white spaces from the parameters.
|
||||||
func clearParameters(oldParameters []string) (result []string) {
|
func clearParameters(oldParameters []string) (result []string) {
|
||||||
for n := 0; n < len(oldParameters); n++ {
|
for n := 0; n < len(oldParameters); n++ {
|
||||||
// Remove white spaces:
|
|
||||||
oldParameters[n] = removeWhitespaces(oldParameters[n])
|
oldParameters[n] = removeWhitespaces(oldParameters[n])
|
||||||
|
|
||||||
// Is content left after removing?
|
|
||||||
if oldParameters[n] != `` {
|
|
||||||
// Yes, some content is still there. Thus, commit this entry:
|
|
||||||
result = append(result, oldParameters[n])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = oldParameters
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
package ICCCLog
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/SommerEngineering/Ocean/ICCC"
|
|
||||||
"github.com/SommerEngineering/Ocean/ICCC/SystemMessages"
|
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The receiver function for the ICCC new log event message.
|
|
||||||
func ICCCNewLogEventReceiver(data map[string][]string) (result map[string][]string) {
|
|
||||||
|
|
||||||
// Recover from errors:
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityUnknown, LM.ImpactUnknown, LM.MessageNamePARSE, "Was not able to execute the ICCC new log event message.")
|
|
||||||
result = make(map[string][]string, 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Converts the HTTP form data into an object:
|
|
||||||
_, _, obj := ICCC.Data2Message(SystemMessages.ICCCNewLogEvent{}, data)
|
|
||||||
|
|
||||||
// Was it possible to convert the data?
|
|
||||||
if obj != nil {
|
|
||||||
// Cast the object to the right type:
|
|
||||||
messageData := obj.(SystemMessages.ICCCNewLogEvent)
|
|
||||||
|
|
||||||
// Provide a log entry:
|
|
||||||
logEntry := LM.Entry{}
|
|
||||||
logEntry.Project = Log.GetProjectName()
|
|
||||||
logEntry.Sender = LM.Sender(messageData.Sender)
|
|
||||||
logEntry.Category = LM.ParseCategory(messageData.Category)
|
|
||||||
logEntry.Level = LM.ParseLevel(messageData.Level)
|
|
||||||
logEntry.Severity = LM.ParseSeverity(messageData.Severity)
|
|
||||||
logEntry.Impact = LM.ParseImpact(messageData.Impact)
|
|
||||||
logEntry.MessageName = LM.MessageName(messageData.MessageName)
|
|
||||||
logEntry.MessageDescription = messageData.MessageDescription
|
|
||||||
logEntry.Parameters = messageData.Parameters
|
|
||||||
logEntry.Time = time.Unix(messageData.UnixTimestampUTC, 0).UTC()
|
|
||||||
|
|
||||||
// Deliver the log event:
|
|
||||||
Log.TakeEntry(logEntry)
|
|
||||||
|
|
||||||
// An answer is necessary:
|
|
||||||
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
|
||||||
} else {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Was not able to create the message.`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// In any other error case:
|
|
||||||
result = make(map[string][]string, 0)
|
|
||||||
return
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
package ICCCLog
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/SommerEngineering/Ocean/Log/Meta"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
senderName Meta.Sender = `System::Log::ICCCLog`
|
|
||||||
)
|
|
@ -91,10 +91,7 @@ exit
|
|||||||
* Finnaly, start Ocean again. The system should now run fine. Please have a look at the ICCC startup logging messages.
|
* Finnaly, start Ocean again. The system should now run fine. Please have a look at the ICCC startup logging messages.
|
||||||
|
|
||||||
### Use Ocean as distributed messaging broker
|
### Use Ocean as distributed messaging broker
|
||||||
For this case, you can now start your other ICCC components. This are e.g. some Java, Python or C# programs which are using the Ocean ICCC drivers. These drivers currently under development and they will be available soon. **The next priority:** OceanPy, the ICCC driver for Python.
|
For this case, you can now start your other ICCC components. This are e.g. some Java, Python or C# programs which are using the Ocean ICCC drivers. These drivers currently under development and they will be available soon.
|
||||||
|
|
||||||
**Available ICCC drivers:**
|
|
||||||
- [OceanNET - ICCC with .NET and C#](https://github.com/SommerEngineering/OceanNET)
|
|
||||||
|
|
||||||
### Use Ocean as framework e.g. for websites
|
### Use Ocean as framework e.g. for websites
|
||||||
For this case, an example project with documentation is available here: https://github.com/SommerEngineering/Example003
|
For this case, an example project with documentation is available here: https://github.com/SommerEngineering/Example003
|
||||||
|
@ -3,12 +3,10 @@ package StaticFiles
|
|||||||
import (
|
import (
|
||||||
"archive/zip"
|
"archive/zip"
|
||||||
"bytes"
|
"bytes"
|
||||||
"github.com/SommerEngineering/Ocean/ConfigurationDB"
|
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
"github.com/SommerEngineering/Ocean/Shutdown"
|
"github.com/SommerEngineering/Ocean/Shutdown"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Try to read a static file.
|
// Try to read a static file.
|
||||||
@ -19,40 +17,6 @@ func FindAndReadFile(filename string) (result []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Ensure that the TLS keys are secure and save:
|
|
||||||
//
|
|
||||||
if strings.ToLower(filename) == strings.ToLower(ConfigurationDB.Read(`AdminWebServerTLSCertificateName`)) {
|
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityNone, LM.ImpactNone, LM.MessageNameREQUEST, `Someone tried to read the TLS certificate of the admin server. The attempt was inhibited.`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.ToLower(filename) == strings.ToLower(ConfigurationDB.Read(`AdminWebServerTLSPrivateKey`)) {
|
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityNone, LM.ImpactNone, LM.MessageNameREQUEST, `Someone tried to read the TLS certificate's private key of the admin server. The attempt was inhibited.`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.ToLower(filename) == strings.ToLower(ConfigurationDB.Read(`PublicWebServerTLSCertificateName`)) {
|
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityNone, LM.ImpactNone, LM.MessageNameREQUEST, `Someone tried to read the TLS certificate of the public server. The attempt was inhibited.`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.ToLower(filename) == strings.ToLower(ConfigurationDB.Read(`PublicWebServerTLSPrivateKey`)) {
|
|
||||||
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelSECURITY, LM.SeverityNone, LM.ImpactNone, LM.MessageNameREQUEST, `Someone tried to read the TLS certificate's private key of the public server. The attempt was inhibited.`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
result = FindAndReadFileINTERNAL(filename)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func FindAndReadFileINTERNAL(filename string) (result []byte) {
|
|
||||||
|
|
||||||
// Case: The system goes down.
|
|
||||||
if Shutdown.IsDown() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare the path:
|
// Prepare the path:
|
||||||
path := filename
|
path := filename
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ func icccComponentStartUpMessageReceiver(data map[string][]string) (result map[s
|
|||||||
messageData := obj.(SystemMessages.ICCCComponentStartUpMessage)
|
messageData := obj.(SystemMessages.ICCCComponentStartUpMessage)
|
||||||
|
|
||||||
// Provide a log entry:
|
// Provide a log entry:
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The external component is now up and ready.`, fmt.Sprintf("ipAddressPort='%s'", messageData.IPAddressPort), fmt.Sprintf("name='%s'", messageData.Name), fmt.Sprintf("version='%s'", messageData.Version))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The external component is now up and ready.`, fmt.Sprintf("ipAddressPort=%s", messageData.IPAddressPort), fmt.Sprintf("name=", messageData.Name), fmt.Sprintf("version=", messageData.Version))
|
||||||
|
|
||||||
// An answer is necessary:
|
// An answer is necessary:
|
||||||
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
||||||
|
@ -29,7 +29,7 @@ func icccOceanStartUpMessageReceiver(data map[string][]string) (result map[strin
|
|||||||
messageData := obj.(SystemMessages.ICCCOceanStartUpMessage)
|
messageData := obj.(SystemMessages.ICCCOceanStartUpMessage)
|
||||||
|
|
||||||
// Provide a log entry:
|
// Provide a log entry:
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The Ocean server is now up and ready.`, fmt.Sprintf("public server='%s'", messageData.PublicIPAddressPort), fmt.Sprintf("admin server='%s'", messageData.AdminIPAddressPort), fmt.Sprintf("Ocean's version='%s'", messageData.OceanVersion))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: The Ocean server is now up and ready.`, fmt.Sprintf("public server=%s", messageData.PublicIPAddressPort), fmt.Sprintf("admin server=%s", messageData.AdminIPAddressPort), fmt.Sprintf("Ocean's version=%s", messageData.OceanVersion))
|
||||||
|
|
||||||
// An answer is necessary:
|
// An answer is necessary:
|
||||||
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"github.com/SommerEngineering/Ocean/CustomerDB"
|
"github.com/SommerEngineering/Ocean/CustomerDB"
|
||||||
"github.com/SommerEngineering/Ocean/ICCC"
|
"github.com/SommerEngineering/Ocean/ICCC"
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
"github.com/SommerEngineering/Ocean/Log/ICCCLog"
|
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
"github.com/SommerEngineering/Ocean/NumGen"
|
"github.com/SommerEngineering/Ocean/NumGen"
|
||||||
"github.com/SommerEngineering/Ocean/Shutdown"
|
"github.com/SommerEngineering/Ocean/Shutdown"
|
||||||
@ -105,12 +104,11 @@ func initSystem() {
|
|||||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteListener`, ICCC.ICCCDeleteListenerReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteListener`, ICCC.ICCCDeleteListenerReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteHost`, ICCC.ICCCDeleteHostReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteHost`, ICCC.ICCCDeleteHostReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::ListenerUpdate`, ICCC.ICCCListenerUpdateReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::ListenerUpdate`, ICCC.ICCCListenerUpdateReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelPING, `Ping::Ping`, ICCC.ICCCPingReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `Ping::Ping`, ICCC.ICCCPingReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelSYSTEM, `System::Version`, ICCC.ICCCGetVersionReceiver)
|
ICCC.Registrar(ICCC.ChannelSYSTEM, `System::Version`, ICCC.ICCCGetVersionReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetHosts`, ICCC.ICCCGetHostsReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetHosts`, ICCC.ICCCGetHostsReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetListeners`, ICCC.ICCCGetListenersReceiver)
|
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetListeners`, ICCC.ICCCGetListenersReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelNUMGEN, `NumGen::Next`, NumGen.ICCCNextNumberReceiver)
|
ICCC.Registrar(ICCC.ChannelNUMGEN, `NumGen::Next`, NumGen.ICCCNextNumberReceiver)
|
||||||
ICCC.Registrar(ICCC.ChannelLOGGING, `Logging::NewLogEvent`, ICCCLog.ICCCNewLogEventReceiver)
|
|
||||||
|
|
||||||
// Start the ICCC Listener Cache:
|
// Start the ICCC Listener Cache:
|
||||||
ICCC.InitCacheNow() // Blocking, until the job is done
|
ICCC.InitCacheNow() // Blocking, until the job is done
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
package Version
|
package Version
|
||||||
|
|
||||||
var (
|
var (
|
||||||
oceansVersion string = `2.1.3` // Ocean's current version
|
oceansVersion string = `2.0.0` // Ocean's current version
|
||||||
)
|
)
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
package Templates
|
|
||||||
|
|
||||||
//AddTemplate adds a template to the template cache so it can be used by ProcessHTML
|
|
||||||
func AddTemplate(src string) error {
|
|
||||||
_, err := templates.Parse(src)
|
|
||||||
return err
|
|
||||||
}
|
|
@ -20,5 +20,6 @@ func RandomFloat64() (rnd float64) {
|
|||||||
// Gets a random UUID (v4).
|
// Gets a random UUID (v4).
|
||||||
func RandomGUID() (guidString string) {
|
func RandomGUID() (guidString string) {
|
||||||
guidString = uuid.NewV4().String()
|
guidString = uuid.NewV4().String()
|
||||||
|
guidString = guidString[1 : len(guidString)-1]
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,8 @@ import (
|
|||||||
"github.com/SommerEngineering/Ocean/Handlers"
|
"github.com/SommerEngineering/Ocean/Handlers"
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
"github.com/SommerEngineering/Ocean/StaticFiles"
|
|
||||||
"github.com/SommerEngineering/Ocean/Tools"
|
"github.com/SommerEngineering/Ocean/Tools"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -68,32 +64,6 @@ func init() {
|
|||||||
serverPublic.MaxHeaderBytes = maxHeaderBytes
|
serverPublic.MaxHeaderBytes = maxHeaderBytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is TLS configured?
|
|
||||||
if publicTLSEnabled := ConfigurationDB.Read(`PublicWebServerUseTLS`); strings.ToLower(publicTLSEnabled) == `true` {
|
|
||||||
|
|
||||||
// TLS is enabled. Copy the certificate and private key to the source directory.
|
|
||||||
publicTLSCertificate := StaticFiles.FindAndReadFileINTERNAL(ConfigurationDB.Read(`PublicWebServerTLSCertificateName`))
|
|
||||||
publicTLSPrivateKey := StaticFiles.FindAndReadFileINTERNAL(ConfigurationDB.Read(`PublicWebServerTLSPrivateKey`))
|
|
||||||
|
|
||||||
// Access to the working directory?
|
|
||||||
currentDir, dirError := os.Getwd()
|
|
||||||
if dirError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to read the working directory. Thus, cannot store the TLS certificates!`, dirError.Error())
|
|
||||||
} else {
|
|
||||||
// Build the filenames:
|
|
||||||
pathCertificate := filepath.Join(currentDir, ConfigurationDB.Read(`PublicWebServerTLSCertificateName`))
|
|
||||||
pathPrivateKey := filepath.Join(currentDir, ConfigurationDB.Read(`PublicWebServerTLSPrivateKey`))
|
|
||||||
|
|
||||||
// Write the files:
|
|
||||||
if writeError := ioutil.WriteFile(pathCertificate, publicTLSCertificate, 0660); writeError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to write the TLS certificate to the working directory.`, writeError.Error())
|
|
||||||
}
|
|
||||||
if writeError := ioutil.WriteFile(pathPrivateKey, publicTLSPrivateKey, 0660); writeError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to write the TLS private key to the working directory.`, writeError.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the private web server (i.e. administration server) enabled?
|
// Is the private web server (i.e. administration server) enabled?
|
||||||
if strings.ToLower(ConfigurationDB.Read(`AdminWebServerEnabled`)) == `true` {
|
if strings.ToLower(ConfigurationDB.Read(`AdminWebServerEnabled`)) == `true` {
|
||||||
|
|
||||||
@ -135,32 +105,6 @@ func init() {
|
|||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, fmt.Sprintf("The admin web server's max. header size was set to %d bytes.", maxHeaderBytes))
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameCONFIGURATION, fmt.Sprintf("The admin web server's max. header size was set to %d bytes.", maxHeaderBytes))
|
||||||
serverAdmin.MaxHeaderBytes = maxHeaderBytes
|
serverAdmin.MaxHeaderBytes = maxHeaderBytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is TLS configured?
|
|
||||||
if adminTLSEnabled := ConfigurationDB.Read(`AdminWebServerUseTLS`); strings.ToLower(adminTLSEnabled) == `true` {
|
|
||||||
|
|
||||||
// TLS is enabled. Copy the certificate and private key to the source directory.
|
|
||||||
adminTLSCertificate := StaticFiles.FindAndReadFileINTERNAL(ConfigurationDB.Read(`AdminWebServerTLSCertificateName`))
|
|
||||||
adminTLSPrivateKey := StaticFiles.FindAndReadFileINTERNAL(ConfigurationDB.Read(`AdminWebServerTLSPrivateKey`))
|
|
||||||
|
|
||||||
// Access to the working directory?
|
|
||||||
currentDir, dirError := os.Getwd()
|
|
||||||
if dirError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to read the working directory. Thus, cannot store the TLS certificates!`, dirError.Error())
|
|
||||||
} else {
|
|
||||||
// Build the filenames:
|
|
||||||
pathCertificate := filepath.Join(currentDir, ConfigurationDB.Read(`AdminWebServerTLSCertificateName`))
|
|
||||||
pathPrivateKey := filepath.Join(currentDir, ConfigurationDB.Read(`AdminWebServerTLSPrivateKey`))
|
|
||||||
|
|
||||||
// Write the files:
|
|
||||||
if writeError := ioutil.WriteFile(pathCertificate, adminTLSCertificate, 0660); writeError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to write the TLS certificate to the working directory.`, writeError.Error())
|
|
||||||
}
|
|
||||||
if writeError := ioutil.WriteFile(pathPrivateKey, adminTLSPrivateKey, 0660); writeError != nil {
|
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.MessageNameCONFIGURATION, `Was not able to write the TLS private key to the working directory.`, writeError.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Private web server is disabled:
|
// Private web server is disabled:
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `The admin web server is disabled.`)
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `The admin web server is disabled.`)
|
||||||
|
@ -2,13 +2,11 @@ package WebServer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/SommerEngineering/Ocean/ConfigurationDB"
|
|
||||||
"github.com/SommerEngineering/Ocean/ICCC"
|
"github.com/SommerEngineering/Ocean/ICCC"
|
||||||
"github.com/SommerEngineering/Ocean/ICCC/SystemMessages"
|
"github.com/SommerEngineering/Ocean/ICCC/SystemMessages"
|
||||||
"github.com/SommerEngineering/Ocean/Log"
|
"github.com/SommerEngineering/Ocean/Log"
|
||||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||||
"github.com/SommerEngineering/Ocean/System/Version"
|
"github.com/SommerEngineering/Ocean/System/Version"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start() {
|
func Start() {
|
||||||
@ -21,31 +19,18 @@ func Start() {
|
|||||||
if serverPublic != nil {
|
if serverPublic != nil {
|
||||||
data.PublicIPAddressPort = serverPublicAddressPort
|
data.PublicIPAddressPort = serverPublicAddressPort
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Public web server is now listening.`, `Configuration for hostname and port.`, serverPublicAddressPort)
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Public web server is now listening.`, `Configuration for hostname and port.`, serverPublicAddressPort)
|
||||||
|
|
||||||
// Is TLS configured?
|
|
||||||
if publicTLSEnabled := ConfigurationDB.Read(`PublicWebServerUseTLS`); strings.ToLower(publicTLSEnabled) == `true` {
|
|
||||||
go serverPublic.ListenAndServeTLS(ConfigurationDB.Read(`PublicWebServerTLSCertificateName`), ConfigurationDB.Read(`PublicWebServerTLSPrivateKey`))
|
|
||||||
} else {
|
|
||||||
go serverPublic.ListenAndServe()
|
go serverPublic.ListenAndServe()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the private web server:
|
// Start the private web server:
|
||||||
if serverAdmin != nil {
|
if serverAdmin != nil {
|
||||||
data.AdminIPAddressPort = serverAdminAddressPort
|
data.AdminIPAddressPort = serverAdminAddressPort
|
||||||
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Admin web server is now listening.`, `Configuration for hostname and port.`, serverAdminAddressPort)
|
Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `Admin web server is now listening.`, `Configuration for hostname and port.`, serverAdminAddressPort)
|
||||||
|
|
||||||
// Is TLS configured?
|
|
||||||
if adminTLSEnabled := ConfigurationDB.Read(`AdminWebServerUseTLS`); strings.ToLower(adminTLSEnabled) == `true` {
|
|
||||||
go serverAdmin.ListenAndServeTLS(ConfigurationDB.Read(`AdminWebServerTLSCertificateName`), ConfigurationDB.Read(`AdminWebServerTLSPrivateKey`))
|
|
||||||
} else {
|
|
||||||
go serverAdmin.ListenAndServe()
|
go serverAdmin.ListenAndServe()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Notify the whole cluster, that this server is now up and ready:
|
// Notify the whole cluster, that this server is now up and ready:
|
||||||
answers := ICCC.WriteMessage2All(ICCC.ChannelSTARTUP, `System::OceanStart`, ICCC.KindALL, data, SystemMessages.ICCCDefaultAnswer{})
|
answers := ICCC.WriteMessage2All(ICCC.ChannelSTARTUP, `System::OceanStart`, data, SystemMessages.ICCCDefaultAnswer{})
|
||||||
for n, obj := range answers {
|
for n, obj := range answers {
|
||||||
if obj != nil {
|
if obj != nil {
|
||||||
answer := obj.(SystemMessages.ICCCDefaultAnswer)
|
answer := obj.(SystemMessages.ICCCDefaultAnswer)
|
||||||
|
Loading…
Reference in New Issue
Block a user