135 lines
3.9 KiB
C#
135 lines
3.9 KiB
C#
// /**
|
|
// * File: CrawlHost.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.logging;
|
|
using System.Net.NetworkInformation;
|
|
using ln.snmp.endpoint;
|
|
using ln.snmp;
|
|
using System.Net;
|
|
using ln.snmp.types;
|
|
using System.Collections.Generic;
|
|
using ln.snmp.rfc1213;
|
|
using ln.types;
|
|
using Newtonsoft.Json;
|
|
using ln.skyscanner.crawl.tests;
|
|
using System.Runtime.Remoting.Messaging;
|
|
using ln.skyscanner.crawl.service;
|
|
namespace ln.skyscanner.crawl
|
|
{
|
|
public class Crawl : PoolJob
|
|
{
|
|
[JsonIgnore]
|
|
public Crawler Crawler { get; }
|
|
[JsonIgnore]
|
|
public CrawledHost Host { get; }
|
|
|
|
List<CrawlService> servicesToCheck = new List<CrawlService>();
|
|
List<CrawlService> servicesChecked = new List<CrawlService>();
|
|
|
|
public CrawlService CurrentService { get; set; }
|
|
|
|
public Crawl(Crawler crawler,CrawledHost crawledHost)
|
|
{
|
|
Crawler = crawler;
|
|
Host = crawledHost;
|
|
|
|
servicesToCheck.AddRange(CrawlService.Services);
|
|
|
|
Name = String.Format("Crawl: {0} [ {1} ]", crawledHost.Name, crawledHost.PrimaryIP);
|
|
}
|
|
|
|
public void UpdateState(CrawlService currentService,double progress)
|
|
{
|
|
double progBase = (double)servicesChecked.Count / (double)(servicesChecked.Count + servicesToCheck.Count);
|
|
State = String.Format("Service: {0} => {1:F1}%", currentService?.Name, progress * 100.0);
|
|
CurrentService = currentService;
|
|
Progress = progBase;
|
|
}
|
|
|
|
|
|
public bool CheckRequiredOption(string serviceName,params object[] parameters)
|
|
{
|
|
foreach (CrawlService service in servicesChecked)
|
|
{
|
|
if (service.Name.Equals(serviceName))
|
|
{
|
|
return service.HostProvidesOption(this,parameters);
|
|
}
|
|
}
|
|
foreach (CrawlService service in servicesToCheck)
|
|
{
|
|
if (service.Name.Equals(serviceName))
|
|
{
|
|
RunServiceCheck(service);
|
|
return service.HostProvidesOption(this,parameters);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
private void RunServiceCheck(CrawlService crawlService)
|
|
{
|
|
CrawlService lastService = CurrentService;
|
|
|
|
UpdateState(crawlService, 0);
|
|
|
|
crawlService.Check(this);
|
|
|
|
UpdateState(crawlService, 1.0);
|
|
|
|
servicesChecked.Add(crawlService);
|
|
servicesToCheck.Remove(crawlService);
|
|
|
|
CurrentService = lastService;
|
|
}
|
|
|
|
public override void RunJob()
|
|
{
|
|
State = "Prepare";
|
|
|
|
DateTime dateTime = DateTime.Now;
|
|
|
|
while (servicesToCheck.Count > 0)
|
|
RunServiceCheck(servicesToCheck[0]);
|
|
|
|
//if (CrawledHost.FirstSeen.Equals(DateTime.MinValue))
|
|
// CrawledHost.FirstSeen = DateTime.Now;
|
|
|
|
////CrawledHost.LastSeen = DateTime.Now;
|
|
|
|
Host.LastCheckTime = DateTime.Now - dateTime;
|
|
Host.LastCheck = dateTime;
|
|
Host.NextCheck = dateTime + TimeSpan.FromHours(1);
|
|
|
|
bool updated = Crawler.CrawledHosts.Update( Host );
|
|
|
|
setState("Updating global network");
|
|
SkyScanner.Instance.Entities.GlobalNetwork.EnqueueUpdate(Host);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return Host.GetHashCode();
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (obj is Crawl)
|
|
{
|
|
Crawl you = obj as Crawl;
|
|
return Crawler.Equals(you.Crawler) && Host.Equals(you.Host);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|