VirtualScheduleManager.java 10.3 KB
package com.sitech.ismp.coll.virtual;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import org.apache.log4j.Logger;

import com.sitech.ismp.messageObject.AgentSyncObject;
import com.sitech.jmx.manage.CollScheduleManager;
import com.sitech.util.DES3;
import com.sitech.util.upload.RomoteController;
import com.sitech.util.upload.SSHThread;
import com.sitech.util.upload.TelnetThread;

public class VirtualScheduleManager {
	private static Logger logger = Logger.getLogger("LOGER");

	public static Map<String, VirtualMachineInfo> scheduledVirtualMachineMap;

	public static Map<String, VirtualMachineInfo> currentVirtualMachineMap;

	public static String VMSTAT_RUN = "run";

	public static void refreshVirtualSchedule(HashMap<String, String> params) {
		refreshVMConfig(params);
		refreshSchedule();
	}

	public static void addVirtualSchedule(HashMap<String, String> params) {

		CollScheduleManager scheduleManager = CollScheduleManager.getInstance();
		try {
			String ip = params.get("IP_ADDR");
			String hostname = params.get("VMID");
			String username = params.get("USERNAME");
			String mbeanName = params.get("MBEANNAME");
			String function = params.get("FUNCTION");
			String interval = params.get("INTERVAL");
			logger.info("virtual schedule {" + ip + "," + hostname + ","
					+ username + "," + mbeanName + "," + function + ","
					+ interval + "}");
			AgentSyncObject msg = new AgentSyncObject();
			msg.setScheduleId(ip + "_" + hostname + "_" + username + "_"
					+ function);
			msg.setObjectName(mbeanName);
			msg.setFunction(function);
			msg.setParams(params);
			msg.setInterval(Long.parseLong(interval));

			scheduleManager.addCollSchedule(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void deleteVirtualSchedule(HashMap<String, String> params) {
		CollScheduleManager scheduleManager = CollScheduleManager.getInstance();
		try {
			String ip = params.get("IP_ADDR");
			String hostname = params.get("VMID");
			String username = params.get("USERNAME");
			String function = params.get("FUNCTION");
			scheduleManager.deleteCollSchedule(ip + "_" + hostname + "_"
					+ username + "_" + function);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void updateVirtualSchedule(HashMap<String, String> params) {
		CollScheduleManager scheduleManager = CollScheduleManager.getInstance();
		try {
			String ip = params.get("IP_ADDR");
			String hostname = params.get("VMID");
			String username = params.get("USERNAME");
			String mbeanName = params.get("MBEANNAME");
			String function = params.get("FUNCTION");
			String interval = params.get("INTERVAL");

			AgentSyncObject msg = new AgentSyncObject();
			scheduleManager.addCollSchedule(msg);
			msg.setScheduleId(ip + "_" + hostname + "_" + username + "_"
					+ function);
			msg.setObjectName(mbeanName);
			msg.setFunction(function);
			msg.setParams(params);
			msg.setInterval(Long.parseLong(interval));

			scheduleManager.updateCollSchedule(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void refreshVMConfig(HashMap<String, String> params) {
		try {
			String ipConfigFile = "/bomc/domain.info";
			FileReader fr = new FileReader(ipConfigFile);
			BufferedReader bfr = new BufferedReader(fr);
			String virtInfo = bfr.readLine();
			// every line content likes below
			// vliux_lian run 172.21.0.47 ssh 22
			// test_s pause 172.21.0.46 ssh 22
			while (virtInfo != null) {
				String[] infos = virtInfo.split(" ");
				if (infos != null && infos.length == 5) {
					VirtualMachineInfo vmi = new VirtualMachineInfo();
					vmi.setVmId(infos[0]);
					vmi.setVmState(infos[1]);
					vmi.setIp(infos[2]);
					vmi.setProtocol(infos[3]);
					vmi.setPort(infos[4]);
					vmi.setPhysicalDeviceId(params.get("PHYSICALDEVICEID"));
					// save currrent vm info into a Map
					if (currentVirtualMachineMap == null) {
						currentVirtualMachineMap = new HashMap<String, VirtualMachineInfo>();
					}
					currentVirtualMachineMap.put(infos[0], vmi);
					logger.info("/bomc/domain.info:" + virtInfo);
					logger.info("add:" + infos[0] + "_" + infos[1]);

				}

				virtInfo = bfr.readLine();
			}
			bfr.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 更新虚拟机采集
	 * 
	 * @author guojb
	 */
	public static void refreshSchedule() {
		if (scheduledVirtualMachineMap == null) {
			// add all config
			scheduledVirtualMachineMap = new HashMap<String, VirtualMachineInfo>();
			if (currentVirtualMachineMap != null) {
				Set<String> keyset = currentVirtualMachineMap.keySet();
				Iterator<String> it = keyset.iterator();
				while (it.hasNext()) {
					String key = it.next();
					VirtualMachineInfo vmi = (VirtualMachineInfo) currentVirtualMachineMap
							.get(key);
					if (VMSTAT_RUN.equals(vmi.getVmState())) {
						addVirtualMachineColl(vmi);
						scheduledVirtualMachineMap.put(key, vmi);
					}
				}
			}
		} else if (scheduledVirtualMachineMap != null) {
			// 添加没有采集的
			if (currentVirtualMachineMap != null) {
				Set<String> keyset = currentVirtualMachineMap.keySet();
				Iterator<String> it = keyset.iterator();
				while (it.hasNext()) {
					String key = (String) it.next();
					VirtualMachineInfo vmi = (VirtualMachineInfo) currentVirtualMachineMap
							.get(key);
					// 当前已经配置,但是没有采集的
					if (VMSTAT_RUN.equals(vmi.getVmState())
							&& !scheduledVirtualMachineMap.containsKey(key)) {
						addVirtualMachineColl(vmi);
						scheduledVirtualMachineMap.put(key, vmi);
					} else if (!VMSTAT_RUN.equals(vmi.getVmState())
							&& scheduledVirtualMachineMap.containsKey(key)) {
						deleteVirtualMachineColl(vmi);
						scheduledVirtualMachineMap.remove(key);
					}
				}
			}
			// 删除配置中没有的
			if (scheduledVirtualMachineMap != null) {

				Set<String> keyset = scheduledVirtualMachineMap.keySet();
				Iterator<String> it = keyset.iterator();
				while (it.hasNext()) {
					String key = (String) it.next();
					VirtualMachineInfo vmi = (VirtualMachineInfo) currentVirtualMachineMap
							.get(key);
					// 删除正在采集的,但是没有配置的
					if (!currentVirtualMachineMap.containsKey(key)) {
						deleteVirtualMachineColl(vmi);
						scheduledVirtualMachineMap.remove(key);
					}
				}
			}
		}
	}

	/**
	 * 添加虚拟机采集调度
	 * 
	 * @author guojb
	 * @param vmi
	 */
	public static void addVirtualMachineColl(VirtualMachineInfo vmi) {

		// getConfig
		HashMap<String, String> params = new HashMap<String, String>();
		params.put("IP_ADDR", vmi.getIp());
		params.put("USERNAME", "bomc");
		params.put("PASSWORD", DES3.encrypt("bomc"));
		params.put("PROTOCOL", vmi.getProtocol());
		params.put("VMID", vmi.getVmId());
		params.put("MBEANNAME", "CollVirtualLinux:type=MBean");
		params.put("PHYSICALDEVICEID", vmi.getPhysicalDeviceId());
		params.put("FUNCTION", "getConfig");
		params.put("INTERVAL", "300000");
		
		MBeanInfo mbeanInfo = getVirtualMBeanInfo(params);
		params.put("MBEANNAME", mbeanInfo.getMbeanName());
		params.put("KBPCLASS", mbeanInfo.getKbpClass());
		addVirtualSchedule(params);
		// getDisk
		params.put("FUNCTION", "getDisk");
		addVirtualSchedule(params);

		// getFileSystem
		params.put("FUNCTION", "getFileSystem");
		addVirtualSchedule(params);

		// params.put("INTERVAL", "180000");
		// getCpu
		params.put("FUNCTION", "getCpu");
		addVirtualSchedule(params);

		// getMemory
		params.put("FUNCTION", "getMemory");
		addVirtualSchedule(params);

		params.put("FUNCTION", "collInterface");
		addVirtualSchedule(params);

		// collIO
		/*
		 * params.put("FUNCTION", "collIO"); addVirtualSchedule(params);
		 */

	}

	/**
	 * 删除虚拟机采集调度
	 * 
	 * @author guojb
	 * @param vmi
	 */
	public static void deleteVirtualMachineColl(VirtualMachineInfo vmi) {
		HashMap<String, String> params = new HashMap<String, String>();
		params.put("IP_ADDR", vmi.getIp());
		params.put("USERNAME", "bomc");
		params.put("VMID", vmi.getVmId());
		params.put("FUNCTION", "getConfig");
		deleteVirtualSchedule(params);
		// getCpu
		params.put("FUNCTION", "getCpu");
		deleteVirtualSchedule(params);

		// getMemory
		params.put("FUNCTION", "getMemory");
		deleteVirtualSchedule(params);

		// getDisk
		params.put("FUNCTION", "getDisk");
		deleteVirtualSchedule(params);

		// getFileSystem
		params.put("FUNCTION", "getFileSystem");
		deleteVirtualSchedule(params);

		// collIO
		/*
		 * params.put("FUNCTION", "collIO"); deleteVirtualSchedule(params);
		 */
		// collInterface
		params.put("FUNCTION", "collInterface");
		deleteVirtualSchedule(params);
	}
	
	
	/**
	 * 根据参数,登录虚拟机,获取虚拟机操作系统类型转换为MBeanInfo
	 * 
	 * @author lianlian
	 * @param params
	 * @return
	 */
	private static MBeanInfo getVirtualMBeanInfo(HashMap<String, String> params) {
		MBeanInfo mbeanInfo = new MBeanInfo();
		String hostip = (String) params.get("IP_ADDR");
		String user = (String) params.get("USERNAME");
		String passwd = (String) params.get("PASSWORD");
		String protol = (String) params.get("PROTOCOL");
		RomoteController tt = null;
		if (protol != null && protol.equals("telnet")) {
			tt = new TelnetThread(hostip, 23, user, passwd);
		} else {
			tt = new SSHThread(hostip, 22, user, passwd);
		}
		try {
			tt.initial();
		} catch (Exception e) {
			e.printStackTrace();
		}

		Vector vector = tt.getResultAsVector("uname");
		String ostype = ((String) vector.elementAt(0)).trim().toUpperCase();
		
		if (tt != null) {
			tt.close();
			tt = null;
		}
		
		if (ostype.equals("LINUX")) {
			mbeanInfo.setMbeanName(MBeanInfo.MBEAN_NAME_VIRTUAL_LINUX);
			mbeanInfo.setKbpClass(MBeanInfo.KBPCLASS_LINUX);
		} else if (ostype.equals("AIX")) {
			mbeanInfo.setMbeanName(MBeanInfo.MBEAN_NAME_VIRTUAL_IBM);
			mbeanInfo.setKbpClass(MBeanInfo.KBPCLASS_IBM);
		} else if (ostype.equals("HP-UX")) {
			mbeanInfo.setMbeanName(MBeanInfo.MBEAN_NAME_VIRTUAL_HP);
			mbeanInfo.setKbpClass(MBeanInfo.KBPCLASS_HP);
		} else if (ostype.equals("SUNOS")) {
			mbeanInfo.setMbeanName(MBeanInfo.MBEAN_NAME_VIRTUAL_SUN);
			mbeanInfo.setKbpClass(MBeanInfo.KBPCLASS_SUN);
		} else {
			mbeanInfo.setMbeanName(MBeanInfo.MBEAN_NAME_VIRTUAL_LINUX);
			mbeanInfo.setKbpClass(MBeanInfo.KBPCLASS_LINUX);
		}

		return mbeanInfo;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}