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 qArguments = new Queue(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(); } } } }