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

package com.sitech.ismp.coll;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
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 CollBackupDeviceWithCMD {

	private Logger logger = Logger.getLogger("COLL");

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

	RPCTarget rpctarget = null;
	
	File f;
    FileReader fr;
    BufferedReader br;
    String fileRoute,s,pro_name,status;
    Vector vTmp;
    Vector vForDriver;//Ϊ���ݻ�ij��Driver�е�ij���е�۷��㲻���������衣

	/**
	 * ȡ���ָ��
	 */
	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);

		String unit_process = "export UNIX95=XPG4;ps -ef -o pcpu,state,sz,pid,ruser,stime,args | grep \""
				+ process_name + "\" | grep -v grep | grep -v '%CPU'";
		logger.info("test unit_process : " + unit_process);
		Vector proV = rpctarget.getKPISet(unit_process);
		if (proV == null || proV.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 < proV.size(); i++) {
				String pro_info = (String) proV.elementAt(i);
				String pcpu = split(pro_info, 0); // ռ��cpuʱ��
				String state = split(pro_info, 1);
				if (state.equals("R")) {
					state = "Running";
				} else if (state.equals("S")) {
					state = "Sleeping";
				} else if (state.equals("0")) {
					state = "Nonexistent";
				} else if (state.equals("W")) {
					state = "Waiting";
				} else if (state.equals("I")) {
					state = "Intermediate";
				} else if (state.equals("Z")) {
					state = "Terminated";
				} else if (state.equals("T")) {
					state = "Stopped";
				} else if (state.equals("X")) {
					state = "Growing";
				}
				String vsz = split(pro_info, 2);
				// String pid = split(pro_info, 3);
				// String puser = split(pro_info, 4);

				String pstime = split(pro_info, 5);
				pstime = pstime.indexOf(":") > -1 ? pstime : pstime
						+ split(pro_info, 6); // �������·�+���ʱ�����
				int pos_command = pstime.indexOf(":") > 0 ? 6 : 7; // ��ð�ž��ǵ�6λ��û�о��ǵ�7λ
				String command = split(pro_info, pos_command);
				String full_command = pro_info.substring(pro_info
						.indexOf(command), pro_info.length());

				collResult
						.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
								+ Formater.neatenunitid(process_name),
								"PM-00-01-005-01", Formater
										.formatDecimalKpivalue(pcpu));
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(process_name),
						"PM-00-01-005-02", state);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(process_name),
						"PM-00-01-005-03", full_command);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(process_name),
						"PM-00-01-005-04", pstime);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(process_name),
						"PM-00-01-005-05", Formater.formatDecimalKpivalue(vsz));
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(process_name),
						"PM-00-01-005-07", process_name);
			}
		}

		return collResult.getKPISet();
	}

	/**
	 * ȡ״ָ̬�꣬���ھַ��Ѿ��ṩ��root�û�ȡ�õļ���ļ�
	 * ���ŵ�/tmp/monitor/monitor_nbu.out���棬���ֻ��Ҫ�����ҵ���عؼ���
	 * ��Status������TLD(0)����Ӧ����ݼ��ɡ�
	 */
	public Vector getStatus(HashMap params) {
		// TODO Auto-generated method stub
		logger.info("begin CollBackupDevice getStatus ");
		init(params);									//���飬������һ�еĶ���һ��Ҫд�ھ����ϵ�λ�ã�������д?
		fileRoute = (String) params.get("FILE_ROUTE");
		CollBase collResult = new CollBase();
		String pro_PRE_UNITID = PRE_UNITID + "-11"; // totalֵ
		// ��ȡ������
		String host_name = this.getHostName();
		// �õ�unit_id��ʹ�õ�������
		String neat_host_name = Formater.neatenunitid(host_name);
		
//		fileRoute = "/tmp/monitor/monitor_nbu.out";
		vTmp = new Vector();

		f = new File(fileRoute);
		try {
			fr = new FileReader(f);
		} catch (Exception e) {
			logger.error("�ڱ����Ͽ���û�� " + fileRoute + " �ļ���·������!");
			e.printStackTrace();
		}
		br = new BufferedReader(fr);
		vTmp = firstVectorSplit(br);
		
//		for(int oo = 0;oo<vTmp.size();oo++){
//			logger.info("test Vector's content "+ (String)vTmp.get(oo));
//		}
		
		for(int ii=0;ii<vTmp.size();ii++){
			String[] tmpNo1 = ((String)vTmp.get(ii)).split("--");
			if(tmpNo1[0].indexOf("Drive") < 0){
				vTmp.remove(ii);
			}
		}
		
		for(int i=0;i<vTmp.size();i++){
			String[] tmp = ((String)vTmp.get(i)).split("--");
			String[] strTmp = new String[tmp.length];
			String[] temp = tmp[0].split(" ");

			for(int j =1;j<temp.length;j++){
				if(temp[j].length() >= 1){
					strTmp[0] = temp[j];
					break;
				}
			}
			
			logger.info("into step NO1 : "+tmp.length);
			
			vForDriver = new Vector();
			for(int kk=1;kk<tmp.length;kk++){
				vForDriver.add(tmp[kk]);
				String[] strFinal = tmp[kk].split("  ");
				pro_name = strFinal[0];
				//Ӧ�ַ�Ҫ����Ϊ45.96���ݻ��Driver4�������أ��ʶ������ȡ����
				if(neat_host_name.equals("tjtbs1") && strTmp[0].equals("HP.ULTRIUM4-Drive4") && Formater.neatenunitid(pro_name).equals("/dev/rmt/c10t0d0BESTnb")){
					vForDriver.remove(kk-1);
				}
			}
			logger.info("into step NO2 : "+vForDriver.size());
			
			for(int k=0;k<vForDriver.size();k++){
//				strTmp[k] = strTmp[0] + tmp[k];
//				String[] strFinal = strTmp[k].split("  ");
				String[] strFinal = ((String)vForDriver.get(k)).split("  ");
				pro_name = strFinal[0];

				for(int o=strFinal.length-1;o>=1;o--){
					if(strFinal[o].length() >=1){
						status = strFinal[o].trim();
						break;
					}
				}
				logger.info("into step four " +pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(pro_name)+"---"+strTmp[0]+"==="+status+"==="+strFinal[0]+"==="+tmp[k]);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(pro_name), "CM-00-06-001-13", strTmp[0]);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(pro_name), "CM-00-06-001-04", pro_name);
				collResult.addKPI(pro_PRE_UNITID + ":" + neat_host_name + "-"
						+ Formater.neatenunitid(pro_name), "FM-00-06-001-03", status);

			}
		}

		return collResult.getKPISet();
	}
	
	/**
	 * ����һ�㣬�ܰ�ij̨����ϵ����м���ļ���ȡ��4��
	 * �ŵ�������У����Ǻ��滹��Ҫ�ٴβ�ֺ����飬����������������ֺ����飬ƴ�������������ʽ���ŵ�����
	 * 4   HP.ULTRIUM4-Drive5   hcart  TLD(0)  DRIVE=2--/dev/rmt/c7t0d0BESTnb		UP--/dev/rmt/c4t0d0BESTnb	UP
	 * ������Ŀ����ƴ��һ���10-15-12-10��HP.ULTRIUM4-Drive5 /dev/rmt/c7t0d0BESTnb��PM-00-01-005-07��UP���Ĵ��淽ʽ��
	 * */
	public Vector firstVectorSplit(BufferedReader br){
		Vector vTemp = new Vector();
		String sTmp;
		try {
			while((sTmp=br.readLine())!= null){
				if(sTmp.indexOf("TLD(0)")>=0 || sTmp.indexOf("Standalone")>=0){
					vTemp.add(s);
					s = new String();
					s += sTmp.trim();
				}
				if(sTmp.indexOf("UP")>=0 || sTmp.indexOf("DOWN")>=0 || sTmp.indexOf("DISABLED")>=0){
					s = s + "--" + sTmp.trim();
				}
				if( sTmp.indexOf("JobID")>=0)
					break;
	        }
			for(int i=0;i<vTemp.size();i++){
				if(vTemp.get(i) == null || vTemp.get(i).equals(null)){
					vTemp.remove(i);
				}
				if(((String)vTemp.get(i)).length() <=1){
					vTemp.remove(i);
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		return vTemp;
	}

	/**
	 * ��ʼ��ȡ�ô������
	 */
	public void init(HashMap params) {
		rpctarget = new RPCTarget();
		rpctarget.setRpcCmd("sh RPCTarget_suport.sh");
	}

	private String getHostName() {
		Vector host = rpctarget.getKPISet("uname -a");
//		System.out.println("hp_size" + host.size());
		String host_name = (String) host.elementAt(0);
		host_name = split(host_name, 1);
		return host_name;

	}

	public 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 "";
	}

}