ln.skyscanner/crawl/CrawlNetwork.cs

123 lines
3.4 KiB
C#

// /**
// * 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 System.Linq;
using ln.types.odb;
using ln.types.net;
namespace ln.skyscanner.crawl
{
public class CrawlNetwork : PoolJob
{
public Crawler Crawler { get; }
public CrawledSubnet Subnet { get; }
public Network4 Network { get; }
public CrawlNetwork(Crawler crawler, CrawledSubnet subnet)
{
Crawler = crawler;
Subnet = subnet;
Network = subnet.Network;
Name = String.Format("Subnet crawl {0}", subnet.Network);
}
public CrawlNetwork(Crawler crawler, CrawledSubnet subnet,Network4 network)
{
Crawler = crawler;
Subnet = subnet;
Network = network;
Name = String.Format("Subnet crawl {0} [{1}]", subnet.Network, network);
}
private int maxScanWidth = 28;
public override void RunJob()
{
if (Network.Width < maxScanWidth)
{
SplitJob(Network.Divide(maxScanWidth - (int)Network.Width).Select((n) => new CrawlNetwork(Crawler, Subnet, n)).ToArray());
return;
}
Ping ping = new Ping();
DateTime startTime = DateTime.Now;
Logging.Log(LogLevel.INFO, "Scanning {0}", Subnet);
int count = 0;
foreach (IPv4 ip in Network)
{
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 (JobAbortRequested)
break;
}
if (!JobAbortRequested)
{
Subnet.LastScan = startTime;
Subnet.NextScan = startTime + TimeSpan.FromHours(24);
}
SkyScanner.Instance.Entities.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;
}
}
}