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 = `
Configuration
+
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 {