broken
Harald Wolff 2019-03-21 13:06:36 +00:00
parent e124f5e885
commit 081d118ced
17 changed files with 261 additions and 85 deletions

View File

@ -31,6 +31,7 @@ using System.Threading;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using ln.skyscanner.crawl.tests; using ln.skyscanner.crawl.tests;
using Castle.DynamicProxy; using Castle.DynamicProxy;
using ln.types.odb;
namespace ln.skyscanner namespace ln.skyscanner
{ {
@ -55,6 +56,12 @@ namespace ln.skyscanner
private static void Initialize() private static void Initialize()
{ {
//ODB<CrawlPool> dB = new ODB<CrawlPool>("testdb");
//dB.Root.HostForIP(CIDR.Parse("1.2.3.4"));
//dB.Root.HostForIP(CIDR.Parse("2.3.4.5"));
//dB.SavePersistent(dB.RootObject);
} }
} }

View File

@ -13,12 +13,13 @@ using ln.types;
using System.Net; using System.Net;
using System.Linq; using System.Linq;
using ln.skyscanner.entities; using ln.skyscanner.entities;
using ln.types.odb;
namespace ln.skyscanner.crawl namespace ln.skyscanner.crawl
{ {
public class CrawlPool public class CrawlPool : Persistent
{ {
private List<CrawledHost> hosts = new List<CrawledHost>(); private List<CrawledHost> hosts = new List<CrawledHost>();
private List<Subnet> subnets = new List<Subnet>(); private List<CrawledSubnet> subnets = new List<CrawledSubnet>();
public CrawlPool() public CrawlPool()
{ {
@ -30,7 +31,7 @@ namespace ln.skyscanner.crawl
} }
} }
public Subnet[] Subnets public CrawledSubnet[] Subnets
{ {
get get
{ {
@ -62,17 +63,22 @@ namespace ln.skyscanner.crawl
} }
} }
public Subnet GetSubnet(CIDR network) public void RemoveHost(CrawledHost crawledHost)
{
hosts.Remove(crawledHost);
}
public CrawledSubnet GetSubnet(CIDR network)
{ {
lock (this) lock (this)
{ {
foreach (Subnet subnet in subnets) foreach (CrawledSubnet subnet in subnets)
{ {
if (subnet.Network.Equals(network)) if (subnet.Network.Equals(network))
return subnet; return subnet;
} }
Subnet net = new Subnet(network); CrawledSubnet net = new CrawledSubnet(network);
subnets.Add(net); subnets.Add(net);
return net; return net;
} }

View File

@ -20,10 +20,11 @@ using System.Linq;
using ln.snmp; using ln.snmp;
using ln.snmp.endpoint; using ln.snmp.endpoint;
using ln.snmp.rfc1213; using ln.snmp.rfc1213;
using ln.types.odb;
namespace ln.skyscanner.crawl namespace ln.skyscanner.crawl
{ {
public class CrawledHost public class CrawledHost : Persistent
{ {
private List<RFC1213.Interface> interfaces = new List<RFC1213.Interface>(); private List<RFC1213.Interface> interfaces = new List<RFC1213.Interface>();
public RFC1213.Interface[] Interfaces public RFC1213.Interface[] Interfaces

View File

@ -0,0 +1,47 @@
// /**
// * File: Subnet.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.types;
using ln.types.odb;
using System.Collections.Generic;
using System.Linq;
namespace ln.skyscanner.entities
{
public class CrawledSubnet : Persistent
{
public readonly CIDR Network;
public String Name;
public DateTime FirstSeen;
public DateTime LastScan;
public DateTime NextScan;
private CrawledSubnet()
{
FirstSeen = DateTime.Now;
}
public CrawledSubnet(CIDR cidr)
{
Network = cidr;
Name = Network.ToString();
FirstSeen = DateTime.Now;
}
public override string ToString()
{
return Network.ToString();
}
}
}

View File

@ -28,6 +28,7 @@ using System.Threading;
using ln.snmp.types; using ln.snmp.types;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
using ln.types.odb;
namespace ln.skyscanner.crawl namespace ln.skyscanner.crawl
{ {
@ -37,6 +38,7 @@ namespace ln.skyscanner.crawl
public String BasePath { get; set; } public String BasePath { get; set; }
public String PerfPath => Path.Combine(BasePath, "perfdb"); public String PerfPath => Path.Combine(BasePath, "perfdb");
public string PoolPath => Path.Combine(BasePath, "pool");
bool stopping; bool stopping;
@ -45,16 +47,18 @@ namespace ln.skyscanner.crawl
public PoolJob[] CurrentJobs => crawlThreadPool.CurrentPoolJobs; public PoolJob[] CurrentJobs => crawlThreadPool.CurrentPoolJobs;
public PoolJob[] QueuedJobs => crawlThreadPool.QueuedJobs; public PoolJob[] QueuedJobs => crawlThreadPool.QueuedJobs;
public DiskObject<CrawlPool> _CrawlPool; public CrawlPool CrawlPool => dbCrawlPool?.Root;
public CrawlPool CrawlPool => _CrawlPool?.Instance; public ODB<CrawlPool> DBCrawlPool => dbCrawlPool;
//public SNMPEngine SNMPEngine { get; private set; }
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
public ComponentState CrawlerState { get; private set; } public ComponentState CrawlerState { get; private set; }
Thread threadScheduler; Thread threadScheduler;
private ODB<CrawlPool> dbCrawlPool;
public Crawler(SkyScanner skyScanner) public Crawler(SkyScanner skyScanner)
{ {
SkyScanner = skyScanner; SkyScanner = skyScanner;
@ -83,8 +87,7 @@ namespace ln.skyscanner.crawl
{ {
stopping = false; stopping = false;
if (_CrawlPool == null) dbCrawlPool = new ODB<CrawlPool>(PoolPath);
_CrawlPool = new DiskObject<CrawlPool>(String.Format("{0}/pool", BasePath));
if (crawlThreadPool == null) if (crawlThreadPool == null)
crawlThreadPool = new Pool(128); crawlThreadPool = new Pool(128);
@ -126,7 +129,7 @@ namespace ln.skyscanner.crawl
crawlThreadPool.Close(); crawlThreadPool.Close();
_CrawlPool.Save(); Sync();
stopping = false; stopping = false;
CrawlerState = ComponentState.STOPPED; CrawlerState = ComponentState.STOPPED;
@ -139,10 +142,14 @@ namespace ln.skyscanner.crawl
} }
public void Sync() public void Sync()
{
Sync(CrawlPool);
}
public void Sync(IPersistent persistent)
{ {
lock (CrawlPool) lock (CrawlPool)
{ {
_CrawlPool.Save(); dbCrawlPool.SavePersistent(persistent);
} }
} }
@ -163,7 +170,7 @@ namespace ln.skyscanner.crawl
} }
else else
{ {
Subnet subnet = CrawlPool.GetSubnet(cidr); CrawledSubnet subnet = CrawlPool.GetSubnet(cidr);
SubnetCrawl crawlSubnet = new SubnetCrawl(this, subnet); SubnetCrawl crawlSubnet = new SubnetCrawl(this, subnet);
crawlThreadPool.Enqueue(crawlSubnet); crawlThreadPool.Enqueue(crawlSubnet);
} }
@ -179,13 +186,18 @@ namespace ln.skyscanner.crawl
{ {
foreach (CrawledHost crawledHost in CrawlPool.Hosts) foreach (CrawledHost crawledHost in CrawlPool.Hosts)
{ {
if (crawledHost.NextCheck < DateTime.Now) CrawledHost crawledHost2 = CrawlPool.HostForIP(crawledHost.PrimaryIP);
if (crawledHost != crawledHost2)
{
CrawlPool.RemoveHost(crawledHost);
} else if (crawledHost.NextCheck < DateTime.Now)
{ {
Crawl(crawledHost.PrimaryIP); Crawl(crawledHost.PrimaryIP);
} }
} }
foreach (Subnet subnet in CrawlPool.Subnets.ToArray()) foreach (CrawledSubnet subnet in CrawlPool.Subnets.ToArray())
{ {
if (subnet.NextScan < (DateTime.Now - TimeSpan.FromDays(1)) && subnet.Network.MaskWidth >= 24) if (subnet.NextScan < (DateTime.Now - TimeSpan.FromDays(1)) && subnet.Network.MaskWidth >= 24)
{ {

View File

@ -55,6 +55,8 @@ namespace ln.skyscanner.crawl
CrawledHost.LastCheckTime = DateTime.Now - dateTime; CrawledHost.LastCheckTime = DateTime.Now - dateTime;
CrawledHost.LastCheck = dateTime; CrawledHost.LastCheck = dateTime;
CrawledHost.NextCheck = dateTime + TimeSpan.FromHours(1); CrawledHost.NextCheck = dateTime + TimeSpan.FromHours(1);
Crawler.Sync(CrawledHost);
} }
public override int GetHashCode() public override int GetHashCode()

View File

@ -15,18 +15,20 @@ using System.Net.NetworkInformation;
using ln.logging; using ln.logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Linq; using System.Linq;
using ln.types.odb;
namespace ln.skyscanner.crawl namespace ln.skyscanner.crawl
{ {
public class SubnetCrawl : PoolJob public class SubnetCrawl : PoolJob, IPersistent
{ {
[JsonIgnoreAttribute] [JsonIgnoreAttribute]
public Crawler Crawler { get; } public Crawler Crawler { get; }
public Subnet Subnet { get; } public CrawledSubnet Subnet { get; }
public CIDR Network { get; } public CIDR Network { get; }
public SubnetCrawl(Crawler crawler, Subnet subnet)
public SubnetCrawl(Crawler crawler, CrawledSubnet subnet)
{ {
Crawler = crawler; Crawler = crawler;
Subnet = subnet; Subnet = subnet;
@ -34,7 +36,7 @@ namespace ln.skyscanner.crawl
Name = String.Format("Subnet crawl {0}", subnet.Network); Name = String.Format("Subnet crawl {0}", subnet.Network);
} }
public SubnetCrawl(Crawler crawler, Subnet subnet,CIDR network) public SubnetCrawl(Crawler crawler, CrawledSubnet subnet,CIDR network)
{ {
Crawler = crawler; Crawler = crawler;
Subnet = subnet; Subnet = subnet;
@ -99,6 +101,9 @@ namespace ln.skyscanner.crawl
Subnet.LastScan = startTime; Subnet.LastScan = startTime;
Subnet.NextScan = startTime + TimeSpan.FromHours(24); Subnet.NextScan = startTime + TimeSpan.FromHours(24);
} }
Crawler.Sync(Subnet);
} }
public override int GetHashCode() public override int GetHashCode()
@ -116,5 +121,10 @@ namespace ln.skyscanner.crawl
} }
private Guid PersistenceID = Guid.NewGuid();
public Guid GetPersistenceID()
{
return PersistenceID;
}
} }
} }

View File

@ -24,7 +24,7 @@ namespace ln.skyscanner.crawl.tests
{ {
if (!TestCurrentHints(crawledHost)) if (!TestCurrentHints(crawledHost))
{ {
return TestDefaults(crawledHost);
} }
return false; return false;
@ -228,11 +228,15 @@ namespace ln.skyscanner.crawl.tests
v2.CommunityString = crawledHost.GetHint<string>("snmp.community"); v2.CommunityString = crawledHost.GetHint<string>("snmp.community");
return v2; return v2;
case 3: case 3:
USMEndpoint endpoint = new USMEndpoint(SNMPEngine.DefaultEngine, new System.Net.IPEndPoint(snmpAddress, 161)); if (crawledHost.GetHint<string>("snmp.username", null) != null)
endpoint.AuthMethod = SnmpV3AuthMethod.SHA; {
endpoint.Username = crawledHost.GetHint<string>("snmp.username"); USMEndpoint endpoint = new USMEndpoint(SNMPEngine.DefaultEngine, new System.Net.IPEndPoint(snmpAddress, 161));
endpoint.AuthKeyPhrase = crawledHost.GetHint<string>("snmp.authkey"); endpoint.AuthMethod = SnmpV3AuthMethod.SHA;
return endpoint; endpoint.Username = crawledHost.GetHint<string>("snmp.username");
endpoint.AuthKeyPhrase = crawledHost.GetHint<string>("snmp.authkey");
return endpoint;
}
return null;
default: default:
return null; return null;
} }

View File

@ -41,7 +41,7 @@ namespace ln.skyscanner.crawl.tests
string sshUser = crawledHost.GetHint<string>("ssh.login", null); string sshUser = crawledHost.GetHint<string>("ssh.login", null);
string sshPassword = crawledHost.GetHint<string>("ssh.password", null); string sshPassword = crawledHost.GetHint<string>("ssh.password", null);
if ((sshPort == -1) || !CanConnect(crawledHost,sshIP.Host.ToString(),sshPort,sshUser,sshPassword)) if ((sshPort == -1) || !CanConnect(crawledHost,sshIP.Host,sshPort,sshUser,sshPassword))
{ {
if (!Scan(crawledHost)) if (!Scan(crawledHost))
{ {
@ -64,7 +64,7 @@ namespace ln.skyscanner.crawl.tests
{ {
foreach (string password in defaultPasswords) foreach (string password in defaultPasswords)
{ {
if (CanConnect(crawledHost, ip.Host.ToString(), port, "skytron", password)) if (CanConnect(crawledHost, ip.Host, port, "skytron", password))
return true; return true;
} }
} }
@ -72,9 +72,9 @@ namespace ln.skyscanner.crawl.tests
return false; return false;
} }
private static bool CanConnect(CrawledHost crawledHost, String host, int port, string username, string password) private static bool CanConnect(CrawledHost crawledHost, CIDR host, int port, string username, string password)
{ {
using (SshClient client = new SshClient(host, port, username, password)) using (SshClient client = new SshClient(host.ToString(), port, username, password))
{ {
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(1); client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(1);
try try
@ -82,7 +82,7 @@ namespace ln.skyscanner.crawl.tests
client.Connect(); client.Connect();
crawledHost.SetHint("ssh.port", client.ConnectionInfo.Port); crawledHost.SetHint("ssh.port", client.ConnectionInfo.Port);
crawledHost.SetHint("ssh.ip", client.ConnectionInfo.Host); crawledHost.SetHint("ssh.ip", host);
crawledHost.SetHint("ssh.login", client.ConnectionInfo.Username); crawledHost.SetHint("ssh.login", client.ConnectionInfo.Username);
crawledHost.SetHint("ssh.password", password); crawledHost.SetHint("ssh.password", password);
crawledHost.SetHint("ssh.version", client.ConnectionInfo.ServerVersion); crawledHost.SetHint("ssh.version", client.ConnectionInfo.ServerVersion);
@ -95,6 +95,7 @@ namespace ln.skyscanner.crawl.tests
} }
catch (SocketException) catch (SocketException)
{ {
return false;
} }
} }
return false; return false;

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Collections;
using System.Security;
namespace ln.skyscanner.entities
{
public class GlobalNetwork
{
public IEnumerable<Subnet> Subnets => subnets;
public IEnumerable<Node> Nodes => nodes;
private List<Node> nodes = new List<Node>();
private List<Subnet> subnets = new List<Subnet>();
public GlobalNetwork()
{
}
}
}

View File

@ -0,0 +1,54 @@
// /**
// * File: Router.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 System.Collections.Generic;
using ln.types;
using ln.skyscanner.crawl;
namespace ln.skyscanner.entities
{
public class NetworkInterface
{
public Node Node { get; private set; } = null;
public string Name { get; private set; } = "";
public CIDR[] IPs { get; set; } = new CIDR[0];
private NetworkInterface()
{ }
public NetworkInterface(Node node)
{
Node = node;
}
public NetworkInterface(Node node,String name)
{
Node = node;
Name = name;
}
public override int GetHashCode()
{
return Node.GetHashCode() ^ Name.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is NetworkInterface)
{
NetworkInterface networkInterface = obj as NetworkInterface;
return Node.Equals(networkInterface.Node) && Name.Equals(networkInterface.Name);
}
return false;
}
}
}

View File

@ -10,27 +10,53 @@
using System; using System;
using ln.types; using ln.types;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace ln.skyscanner.entities namespace ln.skyscanner.entities
{ {
public class Node public class Node
{ {
public CIDR PrimaryIP; public GlobalNetwork GlobalNetwork { get; private set; }
public String Name;
public List<NetworkInterface> NetworkInterfaces = new List<NetworkInterface>(); public CIDR PrimaryIP { get; set; }
public String PrimaryMac { get; set; }
public String Name { get; set; }
public DateTime FirstSeen; public DateTime Created { get; }
public DateTime LastSeen; public Uri[] URIs => uris.ToArray();
public Node()
private HashSet<Uri> uris = new HashSet<Uri>();
private Node()
{ {
FirstSeen = DateTime.Now;
} }
public Node(CIDR primaryIP) public Node(GlobalNetwork globalNetwork, CIDR primaryIP)
{ {
GlobalNetwork = globalNetwork;
PrimaryIP = primaryIP; PrimaryIP = primaryIP;
FirstSeen = DateTime.Now; Name = PrimaryIP.ToString();
Created = DateTime.Now;
}
public void RemoveURI(Uri uri)
{
foreach (Uri u in uris)
{
if (uri.Equals(u))
uris.Remove(u);
}
}
public void AddURI(Uri uri)
{
uris.Add(uri);
}
public IEnumerable<Uri> FindURIs(string scheme)
{
return uris.Where((u) => scheme.Equals(u.Scheme));
} }
} }

View File

@ -1,36 +0,0 @@
// /**
// * File: Router.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 System.Collections.Generic;
using ln.types;
namespace ln.skyscanner.entities
{
public class NetworkInterface
{
public Node Node;
public string Name;
public List<CIDR> IPs = new List<CIDR>();
public NetworkInterface()
{ }
public NetworkInterface(Node node)
{
Node = node;
}
public NetworkInterface(Node node,String name)
{
Node = node;
Name = name;
}
}
}

View File

@ -9,10 +9,15 @@
// **/ // **/
using System; using System;
using ln.types; using ln.types;
using ln.types.odb;
using System.Collections.Generic;
using System.Linq;
namespace ln.skyscanner.entities namespace ln.skyscanner.entities
{ {
public class Subnet public class Subnet : Persistent
{ {
public GlobalNetwork GlobalNetwork { get; private set; }
public readonly CIDR Network; public readonly CIDR Network;
public String Name; public String Name;
@ -21,18 +26,32 @@ namespace ln.skyscanner.entities
public DateTime LastScan; public DateTime LastScan;
public DateTime NextScan; public DateTime NextScan;
public Subnet() public NetworkInterface[] AttachedInterfaces => networkInterfaces.ToArray();
private HashSet<NetworkInterface> networkInterfaces = new HashSet<NetworkInterface>();
private Subnet()
{ {
FirstSeen = DateTime.Now;
} }
public Subnet(CIDR cidr) public Subnet(GlobalNetwork globalNetwork,CIDR cidr)
{ {
GlobalNetwork = globalNetwork;
Network = cidr; Network = cidr;
Name = Network.ToString(); Name = Network.ToString();
FirstSeen = DateTime.Now; FirstSeen = DateTime.Now;
} }
public void AttachInterface(NetworkInterface networkInterface)
{
networkInterfaces.Add(networkInterface);
}
public void DetachInterface(NetworkInterface networkInterface)
{
networkInterfaces.Remove(networkInterface);
}
public override string ToString() public override string ToString()
{ {
return Network.ToString(); return Network.ToString();

View File

@ -20,7 +20,7 @@ namespace ln.skyscanner.http
} }
[Callable] [Callable]
public Subnet[] GetSubnets() public CrawledSubnet[] GetSubnets()
{ {
return SkyScanner.Crawler?.CrawlPool.Subnets.ToArray(); return SkyScanner.Crawler?.CrawlPool.Subnets.ToArray();
} }

View File

@ -50,7 +50,7 @@
<Compile Include="crawl\Crawler.cs" /> <Compile Include="crawl\Crawler.cs" />
<Compile Include="crawl\CrawledHost.cs" /> <Compile Include="crawl\CrawledHost.cs" />
<Compile Include="entities\Subnet.cs" /> <Compile Include="entities\Subnet.cs" />
<Compile Include="entities\Router.cs" /> <Compile Include="entities\NetworkInterface.cs" />
<Compile Include="Check.cs" /> <Compile Include="Check.cs" />
<Compile Include="check\Hostalive.cs" /> <Compile Include="check\Hostalive.cs" />
<Compile Include="SkyScanner.cs" /> <Compile Include="SkyScanner.cs" />
@ -66,6 +66,8 @@
<Compile Include="crawl\tests\SNMP.cs" /> <Compile Include="crawl\tests\SNMP.cs" />
<Compile Include="crawl\tests\ICMP.cs" /> <Compile Include="crawl\tests\ICMP.cs" />
<Compile Include="crawl\tests\RFC1213.cs" /> <Compile Include="crawl\tests\RFC1213.cs" />
<Compile Include="entities\GlobalNetwork.cs" />
<Compile Include="crawl\CrawledSubnet.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

View File

@ -117,8 +117,8 @@
{ title: "Zuletzt gesehen", data: "LastSeen", sorter: "", width: 180, formatter: "datetime", formatterParams: { inputFormat: "", outputFormat: "DD.MM.YYYY hh:mm:ss", invalidPlaceHolder: "-" } }, { title: "Zuletzt gesehen", data: "LastSeen", sorter: "", width: 180, formatter: "datetime", formatterParams: { inputFormat: "", outputFormat: "DD.MM.YYYY hh:mm:ss", invalidPlaceHolder: "-" } },
{ title: "Letzter Scan", data: "LastCheck", sorter: "", width: 180, formatter: "datetime", formatterParams: { inputFormat: "", outputFormat: "DD.MM.YYYY hh:mm:ss", invalidPlaceHolder: "-" } }, { title: "Letzter Scan", data: "LastCheck", sorter: "", width: 180, formatter: "datetime", formatterParams: { inputFormat: "", outputFormat: "DD.MM.YYYY hh:mm:ss", invalidPlaceHolder: "-" } },
{ title: "Nächster Scan",data: "NextCheck",sorter: "",width: 180,formatter: "datetime",formatterParams: {inputFormat: "",outputFormat: "DD.MM.YYYY hh:mm:ss",invalidPlaceHolder: "-"} }, { title: "Nächster Scan",data: "NextCheck",sorter: "",width: 180,formatter: "datetime",formatterParams: {inputFormat: "",outputFormat: "DD.MM.YYYY hh:mm:ss",invalidPlaceHolder: "-"} },
{ title: "SNMP", data: "SSHDetected", width: 90 }, { title: "SSH", data: "SSHDetected", width: 90 },
{ title: "SSH", data: "SnmpDetected", width: 90 }, { title: "SNMP", data: "SnmpDetected", width: 90 },
{ title: "RFC1213", data: "RFC1213Detected", width: 90 } { title: "RFC1213", data: "RFC1213Detected", width: 90 }
]; ];