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

📄 networkdiscovery.java

📁 Network Administration Visualized 网络管理可视化源码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
		// Vi starter med å sette boksbak til null alle steder hvor status='down', slik at vi unngår løkker		{			Database.update("UPDATE swport SET to_netboxid = NULL, to_swportid = NULL WHERE link!='y' AND to_netboxid IS NOT NULL");			//if (DB_COMMIT) Database.commit(); // Vi ruller tilbake lenger ned i koden		}		// Find mapping for firewalled VLANs		Map fwVlanMap = new HashMap();		{			beginTime = System.currentTimeMillis();			ResultSet rs = Database.query("select vlan,netaddr from vlan join prefix using(vlanid) where vlan not in (select vlan from swport where vlan is not null) and nettype='lan' and prefixid in (select prefixid from arp where end_time='infinity' and mac not in (select mac from netboxmac))", true);			while (rs.next()) {				String vlan = rs.getString("vlan");				String netaddr = rs.getString("netaddr");				ResultSet rs2 = Database.query("select cam.sysname,cam.netboxid,cam.ifindex,vlan from arp join cam using(mac) join swport on (moduleid in (select moduleid from module where module.netboxid=cam.netboxid) and swport.ifindex=cam.ifindex) where ip << '" + netaddr + "' and cam.end_time='infinity' and arp.end_time='infinity' and (trunk=false or trunk is null) and vlan > 1");				if (rs2.next()) {					fwVlanMap.put(vlan, rs2.getString("vlan"));				}			}			Database.free(rs);			if (TIME_OUT) outl("Spent " + (System.currentTimeMillis()-beginTime) + " ms finding firewalled VLAN mappings (found " + fwVlanMap.size() + " mappings: " + fwVlanMap + ")<br>");		}		// select cam.sysname,cam.netboxid,cam.ifindex,vlan from arp join cam using(mac) join swport on (moduleid in (select moduleid from module where module.netboxid=cam.netboxid) and swport.ifindex=cam.ifindex) where ip << '129.241.23.0/26' and cam.end_time='infinity' and arp.end_time='infinity'and vlan > 1;		beginTime = System.currentTimeMillis();		Map dataStructs = new HashMap();		// Denne er egentlig bare nødvendig for debugging		HashMap boksName = new HashMap();		ResultSet rs = Database.query("SELECT netboxid,sysname FROM netbox");		while (rs.next()) boksName.put(rs.getString("netboxid"), rs.getString("sysname"));		Map vlanidVlan = new HashMap();		Map vlanidNettype = new HashMap();		rs = Database.query("SELECT vlanid,vlan,nettype FROM vlan");		while (rs.next()) {			if (rs.getString("vlan") != null) vlanidVlan.put(rs.getString("vlanid"), rs.getString("vlan"));			vlanidNettype.put(rs.getString("vlanid"), rs.getString("nettype"));		}		// Trenger å vite hva som er GW, alle linker til slike er nemlig 'o' og de skal ikke traverseres		HashSet boksGwSet = new HashSet();		rs = Database.query("SELECT netboxid FROM netbox WHERE catid IN ('GW', 'v6GW')");		while (rs.next()) boksGwSet.add(rs.getString("netboxid"));		// Oversikt over hvilke vlan som kjører på en swport mot gw		Map swportGwVlanMap = new HashMap();		rs = Database.query("SELECT DISTINCT to_swportid,vlan,gwportid FROM gwport JOIN gwportprefix USING(gwportid) JOIN prefix USING(prefixid) JOIN vlan USING(vlanid) JOIN module USING(moduleid) WHERE to_swportid IS NOT NULL AND vlan IS NOT NULL");		while (rs.next()) swportGwVlanMap.put(rs.getString("to_swportid")+":"+rs.getString("vlan"), rs.getString("gwportid"));		// Mapping from gwportid to the running vlanid and prefixid (needed for updating)		Map gwportVlanidMap = new HashMap();		rs = Database.query("SELECT DISTINCT gwportid,vlanid,netboxid FROM gwport JOIN gwportprefix USING(gwportid) JOIN prefix USING(prefixid) JOIN vlan USING(vlanid) JOIN module USING(moduleid) WHERE to_swportid IS NOT NULL");		while (rs.next()) gwportVlanidMap.put(rs.getString("gwportid"), new String[] { rs.getString("vlanid"), rs.getString("netboxid") } );		// Oversikt over hvilke linker:vlan som er blokkert av spanning tree		HashSet spanTreeBlocked = new HashSet();		rs = Database.query("SELECT swportid,vlan FROM swportblocked");		while (rs.next()) spanTreeBlocked.add(rs.getString("swportid")+":"+rs.getString("vlan"));		// Oversikt over ikke-trunker ut fra hver boks per vlan		HashMap nontrunkVlan = new HashMap();		//rs = Database.query("SELECT swportid,netboxid,to_netboxid,to_swportid,vlan FROM swport JOIN module USING(moduleid) WHERE (trunk='f' OR trunk IS NULL) AND to_netboxid IS NOT NULL AND vlan IS NOT NULL");		rs = Database.query("SELECT swportid,netboxid,to_netboxid,to_swportid,COALESCE(vlan,1) AS vlan FROM swport JOIN module USING(moduleid) WHERE (trunk='f' OR trunk IS NULL) AND to_netboxid IS NOT NULL");		while (rs.next()) {			HashMap nontrunkMap;			String key = rs.getString("netboxid")+":"+rs.getString("vlan");			if ( (nontrunkMap = (HashMap)nontrunkVlan.get(key)) == null) {				nontrunkMap = new HashMap();				nontrunkVlan.put(key, nontrunkMap);			}			HashMap hm = new HashMap();			hm.put("swportid", rs.getString("swportid"));			//hm.put("to_netboxid", rs.getString("netboxid"));			hm.put("netboxid", rs.getString("netboxid"));			hm.put("to_netboxid", rs.getString("to_netboxid"));			String toid = rs.getString("to_swportid") != null ? rs.getString("to_swportid") : rs.getString("to_netboxid");			nontrunkMap.put(toid, hm);		}		// Først må vi hente oversikten over hvilke vlan som kan kjøre på de forskjellige portene		HashMap allowedVlan = new HashMap();		rs = Database.query("SELECT netboxid,swportid,module,port,to_netboxid,hexstring FROM swport JOIN module USING(moduleid) JOIN swportallowedvlan USING (swportid) WHERE to_netboxid IS NOT NULL ORDER BY to_netboxid");		while (rs.next()) {			HashMap boksAllowedMap;			String boksid = rs.getString("netboxid");			if ( (boksAllowedMap = (HashMap)allowedVlan.get(boksid)) == null) {				boksAllowedMap = new HashMap();				allowedVlan.put(boksid, boksAllowedMap);			}			HashMap hm = new HashMap();			hm.put("swportid", rs.getString("swportid"));			hm.put("netboxid", rs.getString("netboxid"));			hm.put("module", rs.getString("module"));			hm.put("port", rs.getString("port"));			hm.put("to_netboxid", rs.getString("to_netboxid"));			hm.put("hexstring", rs.getString("hexstring"));			String boksbak = rs.getString("to_netboxid");			if (boksAllowedMap.containsKey(boksbak)) outl("<font color=red>WARNING</font>: Multiple trunks between <b>"+boksName.get(boksid)+"</b> and <b>"+boksName.get(boksbak)+"</b><br>");			boksAllowedMap.put(boksbak, hm);		}		// Vi trenger å vite hvilke vlan som går ut på ikke-trunk fra en gitt boks		// Bruker da en HashMap av HashSets		HashMap activeVlan = new HashMap();		// vlan er aktivt på port selv om den er nede, og vi må ta med vlan'et IP'en på selve boksen er på		//rs = Database.query("(SELECT DISTINCT netboxid,vlan FROM swport JOIN module USING(moduleid) WHERE trunk='f' AND vlan IS NOT NULL) UNION (SELECT DISTINCT netboxid,vlan FROM netbox JOIN prefix USING(prefixid) JOIN vlan USING(vlanid) WHERE vlan IS NOT NULL)");		rs = Database.query("SELECT DISTINCT swportid,netboxid,COALESCE(vlan,1) AS vlan FROM swport JOIN module USING(moduleid) WHERE (trunk='f' OR trunk IS NULL) AND to_netboxid IS NULL");		while (rs.next()) {			Map m;			String netboxid = rs.getString("netboxid");			if ((m = (Map)activeVlan.get(netboxid)) == null) activeVlan.put(netboxid, m = new HashMap());						Set s;			if ((s = (Set)m.get(new Integer(rs.getInt("vlan")))) == null) m.put(new Integer(rs.getInt("vlan")), s = new HashSet());			s.add(rs.getString("swportid"));		}		// The VLAN of the netboxs' IP should also be added to activeVlan		rs = Database.query("SELECT netboxid,vlan FROM netbox JOIN prefix USING(prefixid) JOIN vlan USING(vlanid) WHERE vlan IS NOT NULL");		while (rs.next()) {			Map m;			String netboxid = rs.getString("netboxid");			if ((m = (Map)activeVlan.get(netboxid)) == null) activeVlan.put(netboxid, m = new HashMap());			Integer vl = new Integer(rs.getInt("vlan"));			if (!m.containsKey(vl)) m.put(vl, new HashSet());		}		// Mapping over hvilken swport from befinner seg bak en swport		HashMap swportidMap = new HashMap();		rs = Database.query("SELECT swportid,COALESCE(vlan,1) AS vlan,to_swportid FROM swport WHERE (trunk='f' OR trunk IS NULL) AND to_swportid IS NOT NULL");		while (rs.next()) {			HashMap hm = new HashMap();			hm.put("vlan", rs.getString("vlan"));			hm.put("to_swportid", rs.getString("to_swportid"));			swportidMap.put(rs.getString("swportid"), hm);		}		// Mapping av hvilket vlan som kjører mellom to bokser der vi ikke har to_swportid		Map nbvlanMap = new HashMap();		dataStructs.put("nbvlanMap", nbvlanMap);		rs = Database.query("SELECT netboxid,to_netboxid,COALESCE(vlan,1) AS vlan FROM module JOIN swport USING(moduleid) WHERE (trunk='f' OR trunk IS NULL) AND to_netboxid IS NOT NULL AND to_swportid IS NULL ORDER BY netboxid");		while (rs.next()) {			String key = rs.getString("netboxid")+":"+rs.getString("to_netboxid");			if (nbvlanMap.containsKey(key)) {				outl("<font color=red>WARNING</font>: Multiple links between <b>"+boksName.get(rs.getString("netboxid"))+"</b> and <b>"+boksName.get(rs.getString("to_netboxid"))+" without exact swport knowledge (swportid)</b><br>");			} else {				nbvlanMap.put(key, rs.getString("vlan"));			}		}		// Bruker cam/arp til å sjekke vlan bak netbox / ifindex (når vi kommer fra trunk)		Map swportidVlanMap = new HashMap();		Set swportidVlanDupeSet = new HashSet();		dataStructs.put("swportidVlanMap", swportidVlanMap);		//rs = Database.query("SELECT netbox.sysname,swport.ifindex,vlan.vlan FROM netbox JOIN module USING(netboxid) JOIN swport USING(moduleid) JOIN cam ON (netbox.netboxid = cam.netboxid AND swport.ifindex = cam.ifindex and cam.end_time = 'infinity') JOIN arp ON (cam.mac = arp.mac AND arp.end_time = 'infinity') JOIN prefix ON (arp.prefixid = prefix.prefixid) JOIN vlan USING(vlanid) GROUP BY netbox.sysname,swport.ifindex,vlan.vlan");		rs = Database.query("SELECT swportid,vlanid,COUNT(*) AS count FROM module JOIN swport USING(moduleid) JOIN cam ON (module.netboxid = cam.netboxid AND swport.ifindex = cam.ifindex and cam.end_time = 'infinity') JOIN arp ON (cam.mac = arp.mac AND arp.end_time = 'infinity') JOIN prefix ON (arp.prefixid = prefix.prefixid) JOIN vlan USING(vlanid) WHERE (trunk='f' OR trunk IS NULL) GROUP BY swportid,vlanid ORDER BY swportid,count DESC");		while (rs.next()) {			String key = rs.getString("swportid")+":"+rs.getString("vlanid");			if (swportidVlanDupeSet.add(key)) {				swportidVlanMap.put(rs.getString("swportid"), rs.getString("vlanid"));			} else {				outl("<font color=red>WARNING</font>: Multiple VLANs detected behind non-trunk port (swportid="+rs.getString("swportid")+", vlanid="+rs.getString("vlanid")+")<br>");			}		}		/*		// All non-trunk swportids		Set nontrunkSwportids = new HashSet();		rs = Database.query("SELECT swportid FROM swport WHERE (trunk='f' OR trunk IS NULL)");		while (rs.next()) {			nontrunkSwportids.add(rs.getString("swportid"));		}		*/		if (TIME_OUT) outl("Spent " + (System.currentTimeMillis()-beginTime) + " ms fetching data from db<br>");		// Så henter vi ut alle vlan og hvilken switch vlanet "starter på"		outl("<pre>");		//rs = Database.query("SELECT module.netboxid,vlan,netaddr,sysname,gwport.to_netboxid,gwport.to_swportid,trunk,hexstring FROM prefix JOIN gwport ON (rootgwid=gwportid) JOIN module USING(moduleid) JOIN netbox USING (netboxid) LEFT JOIN swport ON (gwport.to_swportid=swportid) LEFT JOIN swportallowedvlan USING (swportid) WHERE (gwport.to_netboxid IS NOT NULL OR catid='GSW') AND vlan IS NOT NULL ORDER BY vlan");		beginTime = System.currentTimeMillis();		rs = Database.query("SELECT DISTINCT module.netboxid,vlanid,vlan.vlan,sysname,gwportid,gwport.to_netboxid,gwport.to_swportid,trunk,hexstring FROM prefix JOIN vlan USING(vlanid) JOIN gwportprefix ON (prefix.prefixid = gwportprefix.prefixid AND (hsrp='t' OR gwip::text IN (SELECT MIN(gwip::text) FROM gwportprefix GROUP BY prefixid HAVING COUNT(DISTINCT hsrp) = 1))) JOIN gwport USING(gwportid) JOIN module USING(moduleid) JOIN netbox USING (netboxid) LEFT JOIN swport ON (gwport.to_swportid=swportid) LEFT JOIN swportallowedvlan USING (swportid) WHERE (gwport.to_netboxid IS NOT NULL OR catid='GSW') AND vlan.vlan IS NOT NULL ORDER BY vlan.vlan");		Set vlansWithRouter = new HashSet();		while (rs.next()) {			vlansWithRouter.add(rs.getString("vlan"));		}		rs.beforeFirst();		ArrayList trunkVlan = new ArrayList();		Set doneVlan = new HashSet();		Set visitedNodeSet = new HashSet(); // Settet av noder vi har besøkt; resettes for hvert vlan		Set foundGwSet = new HashSet();		// ***** BEGIN DEPTH FIRST SEARCH ***** //		while (rs.next()) {			int vlan = rs.getInt("vlan");			if (fwVlanMap.containsKey(""+vlan) && !vlansWithRouter.contains(fwVlanMap.get(""+vlan))) {				if (DEBUG_OUT) outl("Mapping vlan " + vlan + " to " + fwVlanMap.get(""+vlan));				vlan = Integer.parseInt((String)fwVlanMap.get(""+vlan));			}			int vlanid = rs.getInt("vlanid"); 			String boksid = rs.getString("netboxid");			String nettype = (String)vlanidNettype.get(""+vlanid);			doneVlan.add(""+vlan);			/*			if (!doneVlan.add(new Integer(vlanid))) {				// Duplicate vlanid, check if we already found this gw				if (foundGwSet.contains(boksid+":"+vlanid)) continue;				// Now we need to split the vlan				String[] ins = {					"vlanid", "",					"vlan", rs.getString("vlan"),					"nettype", nettype				};				int oldVlanid = vlanid;				vlanid = Integer.parseInt(Database.insert("vlan", ins, null));				System.err.println("Splitting vlan: " + rs.getString("vlan") + " ("+oldVlanid+"), new vlanid: " + vlanid + ", gwportid: " + rs.getString("gwportid"));				Database.update("UPDATE prefix SET vlanid="+vlanid+" WHERE prefixid IN (SELECT prefixid FROM gwportprefix WHERE gwportid="+rs.getString("gwportid")+")");			}			*/			visitedNodeSet.clear();			//String netaddr = rs.getString("netaddr");			String netaddr = "NA";			String boksbak = rs.getString("to_netboxid");			if (boksbak == null || boksbak.length() == 0) boksbak = boksid; // Spesialtilfelle for GSW enheter			String swportbak = rs.getString("to_swportid");			boolean cameFromTrunk = rs.getBoolean("trunk");			String hexstring = rs.getString("hexstring");			if (DEBUG_OUT) outl("\n<b>NEW VLAN: " + vlan + "</b> (netaddr: <b>"+netaddr+"</b>)<br>");			// Sjekk om det er en trunk eller ikke-trunk ned til gw'en			if (cameFromTrunk) {				// Nå forventer vi at hexstring er på plass				if (hexstring == null) {					if (DEBUG_OUT) outl("\n<b>AllowedVlan hexstring for trunk down to switch is missing, skipping...</b><br>");					continue;				}				// Sjekk vi om vi faktisk har lov til å kjøre på trunken				if (!isAllowedVlan(hexstring, vlan)) {					if (DEBUG_OUT) outl("\n<b>Vlan is not allowed on trunk down to switch, and there is no non-trunk, skipping...</b><br>");					continue;				}			}			/*			// Vi må nå sjekke om det er en ikke-trunk opp fra switchen til denne gw'en på dette vlan'et			String key = boksbak+":"+vlan;			HashMap nontrunkMap = (HashMap)nontrunkVlan.get(key);			if (nontrunkMap != null) {				// Det er porter på vlanet ihvertfall, men er det noen til gw'en?				HashMap swrec = (HashMap)nontrunkMap.get(boksid);				if (swrec != null) {					// Jo, ok, da lagrer vi den virkelige swportid'en					 swportid = (String)swrec.get("swportid");					 cameFromTrunk = false;				 }			 }			 if (cameFromTrunk) {				 // Det er ikke en ikke-trunk mellom gw og sw, altså må det være en trunk				 // Da må vi først sjekke at vlanet har lov til å kjøre				if (rs.getString("hexstring") == null) {					if (DEBUG_OUT) outl("\n<b>AllowedVlan hexstring for trunk down to switch is missing, and there is no non-trunk, skipping...</b><br>");					continue;				} else if (!isAllowedVlan(rs.getString("hexstring"), vlan)) {					if (DEBUG_OUT) outl("\n<b>Vlan is not allowed on trunk down to switch, and there is no non-trunk, skipping...</b><br>");					continue;				}				// OK, vi har lov til å kjøre på trunken, lagre swportid for denne				swportid = rs.getString("swportid");			}			*/			// Så traverserer vi linken ned til sw'en			//  vlanTraverseLink(int vlan, String fromid, String boksid, boolean cameFromTrunk, boolean setDirection, HashMap nontrunkVlan, HashMap allowedVlan, HashMap activeVlan, HashSet spanTreeBlocked, ArrayList trunkVlan, HashSet visitNode, int level, Com com, boolean DEBUG_OUT, HashMap boksName)						// List of gwports we have uplink to			List foundGwports = new ArrayList();			if (vlanTraverseLink(vlan, vlanid, boksid, boksbak, cameFromTrunk, true, nontrunkVlan, allowedVlan, activeVlan, swportidMap, spanTreeBlocked, trunkVlan, dataStructs, foundGwports, visitedNodeSet, 0, DEBUG_OUT, boksGwSet, swportGwVlanMap, boksName)) {				// Vlanet er aktivt på enheten, så da legger vi det til				if (swportbak != null) {					String[] tvlan = {						swportbak,						String.valueOf(vlanid),						"o"					};					trunkVlan.add(tvlan);				}				// If any gwports use a different vlanid we must change it to the current one				for (Iterator it = foundGwports.iterator(); it.hasNext();) {					String gwportid = (String)it.next();					String[] vlanPrefix = (String[])gwportVlanidMap.get(gwportid);					String oldVlanid = vlanPrefix[0];					String gwNetboxid = vlanPrefix[1];					foundGwSet.add(gwNetboxid+":"+vlanid);					if (vlanid != Integer.parseInt(oldVlanid)) {						// Swap in prefix						Database.update("UPDATE prefix SET vlanid="+vlanid+" WHERE prefixid IN (SELECT prefixid FROM gwportprefix WHERE gwportid="+gwportid+")");					}				}			}			/*			boolean b = false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -