185 lines
4.4 KiB
C#
185 lines
4.4 KiB
C#
using System;
|
|
using ln.logging;
|
|
using ln.http;
|
|
using System.Net;
|
|
using ln.skyscanner.http;
|
|
using System.IO;
|
|
using ln.skyscanner.crawl;
|
|
using ln.types.threads;
|
|
using System.Threading;
|
|
using sharp.logging;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Converters;
|
|
using ln.skyscanner.checks;
|
|
using System.Collections.Generic;
|
|
namespace ln.skyscanner
|
|
{
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
public enum ComponentState { STOPPED, INITIALIZED, STARTED, FAILED, STOPPING }
|
|
|
|
public class SkyScanner
|
|
{
|
|
public static SkyScanner Instance { get; private set; }
|
|
|
|
public String[] Arguments { get; }
|
|
public String BasePath { get; private set; }
|
|
|
|
public Pool ConveniencePool { get; }
|
|
|
|
public HTTPServer HTTPServer { get; private set; }
|
|
public Crawler Crawler { get; private set; }
|
|
public SkyEntities Entities { get; private set; }
|
|
public SkyChecker Checker { get; private set; }
|
|
|
|
public MemoryLogger MemoryLogger { get; private set; }
|
|
|
|
public SkyScanner(String[] args)
|
|
:this()
|
|
{
|
|
MemoryLogger = new MemoryLogger(4096);
|
|
Logger.Default.Backends.Add(MemoryLogger);
|
|
|
|
Logging.Log(LogLevel.INFO, "SkyScanner: Constructor");
|
|
|
|
BasePath = Path.GetFullPath("/var/cache/ln.skyscanner");
|
|
|
|
Logging.Log(LogLevel.INFO, "SkyScanner: BasePath={0}", BasePath);
|
|
|
|
ConveniencePool = new Pool();
|
|
|
|
Arguments = args;
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
Entities = new SkyEntities(this);
|
|
Checker = new SkyChecker();
|
|
}
|
|
private SkyScanner()
|
|
{
|
|
if (Instance != null)
|
|
throw new NotSupportedException("only one SkyScanner may be created");
|
|
Instance = this;
|
|
}
|
|
|
|
|
|
public void Start()
|
|
{
|
|
Logging.Log(LogLevel.INFO, "SkyScanner: Start()");
|
|
|
|
StartHttpServer();
|
|
StartCrawler();
|
|
|
|
Checker.Start();
|
|
|
|
lock (this)
|
|
{
|
|
Monitor.Wait(this);
|
|
}
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
Logging.Log(LogLevel.INFO, "SkyScanner: Stop()");
|
|
|
|
Checker.Stop();
|
|
|
|
StopCrawler();
|
|
|
|
new Thread(() => ConveniencePool.Close()).Start();
|
|
|
|
StopHttpServer();
|
|
|
|
lock (this)
|
|
{
|
|
Monitor.Pulse(this);
|
|
}
|
|
}
|
|
|
|
|
|
/** 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();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/** Crawler **/
|
|
|
|
public ComponentState CrawlerStatus
|
|
{
|
|
get
|
|
{
|
|
if (Crawler != null)
|
|
{
|
|
return Crawler.CrawlerState;
|
|
}
|
|
return ComponentState.STOPPED;
|
|
}
|
|
}
|
|
|
|
public void StartCrawler()
|
|
{
|
|
if (Crawler == null)
|
|
{
|
|
Crawler = new Crawler(this);
|
|
}
|
|
else
|
|
{
|
|
Crawler.Start();
|
|
}
|
|
}
|
|
public void StopCrawler()
|
|
{
|
|
if (Crawler != null)
|
|
{
|
|
Crawler.Stop();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|