package ciscoroutertool.scanner;
import ciscoroutertool.rules.Rule;
import ciscoroutertool.rules.RuleParser;
import ciscoroutertool.utils.Host;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Runs the scan on each host and prepares data for the report
* @version 0.01ALPHA
* @author Andrew Johnston
*/
public class ScanManager {
/**
* The list of rules to run against each host
*/
private ArrayList<Rule> rules;
/**
* The hosts we are going to scan
*/
private ArrayList<Host> hosts;
/**
* The maximum number of scanners to run at once
*/
private static final int MAX_THREADS = 5;
/**
* Sets up the ScanManager so it can run scans against the hosts
* @param _hosts The hosts you want to scan
*/
public ScanManager(ArrayList<Host> _hosts) {
hosts = _hosts;
rules = RuleParser.getRules();
//Give the rules to the scanner class
Scanner.rules = rules;
}
/**
* Runs the scan on all hosts and returns the full report
* @return The report covering all hosts
*/
public FullReport run() {
FullReport fullReport = null;
try {
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
List<Future<HostReport>> futureReports;
ArrayList<HostReport> reports = new ArrayList<>();
ArrayList<Scanner> scanners = new ArrayList<>();
for (Host h : hosts) {
Scanner s = new Scanner(h);
scanners.add(s);
}
futureReports = executor.invokeAll(scanners);
for (Future<HostReport> fReport : futureReports) {
reports.add(fReport.get());
}
fullReport = new FullReport(reports);
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(ScanManager.class.getName()).log(Level.SEVERE, null, ex);
}
return fullReport;
}
}