diff --git a/Admin/Assets/CSSAdmin.go b/Admin/Assets/CSSAdmin.go
index abfc0ba..62d0d52 100644
--- a/Admin/Assets/CSSAdmin.go
+++ b/Admin/Assets/CSSAdmin.go
@@ -267,6 +267,15 @@ p {
.filterformcontainer {
text-align: center;
}
+.introtext {
+ margin-bottom: 30px;
+ color: black;
+ font-size: 20px;
+}
+.admintextblock {
+ margin-top: 16px;
+ color: black;
+}
@media (max-width: 991px) {
.icons.oneback {
margin-left: 113px;
diff --git a/Admin/HandlerOverview.go b/Admin/HandlerOverview.go
index 8399f6c..f3199d6 100644
--- a/Admin/HandlerOverview.go
+++ b/Admin/HandlerOverview.go
@@ -5,6 +5,7 @@ import (
LM "github.com/SommerEngineering/Ocean/Log/Meta"
"github.com/SommerEngineering/Ocean/MimeTypes"
"github.com/SommerEngineering/Ocean/Shutdown"
+ "github.com/SommerEngineering/Ocean/System/Version"
"net/http"
)
@@ -17,9 +18,13 @@ func HandlerOverview(response http.ResponseWriter, request *http.Request) {
return
}
+ // Get the data ready:
+ data := AdminWebOverview{}
+ data.Version = Version.GetVersion()
+
// Write the MIME type and execute the template:
MimeTypes.Write2HTTP(response, MimeTypes.TypeWebHTML)
- if executeError := AdminTemplates.ExecuteTemplate(response, `Overview`, nil); executeError != nil {
+ if executeError := AdminTemplates.ExecuteTemplate(response, `Overview`, data); executeError != nil {
Log.LogFull(senderName, LM.CategorySYSTEM, LM.LevelERROR, LM.SeverityCritical, LM.ImpactCritical, LM.MessageNameEXECUTE, `Was not able to execute the admin's overview template.`, executeError.Error())
}
}
diff --git a/Admin/Scheme.go b/Admin/Scheme.go
index f6208ab..6f926c8 100644
--- a/Admin/Scheme.go
+++ b/Admin/Scheme.go
@@ -4,6 +4,12 @@ import (
"github.com/SommerEngineering/Ocean/ConfigurationDB"
)
+// Data for the admin's configuration management site
type AdminWebConfiguration struct {
Configuration []ConfigurationDB.ConfigurationDBEntry
}
+
+// Data for the admin's overview i.e. dashboard
+type AdminWebOverview struct {
+ Version string
+}
diff --git a/Admin/Templates/Overview.go b/Admin/Templates/Overview.go
index 2e47063..2d887fe 100644
--- a/Admin/Templates/Overview.go
+++ b/Admin/Templates/Overview.go
@@ -29,6 +29,7 @@ var Overview = `
+ The current Ocean's version is: {{.Version}}
diff --git a/ICCC/ICCCGetVersionReceiver.go b/ICCC/ICCCGetVersionReceiver.go
new file mode 100644
index 0000000..dff9f7f
--- /dev/null
+++ b/ICCC/ICCCGetVersionReceiver.go
@@ -0,0 +1,44 @@
+package ICCC
+
+import (
+ "github.com/SommerEngineering/Ocean/ICCC/SystemMessages"
+ "github.com/SommerEngineering/Ocean/Log"
+ LM "github.com/SommerEngineering/Ocean/Log/Meta"
+ "github.com/SommerEngineering/Ocean/System/Version"
+ "github.com/SommerEngineering/Ocean/Tools"
+)
+
+// The receiver function for the ICCC version message.
+func ICCCGetVersionReceiver(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 get version message.")
+ result = make(map[string][]string, 0)
+ return
+ }
+ }()
+
+ // Converts the HTTP form data into an object:
+ _, _, obj := Data2Message(SystemMessages.ICCCGetVersion{}, data)
+
+ // Was it possible to convert the data?
+ if obj != nil {
+
+ // Prepare the answer:
+ answer := SystemMessages.ICCCGetVersionAnswer{}
+ answer.Kind = `Ocean`
+ answer.Name = Tools.ThisHostname()
+ answer.Version = Version.GetVersion()
+
+ // An answer is necessary:
+ return Message2Data("", "", answer)
+ } else {
+ Log.LogShort(senderName, LM.CategorySYSTEM, LM.LevelINFO, LM.MessageNameSTARTUP, `ICCC message: Was not able to convert the ping message.`)
+ }
+
+ // In any other error case:
+ result = make(map[string][]string, 0)
+ return
+}
diff --git a/ICCC/SystemMessages/ICCCGetVersion.go b/ICCC/SystemMessages/ICCCGetVersion.go
new file mode 100644
index 0000000..bb5e048
--- /dev/null
+++ b/ICCC/SystemMessages/ICCCGetVersion.go
@@ -0,0 +1,12 @@
+package SystemMessages
+
+// Requests the version from a Ocean server
+type ICCCGetVersion struct {
+}
+
+// Answer to the version request
+type ICCCGetVersionAnswer struct {
+ Kind string // Ocean || Component
+ Name string // Ocean: Hostname; Components: Name
+ Version string // The current version
+}
diff --git a/ICCC/SystemMessages/ICCCStartupMessages.go b/ICCC/SystemMessages/ICCCStartupMessages.go
index 9b8a5a3..43975af 100644
--- a/ICCC/SystemMessages/ICCCStartupMessages.go
+++ b/ICCC/SystemMessages/ICCCStartupMessages.go
@@ -4,9 +4,12 @@ package SystemMessages
type ICCCOceanStartUpMessage struct {
PublicIPAddressPort string // The public web server's IP address and port
AdminIPAddressPort string // The private admin server's IP address and port
+ OceanVersion string // The current version of this server
}
// Message type for a startup message for external components:
type ICCCComponentStartUpMessage struct {
IPAddressPort string // The component's ICCC IP address and port
+ Name string // What is the name of this component?
+ Version string // Which version is used?
}
diff --git a/ICCC/Variables.go b/ICCC/Variables.go
index 9a395fa..70eabdd 100644
--- a/ICCC/Variables.go
+++ b/ICCC/Variables.go
@@ -14,6 +14,7 @@ const (
ChannelSHUTDOWN string = `System::Shutdown` // A channel for system shutdown messages.
ChannelSTARTUP string = `System::Startup` // A channel for system startup messages.
ChannelICCC string = `System::ICCC` // A common ICCC channel.
+ ChannelPING string = `System::Ping` // A channel for pings.
)
var (
diff --git a/Ocean.pdf b/Ocean.pdf
index 8c0b2b0..24735c9 100644
Binary files a/Ocean.pdf and b/Ocean.pdf differ
diff --git a/System/ICCCComponentStartUpMessageReceiver.go b/System/ICCCComponentStartUpMessageReceiver.go
index 0e7352b..8c02ae8 100644
--- a/System/ICCCComponentStartUpMessageReceiver.go
+++ b/System/ICCCComponentStartUpMessageReceiver.go
@@ -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))
+ 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:
return ICCC.Message2Data("", "", SystemMessages.AnswerACK)
diff --git a/System/ICCCOceanStartUpMessageReceiver.go b/System/ICCCOceanStartUpMessageReceiver.go
index b95a95c..a973f36 100644
--- a/System/ICCCOceanStartUpMessageReceiver.go
+++ b/System/ICCCOceanStartUpMessageReceiver.go
@@ -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))
+ 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)
diff --git a/System/InitHandlers.go b/System/InitHandlers.go
index a6fd2ea..b5a2059 100644
--- a/System/InitHandlers.go
+++ b/System/InitHandlers.go
@@ -11,6 +11,7 @@ import (
"github.com/SommerEngineering/Ocean/Log/Web"
"github.com/SommerEngineering/Ocean/Robots"
"github.com/SommerEngineering/Ocean/StaticFiles"
+ "github.com/SommerEngineering/Ocean/System/Version"
"github.com/SommerEngineering/Ocean/WebContent"
)
@@ -58,6 +59,9 @@ func InitHandlers() {
// Handler for the web logging:
Handlers.AddAdminHandler(`/log`, Web.HandlerWebLog)
+ // Handler for the access to Ocean's version:
+ Handlers.AddAdminHandler(`/version`, Version.HandlerVersion)
+
// Handler for the file upload:
Handlers.AddAdminHandler(`/upload`, Admin.HandlerFileUpload)
diff --git a/System/InitSystem.go b/System/InitSystem.go
index 670160e..ea7271c 100644
--- a/System/InitSystem.go
+++ b/System/InitSystem.go
@@ -104,7 +104,8 @@ 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, `ICCC::Ping`, ICCC.ICCCPingReceiver)
+ ICCC.Registrar(ICCC.ChannelICCC, `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)
ICCC.Registrar(ICCC.ChannelNUMGEN, `NumGen::Next`, NumGen.ICCCNextNumberReceiver)
diff --git a/System/Version/GetVersion.go b/System/Version/GetVersion.go
new file mode 100644
index 0000000..789a1ff
--- /dev/null
+++ b/System/Version/GetVersion.go
@@ -0,0 +1,6 @@
+package Version
+
+// Gets Ocean's version
+func GetVersion() string {
+ return oceansVersion
+}
diff --git a/System/Version/HandlerVersion.go b/System/Version/HandlerVersion.go
new file mode 100644
index 0000000..ddb9dbd
--- /dev/null
+++ b/System/Version/HandlerVersion.go
@@ -0,0 +1,19 @@
+package Version
+
+import (
+ "fmt"
+ "github.com/SommerEngineering/Ocean/Shutdown"
+ "net/http"
+)
+
+// Handler for the access to Ocean's version
+func HandlerVersion(response http.ResponseWriter, request *http.Request) {
+
+ // Case: The system goes down now?
+ if Shutdown.IsDown() {
+ http.NotFound(response, request)
+ return
+ }
+
+ fmt.Fprintf(response, "%s", oceansVersion)
+}
diff --git a/System/Version/Variables.go b/System/Version/Variables.go
new file mode 100644
index 0000000..d5d1152
--- /dev/null
+++ b/System/Version/Variables.go
@@ -0,0 +1,5 @@
+package Version
+
+var (
+ oceansVersion string = `2.0.0` // Ocean's current version
+)
diff --git a/WebServer/Start.go b/WebServer/Start.go
index a09bf68..05ca59d 100644
--- a/WebServer/Start.go
+++ b/WebServer/Start.go
@@ -6,12 +6,14 @@ import (
"github.com/SommerEngineering/Ocean/ICCC/SystemMessages"
"github.com/SommerEngineering/Ocean/Log"
LM "github.com/SommerEngineering/Ocean/Log/Meta"
+ "github.com/SommerEngineering/Ocean/System/Version"
)
func Start() {
// Tell the whole cluster, that we are up and ready:
data := SystemMessages.ICCCOceanStartUpMessage{}
+ data.OceanVersion = Version.GetVersion()
// Start the public web server:
if serverPublic != nil {