broken
Harald Wolff 2019-04-11 08:30:13 +02:00
parent 30b9980a51
commit 96356c047c
16 changed files with 107 additions and 169 deletions

View File

@ -37,46 +37,6 @@ namespace ln.skyscanner
SkyScanner skyScanner = new SkyScanner(args);
skyScanner.Start();
return;
Node coreNode = skyScanner.Entities.GlobalNetwork.FindNodeByIP(IPv4.Parse("10.10.10.2"));
Console.WriteLine("Core Node: {0}", coreNode);
Node coreNode2 = skyScanner.Entities.GlobalNetwork.FindNodeByIP(IPv4.Parse("10.255.7.129"));
Console.WriteLine("Core Node (alt): {0}", coreNode2);
Query nodeByIpQuery = Query.Equals<Node>("Interfaces[].ConfiguredIPs[].IP", IPv4.Parse("10.255.7.129"));
IEnumerable<Node> qnodes = skyScanner.Entities.nodeCollection.Query(nodeByIpQuery);
IEnumerable<Node> neighbors = skyScanner.Entities.GlobalNetwork.FindNeighbors(coreNode);
foreach (Node neigh in neighbors)
{
Console.WriteLine("Neighbor: {0}", neigh);
}
SkyScanner.Instance.Stop();
return;
IEnumerable<Node> nodes = skyScanner.Entities.nodeCollection;
foreach (Node node in nodes)
{
Console.WriteLine("Node: {0}", node);
Timing.Meassure("", () =>
{
foreach (Node neighbor in SkyScanner.Instance.Entities.GlobalNetwork.FindNeighbors(node))
{
Console.WriteLine(" Neighbor: {0}", neighbor);
}
});
Console.WriteLine("");
Console.WriteLine("");
}
throw new Exception();
}
private static void Initialize()

View File

@ -14,46 +14,70 @@ using System.IO;
using ln.http.resources;
using System.Linq;
using ln.types.odb.mapped;
using ln.types.net;
using ln.skyscanner.crawl;
using ln.skyscanner.checks;
using ln.logging;
namespace ln.skyscanner
{
public class SkyEntities
{
[Callable]
public Node[] Nodes => nodeCollection.ToArray();
public SkyScanner SkyScanner { get; }
public string BasePath => Path.Combine(SkyScanner.BasePath, "entities");
public GlobalNetwork GlobalNetwork { get; private set; }
public ODB odDatabase { get; private set; }
public ODBCollection<Node> nodeCollection { get; private set; }
//public ODBCollection<NetworkInterface> interfaceCollection { get; private set; }
//public ODBCollection<IntfIP> intfIPCollection { get; private set; }
public ODBCollection<Subnet> subnetCollection { get; private set; }
public ODBCollection<PointOfPresence> popCollection { get; private set; }
public ODB ODB { get; private set; }
public ODBCollection<Node> NodeCollection { get; private set; }
public ODBCollection<Subnet> SubnetCollection { get; private set; }
public ODBCollection<PointOfPresence> PointOfPresenceCollection { get; private set; }
public ODBCollection<CrawledHost> CrawledHosts { get; private set; }
public ODBCollection<CrawledSubnet> CrawledSubnets { get; private set; }
public ODBCollection<Network4> BlockedNetworks { get; private set; }
public ODBCollection<SkyCheckState> SkyCheckStates { get; private set; }
public SkyEntities(SkyScanner skyScanner)
{
SkyScanner = skyScanner;
odDatabase = new ODB(BasePath);
nodeCollection = odDatabase.GetCollection<Node>();
subnetCollection = odDatabase.GetCollection<Subnet>();
Logging.Log(LogLevel.INFO, "SkyEntities: initializing");
nodeCollection.EnableStrongCache(true);
nodeCollection.EnsureIndex("PrimaryIP");
nodeCollection.EnsureIndex("Interfaces[].ConfiguredIPs[].IP");
nodeCollection.EnsureIndex("Interfaces[].ConfiguredIPs[].Network");
nodeCollection.EnsureIndex("uniqueIdentity");
ODB = new ODB(BasePath);
subnetCollection.EnsureIndex("Network");
NodeCollection = ODB.GetCollection<Node>();
NodeCollection.EnableStrongCache(true);
NodeCollection.EnsureIndex("PrimaryIP");
NodeCollection.EnsureIndex("Interfaces[].ConfiguredIPs[].IP");
NodeCollection.EnsureIndex("Interfaces[].ConfiguredIPs[].Network");
NodeCollection.EnsureIndex("uniqueIdentity");
popCollection = odDatabase.GetCollection<PointOfPresence>();
popCollection.EnsureIndex("ForeignName");
popCollection.EnsureIndex("nodeIDList[]");
SubnetCollection = ODB.GetCollection<Subnet>();
SubnetCollection.EnsureIndex("Network");
GlobalNetwork = new GlobalNetwork(this);
PointOfPresenceCollection = ODB.GetCollection<PointOfPresence>();
PointOfPresenceCollection.EnsureIndex("ForeignName");
CrawledHosts = ODB.GetCollection<CrawledHost>();
CrawledHosts.EnsureIndex("PrimaryIP");
CrawledHosts.EnsureIndex("IPAddresses[]");
CrawledSubnets = ODB.GetCollection<CrawledSubnet>();
BlockedNetworks = ODB.GetCollection<Network4>("blockedNetworks");
SkyCheckStates = ODB.GetCollection<SkyCheckState>();
SkyCheckStates.EnableStrongCache(true);
SkyCheckStates.EnsureIndex("CheckName");
SkyCheckStates.EnsureIndex("Node.ID");
Logging.Log(LogLevel.INFO, "SkyEntities: initialized");
GlobalNetwork = new GlobalNetwork();
}

View File

@ -61,7 +61,6 @@ namespace ln.skyscanner
}
}
Entities = new SkyEntities(this);
Checker = new SkyChecker();
}

View File

@ -29,12 +29,10 @@ namespace ln.skyscanner.checks
Name = String.Format("Interval check: {0} [{1}]",node.UniqueIdentity,node.PrimaryIP.ToString());
Node = node;
Query stateQuery = Query.Equals<SkyCheckState>("UniqueNodeIdentifier", Node.UniqueIdentity);
SkyCheckState[] skyCheckStates = SkyScanner.Instance.Checker.checkStates.Query(stateQuery).ToArray();
Query stateQuery = Query.Equals<SkyCheckState>("Node.ID", Node.ID);
SkyCheckState[] skyCheckStates = SkyScanner.Instance.Entities.SkyCheckStates.Query(stateQuery).ToArray();
foreach (SkyCheckState checkState in skyCheckStates)
{
//if (checkState.Node == null)
//checkState.Node = node;
checkStates.Add(checkState.CheckName, checkState);
}
}

View File

@ -38,7 +38,8 @@ namespace ln.skyscanner.checks
public Guid ID = Guid.NewGuid();
public readonly String CheckName;
public readonly String UniqueNodeIdentifier;
[ByReference]
public readonly Node Node;
public String[] PerformanceValues => performanceValues.ToArray();
List<String> performanceValues = new List<String>();
@ -62,7 +63,7 @@ namespace ln.skyscanner.checks
public SkyCheckState(SkyCheck skyCheck,Node node)
{
CheckName = skyCheck.Name;
UniqueNodeIdentifier = node.UniqueIdentity;
Node = node;
}
public void EnsurePerformanceValue(String perfName)

View File

@ -31,8 +31,6 @@ namespace ln.skyscanner.checks
public PoolJob[] CurrentJobs => checkPool.CurrentPoolJobs;
[Callable]
public PoolJob[] QueuedJobs => checkPool.QueuedJobs;
[Callable]
public SkyCheckState[] CheckStates => checkStates.ToArray();
[Callable]
@ -40,8 +38,7 @@ namespace ln.skyscanner.checks
public bool ContainsPerfFile(String perfName) => perfFiles.ContainsKey(perfName);
[Callable]
public SkyCheckState[] Issues => checkStates.Query(
//Query.Contains<SkyCheckState,CheckState>("CheckState",new CheckState[] { CheckState.CRITICAL, CheckState.WARN, CheckState.ERROR })
public SkyCheckState[] Issues => SkyScanner.Instance.Entities.SkyCheckStates.Query(
Query.OR(
Query.Equals<SkyCheckState>("currentCheckState", CheckState.CRITICAL),
Query.Equals<SkyCheckState>("currentCheckState", CheckState.FAIL),
@ -59,23 +56,16 @@ namespace ln.skyscanner.checks
bool stopping;
ODB odb;
public ODBCollection<SkyCheckState> checkStates { get; private set; }
List<SkyCheckState> saveQueue = new List<SkyCheckState>();
public SkyChecker()
{
BasePath = Path.Combine(SkyScanner.Instance.BasePath, "perfdb");
Logging.Log(LogLevel.INFO, "SkyChecker: created");
SNMPEngine = new SNMPEngine();
SNMPEngine.Timeout = 4000;
odb = new ODB(Path.Combine(BasePath));
checkStates = odb.GetCollection<SkyCheckState>();
checkStates.EnableStrongCache(true);
checkStates.EnsureIndex("CheckName");
checkStates.EnsureIndex("UniqueNodeIdentifier");
}
public void Start()
@ -135,7 +125,7 @@ namespace ln.skyscanner.checks
if (node.AddCheck(perfName))
{
SkyScanner.Instance.Entities.nodeCollection.Upsert(node);
SkyScanner.Instance.Entities.NodeCollection.Upsert(node);
}
checkState.EnsurePerformanceValue(perfName);
@ -184,14 +174,14 @@ namespace ln.skyscanner.checks
{
foreach (SkyCheckState checkState in saveQueue)
{
SkyScanner.Instance.Checker.checkStates.Upsert(checkState);
SkyScanner.Instance.Entities.SkyCheckStates.Upsert(checkState);
}
saveQueue.Clear();
}
Logging.Log(LogLevel.INFO, "SkyChecker.scheduler(): scheduler starts");
foreach (Node node in SkyScanner.Instance.Entities.GlobalNetwork.Nodes)
foreach (Node node in SkyScanner.Instance.Entities.NodeCollection)
{
CheckJob checkJob = new CheckJob(node);
checkJobs.Add(checkJob);

View File

@ -113,7 +113,7 @@ namespace ln.skyscanner.crawl
Host.LastCheck = dateTime;
Host.NextCheck = dateTime + TimeSpan.FromHours(24);
bool updated = Crawler.CrawledHosts.Upsert( Host );
bool updated = SkyScanner.Instance.Entities.CrawledHosts.Upsert( Host );
foreach (Network4 network in Host.Networks)
Crawler.EnsureSubnet(network);

View File

@ -103,7 +103,7 @@ namespace ln.skyscanner.crawl
Subnet.NextScan = startTime + TimeSpan.FromHours(24);
}
Crawler.CrawledSubnets.Upsert(Subnet);
SkyScanner.Instance.Entities.CrawledHosts.Upsert(Subnet);
}
public override int GetHashCode()

View File

@ -58,16 +58,6 @@ namespace ln.skyscanner.crawl
Thread threadScheduler;
public ODBCollection<CrawledHost> CrawledHosts => hosts;
public ODBCollection<CrawledSubnet> CrawledSubnets => subnets;
public ODBCollection<Network4> BlockedNetworks => blockedNetworks;
private ODB odbDatabase;
private ODBCollection<CrawledHost> hosts;
private ODBCollection<CrawledSubnet> subnets;
private ODBCollection<Network4> blockedNetworks;
public Crawler(SkyScanner skyScanner)
{
SkyScanner = skyScanner;
@ -79,17 +69,7 @@ namespace ln.skyscanner.crawl
Directory.CreateDirectory(BasePath);
if (!Directory.Exists(PoolPath))
Directory.CreateDirectory(PoolPath);
//dbCrawlPool = new ODB<CrawlPool>(PoolPath);
odbDatabase = new ODB(BasePath);
hosts = odbDatabase.GetCollection<CrawledHost>();
subnets = odbDatabase.GetCollection<CrawledSubnet>();
blockedNetworks = odbDatabase.GetCollection<Network4>("blockedNetworks");
hosts.EnsureIndex("PrimaryIP");
hosts.EnsureIndex("IPAddresses[]");
CrawlerState = ComponentState.INITIALIZED;
}
catch (Exception)
@ -178,7 +158,7 @@ namespace ln.skyscanner.crawl
public void Crawl(Guid hostID)
{
CrawledHost crawledHost = CrawledHosts[hostID];
CrawledHost crawledHost = SkyScanner.Instance.Entities.CrawledHosts[hostID];
Crawl(crawledHost);
}
public void Crawl(CrawledHost crawledHost)
@ -201,14 +181,14 @@ namespace ln.skyscanner.crawl
Query.Equals<CrawledHost>("IPAddresses[]", ip),
Query.Equals<CrawledHost>("PrimaryIP", ip)
);
CrawledHost crawledHost = hosts.Query(nodeByIpQuery).FirstOrDefault();
CrawledHost crawledHost = SkyScanner.Instance.Entities.CrawledHosts.Query(nodeByIpQuery).FirstOrDefault();
if (crawledHost == null)
{
crawledHost = new CrawledHost();
crawledHost.PrimaryIP = ip;
crawledHost.Name = ip.ToString();
CrawledHosts.Insert(crawledHost);
SkyScanner.Instance.Entities.CrawledHosts.Insert(crawledHost);
}
return crawledHost;
}
@ -218,12 +198,12 @@ namespace ln.skyscanner.crawl
lock (this)
{
Query subnetQuery = Query.Equals<CrawledSubnet>("Network", network);
CrawledSubnet sn = CrawledSubnets.Query(subnetQuery).FirstOrDefault();
CrawledSubnet sn = SkyScanner.Instance.Entities.CrawledSubnets.Query(subnetQuery).FirstOrDefault();
if (sn == null)
{
Logging.Log(LogLevel.INFO, "Crawler adds new subnet: {0}", network);
sn = new CrawledSubnet(network);
CrawledSubnets.Insert(sn);
SkyScanner.Instance.Entities.CrawledSubnets.Insert(sn);
}
return sn;
}
@ -241,13 +221,13 @@ namespace ln.skyscanner.crawl
SkyScanner.Entities.GlobalNetwork.Update();
if (CrawlHosts)
foreach (CrawledHost crawledHost in CrawledHosts.Where( host => (host.NextCheck < DateTime.Now)))
foreach (CrawledHost crawledHost in SkyScanner.Instance.Entities.CrawledHosts.Where( host => (host.NextCheck < DateTime.Now)))
{
Crawl(crawledHost);
}
if (CrawlSubnets)
foreach (CrawledSubnet subnet in CrawledSubnets.Where( sn => (sn.NextScan < DateTime.Now ) && sn.Network.Width >= 24))
foreach (CrawledSubnet subnet in SkyScanner.Instance.Entities.CrawledSubnets.Where( sn => (sn.NextScan < DateTime.Now ) && sn.Network.Width >= 24))
{
Crawl(subnet);
}

View File

@ -20,45 +20,31 @@ namespace ln.skyscanner.entities
{
public class GlobalNetwork : Persistent
{
[Unsynced]
public SkyScanner SkyScanner => SkyScanner.Instance;
[Unsynced]
public SkyEntities SkyEntities { get; private set; }
public IEnumerable<Subnet> Subnets => SkyEntities.subnetCollection;
public IEnumerable<Node> Nodes => SkyEntities.nodeCollection.ToArray();
public HopMap DefaultHopMap { get; private set; } = new HopMap();
private object _updateLock = new object();
public GlobalNetwork()
{
}
public GlobalNetwork(SkyEntities skyEntities)
{
SkyEntities = skyEntities;
}
public void EnsureSubnet(Network4 network)
{
Subnet subnet = SkyEntities.subnetCollection.Where(s => s.Network.Equals(network)).FirstOrDefault();
Subnet subnet = SkyScanner.Instance.Entities.SubnetCollection.Where(s => s.Network.Equals(network)).FirstOrDefault();
if (subnet == null)
{
subnet = new Subnet(network);
SkyEntities.subnetCollection.Upsert(subnet);
SkyScanner.Instance.Entities.SubnetCollection.Upsert(subnet);
}
}
public Node GetNode(Guid id)
{
return SkyEntities.nodeCollection[id];
return SkyScanner.Instance.Entities.NodeCollection[id];
}
public Subnet FindSubnetForIP(IPv4 ip)
{
return SkyEntities.subnetCollection.Where((net) => net.Network.Contains(ip)).FirstOrDefault();
return SkyScanner.Instance.Entities.SubnetCollection.Where((net) => net.Network.Contains(ip)).FirstOrDefault();
}
public IEnumerable<Node> FindHostsInSubnet(Network4 network)
@ -70,7 +56,7 @@ namespace ln.skyscanner.entities
Query.Equals<Node>("Interfaces[].ConfiguredIPs[].Network", network),
Query.IF<Node>("PrimaryIP", (ip) => ((firstIP <= ip) && (ip <= lastIP)))
);
return SkyEntities.nodeCollection.Query(nodeByIpQuery);
return SkyScanner.Instance.Entities.NodeCollection.Query(nodeByIpQuery);
}
public IEnumerable<Node> FindNeighbors(Node node)
@ -107,11 +93,11 @@ namespace ln.skyscanner.entities
public Node FindNodeByIP(IPv4 ip)
{
Node node = SkyEntities.nodeCollection.Query("PrimaryIP", ip).FirstOrDefault();
Node node = SkyScanner.Instance.Entities.NodeCollection.Query("PrimaryIP", ip).FirstOrDefault();
if (node == null)
{
Query nodeByIpQuery = Query.Equals<Node>("Interfaces[].ConfiguredIPs[].IP", ip);
node = SkyEntities.nodeCollection.Query(nodeByIpQuery).FirstOrDefault();
node = SkyScanner.Instance.Entities.NodeCollection.Query(nodeByIpQuery).FirstOrDefault();
}
return node;
}
@ -172,7 +158,7 @@ namespace ln.skyscanner.entities
node.Name = crawledHost.Name;
node.PrimaryMac = crawledHost.PrimaryHWAddr;
SkyEntities.nodeCollection.Insert(node);
SkyScanner.Instance.Entities.NodeCollection.Insert(node);
}
if (!crawledHost.PrimaryIP.Equals(node.PrimaryIP))
@ -298,7 +284,7 @@ namespace ln.skyscanner.entities
EnsureSubnet(network);
node.LastUpdate = DateTime.Now;
SkyEntities.nodeCollection.Upsert(node);
SkyScanner.Instance.Entities.NodeCollection.Upsert(node);
}
}
}

View File

@ -47,7 +47,7 @@ namespace ln.skyscanner.entities
[JsonIgnore]
public IEnumerable<Network4> Networks => Interfaces.SelectMany(intf => intf.ConfiguredIPs.Select(nip => nip.Network)).Distinct();
[JsonIgnore]
public IEnumerable<Subnet> Subnets => SkyScanner.Instance.Entities.subnetCollection.Query(Query.Equals<Network4>("Network", Networks.Select(net => net.Network)));
public IEnumerable<Subnet> Subnets => SkyScanner.Instance.Entities.SubnetCollection.Query(Query.Equals<Network4>("Network", Networks.Select(net => net.Network)));
private string uniqueIdentity;
public String UniqueIdentity {

View File

@ -14,6 +14,7 @@ using System.Linq;
using ln.types;
using ln.types.odb.attributes;
using Newtonsoft.Json;
using ln.types.odb.collections;
namespace ln.skyscanner.entities
{
public class PointOfPresence
@ -24,20 +25,17 @@ namespace ln.skyscanner.entities
public String Name { get; set; }
public String ForeignName { get; set; }
public RefList<Node> Nodes { get; private set; } = new RefList<Node>();
public GeoLocation GeoLocation { get; set; }
[JsonIgnore]
public Node[] Nodes => SkyScanner.Instance.Entities.nodeCollection.Query(Query.Equals<Node>("ID", nodeIDList.Select(id => ODBMapper.Default.MapValue(id)).ToArray())).ToArray();
HashSet<Guid> nodeIDList = new HashSet<Guid>();
public DateTime Created { get; private set; } = DateTime.Now;
public PointOfPresence()
{
}
public void AddNode(Node node) => nodeIDList.Add(node.ID);
public void RemoveNode(Node node) => nodeIDList.Remove(node.ID);
public void AddNode(Node node) => Nodes.Add(node);
public void RemoveNode(Node node) => Nodes.Remove(node);

View File

@ -24,13 +24,13 @@ namespace ln.skyscanner.http
[Callable]
public CrawledSubnet[] GetSubnets()
{
return Crawler?.CrawledSubnets.ToArray();
return SkyScanner.Instance.Entities.CrawledSubnets.ToArray();
}
[Callable]
public CrawledHost[] GetHosts()
{
CrawledHost[] result = Crawler?.CrawledHosts.ToArray();
CrawledHost[] result = SkyScanner.Instance.Entities.CrawledHosts.ToArray();
return result;
}
@ -46,17 +46,17 @@ namespace ln.skyscanner.http
IPv4 ip = IPv4.Parse(_ip);
CrawledHost host = SkyScanner.Crawler.FindHostForIP(ip);
host.Name = name;
SkyScanner.Crawler.CrawledHosts.Upsert(host);
SkyScanner.Instance.Entities.CrawledHosts.Upsert(host);
return host;
}
[Callable]
public void TriggerRecrawl()
{
foreach (CrawledHost host in Crawler.CrawledHosts.ToArray())
foreach (CrawledHost host in SkyScanner.Instance.Entities.CrawledHosts.ToArray())
{
host.NextCheck = DateTime.Now;
Crawler.CrawledHosts.Upsert(host);
SkyScanner.Instance.Entities.CrawledHosts.Upsert(host);
}
}
@ -115,26 +115,26 @@ namespace ln.skyscanner.http
[Callable]
public Network4[] GetBlockedNetworks()
{
return Crawler.BlockedNetworks.ToArray();
return SkyScanner.Instance.Entities.BlockedNetworks.ToArray();
}
[Callable]
public void AddBlockedNetwork(string _network)
{
Network4 blocked = Network4.Parse(_network);
if (!Crawler.BlockedNetworks.Contains(blocked))
if (!SkyScanner.Instance.Entities.BlockedNetworks.Contains(blocked))
{
Crawler.BlockedNetworks.Insert(blocked);
SkyScanner.Instance.Entities.BlockedNetworks.Insert(blocked);
}
}
[Callable]
public void RemoveBlockedNetwork(string _network)
{
Network4 blocked = Network4.Parse(_network);
foreach (Network4 blockedNetwork in Crawler.BlockedNetworks)
foreach (Network4 blockedNetwork in SkyScanner.Instance.Entities.BlockedNetworks)
{
if (blockedNetwork.Equals(blocked))
{
Crawler.BlockedNetworks.Delete(blockedNetwork);
SkyScanner.Instance.Entities.BlockedNetworks.Delete(blockedNetwork);
return;
}
}

View File

@ -25,13 +25,6 @@ namespace ln.skyscanner.http
{
}
[Callable]
public Node[] GetNodes()
{
Node[] nodes = GlobalNetwork.Nodes.ToArray();
return nodes;
}
[Callable]
public Node[] GetNeighbors(string pid)
{

View File

@ -4,6 +4,8 @@ using ln.http.resources;
using System.IO;
using ln.skyscanner.entities;
using ln.skyscanner.checks;
using ln.skyscanner.crawl;
using ln.types.net;
namespace ln.skyscanner.http
{
public class SkyScannerHttpApplication : ResourceApplication
@ -35,10 +37,17 @@ namespace ln.skyscanner.http
SkyScannerHttpApi api = new SkyScannerHttpApi(this);
BaseResource collections = new BaseResource(RootResource, "collections");
new CollectionResource<PointOfPresence>(collections, skyScanner.Entities.popCollection);
new CollectionResource<Node>(collections, skyScanner.Entities.nodeCollection);
new CollectionResource<Subnet>(collections, skyScanner.Entities.subnetCollection);
new CollectionResource<SkyCheckState>(collections, skyScanner.Checker.checkStates);
new CollectionResource<Node>(collections, skyScanner.Entities.NodeCollection);
new CollectionResource<Subnet>(collections, skyScanner.Entities.SubnetCollection);
new CollectionResource<PointOfPresence>(collections, skyScanner.Entities.PointOfPresenceCollection);
new CollectionResource<CrawledHost>(collections, skyScanner.Entities.CrawledHosts);
new CollectionResource<CrawledSubnet>(collections, skyScanner.Entities.CrawledSubnets);
new CollectionResource<SkyCheckState>(collections, skyScanner.Entities.SkyCheckStates);
new CollectionResource<Network4>(collections, skyScanner.Entities.BlockedNetworks);
}
private Resource ResourceTypeHook(DirectoryResource directoryResource, FileInfo fileInfo)

View File

@ -17,10 +17,10 @@
var dtDef = {
columns: [
{ title: "CheckName", data: "CheckName" },
{ title: "UniqueNodeIdentifier", data: "UniqueNodeIdentifier" },
{ title: "Node", data: "Node.Name" },
{ title: "LastCheckTime", data: "LastCheckTime" },
{ title: "CheckState", data: "CheckState" },
{ title: "Check Schwere", data: null, render: function(d,t,r){ return "-"; } },
{ title: "Check Schwere", data: "Node.Severity" },
],
ajax: {
url: "/collections/SkyCheckState",