123 lines
3.4 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|