using System; using ln.http.resources; using ln.skyscanner.entities; using System.Linq; using ln.skyscanner.crawl; using ln.types; using System.Net; using ln.types.threads; using ln.types.net; namespace ln.skyscanner.http { public class CrawlerApi : JsonCallResource { public SkyScanner SkyScanner { get; } public Crawler Crawler => SkyScanner.Crawler; public CrawlerApi(Resource container, SkyScanner skyScanner) : base(container, "crawler") { SkyScanner = skyScanner; } [Callable] public CrawledSubnet[] GetSubnets() { return Crawler?.CrawledSubnets.ToArray(); } [Callable] public CrawledHost[] GetHosts() { CrawledHost[] result = Crawler?.CrawledHosts.ToArray(); return result; } [Callable] public CrawledHost GetHostByIP(string _ip) { return SkyScanner.Crawler.FindHostForIP(IPv4.Parse(_ip)); } [Callable] public CrawledHost AddHost(string _ip, string name) { IPv4 ip = IPv4.Parse(_ip); CrawledHost host = SkyScanner.Crawler.FindHostForIP(ip); host.Name = name; SkyScanner.Crawler.CrawledHosts.Upsert(host); return host; } [Callable] public void Crawl(string _id) { Guid hostID = Guid.Parse(_id); SkyScanner.Crawler.Crawl(hostID); } [Callable] public PoolJob[] GetCurrentPoolJobs() { return SkyScanner.Crawler.CurrentJobs; } [Callable] public PoolJob[] GetQueuedJobs() { return SkyScanner.Crawler.QueuedJobs; } [Callable] public bool GetCrawlSubnets() { return SkyScanner.Crawler.CrawlSubnets; } [Callable] public void SetCrawlSubnets(bool enable) { SkyScanner.Crawler.CrawlSubnets = enable; } [Callable] public bool GetCrawlHosts() { return SkyScanner.Crawler.CrawlHosts; } [Callable] public void SetCrawlHosts(bool enable) { SkyScanner.Crawler.CrawlHosts = enable; } [Callable] public void ToggleCrawlHosts() { SkyScanner.Crawler.CrawlHosts = !SkyScanner.Crawler.CrawlHosts; } [Callable] public void ToggleCrawlSubnets() { SkyScanner.Crawler.CrawlSubnets = !SkyScanner.Crawler.CrawlSubnets; } [Callable] public Network4[] GetBlockedNetworks() { return Crawler.BlockedNetworks.ToArray(); } [Callable] public void AddBlockedNetwork(string _network) { Network4 blocked = Network4.Parse(_network); if (!Crawler.BlockedNetworks.Contains(blocked)) { Crawler.BlockedNetworks.Insert(blocked); } } [Callable] public void RemoveBlockedNetwork(string _network) { Network4 blocked = Network4.Parse(_network); foreach (Network4 blockedNetwork in Crawler.BlockedNetworks) { if (blockedNetwork.Equals(blocked)) { Crawler.BlockedNetworks.Delete(blockedNetwork); return; } } } } }