CollBackupIBMWithCMD.java 8.01 KB
/*******************************************************************************
 * $Header$
 * $Revision$
 * $Date$
 *
 *==============================================================================
 *
 * Copyright (c) 2001-2006 Primeton Technologies, Ltd.
 * All rights reserved.
 * 
 * Created on 2010-11-18
 *******************************************************************************/


package com.sitech.ismp.coll;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;

import org.apache.log4j.Logger;

import com.sitech.ismp.app.coll.RPCTarget;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.util.Formater;

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

	String PRE_UNITID = "10-15-12"; // �����豸�ı�ʶ

	RPCTarget rpctarget = null;
	
	/**
	 * ȡ���ָ��
	 */
	public Vector getProgress(HashMap params) {
		logger.info("begin getSpecProcess : " + params.get("PROCESS_NAME"));
		init(params);
		String process_name = (String) params.get("PROCESS_NAME");
		// ����ɼ��������ֵ
		CollBase collResult = new CollBase();
		// �������õ���kpiֵ��unit_id,����PRE_UNITID + "-10"��ͷ�����Total���
		String pro_PRE_UNITID = PRE_UNITID + "-10"; // totalֵ
		// ��ȡ������
		String host_name = this.getHostName();
		// �õ�unit_id��ʹ�õ�������
		String neat_host_name = Formater.neatenunitid(host_name);
		
		// ��ȡ��̿�ʼʱ��PM-00-01-005-04�������û�PM-00-01-005-07,
		// ʱ����û�� ":" , ��ô�Ѻ����һλҲ����
		String cmd1 = "ps -ef | grep -v grep | grep -v 'PPID' | grep \"" + process_name + "\"";
		logger.info("test cmd1 : " + cmd1);
		// ����UID PID PPID C STIME TTY TIME CMD
		// ��ݣ�" root 98368 1 0 Mar 17 - 18:51 /usr/sbin/syncd 60"
		// ��ݣ�"agent 299122 831586 0 11:05:34 pts/3 0:00 -ksh"

		// ��λʱ����CPU�����е�ʱ��PM-00-01-005-01��
		// ռ���ڴ�Ŀռ��СPM-00-01-005-05
		// ���������PM-00-01-005-03
		String cmd2 = "ps -ef -o pcpu,vsz,pid,args | grep -v grep | grep -v '%CPU' | grep \"" + process_name + "\"";
		// ���� %CPU VSZ PID COMMAND
		// 0.0 832 1 /etc/init
		// 0.0 560 65684 /usr/dt/bin/dtlogin -daemon

		// ���״̬ PM-00-01-005-02
		String cmd3 = "ps g | grep -v grep | grep -v 'PID'";
		// PID TTY STAT TIME COMMAND
		// 0 - A 0:00 swapper
		// 1 - A 0:04 /etc/init
		// 8196 - A 0:00 wait
		// O�� Nonexistent, R: Running, S:Sleeping, W: Swapped, Z:Canceled,
		// T:Stopped
		String pid = "";
		Vector v1 = rpctarget.getKPISet(cmd1);
		Map map1 = new HashMap();
		if (v1 == null || v1.size() == 0) {
			// �����ڸý��

			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
					+ Formater.neatenunitid(process_name), "PM-00-01-005-01", "0");
			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
					+ Formater.neatenunitid(process_name), "PM-00-01-005-02", "DOWN");
			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
					+ Formater.neatenunitid(process_name), "PM-00-01-005-03", "��");
			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
					+ Formater.neatenunitid(process_name), "PM-00-01-005-04", "��");
			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
					+ Formater.neatenunitid(process_name), "PM-00-01-005-05", "0");
			collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
					+ Formater.neatenunitid(process_name), "PM-00-01-005-07", process_name);
			
			return collResult.getKPISet();
		} else {
			for (int i = 0; i < v1.size(); i++) {
				String pro_info = (String) v1.elementAt(i);
				String puser = split(pro_info, 0);
				pid = split(pro_info, 1);
				String pstime = split(pro_info, 4);
				pstime = pstime.indexOf(":") > -1 ? pstime : pstime + split(pro_info, 5); // �������·�+���ʱ�����
				int pos_command = pstime.indexOf(":") > 0 ? 7 : 8;
				String command = split(pro_info, pos_command);
				map1.put(process_name, pstime + "," + puser);
			}
		}// end v1
		
		Vector v2 = rpctarget.getKPISet(cmd2);
		Map map2 = new HashMap();
		for (int i = 0; i < v2.size(); i++) {
			String pro_info = (String) v2.elementAt(i);
			// ��̵�λʱ����CPU�����е�ʱ��
			// ���ռ���ڴ�Ŀռ��С
			// ��̵�ָ����
			String pcpu = split(pro_info, 0);
			String vsz = split(pro_info, 1);
			String command = split(pro_info, 3);
			String full_command = pro_info.substring(pro_info.indexOf(command), pro_info.length());
			map2.put(process_name, Formater.formatDecimalKpivalue(pcpu) + "," + Formater.formatDecimalKpivalue(vsz) + "," + full_command);
		}
		
		Vector v3 = rpctarget.getKPISet(cmd3);
		Map map3 = new HashMap();
		for (int i = 0; i < v3.size(); i++) {
			String pro_info = (String) v3.elementAt(i);
			String temppid = split(pro_info, 0);
			if (temppid.equals(pid)) {
				String state = split(pro_info, 2);
				if (state.equals("A")) {
					state = "Active";
				} else if (state.equals("Z")) {
					state = "Canceled";
				} else if (state.equals("0")) {
					state = "Nonexistent";
				} else if (state.equals("I")) {
					state = "Intermediate";
				} else if (state.equals("T")) {
					state = "Stopped";
				} else if (state.equals("K")) {
					state = "Available kernel process";
				}
				String command = split(pro_info, 4);
				String full_command = pro_info.substring(pro_info.indexOf(command), pro_info.length());
				map3.put(process_name + ":" + pid, state);
				map3.put(process_name, state + "," + full_command);
			}
		}
		
		Iterator it = map1.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String key = (String) entry.getKey();
			String value = (String) entry.getValue();
			logger.info("value1 " + value);
			if (map2.get(key) != null && map3.get(key) != null) {
				String[] value1 = value.split(",");
				String[] valus2 = ((String) map2.get(key)).split(",");
				String strcom = "";
				for (int i = 2; i < valus2.length; i++) {
					strcom += valus2[i] + ",";
				}
				String[] valus3 = ((String) map3.get(key)).split(",");
				logger.info("value2 " + (String) map2.get(key));
				logger.info("value3 " + (String) map3.get(key));
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ key, "PM-00-01-005-04", value1[0]);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ key, "PM-00-01-005-07", process_name);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
						+ key, "PM-00-01-005-01", valus2[0]);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
						+ key, "PM-00-01-005-05", valus2[1]);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
						+ key, "PM-00-01-005-03", strcom.substring(0, strcom.length() - 1));
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-" 
						+ key, "PM-00-01-005-02", valus3[0]);
			}
		}
		
		logger.info("end getSpecProcess : " + params.get("PROCESS_NAME"));
		return collResult.getKPISet();
	}
	
	public Vector getStatus(HashMap params) {
		return null;
	}
	
	public void init(HashMap params) {
		rpctarget = new RPCTarget();
		rpctarget.setRpcCmd("sh RPCTarget_suport.sh");
	}
	
	private String getHostName() {
		Vector host = rpctarget.getKPISet("uname -a");
		String host_name = (String) host.elementAt(0);
		host_name = split(host_name, 1);
		return host_name;
	}
	
	/**
	 * �����˷���,���ؿմ�
	 */
	private String split(String str, int pos) {
		StringTokenizer st = new StringTokenizer(str);
		Vector values = new Vector();
		while (st.hasMoreTokens()) {
			values.add(st.nextToken());
		}
		if (pos >= 0 && pos < values.size()) {
			return (String) values.elementAt(pos);
		}
		return "";
	}
}