NetConnState.java 8.67 KB
/*
 * Created on 2006-8-1 NetConnState.java responsibility :maozr base class: ping
 * destination net address ,return package lost rate
 *  
 */
package com.sitech.ismp.coll;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import org.apache.log4j.Logger;

public class NetConnState {
	private Logger logger = Logger.getLogger("COLL");

	private NetConnObject NetConnObject = null;

	final boolean UNIX = true;// unix

	private String IP = null;

	/**
	 * this ip is you will ping
	 * 
	 * @param ip
	 */
	public NetConnState(String ip) {
		if (ip != null && ip.length() > 0) {
			NetConnObject = new NetConnObject();
			IP = ip;
		} else {
			logger.error("NetConnState IP IS NULL,Failture!!!");
		}
	}

	public NetConnObject getListenState() {
		logger.info("[hosttype:" + getHostType() + "]");
		listen(getHostType());
		return NetConnObject;
	}

	/*
	 * private String getCmd(String serverName) { String result = null; if
	 * (serverName != null && serverName.length() > 0) { if
	 * (serverName.equals("HP")) { result = "ping " + IP + " -n 6"; } if
	 * (serverName.equals("WINDOWS")) { result = "ping -n 6 " + IP; } if
	 * (serverName.equals("AIX")) { result = "ping -c 6 " + IP; } } return
	 * result; }
	 */

	/**
	 * @author Administrator
	 * @param host
	 * @version 1.0 2006-08-03 listen the others host
	 */
	private void listen(String host) {
		String result = null;
		String cmd = null;
		String ip[] = null;
		int clock = 1;
		if (host != null && host.length() > 0) {
			ip = IP.split(",");

			for (int i = 0; i < ip.length; i++) {
				clock++;
				if (host.equals("hp")) {
					cmd = "ping " + ip[i] + " -n 3";
					logger.info("ping first-" + cmd);
					result = ListenUNIXServer(cmd);
					if (result.equalsIgnoreCase("down")) { // update by
															// maozr@2008312,为down再执行三遍
						for (int j = 0; j < 3; j++) {
							logger.info("ping second-" + j + ":" + cmd);
							result = ListenUNIXServer(cmd);
							if (result.equalsIgnoreCase("up")) {
								break;
							}
						}
					}

				}

				if (host.equals("windows")) {
					cmd = "ping  -n 3 " + ip[i];
					logger.info("ping-" + cmd);
					result = ListenWin32Server(cmd); // WINDOWS CALL
					for (int j = 0; j < 3; j++) {
						logger.info("ping second-" + j + ":" + cmd);
						result = ListenUNIXServer(cmd);
						if (result.equalsIgnoreCase("up")) {
							break;
						}
					}
				}

				if (host.equals("aix")) {
					cmd = "ping -c 3 " + ip[i];
					logger.info("ping-" + cmd);
					result = ListenUNIXServer(cmd);
					for (int j = 0; j < 3; j++) {
						logger.info("ping second-" + j + ":" + cmd);
						result = ListenUNIXServer(cmd);
						if (result.equalsIgnoreCase("up")) {
							break;
						}
					}
				}

				if (result != null && result.equalsIgnoreCase("UP"))
					;
				NetConnObject.setLostRate("UP");
				break;
			}

			if (clock == ip.length && result != null && result.equals("DOWN"))
				result = "DOWN";

			logger.info("----[" + IP + "]---final result----[" + result + "]");
			NetConnObject.setLostRate(result);
		}
	}

	/**
	 * UNIX SYS call this Method fun is listen and ping destination Address
	 * example for ping 172.16.9.90 command param '-n 6' must to place at last
	 * position
	 */
	private String ListenUNIXServer(String cmd) {
		BufferedReader br = null;
		String result = null;
		try {
			Process p = Runtime.getRuntime().exec(cmd);
			br = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line = br.readLine();
			while ((line = br.readLine()) != null) {
				if (line.trim().indexOf("packets") != -1
						&& !line.trim().endsWith("packets")) {
					result = setResultPackage(line, "UNIX");
				}
			}
		} catch (Exception e) {
			logger.error("error:" + e.toString());
		} finally {
			try {
				br.close();
				Runtime.getRuntime().freeMemory();
				Runtime.getRuntime().gc();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * WINDOWS SYS call this Method for example: ping -n 6 172.16.9.90
	 * 
	 */
	private String ListenWin32Server(String cmd) {
		BufferedReader br = null;
		String result = null;
		try {

			Process p = Runtime.getRuntime().exec(cmd);
			br = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line = br.readLine();
			while ((line = br.readLine()) != null) {
				logger.info(line);
				if (line.trim().startsWith("Packets")) {
					result = setResultPackage(line);
				}
				if (line.trim().startsWith("Minimum")) {
					setResultTime(line);
				}
			}
		} catch (Exception e) {
			logger.error("ListenWin32Server:" + e.toString());
		} finally {
			try {
				br.close();
				Runtime.getRuntime().freeMemory();
				Runtime.getRuntime().gc();
			} catch (IOException e1) {
				logger.error("ListenWin32Server:" + e1.toString());
			}
		}
		return result;
	}

	/**
	 * express: Process Package value and set it into NetConnObject param str
	 * instand of package value it's called WINDOWS platform
	 * 
	 * @version 1.0 this method no return value
	 * @version 1.1 06-08-03 add this return param type String
	 * 
	 */
	private String setResultPackage(String str) {
		String allMessage[] = null;
		String subMessage[] = null;
		int flag = 0;
		int subFlag = 1;
		String result = "none"; // regard one host have more MAC,will to split
		// more IP
		try {
			if (str != null && str.length() > 0) {
				allMessage = str.split(",");
				while (flag < allMessage.length) {
					subMessage = allMessage[flag].split("=");
					if (flag == 0)
						NetConnObject.setSend(subMessage[subFlag]);
					if (flag == 1)
						NetConnObject.setReceived(subMessage[subFlag]);
					if (flag == 2) {
						int p = subMessage[subFlag].indexOf("%");
						int pp = subMessage[subFlag].indexOf("(");
						if (p != -1) {
							if (Integer.parseInt(subMessage[subFlag].trim()
									.substring(pp, p - 1)) == 100) {
								result = "DOWN";
							} else {
								result = "UP";
							}
							NetConnObject.setLost(subMessage[subFlag].trim()
									.substring(0, pp - 1));
						}
					}
					flag++;
				}
			}
		} catch (Exception e) {
			logger.error("setResultPackage:" + e.toString());
		}
		return result;
	}

	/**
	 * express: get sent and received value and put into NetConnObject in
	 * accordance with UNIX SYS
	 * 
	 * @param str
	 * @param system
	 * @version 1.0
	 * @version 1.1 2006-08-03 add return param
	 */
	public String setResultPackage(String str, String system) {
		String allMessage[] = null;
		int flag = 0;
		String result = "none";
		try {
			if (str != null && str.length() > 0) {
				allMessage = str.trim().split(",");
				while (flag < allMessage.length) {
					if (flag == 0)
						NetConnObject.setSend(allMessage[flag].substring(0,
								allMessage[flag].indexOf("packets")));
					if (flag == 1)
						NetConnObject.setReceived(allMessage[flag].substring(0,
								allMessage[flag].indexOf("packets")));
					if (flag == 2) {

						if (Integer.parseInt(allMessage[flag].substring(0,
								allMessage[flag].indexOf("%")).trim()) == 100) {
							result = "DOWN";
						} else {
							result = "UP";
						}
						NetConnObject.setLost(allMessage[flag].substring(0,
								allMessage[flag].indexOf("packet")));
					}
					flag++;
				}
			}
		} catch (Exception e) {
			logger.error("setResultPackage:" + e.toString());
		}
		logger.info("[" + this.IP + "],[" + str + "],[" + result + "]");
		return result;
	}

	/**
	 * Minimum = 0ms, Maximum = 0ms, Average = 0ms
	 * 
	 * @param str
	 */
	private void setResultTime(String str) {
		int flag = 0;
		int subflag = 1;
		String callTime[] = null;
		String subTime[] = null;
		try {
			if (str != null && str.length() > 0) {
				callTime = str.split(",");
				while (flag < callTime.length) {
					subTime = callTime[flag].split("=");
					if (flag == 0)
						NetConnObject.setMinimum(subTime[subflag]);
					if (flag == 1)
						NetConnObject.setMaximum(subTime[subflag]);
					if (flag == 2)
						NetConnObject.setAverage(subTime[subflag]);
					flag++;
				}
			}
		} catch (Exception e) {
			logger.error("setResultTime:" + e.toString());
		}
	}

	public String getHostType() {
		String s_config = "/NetListenType.properties";
		String host = "";
		InputStream in = this.getClass().getResourceAsStream(s_config);
		if (in == null) {
			logger.info(" OPEN " + s_config + " Failture!");
		} else {
			Properties properties = new Properties();
			try {
				properties.load(in);
			} catch (IOException e) {
				logger.error("get NETConnTYpe ERROR");
			}
			host = properties.getProperty("Host_Type");

		}
		return host;
	}

	public static void main(String[] args) {
		String str = new NetConnState("localhost").setResultPackage(
				"6 packets transmitted, 6 packets received, 99% packet loss",
				"HP");
		System.out.println(str);
	}
}