ln.skyscanner/SkyScanner.cs

185 lines
4.4 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 sharp.logging;
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-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-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-03-26 12:53:42 +01:00
Entities = new SkyEntities(this);
2019-04-04 00:50:53 +02:00
Checker = new SkyChecker();
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-03-13 14:18:05 +01:00
}
}