⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gwporthandler.java

📁 Network Administration Visualized 网络管理可视化源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -