CollFGTFireWallWithSNMP.java 9.29 KB
package com.sitech.ismp.coll;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;

import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.ismp.coll.net.ifOperStatusHelper;
import com.sitech.ismp.coll.net.ifTypeHelper;
import com.sitech.ismp.coll.net.config.NetDeviceSystem;
import com.sitech.ismp.coll.net.f5.CpuEntry;
import com.sitech.ismp.coll.net.f5.CpuEntryWalker;
import com.sitech.ismp.coll.net.f5.SupplyEntry;
import com.sitech.ismp.coll.net.f5.SupplyEntryWalker;
import com.sitech.ismp.coll.net.table.IfTable;
import com.sitech.ismp.coll.net.table.IfTableRow;

public class CollFGTFireWallWithSNMP {
	//采集BIG IP F5的程序
	// 10-13-12-11-10 总体指标
	// 10-13-12-11-11 接口

	private Logger logger = Logger.getLogger("COLL");
	private String PRE_UNITID = "10-13-12-11"; //
	private String HOST_IP = "";

	private int PORT = 161;

	private String COMMUNITY = "public";

	private String HOST_NAME = "";

	private String NEAT_HOST_NAME = "";

	private Snmp mSnmp = null;

	private CommunityTarget mCommunityTarget = null;

	public CollFGTFireWallWithSNMP(String ip, int port, String community,
			String host_name) {
		this.HOST_IP = ip;
		this.PORT = port;
		this.COMMUNITY = community;
		this.HOST_NAME = host_name;
		this.NEAT_HOST_NAME = com.sitech.util.Formater.neatenunitid(host_name);
	}

	/**
	 * 初始化SNMP target
	 * 
	 */
	public void init() {
		try {
			String addr = "udp:" + this.HOST_IP + "/"
					+ String.valueOf(this.PORT);
			OctetString community = new OctetString(this.COMMUNITY);
			Address address = GenericAddress.parse(addr);
			mCommunityTarget = new CommunityTarget(address, community);
			org.snmp4j.TransportMapping vTransport = new org.snmp4j.transport.DefaultUdpTransportMapping();
			mSnmp = new org.snmp4j.Snmp(vTransport);
			vTransport.listen();
			mCommunityTarget.setCommunity(community);
			mCommunityTarget.setAddress(new UdpAddress(java.net.InetAddress
					.getByName(this.HOST_IP), this.PORT));
			mCommunityTarget.setRetries(2);
			mCommunityTarget.setTimeout(200);
			// mCommunityTarget.setVersion(org.snmp4j.mp.SnmpConstants.version2c);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			logger.error("UnknownHostError", e);
			this.release();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			logger.error("IOError", e);
			this.release();
		}
	}// end init

	public void release() {
		try {
			if (mSnmp != null) {
				mSnmp.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			mSnmp = null;
		}
	}// end release

	/**
	 * 生成TblATO_KPIDETAIL
	 * 
	 * @param KBP_ID
	 * @param KPI_ID
	 * @param KPI_VALUE
	 * @return
	 */
	private TblATO_KPIDETAIL createKPI(String KBP_ID, String KPI_ID,
			String KPI_VALUE) {
		TblATO_KPIDETAIL tblato_kpidetail = new TblATO_KPIDETAIL();
		tblato_kpidetail.UNIT_ID = KBP_ID;
		tblato_kpidetail.KPI_ID = KPI_ID;
		tblato_kpidetail.KPI_VALUE = KPI_VALUE;
		tblato_kpidetail.CLL_TIME = new Date();
		return tblato_kpidetail;
	}

	/**
	 * 采集主机名称
	 * 
	 * @return
	 */
	public TblATO_KPIDETAIL getHostName() {
		String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
		return this.createKPI(UNIT_ID, "CM-00-01-001-01", this.HOST_NAME);
	}

	/**
	 * 采集IpAddr
	 * 
	 * @return
	 */
	public TblATO_KPIDETAIL getIpAddr() {
		String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
		return this.createKPI(UNIT_ID, "CM-00-02-001-05", this.HOST_IP);
	}

	/**
	 * 采集主机状态
	 * 
	 * @return
	 */
	public TblATO_KPIDETAIL getDeviceState() {
		String oid = ".1.3.6.1.2.1.1.2.0";
		String temp = this.getKPIInfo(oid);
		String status = "";
		if (temp == null || temp.equals("")) {
			status = "DOWN";
		} else {
			status = "UP";
		}

		// FM-01-01-01-01
		String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
		return this.createKPI(UNIT_ID, "FM-00-02-001-01", status);
	}

	/**
	 * 采集端口数量
	 * 
	 * @return
	 */
	public TblATO_KPIDETAIL getPortNum() {
		// 1.3.6.1.2.1.2.1.0
		String oid = "1.3.6.1.2.1.2.1.0";
		String temp = "";
		try {
			temp = this.getKPIInfo(oid);
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			temp = "0";
		}
		String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
		return this.createKPI(UNIT_ID, "CM-01-02-01-06", temp);
	}
	
	public Vector getConfig(){
		Vector kpiVector = new Vector();
		try{
			String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
			NetDeviceSystem sys= new NetDeviceSystem(HOST_IP, PORT, COMMUNITY);
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-03-04",sys.getSysDescr()));
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-03-05",sys.getSysUpTime()));
		}catch(Exception e){
			e.printStackTrace();
		}
		return kpiVector;
	}
	
	/**
	 * 采集主机软件版本
	 * 
	 * @return
	 */
	public TblATO_KPIDETAIL getSoftVersion() {
		String temp = this.getSV();
		String UNIT_ID = PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
		return this.createKPI(UNIT_ID, "CM-01-02-01-03", temp);
	}

	/**
	 * 采集主机软件版本
	 * 
	 * @return
	 */
	private String getSV() {
		String oid = "1.3.6.1.2.1.1.1.0";
		String temp = "--";
		try {
			temp = this.getKPIInfo(oid);
			temp = temp.substring(temp.indexOf("IOS"));
			String[] ss = temp.split(",");
			temp = ss[0].trim() + "," + ss[1];
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			return temp;
		}
		return temp;
	}

	/**
	 * 得到单个oid对应值
	 * 
	 * @param oid
	 * @return
	 */
	public String getKPIInfo(String oid) {
		String result = "";
		this.init();
		PDU pdu = new PDU();
		VariableBinding var = new VariableBinding(new OID(oid),
				new org.snmp4j.smi.OctetString());
		pdu.add(var);
		pdu.setType(PDU.GET);
		try {
			ResponseEvent res = mSnmp.send(pdu, mCommunityTarget);
			PDU result_pdu = res.getResponse();
			if (result_pdu != null) {
				VariableBinding vb = result_pdu.get(0);
				result = vb.getVariable().toString();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.release();
		return result;
	}
	public Vector getPortKpi() {
		Vector kpiVector = new Vector();
		IfTable ifTable = new IfTable();
		ifTable.FillTable(HOST_IP, PORT, COMMUNITY);
		Vector ifTableRows = ifTable.getRrows();
		for (int i = 0; i < ifTableRows.size(); i++) {
			IfTableRow row = (IfTableRow) ifTableRows.get(i);
			String ifIndex = row.getIfindex();
			String r_ifDesc = "--";
			String ifDesc = row.getIfdesc();
			if (ifDesc != null && (!(ifDesc.equals("")))
					&& (!(ifDesc.equalsIgnoreCase("null")))) {
				r_ifDesc = ifDesc;
			}
			String ifType = ifTypeHelper.getTypeDesc(row.getIftype());
			String ifOperStatus = ifOperStatusHelper.getOperStatusDesc(row
					.getIfadminstatus());
			String r_ifPhyAddr = "--";
			String ifPhyAddr = row.getIfphyaddr();
			if (ifPhyAddr != null && (!(ifPhyAddr.equals("")))) {
				r_ifPhyAddr = ifPhyAddr;
			}

			String UNIT_ID = PRE_UNITID + "-11" + ":" + NEAT_HOST_NAME + "-"
					+ ifIndex + "-interface";
			// 端口索引号 CM-01-02-02-01
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-02-01", ifIndex));
			// 端口描述 CM-01-02-02-05
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-02-05", r_ifDesc));
			// 端口类型 CM-01-02-02-02
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-02-02", ifType));
			// 端口Mac地址 CM-01-02-02-04
			kpiVector.add(createKPI(UNIT_ID, "CM-01-02-02-04", r_ifPhyAddr));
			// 端口状态 FM-01-02-01-02
			kpiVector.add(createKPI(UNIT_ID, "FM-01-02-01-02", ifOperStatus));
		}
		return kpiVector;
	}
	
	public Vector getCpuTemperatrue(){
		Vector kpiVector = new Vector();
		CpuEntryWalker walker =new CpuEntryWalker();
		walker.walker(HOST_IP, PORT, COMMUNITY);
		Vector cpuVector = walker.getEntry();
		for(int i=0;i<cpuVector.size();i++){
			CpuEntry row = (CpuEntry) cpuVector.get(i);
			String UNIT_ID = PRE_UNITID + "-12" + ":" + NEAT_HOST_NAME+"-"+this.getOIDIndex(row.getCpuIndex());
			//PM-00-02-800-02    10-13    温度    string    ℃    
			kpiVector.add(createKPI(UNIT_ID, "PM-00-02-800-02", row.getCPuTemperature()));
			//PM-00-02-800-06      风扇转速
			kpiVector.add(createKPI(UNIT_ID, "PM-00-02-800-06", row.getCpuFanSpeed()));
		}
		return kpiVector;
	}
	public Vector getSupply(){
		Vector kpiVector = new Vector();
		SupplyEntryWalker walker =new SupplyEntryWalker();
		walker.walker(HOST_IP, PORT, COMMUNITY);
		Vector supplyVector = walker.getEntry();
		for(int i=0;i<supplyVector.size();i++){
			SupplyEntry row = (SupplyEntry) supplyVector.get(i);
			String UNIT_ID = PRE_UNITID + "-13" + ":" + NEAT_HOST_NAME+"-"+this.getOIDIndex(row.getSupplyIndex());
			//PM-00-02-800-05    10-13    电源状态  
			kpiVector.add(createKPI(UNIT_ID, "PM-00-02-800-05", row.getSupplyStatus()));
		}
		return kpiVector;
	}
	
	
	
	private String getOIDIndex(String oid){
		String id="0";
		if("".equals(oid)||null==oid){
			id="";
		}else{
			if(oid.indexOf(".")>=0){
				int i=0;
				i=oid.lastIndexOf(".");
				id= oid.substring(i);
			}
		}
		return id;
	}
}