package cn.tisson.testin.one.collector; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.tisson.testin.model.collector.IcmpParam; import cn.tisson.testin.model.collector.IcmpResult; import cn.tisson.testin.util.StringUtils; public class IcmpDriver { static Logger log = LoggerFactory.getLogger(IcmpDriver.class); public static IcmpResult icmp(IcmpParam param) { if(param.getIp()==null) { return null; } IcmpResult result = new IcmpResult(); String osName = System.getProperty("os.name"); String chartSet = "UTF-8"; StringBuffer cmdBuf = new StringBuffer(); cmdBuf = cmdBuf.append("ping ").append(param.getIp()); if(osName.toLowerCase().contains("windows")) { chartSet = "GBK"; if(param.getCount()!=null&¶m.getCount()>0) { cmdBuf.append(" -n ").append(param.getCount()); } if(param.getPkgSize()!=null&¶m.getPkgSize()>0) { cmdBuf.append(" -l ").append(param.getPkgSize()); } }else { if(param.getCount()!=null&¶m.getCount()>0) { cmdBuf.append(" -c ").append(param.getCount()); }else { cmdBuf.append(" -c ").append(3); } if(param.getPkgSize()!=null&¶m.getPkgSize()>0) { cmdBuf.append(" -s ").append(param.getPkgSize()); } } StringBuffer cmdout = new StringBuffer(); String cmd = cmdBuf.toString(); log.debug("icmp 执行的命令为:" + cmd ); Process process = null; try { process = Runtime.getRuntime().exec(cmd); InputStream fis = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(fis,chartSet)); String line = null; while ((line = br.readLine()) != null) { cmdout.append(line).append(System.getProperty("line.separator")); } } catch (IOException e) { log.warn("icmp 操作出现异常",e); result.setStatus(0); return result; }finally { if(process!=null){ process.destroy(); } } log.debug("执行系统命令后的结果为:" + cmdout.toString()); String[] cmdOutLines = cmdout.toString().split(System.getProperty("line.separator")); if(osName.toLowerCase().contains("windows")) { parseWinExeResult(result, cmdOutLines); }else { parseLinuxExeResult(result,cmdOutLines); } log.debug("icmp结果为:"+result); return result; } private static void parseWinExeResult(IcmpResult result, String[] cmdOutLines) { String lastLine =cmdOutLines[cmdOutLines.length-1]; if(lastLine.contains("最短")) { Map<String, String> tmpMap = StringUtils.toMap(lastLine, ",", "=",true); result.setStatus(1); result.setDelayMsAvg(Double.valueOf(tmpMap.get("平均").replaceAll("ms",""))); result.setDelayMsMin(Double.valueOf(tmpMap.get("最短").replaceAll("ms",""))); result.setDelayMsMax(Double.valueOf(tmpMap.get("最长").replaceAll("ms",""))); String lostLine = cmdOutLines[cmdOutLines.length-1-2]; if(lostLine.contains("数据包:")) { String lost=lostLine.substring(lostLine.indexOf("(")+1, lostLine.indexOf("%")); result.setPackageLossRate(Double.valueOf(lost)); } }else if(lastLine.contains("数据包:")) { String lost=lastLine.substring(lastLine.indexOf("(")+1, lastLine.indexOf("%")); result.setPackageLossRate(Double.valueOf(lost)); result.setStatus(0); } } private static void parseLinuxExeResult(IcmpResult result, String[] cmdOutLines) { String lastLine =cmdOutLines[cmdOutLines.length-1]; if(lastLine.contains("rtt min/avg/max/mdev")) { result.setStatus(1); String[] tmp = lastLine.substring(lastLine.indexOf("=")+1).replaceAll("ms", "").trim().split("/"); result.setDelayMsAvg(Double.valueOf(tmp[1])); result.setDelayMsMin(Double.valueOf(tmp[0])); result.setDelayMsMax(Double.valueOf(tmp[2])); String lostLine = cmdOutLines[cmdOutLines.length-1-1]; if(lostLine.contains("packet loss")) { String lost=lostLine.substring(lostLine.indexOf("received,")+1, lostLine.indexOf("%")).trim(); result.setPackageLossRate(Double.valueOf(lost)); } }else if(lastLine.contains("packet loss")) { String lost=lastLine.substring(lastLine.indexOf("received,")+1, lastLine.indexOf("%")).trim(); result.setPackageLossRate(Double.valueOf(lost)); result.setStatus(0); } } }
ping 命令
最新推荐文章于 2023-11-23 23:20:05 发布