package ciscoroutertool.config; import ciscoroutertool.utils.Host; import nu.xom.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; /** * Manages the Device Configurations. This is separate from Application Settings * @version 0.01ALPHA * @author Andrew H. Johnston */ public class ConfigurationManager { /** * The hosts to save. */ private ArrayList<Host> hosts; /** * Initializes the Manager by reading the configuration into memory * @param config The file where the configuration is stored */ public ConfigurationManager(File config) { hosts = parseConfig(config); } /** * Turns the XML file into a list of host objects. * @param config The file to read from. * @return The list of hosts read from the file. */ private ArrayList<Host> parseConfig(File config) { ArrayList<Host> _hosts = new ArrayList<>(); try { Builder parser = new Builder(); Document doc = parser.build(config); Element root = doc.getRootElement(); Elements eHosts = root.getChildElements("Host"); for (int i = 0; i < eHosts.size(); i++) { String ip, user, pass; Element host = eHosts.get(i); ip = host.getFirstChildElement("IP").getValue(); //Handle the case where InetAddress gets stored with forward slash if (ip.contains("/")) { int index = ip.indexOf("/"); ip = ip.substring((index + 1)); } user = host.getFirstChildElement("Username").getValue(); pass = host.getFirstChildElement("Password").getValue(); InetAddress address = InetAddress.getByName(ip); //Check if there is a superuser password Element superuser = host.getFirstChildElement("ElevatePassword"); if (superuser == null) { _hosts.add(new Host(address, user, pass)); } else { Host h = new Host(address, user, pass); h.setEnable(true); h.setEnablePass(superuser.getValue()); _hosts.add(h); } } } catch (ParsingException | IOException ex) { Logger.getLogger(ConfigurationManager.class.getName()).log(Level.SEVERE, null, ex); } return _hosts; } /** * Retrieves the hosts stored in the file. * @return The list of hosts in the configuration file */ public ArrayList<Host> getAllHosts() { return hosts; } /** * Checks if there are saved hosts in the configuration file * @return true if there are hosts in the config file */ public boolean hasHosts() { return !hosts.isEmpty(); } /** * Add a host to the configuration file. * @param h The host to be added. */ public void addHost(Host h) { hosts.add(h); } /** * Saves the updated configuration to the specified file. */ public static void saveConfiguration(File save, ArrayList<Host> saveHosts) { Element root = new Element("Hosts"); for(Host h : saveHosts) { Element host = new Element("Host"); Element ip = new Element("IP"); ip.appendChild(h.getAddress().toString()); host.appendChild(ip); Element username = new Element("Username"); username.appendChild(h.getUser()); host.appendChild(username); Element password = new Element("Password"); password.appendChild(h.getPass()); host.appendChild(password); if(h.usesEnable()) { Element superuser = new Element("ElevatePassword"); superuser.appendChild(h.getEnablePass()); host.appendChild(superuser); } root.appendChild(host); } Document doc = new Document(root); FileWriter f = null; try { f = new FileWriter(save); } catch (IOException e) { e.printStackTrace(); } PrintWriter p = new PrintWriter(f); p.write(doc.toXML()); p.flush(); p.close(); } }