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

📄 getboksmacs.java

📁 监控大型网络的软件。能够自动发现拓扑结构
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			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 + -