📄 networkdiscovery.java
字号:
// 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 + -