ln.skyscanner/SkyScanner.cs

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();
}
}
}
}