// /** // * 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; } } }