package ciscoroutertool.rules; import nu.xom.*; import org.apache.commons.lang.StringEscapeUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; /** * Parses rule definitions and returns a list of rules to the system * @version 0.01ALPHA * @author Andrew Johnston */ public class RuleParser { /** * Loads rules from rules/ directory and returns them as cleaned Rule objects in an ArrayList * @return an ArrayList of rules */ public static ArrayList<Rule> getRules() { ArrayList<Rule> rules = new ArrayList<>(); //Get the current working directory String cwd = System.getProperty("user.dir"); String xmlDirectory = cwd + "/rules"; File xmlFolder = new File(xmlDirectory); File[] ruleFiles = xmlFolder.listFiles(); if (ruleFiles != null) { for (File rule : ruleFiles) { if (rule.isFile()) { Rule r = getRuleFromFile(rule); rules.add(r); } } } if (rules.size() == 0) { System.err.println("ERROR: No rules found. Scan will fail."); } return rules; } /** * Returns a Rule object from a given file * @param f The file to load the rule from * @return A Rule object */ public static Rule getRuleFromFile(File f) { Rule r = null; try { Builder parser = new Builder(); Document doc = parser.build(f); Element root = doc.getRootElement(); Element name = root.getFirstChildElement("Name"); String nameVal = name.getValue(); Element desc = root.getFirstChildElement("Description"); String descVal = desc.getValue(); Element severity = root.getFirstChildElement("Severity"); String sevVal = severity.getValue(); Element ruledef = root.getFirstChildElement("Rules"); Elements rules = ruledef.getChildElements(); String[] settings = new String[rules.size()]; String[] params = new String[rules.size()]; for (int i = 0; i < rules.size(); i++) { Element rule = rules.get(i); Element sett = rule.getFirstChildElement("Parameter"); settings[i] = StringEscapeUtils.unescapeXml(sett.getValue()); Element arg = rule.getFirstChildElement("Argument"); params[i] = StringEscapeUtils.unescapeXml(arg.getValue()); } r = new Rule(StringEscapeUtils.unescapeXml(nameVal), StringEscapeUtils.unescapeXml(descVal), sevVal, settings, params); } catch (ParsingException | IOException ex) { Logger.getLogger(RuleParser.class.getName()).log(Level.SEVERE, null, ex); } return r; } }