2019-03-26 12:53:42 +01:00
|
|
|
|
// /**
|
|
|
|
|
// * File: CrawlSubnet.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.threads;
|
|
|
|
|
using ln.types;
|
|
|
|
|
using ln.skyscanner.entities;
|
|
|
|
|
using System.Net.NetworkInformation;
|
|
|
|
|
using ln.logging;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using ln.types.odb;
|
2019-04-02 01:25:44 +02:00
|
|
|
|
using ln.types.net;
|
2019-03-26 12:53:42 +01:00
|
|
|
|
namespace ln.skyscanner.crawl
|
|
|
|
|
{
|
|
|
|
|
public class CrawlNetwork : PoolJob, IPersistent
|
|
|
|
|
{
|
|
|
|
|
[JsonIgnoreAttribute]
|
|
|
|
|
public Crawler Crawler { get; }
|
|
|
|
|
public CrawledSubnet Subnet { get; }
|
|
|
|
|
|
2019-04-02 01:25:44 +02:00
|
|
|
|
public Network4 Network { get; }
|
2019-03-26 12:53:42 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CrawlNetwork(Crawler crawler, CrawledSubnet subnet)
|
|
|
|
|
{
|
|
|
|
|
Crawler = crawler;
|
|
|
|
|
Subnet = subnet;
|
|
|
|
|
Network = subnet.Network;
|
|
|
|
|
|
|
|
|
|
Name = String.Format("Subnet crawl {0}", subnet.Network);
|
|
|
|
|
}
|
2019-04-02 01:25:44 +02:00
|
|
|
|
public CrawlNetwork(Crawler crawler, CrawledSubnet subnet,Network4 network)
|
2019-03-26 12:53:42 +01:00
|
|
|
|
{
|
|
|
|
|
Crawler = crawler;
|
|
|
|
|
Subnet = subnet;
|
|
|
|
|
Network = network;
|
|
|
|
|
|
|
|
|
|
Name = String.Format("Subnet crawl {0} [{1}]", subnet.Network, network);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void RunJob()
|
|
|
|
|
{
|
2019-04-02 01:25:44 +02:00
|
|
|
|
if (Network.Width < 26)
|
2019-03-26 12:53:42 +01:00
|
|
|
|
{
|
2019-04-02 01:25:44 +02:00
|
|
|
|
SplitJob(Network.Divide(26 - (int)Network.Width).Select((n) => new CrawlNetwork(Crawler, Subnet, n)).ToArray());
|
2019-03-26 12:53:42 +01:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ping ping = new Ping();
|
|
|
|
|
|
|
|
|
|
DateTime startTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
Logging.Log(LogLevel.INFO, "Scanning {0}", Subnet);
|
|
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
|
|
2019-04-02 01:25:44 +02:00
|
|
|
|
foreach (IPv4 ip in Network)
|
2019-03-26 12:53:42 +01:00
|
|
|
|
{
|
|
|
|
|
count++;
|
|
|
|
|
|
|
|
|
|
long roundTripTime = 0;
|
|
|
|
|
int success = 0;
|
|
|
|
|
int nPings = 6;
|
|
|
|
|
|
|
|
|
|
for (int n = 0; n < nPings; n++)
|
|
|
|
|
{
|
|
|
|
|
State = String.Format("Sending ping #{0} of {1} to {2}",n,nPings,ip);
|
|
|
|
|
Progress = (double)count / Network.Size;
|
|
|
|
|
|
|
|
|
|
PingReply reply = ping.Send(ip, 250);
|
|
|
|
|
if (reply.Status == IPStatus.Success)
|
|
|
|
|
{
|
|
|
|
|
success++;
|
|
|
|
|
roundTripTime += reply.RoundtripTime;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (success > 0)
|
|
|
|
|
{
|
|
|
|
|
roundTripTime /= success;
|
|
|
|
|
Logging.Log(LogLevel.INFO, "IP {0} reachable ({1}/10) {2}ms", ip, success, roundTripTime);
|
|
|
|
|
|
|
|
|
|
Crawler.FindHostForIP(ip);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (AbortRequested)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!AbortRequested)
|
|
|
|
|
{
|
|
|
|
|
Subnet.LastScan = startTime;
|
|
|
|
|
Subnet.NextScan = startTime + TimeSpan.FromHours(24);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Crawler.CrawledSubnets.Upsert(Subnet);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override int GetHashCode()
|
|
|
|
|
{
|
|
|
|
|
return Subnet.GetHashCode() ^ Network.GetHashCode();
|
|
|
|
|
}
|
|
|
|
|
public override bool Equals(object obj)
|
|
|
|
|
{
|
|
|
|
|
if (obj is CrawlNetwork)
|
|
|
|
|
{
|
|
|
|
|
CrawlNetwork you = obj as CrawlNetwork;
|
|
|
|
|
return Crawler.Equals(you.Crawler) && Subnet.Equals(you.Subnet) && Network.Equals(you.Network);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Guid PersistenceID = Guid.NewGuid();
|
|
|
|
|
public Guid GetPersistenceID()
|
|
|
|
|
{
|
|
|
|
|
return PersistenceID;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|