📄 queryboks.java
字号:
} } /* Collections.sort(printList); for (Iterator j=printList.iterator(); j.hasNext();) { outl(String.valueOf(j.next())); } */ if (newCnt > 0 || dupCnt > 0) { Log.d("RUN", "Fount a total of " + newCnt + " new units, " + dupCnt + " duplicate units."); } long boksUsedTime = System.currentTimeMillis() - boksBeginTime; synchronized (boksReport) { boksReport.add(new BoksReport((int)boksUsedTime, bd)); } lastActivity = System.currentTimeMillis(); } long usedTime = System.currentTimeMillis() - beginTime; threadDone[num] = true; Log.freeThread(); Log.d("RUN", "** Thread done, time used: " + getBoksMacs.formatTime(usedTime) + ", waiting for " + getThreadsNotDone() + " **"); } private boolean verifyNetboxid(String netboxid) { try { ResultSet rs = Database.query("SELECT netboxid FROM netbox WHERE netboxid='"+netboxid+"'"); if (rs.next()) return true; } catch (SQLException e) { Log.d("VERIFY_NETBOXID", "Verify netboxid ("+netboxid+"), SQLException: " + e.getMessage() ); e.printStackTrace(System.err); } Log.w("VERIFY_NETBOXID", "Netbox ("+netboxid+") " + boksIdName.get(netboxid) + " no longer exists!"); return false; } private String getThreadsNotDone() { StringBuffer sb = new StringBuffer(); int startRange=0; boolean markLast=false; for (int i=0; i < threadDone.length+1; i++) { if (i != threadDone.length && !threadDone[i]) { if (!markLast) { startRange=i; markLast = true; } } else if (markLast) { String range = (startRange==i-1) ? String.valueOf(i-1) : startRange+"-"+(i-1); sb.append(","+range); markLast=false; } } if (sb.length() > 0) { sb.setCharAt(0, '['); } else { sb.insert(0, "["); } sb.append("]"); return sb.toString(); } /* private ArrayList processCDPCisco(String workingOnBoksid, String ip, String cs_ro, HashMap ifindexMp) throws SQLException, TimeoutException { } private ArrayList processCDPHP(String workingOnBoksid, String ip, String cs_ro, HashMap ifindexMp) throws SQLException, TimeoutException { ArrayList l = new ArrayList(); /* * Først henter vi ut antall i stack'en med MIB: * * .1.3.6.1.4.1.11.2.14.11.5.1.10.4.1.1 * * Denne gir ut et tall for hvert member, 0 er commanderen * */ /* String stackOid = "1.3.6.1.4.1.11.2.14.11.5.1.10.4.1.1"; String cdpOid = ".1.3.6.1.4.1.9.9.23.1.2.1.1.6"; String remoteIfOid = ".1.3.6.1.4.1.9.9.23.1.2.1.1.7"; ArrayList stackList; // Henter først antallet i stack'en: sSnmp.setParams(ip, cs_ro, stackOid); stackList = sSnmp.getAll(); if (stackList.isEmpty()) stackList.add(new String[] { "", "0" }); outld("processCDPHP: stackList.size: " + stackList.size() ); for (int i=stackList.size()-1; i >= 0; i--) { String[] stack = (String[])stackList.get(i); String modul = stack[1]; //String modul = String.valueOf(i+1); outld("processCDPHP: modul: " + modul); // Get the list of macs sSnmp.setParams(ip, cs_ro+(!stack[1].equals("0")?"@sw"+stack[1]:""), cdpOid); ArrayList cdpList = sSnmp.getAll(true); if (cdpList.size() == 0) continue; // Vi har fått noe via CDP, da kan vi trygt lukke CAM records safeCloseBoksidAdd(workingOnBoksid); sSnmp.setParams(ip, cs_ro+(!stack[1].equals("0")?"@sw"+stack[1]:""), remoteIfOid); ArrayList cdpRMpList = sSnmp.getAll(true); outld("In processCDPCDP(), cdpList.size: " + cdpList.size()); if (cdpList.size() != cdpRMpList.size()) outla(" *WARNING*: cdpList != cdpRMpList ("+cdpList.size()+" != "+cdpRMpList.size()+")."); for (int j=0; j<cdpList.size(); j++) { String[] cdps = (String[])cdpList.get(j); String port = cdps[0].substring(0, cdps[0].indexOf(".")); // Hent ut mp på andre siden if (cdpRMpList.size() <= j) continue; String[] remoteIf = (String[])cdpRMpList.get(j); // Opprett record for boksen bak porten PortBoks pm = processCDP(workingOnBoksid, cdps[1], port, modul, port, remoteIf[1].trim() ); if (pm == null) continue; pm.setIfindex(port); l.add(pm); outld("processCDPHP: Modul: " + pm.getModulS() + " Port: " + pm.getPortS() + " CDP: " + boksIdName.get(pm.getBoksId())); } } return l; }*/ /* * Shared CDP processing * */ private List processCDP(String workingOnBoksid) throws SQLException, TimeoutException { List l = new ArrayList(); List cdpList = sSnmp.getAll(getOid("cdpNeighbour"), true, 1); if (cdpList == null || cdpList.isEmpty()) { Log.d("PROCESS_CDP", "cdpList is " + cdpList + " for netboxid: " + workingOnBoksid + " OID: " + getOid("cdpNeighbour") ); return l; } // Vi har fått noe via CDP, da kan vi trygt lukke CAM records safeCloseBoksidAdd(workingOnBoksid); Map remoteIfMap = sSnmp.getAllMap(getOid("cdpRemoteIf"), true, 1); Log.d("PROCESS_CDP", "cdpList.size: " + cdpList.size()); if (remoteIfMap == null) { remoteIfMap = new HashMap(); Log.w("PROCESS_CDP", "Box supports cdpNeighbour, but not cdpRemoteIf. Run OID test again?"); } else { if (cdpList.size() != remoteIfMap.size()) Log.d("PROCESS_CDP", "cdpList != remoteIfMap ("+cdpList.size()+" != "+remoteIfMap.size()+")."); } // Hent liste over alle gamle ifindekser slik at vi kan slette de som ikke lenger eksisterer List unrecognizedCDP = new ArrayList(); Set oldUnrecIfind = new HashSet(); for (Iterator it = NetboxInfo.get(workingOnBoksid, "unrecognizedCDP", null); it.hasNext();) { String[] s = (String[])it.next(); oldUnrecIfind.add(s[0]); } for (Iterator it = cdpList.iterator(); it.hasNext();) { String[] cdps = (String[])it.next(); String ifindex = cdps[0]; String remoteName = cdps[1]; String remoteIf = (String)remoteIfMap.get(ifindex); String[] netboxidA = extractNetboxid(remoteName); if (netboxidA == null) { Log.d("PROCESS_CDP", "Not found, ("+workingOnBoksid+") "+boksIdName.get(workingOnBoksid)+", Ifindex: " + ifindex + " String: " + remoteName); unrecognizedCDP.add(new String[] { ifindex, remoteName }); oldUnrecIfind.remove(ifindex); continue; } String netboxid = netboxidA[0]; String sysname = (String)boksIdName.get(netboxid); // Opprett record for boksen bak porten PortBoks pm = new PortBoks(ifindex, netboxid, "CDP"); if (netboxidA.length > 1) { // Vi har også med modulnummer String zero = ""; try { if (Integer.parseInt(remoteIf) < 10) zero = "0"; } catch (NumberFormatException exp) { } remoteIf = (Integer.parseInt(netboxidA[1])+1) + zero + remoteIf; } pm.setRemoteIf(remoteIf); l.add(pm); foundCDPMp.add(ifindex); Log.d("PROCESS_CDP", "Ifindex: " + ifindex + " CDP: " + sysname + " remoteIf: " + remoteIf); // Nå vet vi at vi har funnet en boks via CDP bak denne porten, og da kan det ikke være andre Cisco eller HP-enheter bak her try { ResultSet rs = Database.query("SELECT COUNT(*) AS count FROM swp_netbox WHERE netboxid='"+workingOnBoksid+"' AND ifindex='"+ifindex+"' AND to_netboxid!='"+pm.getToNetboxid()+"' AND to_netboxid IN (SELECT netboxid FROM netbox JOIN type USING(typeid) WHERE cdp='t')"); if (rs.next() && rs.getInt("count") > 0) { String sql = "DELETE FROM swp_netbox WHERE netboxid='"+workingOnBoksid+"' AND ifindex='"+ifindex+"' AND to_netboxid!='"+pm.getToNetboxid()+"' AND to_netboxid IN (SELECT netboxid FROM netbox JOIN type USING(typeid) WHERE cdp='t')"; Log.d("PROCESS_CDP", "MUST DELETE("+rs.getInt("count")+"): " + sql); Database.update(sql); if (DB_COMMIT) Database.commit(); else Database.rollback(); } } catch (SQLException e) { Log.d("PROCESS_CDP", "SQLException: " + e.getMessage()); e.printStackTrace(System.err); } // Dersom denne porten går fra ikke-gw (sw,kant) til gw må vi slå remote interface opp i gwport // slik at vi kan sette boksbak og swportbak. if (!boksGwSet.contains(workingOnBoksid) && boksGwSet.contains(pm.getToNetboxid())) { // OK, ikke-gw -> gw String swportid = (String)swportidMap.get(workingOnBoksid+":"+ifindex); if (swportid != null) { // Setter boksbak og swportbak for alle matchende interfacer Log.d("PROCESS_CDP", "Updating boksbak("+workingOnBoksid+"), swportbak("+swportid+") for gw: " + boksIdName.get(netboxid)+", rIf: " + remoteIf); Database.update("UPDATE gwport SET to_netboxid = '"+workingOnBoksid+"', to_swportid = '"+swportid+"' WHERE moduleid IN (SELECT moduleid FROM module WHERE netboxid='"+netboxid+"') AND interface = '"+remoteIf+"'"); if (DB_COMMIT) Database.commit(); else Database.rollback(); } } } for (Iterator it = unrecognizedCDP.iterator(); it.hasNext();) { // Write this to netboxinfo String[] s = (String[])it.next(); NetboxInfo.put(workingOnBoksid, "unrecognizedCDP", s[0], s[1]); } for (Iterator it = oldUnrecIfind.iterator(); it.hasNext();) { String ifindex = (String)it.next(); NetboxInfo.remove(workingOnBoksid, "unrecognizedCDP", ifindex); } return l; } private String[] extractNetboxid(String s) { // Vi skal prøve å finne en boksid ut fra CDP strengen, som kan f.eks se slik ut: // 069003402(hb-sw) // tekno-sw200C01D80CEA4 // ntnu-gw2.ntnu.no // HP // mar-ans-601-1(000a57-b8d3c0) String[] r; // Først prøver vi bare strengen if (sysnameMap.containsKey(s)) { return new String[] { (String)sysnameMap.get(s) }; } // Så sjekker vi etter paranteser int i; if ( (i=s.indexOf("(")) != -1) { int end = s.indexOf(")"); if (end != -1) { String n = s.substring(i+1, end); if (sysnameMap.containsKey(n)) { return new String[] { (String)sysnameMap.get(n) }; } if ( (r=extractNetboxid(n)) != null) return r; s = s.substring(0, i); } } // No match so far, check if this is a HP stack member (-#) if (s.matches(".*-\\d")) { String sn = s.substring(0, s.length()-2); if ((r=extractNetboxid(sn)) != null) { return new String[] { r[0], s.substring(s.length()-1, s.length()) }; } } // Brute-force, legg til ett og ett tegn fra starten og sjekk String cur = null; // Hvis vi får flere matcher legger vi til det med flest tegn StringBuffer sb = new StringBuffer(); for (i=0; i < s.length(); i++) { sb.append(s.charAt(i)); if (sysnameMap.containsKey(sb.toString()) ) { cur = (String)sysnameMap.get(sb.toString() ); } } if (cur != null) return new String[] { cur }; // Så tar vi strengen motsatt vei, bare for sikkerhets skyld sb = new StringBuffer(); for (i=s.length()-1; i >= 0; i--) { sb.insert(0, s.charAt(i)); if (sysnameMap.containsKey(sb.toString() )) { cur = (String)sysnameMap.get(sb.toString() ); } } if (cur != null) return new String[] { cur }; return null; } private List processMacEntry(String netboxid, String ip, String cs_ro, String type, boolean csAtVlan) throws TimeoutException { List l = new ArrayList(); // HashSet for å sjekke for duplikater HashSet dupCheck = new HashSet(); HashSet foundBoksBak = new HashSet(); // Hent macadresser for hvert vlan og knytt disse til ifindex int activeVlanCnt=0; int unitVlanCnt=0; Set vlanSet; if (csAtVlan) { vlanSet = (Set)vlanBoksid.get(netboxid); if (vlanSet == null) { Log.d("PROCESS_MAC", "Missing vlanSet for netboxid: " + netboxid + ", aborting"); return l; } } else { vlanSet = new HashSet(); vlanSet.add(""); } // Så vi ikke venter så lenge dersom vi ikke får svar fra et vlan sSnmp.setTimeoutLimit(1); for (Iterator it = vlanSet.iterator(); it.hasNext();) { String vlan = String.valueOf(it.next()); String useCs = cs_ro + (vlan.length() == 0 ? "" : "@"+vlan); sSnmp.setParams(ip, useCs, "1"); Log.d("MAC_ENTRY", "Fetching vlan: " + vlan); // Hent porter som er i blocking (spanning-tree) mode List stpList; try { List mpBlocked = new ArrayList(); stpList = sSnmp.getAll(getOid("stpPortState")); if (stpList != null) { for (Iterator stpIt = stpList.iterator(); stpIt.hasNext();) { String[] s = (String[])stpIt.next(); if (s[1].equals("2")) mpBlocked.add(s[0]); } if (mpBlocked.size() == 0) { // Nå vet vi at ingen porter er blokkert på denne enheten på dette vlan HashMap blockedIfind = (HashMap)spanTreeBlocked.get(netboxid+":"+vlan); if (blockedIfind != null) { // Slett eksisterende innslag i databasen try { Log.d("MAC_ENTRY", "All ports on " + boksIdName.get(netboxid) + " are now non-blocking"); String sql = "DELETE FROM swportblocked WHERE EXISTS (SELECT swportid FROM swport JOIN module USING(moduleid) WHERE netboxid="+netboxid+" AND swportblocked.swportid=swportid)"; if (csAtVlan) sql += " AND vlan='"+vlan+"'"; Database.update(sql); if (DB_COMMIT) Database.commit(); else Database.rollback(); } catch (SQLException e) { Log.d("MAC_ENTRY", "While deleting from swportblocked ("+netboxid+","+vlan+"): SQLException: " + e.getMessage()); e.printStackTrace(System.err); } } } } // Hent macadresser på dette vlan sSnmp.setIfindexIs(SimpleSnmp.IFINDEX_VALUE); List macVlan = sSnmp.getAll(getOid("macPortEntry")); sSnmp.setIfindexIs(SimpleSnmp.IFINDEX_OID); Map portIndexMap = null; if (macVlan == null) { // Try 3Com SS mac macVlan = sSnmp.getAll(getOid("3cSSMac")); if (macVlan != null) { // We need to rewrite the list to match macPortEntry format, as well as create a portIndexMap List newMacVlan = new ArrayList(); portIndexMap = new HashMap(); for (Iterator macIt = macVlan.iterator(); macIt.hasNext();) { String[] s = (String[])macIt.next(); String[] mp = s[0].split("\\."); int module = Integer.parseInt(mp[0]); int port = Integer.parseInt(mp[1]); String ifindex = module + (port<10?"0":"") + port; newMacVlan.add(new String[] { util.join(mp, ".", 2), ifindex }); portIndexMap.put(ifindex, ifindex); } macVlan = newMacVlan; } } if (mpBlocked.isEmpty() && (macVlan == null || macVlan.isEmpty())) continue; // Hent mapping mellom ifIndex og intern portindex if (portIndexMap == null) { sSnmp.setIfindexIs(SimpleSnmp.IFINDEX_BOTH); portIndexMap = sSnmp.getAllMap(getOid("basePortIfIndex")); sSnmp.setIfindexIs(SimpleSnmp.IFINDEX_OID); } if (portIndexMap != null) { int blockedCnt=0; if (mpBlocked.size() > 0) { Map blockedIfind = (Map)spanTreeBlocked.get(netboxid+":"+vlan); if (blockedIfind == null) blockedIfind = new HashMap(); // Ingen porter er blokkert på dette vlan for (Iterator blockIt = mpBlocked.iterator(); blockIt.hasNext();) { String s = (String)blockIt.next(); String ifindex = (String)portIndexMap.get(s); if (ifindex == null) continue; // OK, nå kan vi sjekke om denne eksisterer fra før String swportid = (String)blockedIfind.remove(ifindex); if (swportid == null) { // Eksisterer ikke fra før, må settes inn, hvis den eksisterer i swport swportid = (String)swportidMap.get(netboxid+":"+ifindex); if (swportid != null) { // Find correct vlan String dbVlan = (vlan.length() == 0 ? (String)vlanMap.get(netboxid+":"+ifindex) : vlan); if (dbVlan == null) { Log.d("MAC_ENTRY", "Netboxid: " + netboxid + " blocked ifindex: " + ifindex + " is missing VLAN for swportid: " + swportid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -