ln.skyscanner/crawl/SubnetCrawl.cs

131 lines
3.5 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 Newtonsoft.Json;
using System.Linq;
using ln.types.odb;
namespace ln.skyscanner.crawl
{
public class SubnetCrawl : PoolJob, IPersistent
{
[JsonIgnoreAttribute]
public Crawler Crawler { get; }
public CrawledSubnet Subnet { get; }
public CIDR Network { get; }
public SubnetCrawl(Crawler crawler, CrawledSubnet subnet)
{
Crawler = crawler;
Subnet = subnet;
Network = subnet.Network;
Name = String.Format("Subnet crawl {0}", subnet.Network);
}
public SubnetCrawl(Crawler crawler, CrawledSubnet subnet,CIDR network)
{
Crawler = crawler;
Subnet = subnet;
Network = network;
Name = String.Format("Subnet crawl {0} [{1}]", subnet.Network, network);
}
public override void RunJob()
{
if (Network.MaskWidth < 26)
{
SplitJob(Network.Divide(26 - Network.MaskWidth).Select((n) => new SubnetCrawl(Crawler, Subnet, n)).ToArray());
return;
}
Ping ping = new Ping();
DateTime startTime = DateTime.Now;
Logging.Log(LogLevel.INFO, "Scanning {0}", Subnet);
int count = 0;
foreach (CIDR 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.CrawlPool.HostForIP(ip);
}
if (AbortRequested)
break;
}
if (!AbortRequested)
{
Subnet.LastScan = startTime;
Subnet.NextScan = startTime + TimeSpan.FromHours(24);
}
Crawler.Sync(Subnet);
}
public override int GetHashCode()
{
return Subnet.GetHashCode() ^ Network.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is SubnetCrawl)
{
SubnetCrawl you = obj as SubnetCrawl;
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;
}
}
}