java使用ssh调用shell命令获取KVM数据(KVM需要通过libvirt管理)(二)

3 篇文章 0 订阅
3 篇文章 0 订阅
  1. jsch工具类:
package com.mdl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class JSchUtils {

    private static JSch jsch;
    private static Session session;

    /**
     * 连接到指定的IP
     * 
     * @throws JSchException
     */
    public static void connect(String user, String passwd, String host, int port) throws JSchException {
        jsch = new JSch();// 创建JSch对象
        session = jsch.getSession(user, host, port);// 根据用户名、主机ip、端口号获取一个Session对象
        session.setPassword(passwd);// 设置密码

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);// 为Session对象设置properties
        session.connect();// 通过Session建立连接
    }

    /**
     * 关闭连接
     */
    public static void close() {
        session.disconnect();
    }

    /**
     * 执行相关的命令
     * 
     * @throws JSchException
     */
    public static String execCmd(String command) throws JSchException {
        String resultStr = "";
        BufferedReader reader = null;
        Channel channel = null;
        try {
            if (command != null) {
                channel = session.openChannel("exec");
                ((ChannelExec) channel).setCommand(command);
                // ((ChannelExec) channel).setErrStream(System.err);
                channel.connect();

                InputStream in = channel.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                String buf = null;
                while ((buf = reader.readLine()) != null) {
                    resultStr = resultStr + "\n" + buf;
//                  System.out.println("resultStr---" + resultStr);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSchException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            channel.disconnect();
        }
        return resultStr;
    }

}
  1. main函数:
package com.mdl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
import com.mdl.vo.KVM;
import com.mdl.vo.NET;

public class KVMCollectMain {


    public static void main(String[] args) throws SftpException {
        try {
            // 1.连接到指定的服务器
            JSchUtils.connect("root", "mdl_12345", "172.*.*.45", 22);

            // 2.执行相关的命令,获取主机名称list
            String hostsStr = JSchUtils.execCmd("virsh list");
            List<String> hostNameList = getHostNameList(hostsStr);

            // 3.执行相关的命令,获取每台主机基本信息
            Map<String,KVM> hostInfoMap = getHostInfo(hostNameList);

            // 4.执行相关的命令,获取存储信息
            String storeCommand = "virsh pool-list";
            String storeStr = JSchUtils.execCmd(storeCommand);
            List<String> storeList = getStoreInfo(storeStr);

            // 5.执行相关的命令,获取每个存储池下面的主机信息
            Map<String,List<Map<String,KVM>>> mStoreMap = getStoreDetailInfo(storeList);
            Map<String,Object> resMap = new HashMap<String,Object>();

            // 6.执行相关的命令,获取网络信息
            String networkCommand = "virsh net-list";
            String networkStr = JSchUtils.execCmd(networkCommand);
            HashMap<String,NET> netMapInfo = getNetworkInfo(networkStr);

            resMap.put("kvm", hostInfoMap);
            resMap.put("store", mStoreMap);
            resMap.put("network", netMapInfo);

            Gson gs = new Gson();
            String mStr = gs.toJson(resMap);

            System.out.println(mStr);

            // 4.关闭连接
            JSchUtils.close();
       } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回主机名的list
     * @param str
     * @return
     */
    private static List<String> getHostNameList(String str){
        String[] strArr = str.split("\\n");
        List<String> hostList = new ArrayList<String>();
        List<String> mList;
        for(int j=3;j<strArr.length;j++){   //字符串换行分割后,下标0-2的数值是表格名称和分割线
            mList = new ArrayList<String>();
            String[] arr = strArr[j].split(" ");
            for(int i=0;i<arr.length;i++){
                if(!arr[i].equals("")){
                    mList.add(arr[i]);
                }
            }
            hostList.add(mList.get(1));
        }
        return hostList;
    }

    /**
     * 返回主机的基本信息
     * @param str
     * @return
     */
    private static KVM getHostBaseInfo(String str){
        KVM kvm = new KVM();
        String[] strArr = str.split("\\n");
        kvm.setUuid(formatStr(strArr[3]));
        kvm.setInstanceRunningId(formatStr(strArr[1]));// 运行时ID
        kvm.setInstanceName(formatStr(strArr[2]));// 虚拟机实例名称
        kvm.setInstanceState(formatStr(strArr[5]));// 虚拟机状态
        kvm.setOSType(formatStr(strArr[4]));// 系统类型
        kvm.setCPUNumber(formatStr(strArr[6]));// CPU数量(个)
        kvm.setCPUTime(formatStr(strArr[7]));// CPU时间(s)
        kvm.setMAXMemory(formatStr(strArr[8]));// 最大使用内存
        kvm.setMemoryUsed(formatStr(strArr[9]));// 已用内存
        // String DiskNumber = "";//硬盘数量(个) 返回结果里面没有硬盘个数的显示
        return kvm;
    }

    /**
     * 获取每台主机的基本信息
     * @param list
     * @return
     * @throws JSchException
     */
    private static Map<String,KVM> getHostInfo(List<String> list) throws JSchException{
        Map<String,KVM> map = new HashMap<String,KVM>();
        for(int i=0;i<list.size();i++){
            String commandStr = "virsh dominfo" + " " + list.get(i);
            String hostInfoStr = JSchUtils.execCmd(commandStr);
            map.put(list.get(i), getHostBaseInfo(hostInfoStr));
        }
        return map;
    }

    /**
     * 获取存储池列表
     * @return
     */
    private static List<String> getStoreInfo(String str){
        String[] strArr = str.split("\\n");
        List<String> storeList = new ArrayList<String>();
        List<String> mList;
        for(int j=3;j<strArr.length;j++){   //字符串换行分割后,下标0-2的数值是表格名称和分割线
            mList = new ArrayList<String>();
            String[] arr = strArr[j].split(" ");
            for(int i=0;i<arr.length;i++){
                if(!arr[i].equals("")){
                    mList.add(arr[i]);
                }
            }
            storeList.add(mList.get(0));
        }
        return storeList;
    }

    /**
     * 获取所有存储池下的每个池中的主机信息
     * @param storeList
     * @return
     * @throws JSchException
     */

    private static Map<String,List<Map<String,KVM>>> getStoreDetailInfo(List<String> storeList) throws JSchException{
        Map<String,List<Map<String,KVM>>> map = new HashMap<String,List<Map<String,KVM>>>();;
        for (String str : storeList) {
            String storeDetail = JSchUtils.execCmd("virsh vol-list --details" + " " + str);
            List<Map<String,KVM>> list = getStoreHostDetail(storeDetail);
            map.put(str, list);
        }
        return map;
    }


    /**
     * 每个存储池下面包含的主机及主机信息
     * @param str
     * @return
     * @throws JSchException 
     */
    private static List<Map<String,KVM>> getStoreHostDetail(String str) throws JSchException{
        String[] strArr = str.split("\\n");
        Map<String,KVM> map = null;
        List<Map<String,KVM>> list = new ArrayList<Map<String,KVM>>();
        List<String> mList;
        for(int j=3;j<strArr.length;j++){   //字符串换行分割后,下标0-2的数值是表格名称和分割线
            mList = new ArrayList<String>();
            String[] arr = strArr[j].split(" ");
            for(int i=0;i<arr.length;i++){
                if(!arr[i].equals("")){
                    mList.add(arr[i]);
                }
            }

            if(mList.get(0).indexOf(".")>0 && mList.get(0).split("\\.")[1].equals("img")){
                map = new HashMap<String,KVM>();
                String hostName = mList.get(0).split("\\.")[0];
                String commandStr = "virsh dominfo" + " " + hostName;
                String hostInfoStr = JSchUtils.execCmd(commandStr);
                map.put(hostName, getHostBaseInfo(hostInfoStr));
                list.add(map);
            }
        }
        return list;
    }


    /**
     * 获取网络信息
     * @param str
     * @return
     * @throws JSchException
     */
    private static HashMap<String,NET> getNetworkInfo(String str) throws JSchException{
        String[] strArr = str.split("\\n");
        List<String> netList = new ArrayList<String>();
        List<String> mList;
        for(int j=3;j<strArr.length;j++){   //字符串换行分割后,下标0-2的数值是表格名称和分割线
            mList = new ArrayList<String>();
            String[] arr = strArr[j].split(" ");
            for(int i=0;i<arr.length;i++){
                if(!arr[i].equals("")){
                    mList.add(arr[i]);
                }
            }
            netList.add(mList.get(0));
        }

        HashMap<String,NET> map = null;
        for (String mStr : netList) {
            String netCommand = "virsh net-info" + " " + mStr;
            String networkStr = JSchUtils.execCmd(netCommand);
            NET net = operNetInfo(networkStr);
            map = new HashMap<String,NET>();
            map.put(mStr, net);
        }
        return map;
    }

    private static NET operNetInfo(String str){
        NET net = new NET();
        String[] strArr = str.split("\\n");
        net.setActive(formatStr(strArr[3]));
        net.setUuid(formatStr(strArr[2]));
        net.setAutorun(formatStr(strArr[5]));
        net.setBridge(formatStr(strArr[6]));
        net.setEnduring(formatStr(strArr[4]));
        net.setName(formatStr(strArr[1]));
        return net;
    }


    /**
     * 去除字符串中间的空格 将中文:替换为英文:
     * 
     * @param str
     * @return
     */
    private static String formatStr(String str) {
        String result;
        if (str.indexOf(":") > 0) {
            result = str.replaceAll(" ", "").replaceAll(":", ":");
        } else {
            result = str.replaceAll(" ", "");
        }

        return result.split("\\:")[1];
    }
}
  1. KVM实体:
package com.mdl.vo;

public class KVM {

    String uuid;
    String InstanceRunningId;//运行时ID
    String InstanceName;//虚拟机实例名称
    String InstanceState;//虚拟机状态
    String OSType;//系统类型
    String CPUNumber;//CPU数量(个)
    String CPUTime;//CPU时间(s)
    String MAXMemory;//最大使用内存(MB)
    String MemoryUsed;//已用内存(MB)
//  String DiskNumber;//硬盘数量(个)

    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getInstanceRunningId() {
        return InstanceRunningId;
    }
    public void setInstanceRunningId(String instanceRunningId) {
        InstanceRunningId = instanceRunningId;
    }
    public String getInstanceName() {
        return InstanceName;
    }
    public void setInstanceName(String instanceName) {
        InstanceName = instanceName;
    }
    public String getInstanceState() {
        return InstanceState;
    }
    public void setInstanceState(String instanceState) {
        InstanceState = instanceState;
    }
    public String getOSType() {
        return OSType;
    }
    public void setOSType(String oSType) {
        OSType = oSType;
    }
    public String getCPUNumber() {
        return CPUNumber;
    }
    public void setCPUNumber(String cPUNumber) {
        CPUNumber = cPUNumber;
    }
    public String getCPUTime() {
        return CPUTime;
    }
    public void setCPUTime(String cPUTime) {
        CPUTime = cPUTime;
    }
    public String getMAXMemory() {
        return MAXMemory;
    }
    public void setMAXMemory(String mAXMemory) {
        MAXMemory = mAXMemory;
    }
    public String getMemoryUsed() {
        return MemoryUsed;
    }
    public void setMemoryUsed(String memoryUsed) {
        MemoryUsed = memoryUsed;
    }
}

4.NET实体:

package com.mdl.vo;

public class NET {

    private String name;
    private String uuid;
    private String active;//活跃
    private String enduring ;//持久
    private String autorun;//自启动
    private String bridge;//桥接

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getActive() {
        return active;
    }
    public void setActive(String active) {
        this.active = active;
    }
    public String getEnduring() {
        return enduring;
    }
    public void setEnduring(String enduring) {
        this.enduring = enduring;
    }
    public String getAutorun() {
        return autorun;
    }
    public void setAutorun(String autorun) {
        this.autorun = autorun;
    }
    public String getBridge() {
        return bridge;
    }
    public void setBridge(String bridge) {
        this.bridge = bridge;
    }

}

相关命令:
1. 存储池列表:

virsh # pool-list
 名称               状态     自动开始
-------------------------------------------
 data                 活动     是       
 mnt                  活动     是       

1.1 存储池data:

1.1.1 存储池data基本信息:

virsh # pool-info data
名称:       data
UUID:           669e2c02-62ce-4a4e-****-3e11ef2bc7bb
状态:       running
持久:       是
自动启动: 是
容量:       1.55 TiB
分配:       623.24 GiB
可用:       966.74 GiB

1.1.2 存储池data详细信息:

virsh # vol-list --details data
 名称                                      路径                                            类型    Capacity      分配
------------------------------------------------------------------------------------------------------------------------------
 bg-119.img                                  /data/bg-119.img                                  文件  400.00 GiB   93.38 GiB
 bg-120.img                                  /data/bg-120.img                                  文件  400.00 GiB   90.28 GiB
 bg-121.img                                  /data/bg-121.img                                  文件  400.00 GiB   75.76 GiB
 bg-122.img                                  /data/bg-122.img                                  文件  400.00 GiB    8.58 GiB
 bg-132.img                                  /data/bg-132.img                                  文件  400.00 GiB  255.38 GiB
 bg-239.img                                  /data/bg-239.img                                  文件  400.00 GiB   22.37 GiB
 bg-240.img                                  /data/bg-240.img                                  文件  400.00 GiB    7.57 GiB
 bg-241.img                                  /data/bg-241.img                                  文件  400.00 GiB    9.39 GiB
 centos7-dvd.iso                             /data/centos7-dvd.iso                             文件    3.86 GiB    3.86 GiB
 centos7.img                                 /data/centos7.img                                 文件  400.00 GiB    2.34 GiB
 HDP-pkg                                     /data/HDP-pkg                                     dir         0.00 B      0.00 B
 HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart  /data/HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart  文件   14.70 MiB   14.70 MiB
 network                                     /data/network                                     文件    337.00 B    4.00 KiB
 ocn_build_pkg                               /data/ocn_build_pkg                               dir         0.00 B      0.00 B
 virt-clone-centos7.sh                       /data/virt-clone-centos7.sh                       文件   1007.00 B    4.00 KiB
 virt-install-centos7.sh                     /data/virt-install-centos7.sh                     文件    496.00 B    4.00 KiB

1.2 存储池mnt信息:

1.2.1 存储池mnt基本信息:

virsh # pool-info mnt
名称:       mnt
UUID:           35a8f3a4-f0d4-4bbd-****-04d777c5452f
状态:       running
持久:       是
自动启动: 是
容量:       1.55 TiB
分配:       623.24 GiB
可用:       966.74 GiB

1.2.2 存储池mnt详细信息:

virsh # vol-list --details mnt
 名称                 路径                      类型    Capacity    分配
---------------------------------------------------------------------------------
 centos7-dvd.iso        /mnt/centos7-dvd.iso        文件    3.86 GiB  3.86 GiB
 centos7.img            /mnt/centos7.img            文件  400.00 GiB  2.34 GiB
 network                /mnt/network                文件    333.00 B  4.00 KiB
 virt-clone-centos7.sh  /mnt/virt-clone-centos7.sh  文件   1005.00 B  4.00 KiB

2 . 网络

2.1 列表:

virsh # net-list
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是

2.2 详情:

virsh # net-info default
名称:       default
UUID:           fb38ae16-a4e2-4875-****-d00cc9d36ba8
活跃:       是
持久:       是
自动启动: 是
桥接:       virbr0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值