CollWindowsWithHyperv.java 12.8 KB
package com.sitech.ismp.coll.centercoll;

import com.sitech.ismp.coll.CollBase;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.util.DES3;
import com.sitech.util.Formater;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;
import org.springframework.web.client.RestClientException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

/**
 * Created by mooker on 15/1/7.
 */
public class CollWindowsWithHyperv {

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

    private String PRE_UNITID = "10-10-23";

    static final String SH_COLL_CPU = "getHypervCPU.ps1";
    static final String SH_COLL_MEM = "getHypervMem.ps1";
    static final String SH_COLL_FILESYSTEM = "getHypervFileSystem.ps1";
    static final String SH_COLL_CONFIG = "getHypervConfig.ps1";

    private String HYPERV_URL = "";
    private String HOST_NAME = "";
    private String IP_ADDR = "";
    private int PORT = 8888;
    private String SCHEME = "http";
    private String USERNAME = "";
    private String PASSWORD = "";
    private String DOMAIN = null;
    private String FILEPATH = "";
    private String NEAT_HOST_NAME = "";
    private boolean isConnection = false;

    private List<Map> allVM = null;
    private String result = "";

    public CollWindowsWithHyperv(HashMap<String, String> params) {
        this.HYPERV_URL = (String) params.get("HYPERV_URL");
        this.HOST_NAME = (String) params.get("HOST_NAME");
        this.IP_ADDR = ((String) params.get("HYPERV_URL")).split("/")[2].split(":")[0];
        this.PORT = Integer.valueOf(((String) params.get("HYPERV_URL")).split("/")[2].split(":")[1]);
        this.FILEPATH = ((String) params.get("HYPERV_URL")).split("\\?")[1];
        String domianUsername = (String) params.get("USERNAME");
        if (domianUsername.indexOf("\\") != -1) {
            this.DOMAIN = domianUsername.split("\\\\")[0];
            this.USERNAME = domianUsername.split("\\\\")[1];
        } else {
            this.USERNAME = domianUsername;
        }
        this.PASSWORD = DES3.decrypt((String) params.get("PASSWORD"));
        this.NEAT_HOST_NAME = Formater.neatenunitid(this.HOST_NAME);
    }

    public void init(String filename) {
        try {
            HttpHost targetHost = new HttpHost(this.IP_ADDR, this.PORT, this.SCHEME);
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    new AuthScope(targetHost.getHostName(), targetHost.getPort()),
                    new NTCredentials(this.USERNAME, this.PASSWORD, null, this.DOMAIN));
            AuthCache authCache = new BasicAuthCache();
            // Generate BASIC scheme object and add it to the local auth cache
            BasicScheme basicAuth = new BasicScheme();
            authCache.put(targetHost, basicAuth);

            // Add AuthCache to the execution context
            HttpClientContext context = HttpClientContext.create();
            context.setCredentialsProvider(credsProvider);
            context.setAuthCache(authCache);
            CloseableHttpClient httpclient = HttpClients.createDefault();

            HttpGet httpget = new HttpGet("/?" + this.FILEPATH + filename);
            logger.info(this.HYPERV_URL + filename);
            for (int i = 0; i < 1; i++) {
                CloseableHttpResponse response = null;
                try {
                    response = httpclient.execute(targetHost, httpget, context);
                    System.out.print(response.toString());
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    HttpEntity entity = response.getEntity();
                    result = convertStreamToString(entity.getContent());
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    logger.info("httpclient.execute end" + result.length());
                }
            }

            isConnection = true;
        } catch (RestClientException re) {
            logger.error("Disconnected Hyperv");
            isConnection = false;
        }
    }

    public static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

    public Vector<TblATO_KPIDETAIL> getCpu(HashMap<String, String> params) {
        logger.info("Begin getCPU info by hyperv");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        init(SH_COLL_CPU);
        logger.info(isConnection + "><" + result);
        for (String res : result.split("\n")) {
            if (res.contains("CPU: ")) {
                // CPU使用率
                String UNIT_ID = this.PRE_UNITID + "-11:" + NEAT_HOST_NAME + "-cpu";
                collResult.addKPI(UNIT_ID, "PM-00-01-001-05", String.valueOf(res.split(":|%")[1]).trim());
            }
        }
        return collResult.getKPISet();
    }

    public Vector<TblATO_KPIDETAIL> getMemory(HashMap<String, String> params) {
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        init(SH_COLL_MEM);
        System.out.println(result);
        for (String res : result.split("\n")) {
            if (res.contains("Total Mem:")) {
                // 主机内存总大小
                collResult.addKPI(this.PRE_UNITID + "-10:" + NEAT_HOST_NAME + "-total", "CM-00-01-001-07", String.valueOf(res.split(":|MB")[1]).trim());
            } else if (res.contains("Left Mem:")) {
                // 剩余可使用主机内存 PM-00-01-002-14
                collResult.addKPI(this.PRE_UNITID + "-12:" + NEAT_HOST_NAME + "-mem", "PM-00-01-002-14", String.valueOf(res.split(":|MB")[1]).trim());
            }else if (res.contains("Used Mem:")) {
                // 内存使用率 PM-00-01-002-01
                collResult.addKPI(this.PRE_UNITID + "-12:" + NEAT_HOST_NAME + "-mem", "PM-00-01-002-01", String.valueOf(res.split(":|%")[1]).trim());
            }
        }
        return collResult.getKPISet();
    }

    public Vector<TblATO_KPIDETAIL> getFileSystem(HashMap<String, String> params) {
        logger.info("begin getFileSystem");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        init(SH_COLL_FILESYSTEM);
        System.out.println(result);
        long total_disk_size = 0;
        long total_disk_used = 0;
        String UNIT_ID = "";
        String[] tmp_result = result.split("\n");
        for (int j = 0; j < 3; j++) {
            for (int i = 1 + j * 3; i <= ((tmp_result.length - 2) / 3) + 3 * j - 1; i++) {
                if (tmp_result[i] != null && !tmp_result[i].equals("[") && !tmp_result[i].equals("]")) {
                    String fsName = tmp_result[i].split(":")[1].trim();
                    String fsSize = Formater
                            .formatDecimalKpivalue(tmp_result[i+1].split(":")[1].split("\"")[0].trim());
                    String fsFreeSize = Formater
                            .formatDecimalKpivalue(tmp_result[i+2].split(":")[1].split("\"")[0].trim());
                    System.out.println(fsName+"--"+fsSize+"--"+fsFreeSize);
                    UNIT_ID = this.PRE_UNITID + "-14" + ":" + NEAT_HOST_NAME + "-" + fsName;
                    // 文件系统名称 CM-00-01-001-16
                    collResult.addKPI(UNIT_ID, "CM-00-01-001-16", fsName);

                    // 文件系统使用率 PM-00-01-004-03
                    String fsUsed = Formater
                            .formatDecimalKpivalue(String.valueOf((Float.valueOf(fsSize) - Float.valueOf(fsFreeSize))/1024/1024));
                    if (Float.valueOf(fsSize) != 0) {
                        collResult.addKPI(UNIT_ID, "PM-00-01-004-03", Formater
                                .formatDecimalKpivalue(String.valueOf(Float.valueOf(fsUsed) /(Float.valueOf(fsSize)/1024/1024) * 100)));
                    } else {
                        collResult.addKPI(UNIT_ID, "PM-00-01-004-03", "0");
                    }

                    // 文件系统可用空间 PM-00-01-004-04
                    collResult.addKPI(UNIT_ID, "PM-00-01-004-04", Formater
                            .formatDecimalKpivalue(String.valueOf(Float.valueOf(fsFreeSize) /1024/1024)));
                    total_disk_size += Float.valueOf(fsSize)/1024/1024;
                    total_disk_used += Float.valueOf(fsUsed);
                    break;
                }
            }
        }

        UNIT_ID = this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME + "-total";
        if (total_disk_size != 0) {
            // 文件系统总的使用比率 PM-00-01-004-01
            collResult.addKPI(UNIT_ID, "PM-00-01-004-01", String.valueOf((int) (Float.valueOf(total_disk_used) / Float.valueOf(total_disk_size) * 100)));
        }
        // 文件系统的总空间 CM-00-01-001-17
        collResult.addKPI(UNIT_ID, "CM-00-01-001-17", String.valueOf(total_disk_size));
        return collResult.getKPISet();
    }

    public Vector<TblATO_KPIDETAIL> getConfig(HashMap<String, String> params){
        logger.info("begin getConfig");
        // 保存采集结果,并返回值
        CollBase collResult = new CollBase();
        init(SH_COLL_CONFIG);
        System.out.println(result);
        for (String res : result.split("\n")) {

            // 主机、CPU信息采集

            if(res.contains("SystemName:")){
                // 主机名称 CM-00-01-001-01
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-01", res.split(":|\"")[2].trim());
            } else if(res.contains("Name:")){
                // 主机Cpu型号 CM-00-01-001-05
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-05", res.split(":|\"")[2].trim());
            } else if(res.contains("Caption:")){
                // 主机操作系统版本 CM-00-01-001-59
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-59", res.split(":|\"")[2].trim());
            } else if(res.contains("CurrentClockSpeed:")){
                // 主机Cpu主频 CM-00-01-001-06
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-06", res.split(":|\"")[2].trim());
            } else if(res.contains("Version:")){
                // 主机内核版本 CM-00-01-001-08
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-08", res.split(":|\"")[2].trim());
            } else if(res.contains("NumberOfCores:")){
                // 物理CPU颗数 CM-00-01-001-71
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-71", res.split(":|\"")[2].trim());
            } else if(res.contains("NumberOfLogicalProcessors:")){
                // 逻辑CPU颗数 CM-00-01-001-72
                collResult.addKPI( this.PRE_UNITID + "-10" + ":" + NEAT_HOST_NAME
                        + "-total", "CM-00-01-001-72", res.split(":|\"")[2].trim());
            }

        }

        return collResult.getKPISet();
    }

    public static void main(String args[]) {
        String str = "http://172.21.0.16:8888/?command=E:\\monitor-ps1\\#FILE_PATH#&format=text";
        System.out.println(str.split("/")[2].split(":")[0]);
        System.out.println(str.split("/")[2].split(":")[1]);
    }
}