broken
Harald Wolff 2019-04-04 19:34:19 +02:00
parent 488f72a940
commit 9905238db5
17 changed files with 165 additions and 16 deletions

View File

@ -31,7 +31,7 @@ namespace ln.skyscanner
fileLogger.MaxLogLevel = LogLevel.INFO; fileLogger.MaxLogLevel = LogLevel.INFO;
Logger.Default.Backends.Add(fileLogger); Logger.Default.Backends.Add(fileLogger);
//Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGDETAIL; Logger.ConsoleLogger.MaxLogLevel = LogLevel.INFO;
Initialize(); Initialize();

View File

@ -11,6 +11,7 @@ using sharp.logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
using ln.skyscanner.checks; using ln.skyscanner.checks;
using System.Collections.Generic;
namespace ln.skyscanner namespace ln.skyscanner
{ {
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
@ -40,7 +41,7 @@ namespace ln.skyscanner
Logging.Log(LogLevel.INFO, "SkyScanner: Constructor"); Logging.Log(LogLevel.INFO, "SkyScanner: Constructor");
BasePath = Path.GetFullPath("."); BasePath = Path.GetFullPath("/var/cache/ln.skyscanner");
Logging.Log(LogLevel.INFO, "SkyScanner: BasePath={0}", BasePath); Logging.Log(LogLevel.INFO, "SkyScanner: BasePath={0}", BasePath);
@ -48,6 +49,19 @@ namespace ln.skyscanner
Arguments = args; Arguments = args;
Queue<string> qArguments = new Queue<string>(Arguments);
while (qArguments.Count > 0)
{
string arg = qArguments.Dequeue();
switch (arg)
{
case "-p":
BasePath = Path.GetFullPath(qArguments.Dequeue());
break;
}
}
Entities = new SkyEntities(this); Entities = new SkyEntities(this);
Checker = new SkyChecker(); Checker = new SkyChecker();
} }

View File

@ -26,6 +26,7 @@ namespace ln.skyscanner.checks
Ping = new Ping(); Ping = new Ping();
} }
public override bool IsCritical => true;
public override bool IsValid(Node node) => node.PrimaryIP != null; public override bool IsValid(Node node) => node.PrimaryIP != null;
public override void Check(SkyChecker skyChecker, Node node) public override void Check(SkyChecker skyChecker, Node node)

View File

@ -38,6 +38,7 @@ namespace ln.skyscanner.checks
static SkyCheck() static SkyCheck()
{ {
AddSkyCheck(new Hostalive()); AddSkyCheck(new Hostalive());
AddSkyCheck(new Ubiquity());
} }
} }
} }

View File

@ -16,6 +16,7 @@ using ln.types.threads;
using System.Threading; using System.Threading;
using System.Linq; using System.Linq;
using ln.logging; using ln.logging;
using ln.snmp;
namespace ln.skyscanner.checks namespace ln.skyscanner.checks
{ {
public class SkyChecker public class SkyChecker
@ -28,6 +29,8 @@ namespace ln.skyscanner.checks
public string[] PerfNames => perfFiles.Keys.ToArray(); public string[] PerfNames => perfFiles.Keys.ToArray();
public bool ContainsPerfFile(String perfName) => perfFiles.ContainsKey(perfName); public bool ContainsPerfFile(String perfName) => perfFiles.ContainsKey(perfName);
public SNMPEngine SNMPEngine { get; }
BTree<string, PerfFile> perfFiles = new BTree<string, PerfFile>(); BTree<string, PerfFile> perfFiles = new BTree<string, PerfFile>();
Pool checkPool = new Pool(0); Pool checkPool = new Pool(0);
@ -38,6 +41,7 @@ namespace ln.skyscanner.checks
public SkyChecker() public SkyChecker()
{ {
BasePath = Path.Combine(SkyScanner.Instance.BasePath, "perfdb"); BasePath = Path.Combine(SkyScanner.Instance.BasePath, "perfdb");
SNMPEngine = new SNMPEngine();
} }
public void Start() public void Start()

54
checks/Ubiquity.cs 100644
View File

@ -0,0 +1,54 @@
using System;
using ln.skyscanner.entities;
using ln.types;
using ln.snmp;
using System.Collections.Generic;
using ln.snmp.types;
using ln.logging;
namespace ln.skyscanner.checks
{
public class Ubiquity : SkyCheck
{
public Ubiquity()
:base("ubiquity")
{
}
public override void Check(SkyChecker skyChecker, Node node)
{
foreach (URI snmpUri in node.FindURIs("snmp"))
{
using (SnmpInterface snmp = SnmpInterface.FromURI(snmpUri,skyChecker.SNMPEngine))
{
Sequence[][] ptp = snmp.snmpWalk(new string[] {
"1.3.6.1.4.1.41112.1.3.2.1.5",
"1.3.6.1.4.1.41112.1.3.2.1.6",
"1.3.6.1.4.1.41112.1.3.2.1.11",
"1.3.6.1.4.1.41112.1.3.2.1.14",
"1.3.6.1.4.1.41112.1.3.3.1.64",
"1.3.6.1.4.1.41112.1.3.3.1.66"
});
foreach (Sequence[] row in ptp)
{
skyChecker.WritePerfValue(this, "ptp_rx_capa", node, (double)((Integer)(row[0].Items[1])).LongValue);
skyChecker.WritePerfValue(this, "ptp_tx_capa", node, (double)((Integer)(row[1].Items[1])).LongValue);
skyChecker.WritePerfValue(this, "ptp_rx_pwr", node, (double)((Integer)(row[2].Items[1])).LongValue);
skyChecker.WritePerfValue(this, "ptp_tx_pwr", node, (double)((Integer)(row[3].Items[1])).LongValue);
skyChecker.WritePerfValue(this, "ptp_rx_rate", node, (double)((Integer)(row[4].Items[1])).LongValue); // ToDo: multiply 8 / delta T
skyChecker.WritePerfValue(this, "ptp_tx_rate", node, (double)((Integer)(row[5].Items[1])).LongValue); // ToDo: multiply 8 / delta T
}
}
}
}
public override bool IsValid(Node node)
{
return (node.Vendor != null) && node.Vendor.Equals("Ubiquity");
}
}
}

View File

@ -33,6 +33,7 @@ namespace ln.skyscanner.crawl
CrawlService.RegisterService(new RFC1213()); CrawlService.RegisterService(new RFC1213());
CrawlService.RegisterService(new HTTP()); CrawlService.RegisterService(new HTTP());
CrawlService.RegisterService(new SSH()); CrawlService.RegisterService(new SSH());
CrawlService.RegisterService(new Ubiquity());
} }
public SkyScanner SkyScanner { get; } public SkyScanner SkyScanner { get; }
@ -85,6 +86,9 @@ namespace ln.skyscanner.crawl
subnets = odbDatabase.GetCollection<CrawledSubnet>(); subnets = odbDatabase.GetCollection<CrawledSubnet>();
blockedNetworks = odbDatabase.GetCollection<Network4>("blockedNetworks"); blockedNetworks = odbDatabase.GetCollection<Network4>("blockedNetworks");
hosts.EnsureIndex("PrimaryIP");
hosts.EnsureIndex("IPAddresses[]");
CrawlerState = ComponentState.INITIALIZED; CrawlerState = ComponentState.INITIALIZED;
} }
catch (Exception) catch (Exception)
@ -190,27 +194,38 @@ namespace ln.skyscanner.crawl
public CrawledHost FindHostForIP(IPv4 ip) public CrawledHost FindHostForIP(IPv4 ip)
{ {
CrawledHost crawledHost = CrawledHosts.Where(host => host.HasIP(ip)).FirstOrDefault(); lock (this)
if (crawledHost == null)
{ {
crawledHost = new CrawledHost(); Query nodeByIpQuery = Query.OR(
crawledHost.PrimaryIP = ip; Query.Equals<CrawledHost>("IPAddresses[]", ip),
crawledHost.Name = ip.ToString(); Query.Equals<CrawledHost>("PrimaryIP", ip)
);
CrawledHost crawledHost = hosts.Select(nodeByIpQuery).FirstOrDefault();
if (crawledHost == null)
{
crawledHost = new CrawledHost();
crawledHost.PrimaryIP = ip;
crawledHost.Name = ip.ToString();
CrawledHosts.Insert(crawledHost); CrawledHosts.Insert(crawledHost);
}
return crawledHost;
} }
return crawledHost;
} }
public CrawledSubnet FindSubnet(Network4 network) public CrawledSubnet FindSubnet(Network4 network)
{ {
CrawledSubnet sn = CrawledSubnets.Select("Network", network).FirstOrDefault(); lock (this)
if (sn == null)
{ {
Logging.Log(LogLevel.INFO, "Crawler adds new subnet: {0}",network); Query subnetQuery = Query.Equals<CrawledSubnet>("Network", network);
sn = new CrawledSubnet(network); CrawledSubnet sn = CrawledSubnets.Select(subnetQuery).FirstOrDefault();
CrawledSubnets.Insert(sn); if (sn == null)
{
Logging.Log(LogLevel.INFO, "Crawler adds new subnet: {0}", network);
sn = new CrawledSubnet(network);
CrawledSubnets.Insert(sn);
}
return sn;
} }
return sn;
} }

View File

@ -50,6 +50,8 @@ namespace ln.skyscanner.crawl.tests
crawl.Host.SetHint("ping.out_of_ten", nSuccess); crawl.Host.SetHint("ping.out_of_ten", nSuccess);
crawl.Host.LastSeen = DateTime.Now; crawl.Host.LastSeen = DateTime.Now;
if (crawl.Host.FirstSeen < new DateTime(1970, 1, 2))
crawl.Host.FirstSeen = DateTime.Now;
} }
else else
{ {

View File

@ -15,6 +15,7 @@ using ln.types;
using ln.skyscanner.crawl.service; using ln.skyscanner.crawl.service;
using System.Configuration; using System.Configuration;
using System.Net.Sockets; using System.Net.Sockets;
using ln.types.net;
namespace ln.skyscanner.crawl.tests namespace ln.skyscanner.crawl.tests
{ {
public class RFC1213 : CrawlService public class RFC1213 : CrawlService
@ -48,6 +49,7 @@ namespace ln.skyscanner.crawl.tests
{ {
crawl.Host.IPAddresses = interfaces.SelectMany(intf => intf.IPAddresses).ToArray(); crawl.Host.IPAddresses = interfaces.SelectMany(intf => intf.IPAddresses).ToArray();
crawl.Host.HWAddresses = interfaces.Select(intf => intf.HWAddr).ToArray(); crawl.Host.HWAddresses = interfaces.Select(intf => intf.HWAddr).ToArray();
crawl.Host.Networks = interfaces.SelectMany(intf => intf.IPAddresses).Zip(interfaces.SelectMany(intf => intf.Netmasks), (ip, nm) => new Network4(ip.AsUInt, nm.AsUInt)).ToArray();
crawl.Host.SetHint("rfc1213.interfaces", interfaces.Select(intf => string.Format("{0};{1};{2}", crawl.Host.SetHint("rfc1213.interfaces", interfaces.Select(intf => string.Format("{0};{1};{2}",
intf.Name, intf.Name,

View File

@ -38,6 +38,7 @@ namespace ln.skyscanner.crawl.tests
{ {
TestDefaults(crawl.Host); TestDefaults(crawl.Host);
} }
return true; return true;
} }

View File

@ -238,6 +238,27 @@ namespace ln.skyscanner.entities
); );
} }
node.RemoveURI("snmp");
if (crawledHost.GetHint("snmp.version", -1) == 3)
{
node.AddURI(new URI(String.Format("snmp://{0}:{1}:{2}@{3}#{4}",
crawledHost.GetHint("snmp.username",""),
crawledHost.GetHint("snmp.authkey",""),
crawledHost.GetHint("snmp.privkey",""),
crawledHost.GetHint<IPv4>("snmp.address"),
crawledHost.GetHint<int>("snmp.version")
)));
}
else if (crawledHost.GetHint("snmp.version", -1) > 0)
{
node.AddURI(new URI(String.Format("snmp://{0}@{1}#{2}",
crawledHost.GetHint("snmp.community", ""),
crawledHost.GetHint<IPv4>("snmp.address"),
crawledHost.GetHint<int>("snmp.version")
)));
}
node.RemoveURI("http"); node.RemoveURI("http");
if (crawledHost.GetHint("http.port",-1) != -1) if (crawledHost.GetHint("http.port",-1) != -1)

View File

@ -50,6 +50,16 @@ namespace ln.skyscanner.http
return host; return host;
} }
[Callable]
public void TriggerRecrawl()
{
foreach (CrawledHost host in Crawler.CrawledHosts.ToArray())
{
host.NextCheck = DateTime.Now;
Crawler.CrawledHosts.Upsert(host);
}
}
[Callable] [Callable]
public void Crawl(string _id) public void Crawl(string _id)
{ {

View File

@ -82,6 +82,7 @@
<Compile Include="checks\SkyCheck.cs" /> <Compile Include="checks\SkyCheck.cs" />
<Compile Include="checks\CheckJob.cs" /> <Compile Include="checks\CheckJob.cs" />
<Compile Include="http\CheckerApi.cs" /> <Compile Include="http\CheckerApi.cs" />
<Compile Include="checks\Ubiquity.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

View File

@ -27,6 +27,13 @@
}, },
options: { options: {
scales: { scales: {
yAxes: [
{
ticks: {
callback: ScaleSI
}
}
],
xAxes: [{ xAxes: [{
type: 'time', type: 'time',
time: { time: {

View File

@ -5,6 +5,7 @@
</div> </div>
<div> <div>
<button onclick="skyapi().call('api/crawler','TriggerRecrawl');">Force Recrawl</button>
<button onclick="refreshHostTable();">!?</button> <button onclick="refreshHostTable();">!?</button>
<div> <div>
Bezeichnung: <input type="text" id="htName" /> Bezeichnung: <input type="text" id="htName" />

View File

@ -60,7 +60,7 @@
$("#dLocation").prop("disabled", false).val(node.Location.Latitude + " / " + node.Location.Longitude); $("#dLocation").prop("disabled", false).val(node.Location.Latitude + " / " + node.Location.Longitude);
$("#dURIs").empty(); $("#dURIs").empty();
$.each( node.URIs, function(){ $("#dURIs").append($("<span>" + this.Scheme + "://" + this.Host + ":" + this.Port + "</span><br>")); } ); $.each( node.URIs, function(){ $("#dURIs").append($("<span>" + this.Scheme + "://" + this.Host + ":" + this.Port + (this.Fragment ? "#" + this.Fragment : "") + "</span><br>")); } );
$("#dInterfaces").empty(); $("#dInterfaces").empty();
$.each( node.Interfaces, function(){ $.each( node.Interfaces, function(){

View File

@ -176,3 +176,18 @@ function skyapi()
{ {
return __skyapi; return __skyapi;
} }
function ScaleSI(value)
{
if (value > 1000000000)
return ((value / 1000000000) | 0) + "G";
if (value > 1000000)
return ((value / 1000000) | 0) + "M";
if (value > 1000)
return ((value / 1000) | 0) + "k";
return value;
}