📄 gwporthandler.java
字号:
package no.ntnu.nav.getDeviceData.dataplugins.Gwport;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Collection;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set;import no.ntnu.nav.ConfigParser.ConfigParser;import no.ntnu.nav.Database.Database;import no.ntnu.nav.getDeviceData.Netbox;import no.ntnu.nav.getDeviceData.dataplugins.DataContainer;import no.ntnu.nav.getDeviceData.dataplugins.DataHandler;import no.ntnu.nav.getDeviceData.dataplugins.Module.ModuleHandler;import no.ntnu.nav.logger.Log;import no.ntnu.nav.netboxinfo.NetboxInfo;import no.ntnu.nav.util.util;/** * DataHandler plugin for getDeviceData; provides an interface for storing * router data, which includes modules, gwports, prefixes and vlans. * * @see GwportContainer */public class GwportHandler implements DataHandler { private static final boolean DEBUG_OUT = false; private static ConfigParser navCp; /** * Fetch initial data from module/gwport/prefix/vlan tables. */ public synchronized void init(Map persistentStorage, Map changedDeviceids) { if (persistentStorage.containsKey("initDone")) return; persistentStorage.put("initDone", null); navCp = (ConfigParser)persistentStorage.get("navCp"); } /** * Return a DataContainer object used to return data to this * DataHandler. */ public DataContainer dataContainerFactory() { return new GwportContainer(this); } Map gwportMap = new HashMap(); Map vlanMap = new HashMap(); Map prefixMap = new HashMap(); Map gwpMap = new HashMap(); Map gwVlanMap = new HashMap(); private Vlan vlanFactory(ResultSet rs) throws SQLException { Vlan vlan = new Vlan(rs.getString("netident"), rs.getInt("vlan")); vlan.setVlanid(rs.getInt("vlanid")); vlan.setNettype(rs.getString("nettype")); vlan.setOrgid(rs.getString("orgid")); vlan.setUsageid(rs.getString("usageid")); vlan.setDescription(rs.getString("description")); vlanMap.put(rs.getString("vlanid"), vlan); return vlan; } private Vlan getVlan(String vlanid) throws SQLException { // Create vlan Vlan vlan = (Vlan)vlanMap.get(vlanid); if (vlan == null) { ResultSet rs = Database.query("SELECT vlanid,vlan,nettype,orgid,usageid,netident,description FROM vlan WHERE vlanid='"+vlanid+"'"); if (rs.next()) { // Create vlan vlan = new Vlan(rs.getString("netident"), rs.getInt("vlan")); vlan.setVlanid(rs.getInt("vlanid")); vlan.setNettype(rs.getString("nettype")); vlan.setOrgid(rs.getString("orgid")); vlan.setUsageid(rs.getString("usageid")); vlan.setDescription(rs.getString("description")); vlanMap.put(rs.getString("vlanid"), vlan); } } return vlan; } private Prefix getPrefix(String cidr) throws SQLException { Prefix p = (Prefix)prefixMap.get(cidr); if (p == null) { ResultSet rs = Database.query("SELECT prefixid,netaddr AS cidr,host(netaddr) AS netaddr,masklen(netaddr) AS masklen,vlanid,gwportid FROM prefix LEFT JOIN gwportprefix USING(prefixid) WHERE netaddr='"+cidr+"'"); if (rs.next()) { p = new Prefix(rs.getString("netaddr"), rs.getInt("masklen"), getVlan(rs.getString("vlanid"))); p.setPrefixid(rs.getInt("prefixid")); prefixMap.put(rs.getString("cidr"), p); if (rs.getInt("gwportid") != 0) { do { p.addGwport(rs.getString("gwportid")); } while (rs.next()); } } } return p; } private Gwportprefix getGwportprefix(String gwip) throws SQLException { Gwportprefix gp = (Gwportprefix)gwpMap.get(gwip); if (gp == null) { ResultSet rs = Database.query("SELECT gwportid,gwip,hsrp,netaddr AS cidr FROM gwportprefix JOIN prefix USING(prefixid) WHERE gwip='"+gwip+"'"); if (rs.next()) { gp = new Gwportprefix(rs.getString("gwip"), rs.getBoolean("hsrp"), getPrefix(rs.getString("cidr"))); gwpMap.put(rs.getString("gwip"), gp); } } return gp; } /** * Store the data in the DataContainer in the database. */ public void handleData(Netbox nb, DataContainer dc, Map changedDeviceids) { if (!(dc instanceof GwportContainer)) return; GwportContainer gc = (GwportContainer)dc; if (!gc.isCommited()) return; // Let ModuleHandler update the module table first ModuleHandler mh = new ModuleHandler(); mh.handleData(nb, dc, changedDeviceids); // We protect the whole update procedure to be on the safe // side. This code executes very quickly compared to data // collection in any case. synchronized(getClass()) { Log.setDefaultSubsystem("GwportHandler"); int newcnt = 0, updcnt = 0, newPrefixCnt=0; boolean fixupPrefix = false; try { // Fill gwVlanMap { ResultSet rs = Database.query("SELECT vlanid,vlan,nettype,orgid,usageid,netident,description FROM vlan JOIN prefix USING(vlanid) JOIN gwportprefix USING(prefixid) JOIN gwport USING(gwportid) JOIN module USING(moduleid) WHERE vlan IS NOT NULL AND netboxid='"+nb.getNetboxid()+"'"); while (rs.next()) { String vlKey = nb.getNetboxid()+":"+rs.getString("vlan"); if (gwVlanMap.containsKey(vlKey)) { Vlan vl = (Vlan)gwVlanMap.get(vlKey); if (vl.getVlanid() != rs.getInt("vlanid")) { System.err.println("Detected duplicate vlan("+vlKey+") on same gw, deleting ..."); String prefixid = rs.getString("prefixid"); System.err.println(" Want to delete: " + rs.getString("vlanid") + ", dbvl: " + vl.getVlanid() + " p: " + rs.getString("prefixid")); Database.update("UPDATE prefix SET vlanid='"+vl.getVlanid()+"' WHERE vlanid='"+rs.getString("vlanid")+"'"); Database.update("DELETE FROM vlan WHERE vlanid='"+rs.getString("vlanid")+"'"); } } else { gwVlanMap.put(vlKey, vlanFactory(rs)); } } } Map removeGwipMap = new HashMap(); Set prefixUpdateSet = new HashSet(); for (Iterator gwModules = gc.getGwModules(); gwModules.hasNext();) { GwModule gwm = (GwModule)gwModules.next(); String moduleid = gwm.getModuleidS(); if ("0".equals(moduleid)) { System.err.println("Moduleid is null!! " + gwm); } // Fetch old gwp from database ResultSet rs = Database.query("SELECT gwportid,ifindex,interface,masterindex,speed,metric AS ospf,portname,gwip,hsrp,prefixid,netaddr AS cidr,host(netaddr) AS netaddr,masklen(netaddr) AS masklen,vlanid,vlanid,vlan,nettype,orgid,usageid,netident,description FROM gwport LEFT JOIN gwportprefix USING(gwportid) LEFT JOIN prefix USING(prefixid) LEFT JOIN vlan USING(vlanid) WHERE moduleid='"+moduleid+"'", true); while (rs.next()) { // Create vlan Vlan vlan = (Vlan)vlanMap.get(rs.getString("vlanid")); if (vlan == null && rs.getInt("vlanid") > 0) { vlan = vlanFactory(rs); } // Create prefix Prefix p = null; if (rs.getInt("prefixid") > 0) { p = getPrefix(rs.getString("cidr")); } // Create gwport Gwport gwp = new Gwport(rs.getString("ifindex"), rs.getString("interface")); gwp.setGwportid(rs.getInt("gwportid")); gwp.setMasterindex(rs.getInt("masterindex")); gwp.setSpeed(rs.getDouble("speed")); if (rs.getString("ospf") != null) gwp.setOspf(rs.getInt("ospf")); gwp.setPortname(rs.getString("portname")); gwportMap.put(rs.getString("ifindex"), gwp); if (rs.getString("gwip") != null) { // Create gwpMap if (gwpMap.containsKey(rs.getString("gwip"))) { System.err.println("***** ERROR - duplicate gwip " + rs.getString("gwip")); } Gwportprefix gp = new Gwportprefix(rs.getString("gwip"), rs.getBoolean("hsrp"), p); p.addGwport(rs.getString("gwportid")); gwpMap.put(rs.getString("gwip"), gp); gwp.addGwportprefix(rs.getString("gwip"), gp); } } Database.free(rs); errl(" GwModule: " + gwm); for (Iterator gwPorts = gwm.getGwports(); gwPorts.hasNext();) { Gwport gwp = (Gwport)gwPorts.next(); errl(" Gwport: " + gwp); // Check if this is a static entry for (Iterator gwportPrefices = gwp.getGwportPrefices(); gwportPrefices.hasNext();) { Gwportprefix gp = (Gwportprefix)gwportPrefices.next(); Prefix p = gp.getPrefix(); Vlan vl = p.getVlan(); if ("static".equals(vl.getNettype())) { // If nexthop is in gwpDbMap, don't add the static route rs = Database.query("SELECT prefixid FROM gwportprefix WHERE gwip='"+p.getNexthop()+"'"); if (rs.next()) { //System.err.println("Removing nexthop: " + p.getNexthop() + ", " + gwpDbMap.get(p.getNexthop())); gwportPrefices.remove(); } else { rs = Database.query("SELECT prefixid FROM prefix WHERE netaddr='"+p.getCidr()+"'"); if (rs.next()) { // Don't overwrite a non-static vlan with a static one Prefix oldp = getPrefix(p.getCidr()); Vlan oldv = oldp.getVlan(); if (!"static".equals(oldv.getNettype())) { //System.err.println("At " + nb.getSysname() + ", removed static prefix: " + p.getCidr() + " + p: " + p + " vl: " + vl + " oldp: " + oldp + " oldvl: " + oldv); gwportPrefices.remove(); } } } } } if (!gwp.getGwportPrefices().hasNext()) { errl(" Not adding gwp because no prefices: " + gwp); continue; } // Find old if exists String gwportid; //System.err.println(" GWP: " + gwp); //System.err.println("OLDGWP: " + oldgwp); Gwport oldgwp = (Gwport)gwportMap.remove(gwp.getIfindex()); if (oldgwp == null) { // Insert new Log.d("NEW_GWPORT", "Creating gwport: " + gwp); String masterindex = null; String[] ins = { "gwportid", "", "moduleid", moduleid, "ifindex", gwp.getIfindex(), "link", gwp.getLinkS(), "masterindex", masterindex, "interface", Database.addSlashes(gwp.getInterf()), "speed", gwp.getSpeedS(), "metric", gwp.getOspfS(), "portname", gwp.getPortname() }; gwportid = Database.insert("gwport", ins, null); newcnt++; } else { gwportid = oldgwp.getGwportidS(); if (!gwp.equalsGwport(oldgwp)) { // We must update Log.d("UPDATE_GWPORT", "Update gwportid: "+gwportid+" ifindex="+gwp.getIfindex()); String masterindex = null; String[] set = { "moduleid", gwm.getModuleidS(), "ifindex", gwp.getIfindex(), "link", gwp.getLinkS(), "masterindex", masterindex, "interface", Database.addSlashes(gwp.getInterf()), "speed", gwp.getSpeedS(), "metric", gwp.getOspfS(), "portname", gwp.getPortname() }; String[] where = { "gwportid", gwportid }; Database.update("gwport", set, where); updcnt++; } // Check which prefices are present in oldgwp, but not in // gwp, and remove them from the mentioned gwportprefix // entries Set removeGwip = oldgwp.gwipIntersection(gwp.gwipSet()); if (!removeGwip.isEmpty()) removeGwipMap.put(gwportid, removeGwip); } gwp.setGwportid(gwportid); for (Iterator gwportPrefices = gwp.getGwportPrefices(); gwportPrefices.hasNext();) { Gwportprefix gp = (Gwportprefix)gwportPrefices.next(); String gwip = gp.getGwip(); boolean hsrp = gp.getHsrp(); Prefix p = gp.getPrefix(); Vlan vl = p.getVlan(); //if (!vl.getNettype().equals("elink")) vl.setNettype(Vlan.UNKNOWN_NETTYPE); //if (vl.getNettype().equals("elink")) vl.setNetident(null); //vl.setNettype(Vlan.UNKNOWN_NETTYPE); if (vl.getNetident() != null) { vl.setNetident(util.remove(vl.getNetident(), navCp.get("DOMAIN_SUFFIX"))); } errl(" Gwip: " + gwip); errl(" Hsrp: " + hsrp); errl(" Prefix: " + p); errl(" Vlan: " + vl); String prefixid; Prefix oldp = getPrefix(p.getCidr()); if (oldp == null) { // There is no old gwportprefix and prefix does not contains the netaddr // Note: the gwpMap cannot contain getGwip now, so the next section will also match // Check if the vlan already exists on the gw if (vl.getVlan() != null) { String vlKey = nb.getNetboxid()+":"+vl.getVlanS(); if (gwVlanMap.containsKey(vlKey)) { Vlan gwvl = (Vlan)gwVlanMap.get(vlKey); vl.setVlanid(gwvl.getVlanid()); } else { gwVlanMap.put(vlKey, vl); } } if (vl.getVlanid() == 0) { Log.d("NEW_PREFIX", "Creating vlan: " + vl); createVlan(vl); fixupPrefix = true; } String[] ins = { "prefixid", "", "netaddr", p.getCidr(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -