ln.skyscanner/SkyScanner.cs

272 lines
7.2 KiB
C#
Raw Normal View History

2019-03-13 14:18:05 +01:00
using System;
using ln.logging;
using ln.http;
using System.Net;
using ln.skyscanner.http;
using System.IO;
2019-03-14 08:36:02 +01:00
using ln.skyscanner.crawl;
2019-03-14 13:31:15 +01:00
using ln.types.threads;
2019-03-15 07:43:12 +01:00
using System.Threading;
2019-03-18 08:12:54 +01:00
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
2019-04-04 00:50:53 +02:00
using ln.skyscanner.checks;
2019-04-04 19:34:19 +02:00
using System.Collections.Generic;
2019-06-28 10:01:30 +02:00
using ln.skyscanner.import.skytron;
2019-07-03 10:54:46 +02:00
using System.Linq;
2019-07-08 13:14:49 +02:00
using ln.skyscanner.entities;
using ln.types.json;
using Newtonsoft.Json.Linq;
2019-03-13 14:18:05 +01:00
namespace ln.skyscanner
{
2019-03-18 08:12:54 +01:00
[JsonConverter(typeof(StringEnumConverter))]
2019-03-15 15:35:44 +01:00
public enum ComponentState { STOPPED, INITIALIZED, STARTED, FAILED, STOPPING }
2019-03-13 14:18:05 +01:00
public class SkyScanner
{
2019-03-26 12:53:42 +01:00
public static SkyScanner Instance { get; private set; }
2019-03-13 14:18:05 +01:00
public String[] Arguments { get; }
public String BasePath { get; private set; }
2019-03-14 13:31:15 +01:00
public Pool ConveniencePool { get; }
2019-03-13 14:18:05 +01:00
public HTTPServer HTTPServer { get; private set; }
2019-03-14 08:36:02 +01:00
public Crawler Crawler { get; private set; }
2019-03-26 12:53:42 +01:00
public SkyEntities Entities { get; private set; }
2019-04-04 00:50:53 +02:00
public SkyChecker Checker { get; private set; }
2019-03-18 08:12:54 +01:00
public MemoryLogger MemoryLogger { get; private set; }
2019-03-13 14:18:05 +01:00
public SkyScanner(String[] args)
2019-03-26 12:53:42 +01:00
:this()
2019-03-13 14:18:05 +01:00
{
2019-04-15 09:18:41 +02:00
MemoryLogger = new MemoryLogger(4096);
2019-03-18 08:12:54 +01:00
Logger.Default.Backends.Add(MemoryLogger);
2019-03-13 14:18:05 +01:00
Logging.Log(LogLevel.INFO, "SkyScanner: Constructor");
2019-04-04 19:34:19 +02:00
BasePath = Path.GetFullPath("/var/cache/ln.skyscanner");
2019-03-13 14:18:05 +01:00
Logging.Log(LogLevel.INFO, "SkyScanner: BasePath={0}", BasePath);
2019-03-14 13:31:15 +01:00
ConveniencePool = new Pool();
2019-03-13 14:18:05 +01:00
Arguments = args;
2019-03-26 12:53:42 +01:00
2019-06-28 10:01:30 +02:00
String skytronImport = null;
2019-07-03 10:54:46 +02:00
String benchMark = null;
2019-07-08 13:14:49 +02:00
String debugCheckNode = null;
2019-06-28 10:01:30 +02:00
2019-04-04 19:34:19 +02:00
Queue<string> qArguments = new Queue<string>(Arguments);
while (qArguments.Count > 0)
{
string arg = qArguments.Dequeue();
switch (arg)
{
case "-p":
BasePath = Path.GetFullPath(qArguments.Dequeue());
break;
2019-06-28 10:01:30 +02:00
case "--import-skytron":
skytronImport = qArguments.Dequeue();
break;
2019-07-03 10:54:46 +02:00
case "--benchmark":
benchMark = qArguments.Dequeue();
break;
2019-07-08 13:14:49 +02:00
case "--debug-check":
debugCheckNode = qArguments.Dequeue();
break;
2019-04-04 19:34:19 +02:00
}
}
2019-03-26 12:53:42 +01:00
Entities = new SkyEntities(this);
2019-04-04 00:50:53 +02:00
Checker = new SkyChecker();
2019-06-28 10:01:30 +02:00
if (skytronImport != null)
{
SkytronImport si = new SkytronImport(skytronImport);
si.Import();
}
2019-07-03 10:54:46 +02:00
if (benchMark != null)
{
switch (benchMark)
{
case "odb":
BenchmarkODB();
break;
default:
Logging.Log(LogLevel.ERROR, "Unknown Benchmark: {0}", benchMark);
break;
}
throw new Exception("Quitting after benchmarking");
}
2019-07-08 13:14:49 +02:00
if (debugCheckNode != null)
{
DebugCheck(debugCheckNode);
throw new Exception("Qutting after --debug-check");
}
2019-03-26 12:53:42 +01:00
}
private SkyScanner()
{
if (Instance != null)
throw new NotSupportedException("only one SkyScanner may be created");
Instance = this;
2019-03-13 14:18:05 +01:00
}
public void Start()
{
Logging.Log(LogLevel.INFO, "SkyScanner: Start()");
StartHttpServer();
2019-03-18 08:12:54 +01:00
StartCrawler();
2019-04-04 00:50:53 +02:00
Checker.Start();
2019-03-13 14:18:05 +01:00
2019-03-18 08:12:54 +01:00
lock (this)
{
Monitor.Wait(this);
}
2019-03-13 14:18:05 +01:00
}
public void Stop()
{
Logging.Log(LogLevel.INFO, "SkyScanner: Stop()");
2019-04-04 00:50:53 +02:00
Checker.Stop();
2019-03-15 07:43:12 +01:00
StopCrawler();
2019-03-15 15:35:44 +01:00
new Thread(() => ConveniencePool.Close()).Start();
2019-03-18 08:12:54 +01:00
StopHttpServer();
lock (this)
{
Monitor.Pulse(this);
}
2019-03-13 14:18:05 +01:00
}
/** HTTP Server **/
public ComponentState HttpStatus
{
get
{
if (HTTPServer != null)
{
if (HTTPServer.IsRunning)
return ComponentState.STARTED;
return ComponentState.INITIALIZED;
}
return ComponentState.STOPPED;
}
}
public void StartHttpServer()
{
HTTPServer = new HTTPServer();
HTTPServer.AddEndpoint(new System.Net.IPEndPoint(IPAddress.Any,8080));
HTTPServer.DefaultApplication = new SkyScannerHttpApplication(this);
HTTPServer.Start();
}
public void StopHttpServer()
{
if (HTTPServer != null)
{
if (HTTPServer.IsRunning)
{
HTTPServer.Stop();
}
}
}
2019-03-14 08:36:02 +01:00
/** Crawler **/
public ComponentState CrawlerStatus
{
get
{
if (Crawler != null)
{
2019-03-15 15:35:44 +01:00
return Crawler.CrawlerState;
2019-03-14 08:36:02 +01:00
}
return ComponentState.STOPPED;
}
}
2019-03-13 14:18:05 +01:00
2019-03-14 13:31:15 +01:00
public void StartCrawler()
{
if (Crawler == null)
{
Crawler = new Crawler(this);
}
2019-03-18 08:12:54 +01:00
else
{
Crawler.Start();
}
2019-03-14 13:31:15 +01:00
}
public void StopCrawler()
{
if (Crawler != null)
2019-03-18 08:12:54 +01:00
{
2019-03-14 13:31:15 +01:00
Crawler.Stop();
}
}
2019-07-03 10:54:46 +02:00
public void BenchmarkODB()
{
int maxIterations = 10000;
for (int i = 0; i < maxIterations; i++)
{
int n = 0;
Logging.Log(LogLevel.INFO, "Benchmark ODB: Iteration {0} of {1}", i, maxIterations);
foreach (SkyCheckState checkState in SkyScanner.Instance.Entities.SkyCheckStates.ToArray())
{
SkyScanner.Instance.Entities.SkyCheckStates.Upsert(checkState);
n++;
}
Logging.Log(LogLevel.INFO, "Saved {0} SkyCheckStates", n);
2019-03-14 13:31:15 +01:00
2019-07-03 10:54:46 +02:00
}
}
2019-03-13 14:18:05 +01:00
2019-07-08 13:14:49 +02:00
public void DebugCheck(String uniqueID)
{
Logger.ConsoleLogger.MaxLogLevel = LogLevel.DEBUGFULL;
Node node = Entities.NodeCollection.Query("uniqueIdentity", uniqueID).FirstOrDefault();
if (node == null)
{
Logging.Log(LogLevel.INFO, "DebugCheck(): Node not found: uniqueIdentity={0}", uniqueID);
}
else
{
Logging.Log(LogLevel.INFO, "DebugCheck(): Node: {0}",JObject.FromObject(node).ToString());
CheckJob checkJob = new CheckJob(node);
Logging.Log(LogLevel.INFO, "Prepare...");
checkJob.Prepare();
Logging.Log(LogLevel.INFO, "Check...");
checkJob.RunJob();
}
}
2019-03-13 14:18:05 +01:00
}
}