From 7715b1ee3d15d03f5dd9eb2a630639cffbb29827 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Thu, 14 Mar 2019 08:36:02 +0100 Subject: [PATCH] WIP --- SkyScanner.cs | 19 ++++++ http/SkyScannerHttpApi.cs | 2 +- http/SkyScannerHttpManagement.cs | 80 +++++++++++++++++++++++ ln.skyscanner.csproj | 5 +- templates/static/frame.html | 41 +++++++++--- templates/static/index.html | 4 +- templates/static/interface.js | 107 ++++++++++++++++++++++++++++--- templates/static/style.css | 85 ++++++++++++++++++++++-- templates/static/workspace.js | 26 ++++++++ templates/statistics.html | 6 -- 10 files changed, 344 insertions(+), 31 deletions(-) create mode 100644 http/SkyScannerHttpManagement.cs create mode 100644 templates/static/workspace.js delete mode 100644 templates/statistics.html diff --git a/SkyScanner.cs b/SkyScanner.cs index 775e353..ba84cd6 100644 --- a/SkyScanner.cs +++ b/SkyScanner.cs @@ -4,6 +4,7 @@ using ln.http; using System.Net; using ln.skyscanner.http; using System.IO; +using ln.skyscanner.crawl; namespace ln.skyscanner { public enum ComponentState { STOPPED, INITIALIZED, STARTED, FAILED } @@ -15,6 +16,7 @@ namespace ln.skyscanner public HTTPServer HTTPServer { get; private set; } + public Crawler Crawler { get; private set; } public SkyScanner(String[] args) { @@ -85,6 +87,23 @@ namespace ln.skyscanner } + /** Crawler **/ + + public ComponentState CrawlerStatus + { + get + { + if (Crawler != null) + { + if (Crawler.ThreadStates.Length > 0) + { + return ComponentState.STARTED; + } + return ComponentState.INITIALIZED; + } + return ComponentState.STOPPED; + } + } } diff --git a/http/SkyScannerHttpApi.cs b/http/SkyScannerHttpApi.cs index 5788f7b..2113317 100644 --- a/http/SkyScannerHttpApi.cs +++ b/http/SkyScannerHttpApi.cs @@ -14,7 +14,7 @@ namespace ln.skyscanner.http { SkyScanner = skyScannerHttpApplication.SkyScanner; - TemplateResource statistics = new TemplateResource(this, System.IO.Path.Combine(SkyScanner.BasePath,"templates","statistics.html"), SkyScanner); + SkyScannerHttpManagement management = new SkyScannerHttpManagement(this,SkyScanner); } diff --git a/http/SkyScannerHttpManagement.cs b/http/SkyScannerHttpManagement.cs new file mode 100644 index 0000000..3b50eee --- /dev/null +++ b/http/SkyScannerHttpManagement.cs @@ -0,0 +1,80 @@ +// /** +// * File: SkyScannerHttpManagement.cs +// * Author: haraldwolff +// * +// * This file and it's content is copyrighted by the Author and / or copyright holder. +// * Any use wihtout proper permission is illegal and may lead to legal actions. +// * +// * +// **/ +using System; +using ln.http.resources; +using ln.logging; +using System.Threading; +namespace ln.skyscanner.http +{ + public class SkyScannerHttpManagement : JsonCallResource + { + public SkyScanner SkyScanner { get; } + + public SkyScannerHttpManagement(Resource container,SkyScanner skyScanner) + : base(container, "management") + { + SkyScanner = skyScanner; + } + public SkyScannerHttpManagement(Resource container, string name, SkyScanner skyScanner) + : base(container, name) + { + SkyScanner = skyScanner; + } + + [Callable] + public SkyScannerStatistics GetStatistics() + { + SkyScannerStatistics statistics = new SkyScannerStatistics(SkyScanner); + return statistics; + } + + [Callable] + public void StartCrawler() + { + Logging.Log(LogLevel.INFO, "Management: StartCrawler() called"); + } + + [Callable] + public void Shutdown() + { + Thread thread = new Thread(()=>SkyScanner.Stop()); + thread.Start(); + } + + + + + public class SkyScannerStatistics + { + public SkyScannerState States; + + public SkyScannerStatistics(SkyScanner skyScanner) + { + States.HttpServer = skyScanner.HttpStatus; + States.Crawler = skyScanner.CrawlerStatus; + + States.Checks = ComponentState.STOPPED; + States.Dispatcher = ComponentState.STOPPED; + + + States.Manager = ComponentState.STARTED; + } + + } + public struct SkyScannerState + { + public ComponentState HttpServer; + public ComponentState Crawler; + public ComponentState Manager; + public ComponentState Checks; + public ComponentState Dispatcher; + } + } +} diff --git a/ln.skyscanner.csproj b/ln.skyscanner.csproj index bbba2dd..2c241e1 100644 --- a/ln.skyscanner.csproj +++ b/ln.skyscanner.csproj @@ -50,6 +50,7 @@ + @@ -62,10 +63,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest diff --git a/templates/static/frame.html b/templates/static/frame.html index c288f11..0cdc62d 100644 --- a/templates/static/frame.html +++ b/templates/static/frame.html @@ -6,8 +6,9 @@ + - +
- +
-
<%=__frame__%>
- -
+
+ <%=__frame__%> +
+ + + diff --git a/templates/static/index.html b/templates/static/index.html index 0ef800d..308ce76 100644 --- a/templates/static/index.html +++ b/templates/static/index.html @@ -1,3 +1,5 @@ <%frame "frame.html"%> -

SkyScanner

+
+ +
diff --git a/templates/static/interface.js b/templates/static/interface.js index c2242d2..218cdb1 100644 --- a/templates/static/interface.js +++ b/templates/static/interface.js @@ -2,18 +2,109 @@ function API(baseurl){ -} + this.baseurl = baseurl; + + this.get = function(page, handler = null){ + var x = new XMLHttpRequest(); + var async = (handler != null); + + if (async) + { + x.onload = function(){ + var responseText = x.responseText; + handler( responseText ); + } + } + x.open("GET", this.baseurl + page, async); + x.send(); + + if (!async) + return x.responseText + } + this.post = function(page, handler = null){ + var x = new XMLHttpRequest(); + if (handler != null) + { + x.onload = function(){ + var responseText = x.responseText; + handler( responseText ); + } + } + x.open("POST", this.baseurl + page); + x.send(); + } + + this.getJson = function(page, handler){ + var j = function(t){ + handler(JSON.parse(t)); + }; + return this.get( page, j ); + } + + this.call = function(endpoint,method,parameters = []){ + var x = new XMLHttpRequest(); + x.open("POST", this.baseurl + endpoint, false); + x.setRequestHeader("content-type","application/json"); + + var methodCall = { + "MethodName": method, + "Parameters": parameters + } + + x.send(JSON.stringify(methodCall)); + + var result = JSON.parse(x.responseText); + if (result.Exception != null) + throw result.Exception; - - -api = API("<%=request.self()%>"); - - -function loadStatistics() -{ + return result.Result; + } } +function $(id) +{ + return document.getElementById(id); +} +function CE(eName) +{ + return document.createElement(eName); +} + + +var api = null; + +function loadStatistics() +{ + try + { + var stats = api.call("api/management","GetStatistics"); + + $("indHttpServer").attributes["state"].value = stats.States.HttpServer; + $("indManager").attributes["state"].value = stats.States.Manager; + $("indCrawler").attributes["state"].value = stats.States.Crawler; + $("indChecks").attributes["state"].value = stats.States.Checks; + $("indDispatcher").attributes["state"].value = stats.States.Dispatcher; + + } catch (e) + { + $("indHttpServer").attributes["state"].value = 3; + $("indManager").attributes["state"].value = 0; + $("indCrawler").attributes["state"].value = 0; + $("indChecks").attributes["state"].value = 0; + $("indDispatcher").attributes["state"].value = 0; + } +} + + +function initApi(baseurl) +{ + api = new API(baseurl); + setInterval( loadStatistics, 1000 ); + + log("API initialized"); +} + diff --git a/templates/static/style.css b/templates/static/style.css index 826efd0..29b5b5c 100644 --- a/templates/static/style.css +++ b/templates/static/style.css @@ -4,6 +4,18 @@ font-family: Arial, Helvetica, sans-serif; font-size: 12px; + + display: block; + position: absolute; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; +} + +a { + text-decoration: none; + color: inherit; } #header { @@ -43,7 +55,7 @@ } .indicator > div { border-radius: 50%; - background-color: red; + background-color: #404040; display: inline-block; width: 11px; height: 11px; @@ -52,6 +64,71 @@ margin-right: 4px; } - .indicator[state=STARTED] > div { - background-color: #00D000; - } +.indicator[state="1"] > div { + background-color: #C0C000; +} +.indicator[state="2"] > div { + background-color: #00D000; +} +.indicator[state="3"] > div { + background-color: #D00000; +} + +#footer { + position: absolute; + display: block; + + bottom: 0px; + height: 32px; + left: 0px; + right: 0px; + + + background-color: #c7def5; + padding: 6px; + padding-left: 24px; +} + +#nav { + display: block; + left: 0px; + right: 0px; + + text-align: center; + padding: 6px; +} + +#nav > div { +} + +#nav > div > div { + display: inline-block; + + width: 160px; + + + border: 1px solid black; + padding: 4px; + + margin-left: 32px; + margin-right: 32px; + + + border-radius: 3px; +} + +#content { + display: block; + position: absolute; + + top: 80px; + bottom: 32px; + left: 0px; + right: 0px; + + background-color: #F0F0D0; +} + +#workspace { +} + diff --git a/templates/static/workspace.js b/templates/static/workspace.js new file mode 100644 index 0000000..b01f5a1 --- /dev/null +++ b/templates/static/workspace.js @@ -0,0 +1,26 @@ + +function Workspace() +{ + this.desktop = $("workspace"); + + this.loadPanel = function(title,page){ + var content = api.get(page); + this.createPanel(title,content); + } + + this.createPanel = function(title,content){ + var divFrame = CE("div"); + var divTitle = CE("div"); + var divPanel = CE("DIV"); + + divFrame.appendChild(divTitle); + divFrame.appendChild(divPanel); + + divTitle.innerText = title; + divPanel.innerText = content; + + this.desktop.appendChild(divFrame); + } +} + +var workspace = null; diff --git a/templates/statistics.html b/templates/statistics.html deleted file mode 100644 index 248f790..0000000 --- a/templates/statistics.html +++ /dev/null @@ -1,6 +0,0 @@ -<%=response.SetHeader("Content-Type","application/json")%> -{ - "ComponentState": { - "HttpServer": "<%=this.HttpStatus%>" - } -}