From 8ff517837832e4dd26ea625462b11561605a47a4 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Fri, 30 Aug 2019 07:16:54 +0200 Subject: [PATCH] WIP --- SkyScanner.cs | 80 +++++++-------- entities/Node.cs | 2 - entities/PointOfPresence.cs | 4 + http/SkyScannerHttpApplication.cs | 22 ---- http/WebSocketInterface.cs | 86 ---------------- import/skytron/SkytronImport.cs | 41 ++++---- ln.skyscanner.csproj | 27 +++-- ln.skyscanner.sln | 71 +++++++++++++ packages.config | 4 +- services/CheckService.cs | 125 +++++++++++++---------- services/CrawlService.cs | 1 - services/EntityService.cs | 22 +++- templates/static/ln.application.js | 28 +++--- templates/static/network/nodes.html | 149 ++++++++++++++++++++++++++++ templates/static/topnav.html | 3 + 15 files changed, 415 insertions(+), 250 deletions(-) delete mode 100644 http/WebSocketInterface.cs create mode 100644 ln.skyscanner.sln create mode 100644 templates/static/network/nodes.html diff --git a/SkyScanner.cs b/SkyScanner.cs index 65c4c13..01252c2 100644 --- a/SkyScanner.cs +++ b/SkyScanner.cs @@ -62,8 +62,8 @@ namespace ln.skyscanner if (Arguments["import-skytron"].IsSet) { - SkytronImport si = new SkytronImport(Arguments["import-skytron"].Value); - si.Import(); + //SkytronImport si = new SkytronImport(Arguments["import-skytron"].Value); + //si.Import(); } if (Arguments["benchmark"].IsSet) @@ -103,7 +103,7 @@ namespace ln.skyscanner public class Service : ApplicationServiceBase { - public WebSocketInterface webSocketInterface { get; private set; } + public ApplicationWebSocket webSocketInterface { get; private set; } public RPCContainer RPCContainer { get; private set; } public Service() @@ -130,7 +130,7 @@ namespace ln.skyscanner rootResource.DefaultResource = staticTemplates; - webSocketInterface = new WebSocketInterface(rootResource, this); + webSocketInterface = new ApplicationWebSocket(rootResource, "socket", RPCContainer); RPCContainer.Add("", new SkyScannerRpc(this)); RPCContainer.Add("ServiceContainer",applicationInterface.ServiceContainer.RPC); @@ -200,62 +200,62 @@ namespace ln.skyscanner public void BenchmarkODB() { - int maxIterations = 10000; + //int maxIterations = 10000; - for (int i = 0; i < maxIterations; i++) - { - int n = 0; - Logging.Log(LogLevel.INFO, "Benchmark ODB: Iteration {0} of {1}", i, maxIterations); + //for (int i = 0; i < maxIterations; i++) + //{ + // int n = 0; + // Logging.Log(LogLevel.INFO, "Benchmark ODB: Iteration {0} of {1}", i, maxIterations); - foreach (SkyCheckState checkState in SkyScanner.Instance.Entities.SkyCheckStates.ToArray()) - { - SkyScanner.Instance.Entities.SkyCheckStates.Upsert(checkState); - n++; - } + // foreach (SkyCheckState checkState in SkyScanner.Instance.Entities.SkyCheckStates.ToArray()) + // { + // SkyScanner.Instance.Entities.SkyCheckStates.Upsert(checkState); + // n++; + // } - Logging.Log(LogLevel.INFO, "Saved {0} SkyCheckStates", n); + // Logging.Log(LogLevel.INFO, "Saved {0} SkyCheckStates", n); - } + //} } public void CrawlHost(IPv4 ip) { - Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGFULL; + //Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGFULL; - CrawledHost crawledHost = new CrawledHost(); - crawledHost.Name = ip.ToString(); - crawledHost.PrimaryIP = ip; - crawledHost.IPAddresses = new IPv4[] { ip }; + //CrawledHost crawledHost = new CrawledHost(); + //crawledHost.Name = ip.ToString(); + //crawledHost.PrimaryIP = ip; + //crawledHost.IPAddresses = new IPv4[] { ip }; - Crawl crawl = new Crawl(Crawler, crawledHost); - crawl.Prepare(); - crawl.RunJob(); + //Crawl crawl = new Crawl(Crawler, crawledHost); + //crawl.Prepare(); + //crawl.RunJob(); - Logging.Log(LogLevel.INFO, "CrawledHost: {0}", JSONObject.From(crawledHost).ToString()); + //Logging.Log(LogLevel.INFO, "CrawledHost: {0}", JSONObject.From(crawledHost).ToString()); } public void DebugCheck(String uniqueID) { - Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGFULL; + //Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGFULL; - Node node = Entities.NodeCollection.Query("uniqueIdentity", uniqueID).FirstOrDefault(); - if (node == null) - { - Logging.Log(LogLevel.INFO, "DebugCheck(): Node not found: uniqueIdentity={0}", uniqueID); - } - else - { - Logging.Log(LogLevel.INFO, "DebugCheck(): Node: {0}",JSONObject.From(node).ToString()); - CheckJob checkJob = new CheckJob(null, node); + //Node node = Entities.NodeCollection.Query("uniqueIdentity", uniqueID).FirstOrDefault(); + //if (node == null) + //{ + // Logging.Log(LogLevel.INFO, "DebugCheck(): Node not found: uniqueIdentity={0}", uniqueID); + //} + //else + //{ + // Logging.Log(LogLevel.INFO, "DebugCheck(): Node: {0}",JSONObject.From(node).ToString()); + // CheckJob checkJob = new CheckJob(null, node); - Logging.Log(LogLevel.INFO, "Prepare..."); - checkJob.Prepare(); + // Logging.Log(LogLevel.INFO, "Prepare..."); + // checkJob.Prepare(); - Logging.Log(LogLevel.INFO, "Check..."); - checkJob.RunJob(); - } + // Logging.Log(LogLevel.INFO, "Check..."); + // checkJob.RunJob(); + //} } diff --git a/entities/Node.cs b/entities/Node.cs index e767e1d..5e1afa4 100644 --- a/entities/Node.cs +++ b/entities/Node.cs @@ -51,8 +51,6 @@ namespace ln.skyscanner.entities public IEnumerable IPAdresses => Interfaces.SelectMany(intf => intf.ConfiguredIPs.Select(nip => nip.IP)); [JSONMapping(Private = true)] public IEnumerable Networks => Interfaces.SelectMany(intf => intf.ConfiguredIPs.Select(nip => nip.Network)).Distinct(); - [JSONMapping(Private = true)] - public IEnumerable Subnets => SkyScanner.Instance.Entities.SubnetCollection.Query(Query.Equals("Network", Networks.Select(net => net.Network))); private string uniqueIdentity; public String UniqueIdentity { diff --git a/entities/PointOfPresence.cs b/entities/PointOfPresence.cs index ff1d7d9..2187cae 100644 --- a/entities/PointOfPresence.cs +++ b/entities/PointOfPresence.cs @@ -36,6 +36,10 @@ namespace ln.skyscanner.entities { } + public override string ToString() + { + return string.Format("[PointOfPresence ID={0} Name={1} ForeignName={2}]",ID,Name,ForeignName); + } } } diff --git a/http/SkyScannerHttpApplication.cs b/http/SkyScannerHttpApplication.cs index 08b4619..570f21c 100644 --- a/http/SkyScannerHttpApplication.cs +++ b/http/SkyScannerHttpApplication.cs @@ -37,29 +37,7 @@ namespace ln.skyscanner.http RootResource.DefaultResource = staticTemplates; - refEntities = new ReflectiveResource(RootResource, "entities", SkyScanner.Entities); - refChecker = new ReflectiveResource(RootResource, "checker", SkyScanner.Checker); - SkyScannerHttpApi api = new SkyScannerHttpApi(this); - - BaseResource collections = new BaseResource(RootResource, "collections"); - - new CollectionResource(collections, skyScanner.Entities.NodeCollection); - new CollectionResource(collections, skyScanner.Entities.SubnetCollection); - new CollectionResource(collections, skyScanner.Entities.PointOfPresenceCollection); - - new CollectionResource(collections, skyScanner.Entities.CrawledHosts); - new CollectionResource(collections, skyScanner.Entities.CrawledSubnets); - - new CollectionResource(collections, skyScanner.Entities.SkyCheckStates); - - new CollectionResource(collections, skyScanner.Entities.BlockedNetworks); - - ObjectContainerResource resPerformanceValues = new ObjectContainerResource(collections); - resPerformanceValues.GetResourceName = (pv) => pv.PerfName; - resPerformanceValues.Enumeration = () => skyScanner.Entities.SkyCheckStates.SelectMany((checkState) => checkState.PerformanceValues); - resPerformanceValues.Lookup = skyScanner.Entities.LookupPerformanceValue; - } private Resource ResourceTypeHook(DirectoryResource directoryResource, FileInfo fileInfo) diff --git a/http/WebSocketInterface.cs b/http/WebSocketInterface.cs deleted file mode 100644 index c3d9b9e..0000000 --- a/http/WebSocketInterface.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using ln.http.resources.websocket; -using ln.http.resources; -using ln.logging; -using System.Collections.Generic; -using ln.http.websocket; -using System.Linq; -using ln.types.rpc; -using ln.json; -using ln.json.mapping; - -namespace ln.skyscanner.http -{ - public class WebSocketInterface : WebsocketResource - { - SkyScanner.Service SkyScannerService { get; } - - public WebSocket[] CurrentWebSockets { - get - { - lock (currentWebSockets) - { - return currentWebSockets.ToArray(); - } - } - } - HashSet currentWebSockets = new HashSet(); - - public WebSocketInterface(Resource container,SkyScanner.Service skyscannerService) - :base(container,"socket") - { - SkyScannerService = skyscannerService; - Connection += WebSocketInterface_Connection; - } - - void WebSocketInterface_Connection(WebsocketResource webSocketResource, ln.http.websocket.WebSocket webSocket, WSREvent ev) - { - lock (currentWebSockets) - { - switch (ev) - { - case WSREvent.CONNECT: - currentWebSockets.Add(webSocket); - break; - case WSREvent.CLOSE: - currentWebSockets.Remove(webSocket); - break; - } - } - } - - public void Broadcast(JSONObject json) - { - Broadcast(json.ToString()); - } - - public void Broadcast(String text) - { - foreach (WebSocket webSocket in CurrentWebSockets) - { - webSocket.Send(text); - } - } - - public override void MessageReceived(WebSocketResourceRequestContext requestContext, string textMessage) - { - try - { - JSONObject json = (JSONObject)JSONParser.Parse(textMessage); - RPCCall rpcCall = json.ToObject(); - - RPCResult rpcResult = SkyScannerService.RPCContainer.Invoke(rpcCall); - - requestContext.WebSocket.Send( - JSONObject.From(rpcResult).ToString() - ); - - } - catch (Exception e) - { - Logging.Log(e); - } - } - - } -} diff --git a/import/skytron/SkytronImport.cs b/import/skytron/SkytronImport.cs index b9d4c4e..3913eb2 100644 --- a/import/skytron/SkytronImport.cs +++ b/import/skytron/SkytronImport.cs @@ -6,6 +6,7 @@ using System.Linq; using ln.types.net; using ln.types; using System.Globalization; +using ln.types.odb.ng; namespace ln.skyscanner.import.skytron { public class SkytronImport @@ -17,15 +18,15 @@ namespace ln.skyscanner.import.skytron mysql = new MySqlConnection(connectionString); } - public void Import() + public void Import(Mapper mapper) { try { mysql.Open(); - ImportStammdaten(); - ImportNodes(); - ImportL2Segmente(); + ImportStammdaten(mapper); + ImportNodes(mapper); + ImportL2Segmente(mapper); } catch (Exception e) { @@ -38,7 +39,7 @@ namespace ln.skyscanner.import.skytron } } - public void ImportStammdaten() + public void ImportStammdaten(Mapper mapper) { MySqlCommand command = mysql.CreateCommand(); @@ -48,7 +49,7 @@ namespace ln.skyscanner.import.skytron while (reader.Read()) { - PointOfPresence pop = SkyScanner.Instance.Entities.PointOfPresenceCollection.Query("ForeignName", reader.GetInt32("senderid").ToString()).FirstOrDefault(); + PointOfPresence pop = mapper.Load(Query.Equals("ForeignName", reader.GetInt32("senderid").ToString())).FirstOrDefault(); if (pop == null) { Logging.Log(LogLevel.INFO, "New PoP: {0} / {1}", reader.GetInt32("senderid"), reader.GetString("stationsname")); @@ -63,13 +64,18 @@ namespace ln.skyscanner.import.skytron if (!String.Empty.Equals(lati) && !String.Empty.Equals(longi)) pop.GeoLocation = new GeoLocation(float.Parse(lati,CultureInfo.InvariantCulture.NumberFormat),float.Parse(longi, CultureInfo.InvariantCulture.NumberFormat)); - SkyScanner.Instance.Entities.PointOfPresenceCollection.Insert(pop); + mapper.Save(pop); } + else + { + Logging.Log(LogLevel.INFO, "Known PoP: {0}",pop); + } + } } } - public void ImportNodes() + public void ImportNodes(Mapper mapper) { MySqlCommand command = mysql.CreateCommand(); @@ -82,7 +88,7 @@ namespace ln.skyscanner.import.skytron String id = reader.GetString("id"); IPv4 primaryIP = IPv4.Parse(reader.GetString("ip")); - Node node = SkyScanner.Instance.Entities.NodeCollection.Query("uniqueIdentity", id).FirstOrDefault(); + Node node = mapper.Load(Query.Equals("uniqueIdentity", id)).FirstOrDefault(); if (node == null) { node = new Node(primaryIP); @@ -136,13 +142,12 @@ namespace ln.skyscanner.import.skytron node.Severity = CheckSeverity.PRODUCTION; - SkyScanner.Instance.Entities.NodeCollection.Upsert(node); - + mapper.Save(node); } } } - public void ImportL2Segmente() + public void ImportL2Segmente(Mapper mapper) { MySqlCommand command = mysql.CreateCommand(); @@ -153,7 +158,7 @@ namespace ln.skyscanner.import.skytron while (reader.Read()) { Network4 net4 = Network4.Parse(reader.GetString("cidr")); - L2Segment l2 = SkyScanner.Instance.Entities.L2SegmentCollection.Query("Network", net4).FirstOrDefault(); + L2Segment l2 = mapper.Load(Query.Equals("Network", net4)).FirstOrDefault(); if (l2 == null) { l2 = new L2Segment(); @@ -166,33 +171,33 @@ namespace ln.skyscanner.import.skytron String sid = reader.GetString("senderid1"); if ((sid != null) && !String.Empty.Equals(sid)) { - PointOfPresence pop = SkyScanner.Instance.Entities.PointOfPresenceCollection.Query("ForeignName", sid).FirstOrDefault(); + PointOfPresence pop = mapper.Load(Query.Equals("ForeignName", sid)).FirstOrDefault(); if (pop != null) l2.PoPs.Add(pop); } sid = reader.GetString("senderid2"); if ((sid != null) && !String.Empty.Equals(sid)) { - PointOfPresence pop = SkyScanner.Instance.Entities.PointOfPresenceCollection.Query("ForeignName", sid).FirstOrDefault(); + PointOfPresence pop = mapper.Load(Query.Equals("ForeignName", sid)).FirstOrDefault(); if (pop != null) l2.PoPs.Add(pop); } sid = reader.GetString("senderid3"); if ((sid != null) && !String.Empty.Equals(sid)) { - PointOfPresence pop = SkyScanner.Instance.Entities.PointOfPresenceCollection.Query("ForeignName", sid).FirstOrDefault(); + PointOfPresence pop = mapper.Load(Query.Equals("ForeignName", sid)).FirstOrDefault(); if (pop != null) l2.PoPs.Add(pop); } sid = reader.GetString("senderid4"); if ((sid != null) && !String.Empty.Equals(sid)) { - PointOfPresence pop = SkyScanner.Instance.Entities.PointOfPresenceCollection.Query("ForeignName", sid).FirstOrDefault(); + PointOfPresence pop = mapper.Load(Query.Equals("ForeignName", sid)).FirstOrDefault(); if (pop != null) l2.PoPs.Add(pop); } - SkyScanner.Instance.Entities.L2SegmentCollection.Insert(l2); + mapper.Save(l2); } } diff --git a/ln.skyscanner.csproj b/ln.skyscanner.csproj index 4edb9c0..9b391cb 100644 --- a/ln.skyscanner.csproj +++ b/ln.skyscanner.csproj @@ -30,20 +30,8 @@ - - ..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll - - - ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll - - - ..\packages\Google.Protobuf.3.9.1\lib\net45\Google.Protobuf.dll - - - ..\packages\MySql.Data.8.0.17\lib\net452\MySql.Data.dll - @@ -55,6 +43,18 @@ + + packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll + + + packages\Google.Protobuf.3.6.1\lib\net45\Google.Protobuf.dll + + + packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll + + + packages\MySql.Data.8.0.17\lib\net452\MySql.Data.dll + @@ -88,7 +88,6 @@ - @@ -96,7 +95,6 @@ - PreserveNewest @@ -240,6 +238,7 @@ + diff --git a/ln.skyscanner.sln b/ln.skyscanner.sln new file mode 100644 index 0000000..92fef7f --- /dev/null +++ b/ln.skyscanner.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.skyscanner", "ln.skyscanner.csproj", "{8456AFA0-20E9-4566-A81A-3C0EDB12356F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.application", "..\ln.application\ln.application.csproj", "{44AA3A50-7214-47F2-9D60-6FF34C0FE6D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.http", "..\ln.http\ln.http.csproj", "{CEEEEB41-3059-46A2-A871-2ADE22C013D9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.http.resources", "..\ln.http.resources\ln.http.resources.csproj", "{F9086FE4-8925-42FF-A59C-607341604293}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.json", "..\ln.json\ln.json.csproj", "{D9342117-3249-4D8B-87C9-51A50676B158}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.logging", "..\ln.logging\ln.logging.csproj", "{D471A566-9FB6-41B2-A777-3C32874ECD0E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.perfdb", "..\ln.perfdb\ln.perfdb.csproj", "{D934C1E8-9215-4D8D-83B3-A296E4912792}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.snmp", "..\ln.snmp\ln.snmp.csproj", "{C7A43B82-55F2-4092-8DBE-6BE29CBF079D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.templates", "..\ln.templates\ln.templates.csproj", "{AD0267BB-F08C-4BE1-A88D-010D49041761}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ln.types", "..\ln.types\ln.types.csproj", "{8D9AB9A5-E513-4BA7-A450-534F6456BF28}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8456AFA0-20E9-4566-A81A-3C0EDB12356F}.Debug|x86.ActiveCfg = Debug|x86 + {8456AFA0-20E9-4566-A81A-3C0EDB12356F}.Debug|x86.Build.0 = Debug|x86 + {8456AFA0-20E9-4566-A81A-3C0EDB12356F}.Release|x86.ActiveCfg = Release|x86 + {8456AFA0-20E9-4566-A81A-3C0EDB12356F}.Release|x86.Build.0 = Release|x86 + {44AA3A50-7214-47F2-9D60-6FF34C0FE6D3}.Debug|x86.ActiveCfg = Debug|Any CPU + {44AA3A50-7214-47F2-9D60-6FF34C0FE6D3}.Debug|x86.Build.0 = Debug|Any CPU + {44AA3A50-7214-47F2-9D60-6FF34C0FE6D3}.Release|x86.ActiveCfg = Release|Any CPU + {44AA3A50-7214-47F2-9D60-6FF34C0FE6D3}.Release|x86.Build.0 = Release|Any CPU + {CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Debug|x86.Build.0 = Debug|Any CPU + {CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Release|x86.ActiveCfg = Release|Any CPU + {CEEEEB41-3059-46A2-A871-2ADE22C013D9}.Release|x86.Build.0 = Release|Any CPU + {F9086FE4-8925-42FF-A59C-607341604293}.Debug|x86.ActiveCfg = Debug|Any CPU + {F9086FE4-8925-42FF-A59C-607341604293}.Debug|x86.Build.0 = Debug|Any CPU + {F9086FE4-8925-42FF-A59C-607341604293}.Release|x86.ActiveCfg = Release|Any CPU + {F9086FE4-8925-42FF-A59C-607341604293}.Release|x86.Build.0 = Release|Any CPU + {D9342117-3249-4D8B-87C9-51A50676B158}.Debug|x86.ActiveCfg = Debug|Any CPU + {D9342117-3249-4D8B-87C9-51A50676B158}.Debug|x86.Build.0 = Debug|Any CPU + {D9342117-3249-4D8B-87C9-51A50676B158}.Release|x86.ActiveCfg = Release|Any CPU + {D9342117-3249-4D8B-87C9-51A50676B158}.Release|x86.Build.0 = Release|Any CPU + {D471A566-9FB6-41B2-A777-3C32874ECD0E}.Debug|x86.ActiveCfg = Debug|Any CPU + {D471A566-9FB6-41B2-A777-3C32874ECD0E}.Debug|x86.Build.0 = Debug|Any CPU + {D471A566-9FB6-41B2-A777-3C32874ECD0E}.Release|x86.ActiveCfg = Release|Any CPU + {D471A566-9FB6-41B2-A777-3C32874ECD0E}.Release|x86.Build.0 = Release|Any CPU + {D934C1E8-9215-4D8D-83B3-A296E4912792}.Debug|x86.ActiveCfg = Debug|Any CPU + {D934C1E8-9215-4D8D-83B3-A296E4912792}.Debug|x86.Build.0 = Debug|Any CPU + {D934C1E8-9215-4D8D-83B3-A296E4912792}.Release|x86.ActiveCfg = Release|Any CPU + {D934C1E8-9215-4D8D-83B3-A296E4912792}.Release|x86.Build.0 = Release|Any CPU + {C7A43B82-55F2-4092-8DBE-6BE29CBF079D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7A43B82-55F2-4092-8DBE-6BE29CBF079D}.Debug|x86.Build.0 = Debug|Any CPU + {C7A43B82-55F2-4092-8DBE-6BE29CBF079D}.Release|x86.ActiveCfg = Release|Any CPU + {C7A43B82-55F2-4092-8DBE-6BE29CBF079D}.Release|x86.Build.0 = Release|Any CPU + {AD0267BB-F08C-4BE1-A88D-010D49041761}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD0267BB-F08C-4BE1-A88D-010D49041761}.Debug|x86.Build.0 = Debug|Any CPU + {AD0267BB-F08C-4BE1-A88D-010D49041761}.Release|x86.ActiveCfg = Release|Any CPU + {AD0267BB-F08C-4BE1-A88D-010D49041761}.Release|x86.Build.0 = Release|Any CPU + {8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Debug|x86.ActiveCfg = Debug|Any CPU + {8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Debug|x86.Build.0 = Debug|Any CPU + {8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Release|x86.ActiveCfg = Release|Any CPU + {8D9AB9A5-E513-4BA7-A450-534F6456BF28}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/packages.config b/packages.config index 1f19f06..df9ce97 100644 --- a/packages.config +++ b/packages.config @@ -1,7 +1,7 @@  - - + + \ No newline at end of file diff --git a/services/CheckService.cs b/services/CheckService.cs index 41e5082..332e508 100644 --- a/services/CheckService.cs +++ b/services/CheckService.cs @@ -10,6 +10,7 @@ using ln.types.threads; using System.Linq; using ln.snmp; using ln.types.odb.ng; + namespace ln.skyscanner.services { public class CheckService : ApplicationServiceBase @@ -28,6 +29,10 @@ namespace ln.skyscanner.services SkyScanner.Service coreService; CheckServiceRPC RPC; + Mapper SessionMapper { get; set; } + + Dictionary checkJobs = new Dictionary(); + public CheckService() :base("Check Service") { @@ -42,10 +47,10 @@ namespace ln.skyscanner.services entityService = Dependency(); performanceValueService = Dependency(); - Dictionary checkJobs = new Dictionary(); HashSet currentNodes = new HashSet(); checkPool = new Pool(96); + checkPool.PoolJobFinished += PoolJobFinished; SNMPEngine = new SNMPEngine(); SNMPEngine.Timeout = 2000; @@ -55,60 +60,42 @@ namespace ln.skyscanner.services RPC = new CheckServiceRPC(this); coreService.RPCContainer.Add("CheckService",RPC); - Ready(); - - while (!StopRequested) + using (Session session = new Session(entityService.StorageContainer)) { - Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): scheduler starts"); + SessionMapper = new Mapper(session); - currentNodes.Clear(); - foreach (Node node in entityService.NodeCollection) + Ready(); + + while (!StopRequested) { - currentNodes.Add(node); - if (!checkJobs.ContainsKey(node)) + Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): scheduler starts"); + + UpdateNodeList(); + + foreach (CheckJob checkJob in checkJobs.Values) + checkJob.Prepare(); + + Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): currently knows {0} checks", checkJobs.Count); + Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): currently {0} checks alive", checkPool.NumQueuedJobs); + Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): scheduled {0} checks", checkPool.Enqueue(checkJobs.Values)); + + + while (true) { - CheckJob checkJob = new CheckJob(this,node); - checkJobs.Add(node, checkJob); - } - } - foreach (Node node in checkJobs.Keys.ToArray()) - { - currentNodes.Remove(node); - } + while ((nextMinute - DateTimeOffset.Now.ToUnixTimeMilliseconds()) < 0) + nextMinute += 60000; - if (currentNodes.Count > 0) - { - foreach (Node node in currentNodes) - { - checkJobs.Remove(node); - } - } - currentNodes.Clear(); - - foreach (CheckJob checkJob in checkJobs.Values) - { - checkJob.Prepare(); - } - - Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): currently knows {0} checks", checkJobs.Count); - Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): currently {0} checks alive", checkPool.NumQueuedJobs); - Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): scheduled {0} checks", checkPool.Enqueue(checkJobs.Values)); - - - while (true) - { - while ((nextMinute - DateTimeOffset.Now.ToUnixTimeMilliseconds()) < 0) - nextMinute += 60000; - - try - { - Thread.Sleep((int)(nextMinute - DateTimeOffset.Now.ToUnixTimeMilliseconds())); - break; - } catch (ThreadInterruptedException) - { - Logging.Log(LogLevel.INFO, "CheckService: scheduler was interrupted"); - if (StopRequested) + try + { + Thread.Sleep((int)(nextMinute - DateTimeOffset.Now.ToUnixTimeMilliseconds())); break; + } + catch (ThreadInterruptedException) + { + Logging.Log(LogLevel.INFO, "CheckService: scheduler was interrupted"); + if (StopRequested) + break; + } } } } @@ -119,10 +106,44 @@ namespace ln.skyscanner.services coreService = null; } + private void UpdateNodeList() + { + lock (this) + { + Logging.Log(LogLevel.DEBUG, "CheckService: Synchronizing CheckJobs"); + + HashSet knownNodes = new HashSet(SessionMapper.Load()); + HashSet currentNodes = new HashSet(checkJobs.Keys); + + foreach (Node node in knownNodes) + { + if (!currentNodes.Contains(node)) + { + CheckJob checkJob = new CheckJob(this, node); + checkJobs.Add(node, checkJob); + } + } + foreach (Node node in currentNodes) + { + if (!knownNodes.Contains(node)) + { + checkJobs.Remove(node); + } + } + } + } + + void PoolJobFinished(Pool pool, PoolJob job) + { + CheckJob checkJob = job as CheckJob; + SessionMapper.Save(checkJob.Node); + } + + public SkyCheckState[] GetCheckStates(Node node) { Query stateQuery = Query.Equals("Node", node.ID); - SkyCheckState[] skyCheckStates = entityService.SkyCheckStates.SelectQuery(stateQuery).ToArray(); + SkyCheckState[] skyCheckStates = SessionMapper.Load(stateQuery).ToArray(); Dictionary checkStates = new Dictionary(); foreach (SkyCheckState checkState in skyCheckStates) @@ -134,7 +155,7 @@ namespace ln.skyscanner.services if (!checkStates.ContainsKey(check.Name) && check.IsValid(node)) { checkStates.Add(check.Name, check.PrepareCheckState(this, node)); - entityService.SkyCheckStates.Insert(checkStates[check.Name]); + SessionMapper.Save(checkStates[check.Name]); } } @@ -155,7 +176,7 @@ namespace ln.skyscanner.services { List nodes = new List(); - foreach (Node node in checkService.EntityService.NodeCollection) + foreach (Node node in checkService.SessionMapper.Load()) { foreach (SkyCheckState checkState in node.CheckStates) { diff --git a/services/CrawlService.cs b/services/CrawlService.cs index 1a4ed39..9b481c0 100644 --- a/services/CrawlService.cs +++ b/services/CrawlService.cs @@ -16,7 +16,6 @@ namespace ln.skyscanner.services EntityService entityService = Dependency(); Ready(); - } } } diff --git a/services/EntityService.cs b/services/EntityService.cs index d01f710..79ac99f 100644 --- a/services/EntityService.cs +++ b/services/EntityService.cs @@ -8,6 +8,9 @@ using ln.skyscanner.entities; using ln.logging; using System.Collections.Generic; using ln.types.odb.ng.storage; +using System.Linq; +using ln.types.net; +using ln.skyscanner.import.skytron; namespace ln.skyscanner.services { public class EntityService : ApplicationServiceBase @@ -111,10 +114,27 @@ namespace ln.skyscanner.services public Node GetNode(Guid nodeID) { - return EntityService.SessionMapper.Load(nodeID); + return EntityService.SessionMapper.Load(Query.Equals("ID", nodeID)).FirstOrDefault(); } + public Node[] GetNodes() + { + return EntityService.SessionMapper.Load().ToArray(); + } + public Node CreateNode() + { + Node node = new Node(IPv4.ANY); + EntityService.SessionMapper.Save(node); + return node; + } + + public void SyncSkytron() + { + SkytronImport skytronImport = new SkytronImport(EntityService.CurrentApplicationInterface.Arguments["import-skytron"].Value); + ThreadPool.QueueUserWorkItem((state) => skytronImport.Import(EntityService.SessionMapper)); + + } } diff --git a/templates/static/ln.application.js b/templates/static/ln.application.js index 87e725f..c64ef7f 100644 --- a/templates/static/ln.application.js +++ b/templates/static/ln.application.js @@ -25,24 +25,28 @@ alert("WebSocket caught error: " + e.date); } this.websocket.onmessage = function(e){ - var j = JSON.parse(e.data); - if (j.state){ - updateState(j.state); - } else if (j.id) - { - for (var n=0;n + +

Network Overview

+

Hosts / Nodes + + Sync with Skytron CRM +

+ +
+
+
+ +

Details

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+ + diff --git a/templates/static/topnav.html b/templates/static/topnav.html index 3f75741..44cd79f 100644 --- a/templates/static/topnav.html +++ b/templates/static/topnav.html @@ -11,6 +11,9 @@