Compare commits
29
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27e3eef7fc | ||
|
|
b2cf41a088 | ||
|
|
a72d45d27c | ||
|
|
0c80f4bdcc | ||
|
|
47fc86f490 | ||
|
|
e316ccbf95 | ||
|
|
4dfda5a807 | ||
|
|
744a817150 | ||
|
|
4ebaaebaa7 | ||
|
|
210373280f | ||
|
|
ca8a960896 | ||
|
|
d071609988 | ||
|
|
c1748edd8d | ||
|
|
041cda8a35 | ||
|
|
6c6e52536a | ||
|
|
630147ecdd | ||
|
|
36bf26e12a | ||
|
|
0bca5ebb7b | ||
|
|
858cfc81e4 | ||
|
|
74b287017b | ||
|
|
b74c9e7fa3 | ||
|
|
a792a8e86f | ||
|
|
40fd2d5dfb | ||
|
|
bfedc63eb6 | ||
|
|
6ab4732b85 | ||
|
|
cc68365977 | ||
|
|
72e2870684 | ||
|
|
a6f340b311 | ||
|
|
eb7bc9e0fd |
No files matched your search
@@ -14,7 +14,7 @@ func connectDatabase(config Meta.Configuration) {
|
||||
defer func() {
|
||||
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)
|
||||
os.Exit(0)
|
||||
os.Exit(1)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -22,7 +22,7 @@ func connectDatabase(config Meta.Configuration) {
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(1)
|
||||
} else {
|
||||
session = newSession
|
||||
}
|
||||
@@ -34,7 +34,7 @@ func connectDatabase(config Meta.Configuration) {
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// 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() {
|
||||
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)
|
||||
os.Exit(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -21,7 +21,7 @@ func connectDatabase(host, username, password, database string) {
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(2)
|
||||
} else {
|
||||
mainSession = newSession
|
||||
}
|
||||
@@ -31,14 +31,14 @@ func connectDatabase(host, username, password, database string) {
|
||||
if db == nil {
|
||||
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")
|
||||
os.Exit(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
// Login:
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
// 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 {
|
||||
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")
|
||||
os.Exit(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
// Ensure the indexes for the GridFS:
|
||||
|
||||
@@ -2,9 +2,10 @@ package Handlers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/SommerEngineering/Ocean/Log"
|
||||
LM "github.com/SommerEngineering/Ocean/Log/Meta"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Function to add a new public handler.
|
||||
|
||||
+1
-1
@@ -42,6 +42,6 @@ channel=CHANNEL
|
||||
checksum=[the SHA512 checksum of the message]
|
||||
|
||||
Constrains to the environment:
|
||||
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.
|
||||
The three field names 'command', 'channel' and 'checksum' are reserved, thus, you cannot use these names.
|
||||
*/
|
||||
package ICCC
|
||||
@@ -56,7 +56,7 @@ func ICCCHandler(response http.ResponseWriter, request *http.Request) {
|
||||
|
||||
if listener == nil {
|
||||
// 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)
|
||||
} else {
|
||||
// Case: Everything is fine => deliver the message and read the answer:
|
||||
|
||||
@@ -35,6 +35,7 @@ func ICCCGetHostsReceiver(data map[string][]string) (result map[string][]string)
|
||||
answerMessage := SystemMessages.ICCCGetHostsAnswer{}
|
||||
answerMessage.Hostnames = 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:
|
||||
n := 0
|
||||
@@ -42,6 +43,7 @@ func ICCCGetHostsReceiver(data map[string][]string) (result map[string][]string)
|
||||
host := entry.Value.(Scheme.Host)
|
||||
answerMessage.Hostnames[n] = host.Hostname
|
||||
answerMessage.IPAddressesPorts[n] = host.IPAddressPort
|
||||
answerMessage.Kinds[n] = host.Kind
|
||||
n++
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ func ICCCGetListenersReceiver(data map[string][]string) (result map[string][]str
|
||||
answerMessage.Channels = make([]string, countListeners, countListeners)
|
||||
answerMessage.Commands = 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:
|
||||
n := 0
|
||||
@@ -44,6 +45,7 @@ func ICCCGetListenersReceiver(data map[string][]string) (result map[string][]str
|
||||
answerMessage.Channels[n] = listener.Channel
|
||||
answerMessage.Commands[n] = listener.Command
|
||||
answerMessage.IPAddressesPorts[n] = listener.IPAddressPort
|
||||
answerMessage.Kinds[n] = listener.Kind
|
||||
n++
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ func ICCCGetVersionReceiver(data map[string][]string) (result map[string][]strin
|
||||
|
||||
// Prepare the answer:
|
||||
answer := SystemMessages.ICCCGetVersionAnswer{}
|
||||
answer.Kind = `Ocean`
|
||||
answer.Kind = KindOCEAN
|
||||
answer.Name = Tools.ThisHostname()
|
||||
answer.Version = Version.GetVersion()
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ func ICCCListenerUpdateReceiver(data map[string][]string) (result map[string][]s
|
||||
updatedObject.Command = messageData.Command
|
||||
updatedObject.IPAddressPort = messageData.IPAddressPort
|
||||
updatedObject.IsActive = messageData.IsActiveNew
|
||||
updatedObject.Kind = messageData.Kind
|
||||
|
||||
// Update the entry:
|
||||
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))
|
||||
|
||||
// Execute the command:
|
||||
registerHost2Database(messageData.Hostname, messageData.IPAddressPort)
|
||||
registerHost2Database(messageData.Hostname, messageData.IPAddressPort, messageData.Kind)
|
||||
|
||||
// Update the caches:
|
||||
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))
|
||||
|
||||
// Execute the command:
|
||||
registerListener2Database(messageData.Channel, messageData.Command, messageData.IPAddressPort, messageData.IsActive)
|
||||
registerListener2Database(messageData.Channel, messageData.Command, messageData.IPAddressPort, messageData.IsActive, messageData.Kind)
|
||||
|
||||
// Update the caches:
|
||||
InitCacheNow()
|
||||
|
||||
@@ -28,6 +28,7 @@ func initDB() {
|
||||
//
|
||||
// Take care about the indexes for ICCCListener:
|
||||
//
|
||||
collectionListener.EnsureIndexKey(`Kind`)
|
||||
collectionListener.EnsureIndexKey(`Command`)
|
||||
collectionListener.EnsureIndexKey(`Command`, `IsActive`)
|
||||
|
||||
@@ -52,6 +53,7 @@ func initDB() {
|
||||
//
|
||||
// Index for hosts:
|
||||
//
|
||||
collectionHosts.EnsureIndexKey(`Kind`)
|
||||
collectionHosts.EnsureIndexKey(`Hostname`)
|
||||
collectionHosts.EnsureIndexKey(`IPAddressPort`)
|
||||
|
||||
|
||||
@@ -8,12 +8,13 @@ import (
|
||||
)
|
||||
|
||||
// Function to register a server to the ICCC.
|
||||
func registerHost2Database(hostname, ipAddressPort string) {
|
||||
func registerHost2Database(hostname, ipAddressPort string, kind byte) {
|
||||
|
||||
// Create the host entry:
|
||||
host := Scheme.Host{}
|
||||
host.Hostname = hostname
|
||||
host.IPAddressPort = ipAddressPort
|
||||
host.Kind = kind
|
||||
|
||||
// The query to find already existing entries:
|
||||
selection := bson.D{{`Hostname`, host.Hostname}, {`IPAddressPort`, host.IPAddressPort}}
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
)
|
||||
|
||||
// The internal function to register an listener to ICCC.
|
||||
func registerListener2Database(channel, command, ipAddressPort string, isActive bool) {
|
||||
func registerListener2Database(channel, command, ipAddressPort string, isActive bool, kind byte) {
|
||||
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{}
|
||||
@@ -17,6 +17,7 @@ func registerListener2Database(channel, command, ipAddressPort string, isActive
|
||||
entry.Command = command
|
||||
entry.IsActive = isActive
|
||||
entry.IPAddressPort = ipAddressPort
|
||||
entry.Kind = kind
|
||||
|
||||
//
|
||||
// Case: Exists?
|
||||
|
||||
@@ -8,5 +8,5 @@ func registerLocalListener2Database(channel, command string) {
|
||||
there would be no server which can execute the ICCC command.
|
||||
Therefore, every Ocean server registers the own listeners directly.
|
||||
*/
|
||||
registerListener2Database(channel, command, correctAddressWithPort, true)
|
||||
registerListener2Database(channel, command, correctAddressWithPort, true, KindOCEAN)
|
||||
}
|
||||
@@ -12,5 +12,5 @@ func registerThisHost2Database() {
|
||||
there would be no server which can execute the ICCC command.
|
||||
Therefore, every Ocean server registers the own host directly.
|
||||
*/
|
||||
registerHost2Database(Tools.ThisHostname(), correctAddressWithPort)
|
||||
registerHost2Database(Tools.ThisHostname(), correctAddressWithPort, KindOCEAN)
|
||||
}
|
||||
@@ -4,4 +4,5 @@ package Scheme
|
||||
type Host struct {
|
||||
Hostname string `bson:"Hostname"`
|
||||
IPAddressPort string `bson:"IPAddressPort"`
|
||||
Kind byte `bson:"Kind"`
|
||||
}
|
||||
@@ -6,4 +6,5 @@ type Listener struct {
|
||||
Command string `bson:"Command"`
|
||||
IsActive bool `bson:"IsActive"`
|
||||
IPAddressPort string `bson:"IPAddressPort"`
|
||||
Kind byte `bson:"Kind"`
|
||||
}
|
||||
+3
-2
@@ -6,6 +6,7 @@ import (
|
||||
"github.com/SommerEngineering/Ocean/Tools"
|
||||
"net/url"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Sign a message to secure it.
|
||||
@@ -32,7 +33,7 @@ func signMessage(data map[string][]string) (result url.Values) {
|
||||
// Now, loop over all the data:
|
||||
for _, key := range keys {
|
||||
// Get the value:
|
||||
value := data[key]
|
||||
value := data[key][0]
|
||||
|
||||
// Hash each key and value:
|
||||
fmt.Fprintf(hash, "key=%s :: value=%s\n", key, value)
|
||||
@@ -42,6 +43,6 @@ func signMessage(data map[string][]string) (result url.Values) {
|
||||
result = url.Values(data)
|
||||
|
||||
// Append the sign:
|
||||
result.Add(`checksum`, fmt.Sprintf("%x", hash.Sum(nil)))
|
||||
result.Add(`checksum`, strings.ToUpper(fmt.Sprintf("%x", hash.Sum(nil))))
|
||||
return
|
||||
}
|
||||
@@ -8,4 +8,5 @@ type ICCCGetHosts struct {
|
||||
type ICCCGetHostsAnswer struct {
|
||||
Hostnames []string
|
||||
IPAddressesPorts []string
|
||||
Kinds []byte
|
||||
}
|
||||
@@ -9,4 +9,5 @@ type ICCCGetListenersAnswer struct {
|
||||
Channels []string
|
||||
Commands []string
|
||||
IPAddressesPorts []string
|
||||
Kinds []byte
|
||||
}
|
||||
@@ -6,7 +6,7 @@ type ICCCGetVersion struct {
|
||||
|
||||
// Answer to the version request
|
||||
type ICCCGetVersionAnswer struct {
|
||||
Kind string // Ocean || Component
|
||||
Kind byte // Ocean || Component
|
||||
Name string // Ocean: Hostname; Components: Name
|
||||
Version string // The current version
|
||||
}
|
||||
@@ -6,4 +6,5 @@ type ICCCListenerUpdate struct {
|
||||
Command string
|
||||
IPAddressPort string
|
||||
IsActiveNew bool
|
||||
Kind byte
|
||||
}
|
||||
@@ -4,4 +4,5 @@ package SystemMessages
|
||||
type ICCCRegisterHost struct {
|
||||
Hostname string // The hostname for the end-point
|
||||
IPAddressPort string // The IP address and port for the end-point
|
||||
Kind byte // Ocean || Component
|
||||
}
|
||||
@@ -6,4 +6,5 @@ type ICCCRegisterListener struct {
|
||||
Command string // The provided command
|
||||
IsActive bool // Is the command active?
|
||||
IPAddressPort string // The IP address and port for the end-point
|
||||
Kind byte // Ocean || Component
|
||||
}
|
||||
@@ -16,6 +16,9 @@ const (
|
||||
ChannelICCC string = `System::ICCC` // A common ICCC channel.
|
||||
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 (
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
)
|
||||
|
||||
// Function to broadcast a message to all listeners.
|
||||
func WriteMessage2All(channel, command string, message interface{}, answerPrototype interface{}) (results []interface{}) {
|
||||
func WriteMessage2All(channel, command string, kind byte, message interface{}, answerPrototype interface{}) (results []interface{}) {
|
||||
cacheListenerDatabaseLock.RLock()
|
||||
defer cacheListenerDatabaseLock.RUnlock()
|
||||
|
||||
@@ -21,10 +21,16 @@ func WriteMessage2All(channel, command string, message interface{}, answerProtot
|
||||
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
||||
listener := entry.Value.(Scheme.Listener)
|
||||
|
||||
// If the channel and the command matches, deliver the message:
|
||||
// If the channel, command and kind matches, deliver the message:
|
||||
if kind == KindALL {
|
||||
if listener.Channel == channel && listener.Command == command {
|
||||
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?
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
)
|
||||
|
||||
// Function to write a message to any listener.
|
||||
func WriteMessage2Any(channel, command string, message interface{}, answerPrototype interface{}) (result interface{}) {
|
||||
func WriteMessage2Any(channel, command string, kind byte, message interface{}, answerPrototype interface{}) (result interface{}) {
|
||||
cacheListenerDatabaseLock.RLock()
|
||||
defer cacheListenerDatabaseLock.RUnlock()
|
||||
|
||||
@@ -22,11 +22,18 @@ func WriteMessage2Any(channel, command string, message interface{}, answerProtot
|
||||
for entry := cacheListenerDatabase.Front(); entry != nil; entry = entry.Next() {
|
||||
listener := entry.Value.(Scheme.Listener)
|
||||
|
||||
// If the channel and the command matches, store the listener:
|
||||
// If the channel, command and kind matches, store the listener:
|
||||
if kind == KindALL {
|
||||
if listener.Channel == channel && listener.Command == command {
|
||||
entries = entries[:len(entries)+1]
|
||||
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)
|
||||
|
||||
@@ -18,7 +18,7 @@ func initDatabase() {
|
||||
defer func() {
|
||||
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)
|
||||
os.Exit(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -57,7 +57,7 @@ func initDatabase() {
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(2)
|
||||
} else {
|
||||
logDBSession = newSession
|
||||
}
|
||||
@@ -69,7 +69,7 @@ func initDatabase() {
|
||||
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())
|
||||
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(0)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
// Get the collection:
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package Log
|
||||
|
||||
// This function provides the project name for e.g. logging events
|
||||
// coming trough the ICCC.
|
||||
func GetProjectName() string {
|
||||
return projectName
|
||||
}
|
||||
+7
-1
@@ -121,10 +121,16 @@ func clearEntry(entry Meta.Entry) (result Meta.Entry) {
|
||||
// Remove white spaces from the parameters.
|
||||
func clearParameters(oldParameters []string) (result []string) {
|
||||
for n := 0; n < len(oldParameters); n++ {
|
||||
// Remove white spaces:
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ func ICCCNewLogEventReceiver(data map[string][]string) (result map[string][]stri
|
||||
|
||||
// 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)
|
||||
|
||||
@@ -91,7 +91,10 @@ exit
|
||||
* 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
|
||||
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.
|
||||
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.
|
||||
|
||||
**Available ICCC drivers:**
|
||||
- [OceanNET - ICCC with .NET and C#](https://github.com/SommerEngineering/OceanNET)
|
||||
|
||||
### Use Ocean as framework e.g. for websites
|
||||
For this case, an example project with documentation is available here: https://github.com/SommerEngineering/Example003
|
||||
|
||||
@@ -29,7 +29,7 @@ func icccComponentStartUpMessageReceiver(data map[string][]string) (result map[s
|
||||
messageData := obj.(SystemMessages.ICCCComponentStartUpMessage)
|
||||
|
||||
// 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=", messageData.Name), fmt.Sprintf("version=", 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='%s'", messageData.Name), fmt.Sprintf("version='%s'", messageData.Version))
|
||||
|
||||
// An answer is necessary:
|
||||
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
||||
|
||||
@@ -29,7 +29,7 @@ func icccOceanStartUpMessageReceiver(data map[string][]string) (result map[strin
|
||||
messageData := obj.(SystemMessages.ICCCOceanStartUpMessage)
|
||||
|
||||
// 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:
|
||||
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
|
||||
|
||||
@@ -105,7 +105,7 @@ func initSystem() {
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteListener`, ICCC.ICCCDeleteListenerReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::DeleteHost`, ICCC.ICCCDeleteHostReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::ListenerUpdate`, ICCC.ICCCListenerUpdateReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `Ping::Ping`, ICCC.ICCCPingReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelPING, `Ping::Ping`, ICCC.ICCCPingReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelSYSTEM, `System::Version`, ICCC.ICCCGetVersionReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetHosts`, ICCC.ICCCGetHostsReceiver)
|
||||
ICCC.Registrar(ICCC.ChannelICCC, `ICCC::GetListeners`, ICCC.ICCCGetListenersReceiver)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
package Version
|
||||
|
||||
var (
|
||||
oceansVersion string = `2.0.0` // Ocean's current version
|
||||
oceansVersion string = `2.0.7` // Ocean's current version
|
||||
)
|
||||
+1
-1
@@ -30,7 +30,7 @@ func Start() {
|
||||
}
|
||||
|
||||
// Notify the whole cluster, that this server is now up and ready:
|
||||
answers := ICCC.WriteMessage2All(ICCC.ChannelSTARTUP, `System::OceanStart`, data, SystemMessages.ICCCDefaultAnswer{})
|
||||
answers := ICCC.WriteMessage2All(ICCC.ChannelSTARTUP, `System::OceanStart`, ICCC.KindALL, data, SystemMessages.ICCCDefaultAnswer{})
|
||||
for n, obj := range answers {
|
||||
if obj != nil {
|
||||
answer := obj.(SystemMessages.ICCCDefaultAnswer)
|
||||
|
||||
Reference in new issue
Block a user