public bool ConsolidationTask <T>() where T : IPingCastleReport { return(StartTask("PingCastle report consolidation (" + typeof(T).Name + ")", () => { if (String.IsNullOrEmpty(FileOrDirectory)) { FileOrDirectory = Directory.GetCurrentDirectory(); } if (!Directory.Exists(FileOrDirectory)) { WriteInRed("The directory " + FileOrDirectory + " doesn't exist"); return; } var consolidation = PingCastleReportHelper <T> .LoadXmls(FileOrDirectory, FilterReportDate); if (consolidation.Count == 0) { WriteInRed("No report has been found. Please generate one with PingCastle and try again. The task will stop."); return; } if (typeof(T) == typeof(HealthcheckData)) { var hcconso = consolidation as PingCastleReportCollection <HealthcheckData>; var report = new ReportHealthCheckConsolidation(); report.GenerateReportFile(hcconso, License, "ad_hc_summary.html"); ReportHealthCheckMapBuilder nodeAnalyzer = new ReportHealthCheckMapBuilder(hcconso); nodeAnalyzer.Log = Console.WriteLine; nodeAnalyzer.GenerateReportFile("ad_hc_summary_full_node_map.html"); nodeAnalyzer.FullNodeMap = false; nodeAnalyzer.CenterDomainForSimpliedGraph = CenterDomainForSimpliedGraph; nodeAnalyzer.GenerateReportFile("ad_hc_summary_simple_node_map.html"); var mapReport = new ReportNetworkMap(); mapReport.GenerateReportFile(hcconso, License, "ad_hc_hilbert_map.html"); } else if (typeof(T) == typeof(CompromiseGraphData)) { var gcconso = consolidation as PingCastleReportCollection <CompromiseGraphData>; var report = new ReportCompromiseGraphConsolidation(); report.GenerateReportFile(gcconso, License, "ad_cg_summary.html"); } } )); }
public bool GenerateDemoReportTask() { return(StartTask("Generating demo reports", () => { if (String.IsNullOrEmpty(FileOrDirectory)) { FileOrDirectory = Directory.GetCurrentDirectory(); } if (!Directory.Exists(FileOrDirectory)) { WriteInRed("The directory " + FileOrDirectory + " doesn't exist"); return; } string path = Path.Combine(FileOrDirectory, "demo"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var consolidation = PingCastleReportHelper <HealthcheckData> .LoadXmls(FileOrDirectory, FilterReportDate); if (consolidation.Count == 0) { WriteInRed("No report has been found. Please generate one with PingCastle and the Healtch Check mode. The program will stop."); return; } consolidation = PingCastleReportHelper <HealthcheckData> .TransformReportsToDemo(consolidation); foreach (HealthcheckData data in consolidation) { string domain = data.DomainFQDN; var endUserReportGenerator = PingCastleFactory.GetEndUserReportGenerator <HealthcheckData>(); string html = endUserReportGenerator.GenerateReportFile(data, License, Path.Combine(path, data.GetHumanReadableFileName())); data.SetExportLevel(ExportLevel); string xml = DataHelper <HealthcheckData> .SaveAsXml(data, Path.Combine(path, data.GetMachineReadableFileName()), EncryptReport); } } )); }
public bool CartoTask(bool PerformHealthCheckGenerateDemoReports) { List <HealthcheckAnalyzer.ReachableDomainInfo> domains = null; StartTask("Exploration", () => { HealthcheckAnalyzer hcroot = new HealthcheckAnalyzer(); domains = hcroot.GetAllReachableDomains(Port, Credential); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("List of domains that will be queried"); Console.ResetColor(); foreach (var domain in domains) { Console.WriteLine(domain.domain); } }); var consolidation = new PingCastleReportCollection <HealthcheckData>(); StartTask("Examining all domains in parallele (this can take a few minutes)", () => { BlockingQueue <string> queue = new BlockingQueue <string>(30); int numberOfThread = 100; Thread[] threads = new Thread[numberOfThread]; try { ThreadStart threadFunction = () => { for (; ;) { string domain = null; if (!queue.Dequeue(out domain)) { break; } try { Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] " + "Starting the analysis of " + domain); HealthcheckAnalyzer hc = new HealthcheckAnalyzer(); var data = hc.GenerateCartoReport(domain, Port, Credential, AnalyzeReachableDomains); consolidation.Add(data); Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] " + "Analysis of " + domain + " completed with success"); } catch (Exception ex) { Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] " + "Analysis of " + domain + " failed"); Trace.WriteLine("Exception while analysing domain " + domain + " : " + ex.Message); Trace.WriteLine(ex.StackTrace); } } }; // Consumers for (int i = 0; i < numberOfThread; i++) { threads[i] = new Thread(threadFunction); threads[i].Start(); } foreach (var domain in domains) { queue.Enqueue(domain.domain); } queue.Quit(); Trace.WriteLine("examining domains file completed. Waiting for worker thread to complete"); for (int i = 0; i < numberOfThread; i++) { threads[i].Join(); } Trace.WriteLine("Done examining domains"); } catch (Exception ex) { Trace.WriteLine("Exception while analysing domain in carto: " + ex.Message); Trace.WriteLine(ex.StackTrace); } finally { queue.Quit(); for (int i = 0; i < numberOfThread; i++) { if (threads[i] != null) { if (threads[i].ThreadState == System.Threading.ThreadState.Running) { threads[i].Abort(); } } } } }); if (PerformHealthCheckGenerateDemoReports) { Console.WriteLine("Performing demo report transformation"); Trace.WriteLine("Performing demo report transformation"); consolidation = PingCastleReportHelper <HealthcheckData> .TransformReportsToDemo(consolidation); } if (!StartTask("Healthcheck consolidation", () => { consolidation.EnrichInformation(); ReportHealthCheckMapBuilder nodeAnalyzer = new ReportHealthCheckMapBuilder(consolidation, License); nodeAnalyzer.Log = Console.WriteLine; nodeAnalyzer.CenterDomainForSimpliedGraph = CenterDomainForSimpliedGraph; nodeAnalyzer.GenerateReportFile("ad_carto_full_node_map.html"); nodeAnalyzer.FullNodeMap = false; nodeAnalyzer.CenterDomainForSimpliedGraph = CenterDomainForSimpliedGraph; nodeAnalyzer.GenerateReportFile("ad_carto_simple_node_map.html"); } )) { return(false); } return(true); }