📄 getboksmacs.java
字号:
vlanMap.put(rs.getString("netboxid")+":"+rs.getString("ifindex"), rs.getString("vlan")); } // netboxid+interface -> swportid QueryBoks.interfaceMap = new HashMap(); Map interfaceMap = QueryBoks.interfaceMap; rs = Database.query("SELECT netboxid,ifindex,interface,swportid FROM swport JOIN module USING(moduleid) ORDER BY ifindex DESC"); while (rs.next()) { interfaceMap.put(rs.getString("netboxid")+":"+rs.getString("ifindex"), rs.getString("swportid")); if (rs.getString("interface") != null) { interfaceMap.put(rs.getString("netboxid")+":"+rs.getString("interface"), rs.getString("swportid")); } } QueryBoks.mpMap = new HashMap(); Map mpMap = QueryBoks.mpMap; rs = Database.query("SELECT netboxid,ifindex,module,interface FROM swport JOIN module USING(moduleid) WHERE interface IS NOT NULL"); while (rs.next()) { mpMap.put(rs.getString("netboxid")+":"+rs.getString("ifindex"), new String[] { rs.getString("module"), rs.getString("interface") } ); } // For CAM-logger, alle uavsluttede CAM-records (dvs. alle steder hvor til er null) if (DUMP_CAM) { out(" cam..."); dumpBeginTime = System.currentTimeMillis(); rs = Database.query("SELECT camid,netboxid,ifindex,REPLACE(mac::text, ':', '') AS mac,misscnt FROM cam WHERE (end_time = 'infinity' OR misscnt >= 0) AND netboxid IS NOT NULL ORDER BY end_time"); while (rs.next()) { String key = rs.getString("netboxid")+":"+rs.getString("ifindex")+":"+rs.getString("mac"); String[] oldkey; if ( (oldkey=(String[])unclosedCam.put(key, new String[] { rs.getString("camid"), rs.getString("misscnt") } )) != null) { // Set misscnt = NULL String camid = oldkey[0]; Database.update("UPDATE cam SET misscnt = NULL, end_time = CASE end_time WHEN 'infinity' THEN now() ELSE end_time END WHERE camid='"+camid+"'"); errl("Error, found duplicate in cam for key: " + key + " (camid: " + camid + ")");/*DELETE FROM cam WHERE end_time='infinity' AND (netboxid,ifindex,mac) IN (SELECT netboxid,ifindex,mac FROM cam WHERE end_time='infinity' GROUP BY netboxid,ifindex,mac HAVING COUNT(camid) > 1) AND start_time NOT IN (SELECT MIN(start_time) AS start_time FROM cam WHERE end_time='infinity' GROUP BY netboxid,ifindex,mac HAVING COUNT(camid) > 1)SELECT * FROM cam WHERE end_time='infinity' AND (netboxid,ifindex,mac) IN (SELECT netboxid,ifindex,mac FROM cam WHERE end_time='infinity' GROUP BY netboxid,ifindex,mac HAVING COUNT(camid) > 1) AND start_time NOT IN (SELECT MIN(start_time) AS start_time FROM cam WHERE end_time='infinity' GROUP BY netboxid,ifindex,mac HAVING COUNT(camid) > 1)if duplikat if ny record har end_time=infinity sett misscnt = NULL for eksisterende record legg ny record i hash else sett misscnt = NULL for record som har eldst end_time*/ } } dumpUsedTime = System.currentTimeMillis() - dumpBeginTime; outl(dumpUsedTime + " ms."); } //Database.setDefaultKeepOpen(true); if (qNetbox == null) { rs = Database.query("SELECT ip,ro,netboxid,typename,catid,sysName,vendorid,cdp,cs_at_vlan FROM netbox JOIN type USING(typeid) WHERE catid IN ('SW','EDGE','WLAN','GW','GSW') AND up='y' AND ro IS NOT NULL"); } else if (qNetbox.equals("_gw")) { //rs = Database.query("SELECT ip,ro,boksid,typeid,typegruppe,kat,sysName FROM boks NATURAL JOIN type WHERE kat='GW'"); } else if (qNetbox.equals("_sw")) { //rs = Database.query("SELECT ip,ro,boksid,typeid,typegruppe,kat,sysName FROM boks NATURAL JOIN type WHERE kat='SW'"); } else if (qNetbox.equals("_kant")) { //rs = Database.query("SELECT ip,ro,boksid,typeid,typegruppe,kat,sysName FROM boks NATURAL JOIN type WHERE kat='EDGE'"); } else { rs = Database.query("SELECT ip,ro,netboxid,typename,catid,sysName,vendorid,cdp,cs_at_vlan FROM netbox JOIN type USING(typeid) WHERE sysName='"+qNetbox+"' AND ro IS NOT NULL"); //rs = Database.query("SELECT ip,ro,boksid,typeid,typegruppe,kat,sysName FROM boks NATURAL JOIN type WHERE prefiksid in (2089,1930) AND boksid != 241"); //rs = Database.query("SELECT ip,ro,boksid,typeid,typegruppe,kat,sysName FROM boks NATURAL JOIN type WHERE typegruppe in ('cat-sw', 'ios-sw')"); } //Database.setDefaultKeepOpen(false); Stack bdStack = new Stack(); while (rs.next()) { BoksData bd = new BoksData(); bd.ip = rs.getString("ip"); bd.cs_ro = rs.getString("ro"); bd.boksId = rs.getString("netboxid"); bd.boksType = rs.getString("typename"); bd.sysName = rs.getString("sysname"); bd.kat = rs.getString("catid"); bd.vendor = rs.getString("vendorid"); bd.cdp = rs.getBoolean("cdp"); bd.csAtVlan = rs.getBoolean("cs_at_vlan"); bdStack.push(bd); } int antBd = bdStack.size(); // Sett datastrukturer for alle tråder QueryBoks.DB_COMMIT = DB_COMMIT; QueryBoks.macBoksId = macBoksId; QueryBoks.boksIdName = boksIdName; QueryBoks.boksidKat = boksidKat; QueryBoks.boksidType = boksidType; QueryBoks.sysnameMap = sysnameMap; QueryBoks.downBoksid = downBoksid; QueryBoks.spanTreeBlocked = spanTreeBlocked; QueryBoks.cdpBoks = cdpBoks; QueryBoks.vlanBoksid = vlanBoksid; QueryBoks.oidDb = oidDb; QueryBoks.setFoundBoksBakSwp(foundBoksBakSwp); QueryBoks.unclosedCam = unclosedCam; QueryBoks.safeCloseBoksid = safeCloseBoksid; QueryBoks.watchMacs = watchMacs; // Indikerer om en tråd er ferdig QueryBoks.initThreadDone(NUM_THREADS); // Start activity monitor, every minute Timer activityTimer = new Timer(); activityTimer.schedule(new ActivityMonitorTask(), 60 * 1000, 60 * 1000); // Lag trådene long beginTime = System.currentTimeMillis(); Thread[] threads = new Thread[NUM_THREADS]; int digits = String.valueOf(NUM_THREADS-1).length(); for (int i=0; i < NUM_THREADS; i++) { threads[i] = new QueryBoks(i, format(i, digits), bdStack, antBd, swp, swp_d); threads[i].start(); } for (int i=0; i < NUM_THREADS; i++) { try { threads[i].join(); } catch (InterruptedException e) { errl("Error, got InterruptedException: " + e.getMessage() ); } } long usedTime = System.currentTimeMillis() - beginTime; // Sjekk om det er enheter som har forsvunnet int missinc=0,remcnt=0; Iterator iter = swp_d.values().iterator(); while (iter.hasNext()) { HashMap hm = (HashMap)iter.next(); String swp_boksid = (String)hm.get("swp_netboxid"); String boksid = (String)hm.get("netboxid"); if (!safeCloseBoksid.contains(boksid)) continue; // Dersom boksen bak er nede skal vi ikke slette String boksbak = (String)hm.get("to_netboxid"); if (downBoksid.contains(boksbak)) continue; int misscnt = Integer.parseInt((String)hm.get("misscnt")); misscnt++; if (misscnt > MAX_MISSCNT) { remcnt++; // Slett record fra swp_boks Database.update("DELETE FROM swp_netbox WHERE swp_netboxid = '"+swp_boksid+"'"); if (DB_COMMIT) Database.commit(); else Database.rollback(); } else { missinc++; // Øk misscnt med 1 Database.update("UPDATE swp_netbox SET misscnt=misscnt+1 WHERE swp_netboxid = '"+swp_boksid+"'"); if (DB_COMMIT) Database.commit(); else Database.rollback(); } } int swpResetCnt = QueryBoks.getSwpResetMisscnt(); Log.d("STATS", "swp_netbox: A total of " + prependSpace(missinc,4) + " units were missed, " + prependSpace(swpResetCnt,4) + " units were reset, " + prependSpace(remcnt,4) + " units were removed."); int[] camCnt = finishCam(MAX_MISSCNT); int camMissinc = camCnt[0]; int camRemCnt = camCnt[1]; int camResetCnt = QueryBoks.getCamResetMisscnt(); Log.d("STATS", "cam : A total of " + prependSpace(camMissinc,4) + " records were missed, " + prependSpace(camResetCnt,4) + " records were reset, " + prependSpace(camRemCnt,4) + " records were closed."); ArrayList boksReport = QueryBoks.boksReport; Collections.sort(boksReport); digits = String.valueOf(Math.min(SHOW_TOP, boksReport.size())).length(); for (int i=0; i < SHOW_TOP && i < boksReport.size(); i++) { BoksReport br = (BoksReport)boksReport.get(i); Log.d("STATS", format(i+1, digits)+": " + formatTime(br.getUsedTime()) + ", " + br.getBoksData().sysName + " (" + br.getBoksData().boksType + ") (" + br.getBoksData().ip + ")"); } Database.closeConnection(); Log.d("STATS", "All done, time used: " + formatTime(usedTime) + "."); // Create a job-finished file try { char sep = File.separatorChar; File f = new File(Path.localstatedir+sep+"run"+sep+"boksmacs-finished.flag"); f.createNewFile() ; } catch (SecurityException e) { errl("Error, cannot write to user.dir: " + e.getMessage() ); } catch (IOException e) { errl("Cannot create job-finished, got IOException: " + e.getMessage() ); } outflush(); errflush(); System.exit(0); } // Lukker records i CAM-tabellen private static int[] finishCam(final int MAX_MISSCNT) { // Nå går vi gjennom og lukker alle records vi ikke har funnet igjen int missInc=0,remCnt=0; Iterator iter = unclosedCam.entrySet().iterator(); while (iter.hasNext()) { Map.Entry me = (Map.Entry)iter.next(); String key = (String)me.getKey(); StringTokenizer st = new StringTokenizer(key, ":"); String boksid = st.nextToken(); if (!safeCloseBoksid.contains(boksid)) continue; String[] s = (String[])me.getValue(); String camid = s[0]; int misscnt=0; try { misscnt = Integer.parseInt(s[1]); } catch (NumberFormatException e) { } misscnt++; if (misscnt > MAX_MISSCNT) { // Nå skal vi virkelig lukke denne recorden try { String[] updateFields = { "misscnt", "null" }; String[] condFields = { "camid", camid }; Database.update("cam", updateFields, condFields); if (DB_COMMIT) Database.commit(); else Database.rollback(); } catch (SQLException e) { outl(" finishCam(): Closing record in cam, SQLException: " + e.getMessage() ); } remCnt++; } else { // Misscnt-feltet økes med en; dersom det var 0 fra før skal til settes til NOW() try { String[] updateFields; if (misscnt == 1) { String[] sa = { "end_time", "NOW()", "misscnt", String.valueOf(misscnt) }; updateFields = sa; } else { String[] sa = { "misscnt", String.valueOf(misscnt) }; updateFields = sa; } String[] condFields = { "camid", camid }; Database.update("cam", updateFields, condFields); if (DB_COMMIT) Database.commit(); else Database.rollback(); } catch (SQLException e) { outl(" finishCam(): Semi-closing record in cam, SQLException: " + e.getMessage() ); } missInc++; } } return new int[] { missInc, remCnt }; } private static String format(long i, int n) { DecimalFormat nf = new DecimalFormat("#"); nf.setMinimumIntegerDigits(n); return nf.format(i); } private static String prependSpace(long i, int n) { StringBuffer sb = new StringBuffer(String.valueOf(i)); int c = n-sb.length(); while (c > 0) { sb.insert(0, " "); c--; } return sb.toString(); } public static String formatTime(long t) { long h = t / (60 * 60 * 1000); t %= 60 * 60 * 1000; long m = t / (60 * 1000); t %= 60 * 1000; long s = t / (1000); t %= 1000; long ms = t; return format(h,2)+":"+format(m,2)+":"+format(s,2)+"."+format(ms,3); } private static HashMap getHashFromResultSet(ResultSet rs, ResultSetMetaData md, boolean convertNull) throws SQLException { HashMap hm = new HashMap(); for (int i=md.getColumnCount(); i > 0; i--) { String val = rs.getString(i); hm.put(md.getColumnName(i), (convertNull&&val==null)?"":val); } return hm; } private static String[] netelKat = { "GSW", "GW", "SW", "EDGE", "WLAN" }; private static Set netelSet = new HashSet(); public static boolean isNetel(String kat) { if (netelSet.isEmpty()) for (int i=0;i<netelKat.length;++i) netelSet.add(netelKat[i]); return netelSet.contains(kat.toUpperCase()); } private static boolean isAllowedVlan(String hexstr, int vlan) { if (hexstr.length() == 256) { return isAllowedVlanFwd(hexstr, vlan); } return isAllowedVlanRev(hexstr, vlan); } private static boolean isAllowedVlanFwd(String hexstr, int vlan) { if (vlan < 0 || vlan > 1023) return false; int index = vlan / 4; int allowed = Integer.parseInt(String.valueOf(hexstr.charAt(index)), 16); return ((allowed & (1<<3-(vlan%4))) != 0); } private static boolean isAllowedVlanRev(String hexstr, int vlan) { if (vlan < 0 || vlan > 1023) return false; int index = hexstr.length() - (vlan / 4 + 1); if (index < 0) return false; int allowed = Integer.parseInt(String.valueOf(hexstr.charAt(index)), 16); return ((allowed & (1<<(vlan%4))) != 0); } private static void out(Object o) { System.out.print(o); } private static void outl(Object o) { System.out.println(o); } private static void outflush() { System.out.flush(); } private static void err(Object o) { System.err.print(o); } private static void errl(Object o) { System.err.println(o); } private static void errflush() { System.err.flush(); }}class ActivityMonitorTask extends TimerTask { public void run() { if (QueryBoks.lastActivity < (System.currentTimeMillis() - 60*60*1000)) { // No activity in the last hour, exit System.err.println("Exiting due to no activity in the last hour"); System.err.flush(); System.exit(1); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -