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

来源:互联网 发布:有源码怎么做辅助 编辑:程序博客网 时间:2024/05/22 10:58
  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名称:       dataUUID:           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名称:       mntUUID:           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名称:       defaultUUID:           fb38ae16-a4e2-4875-****-d00cc9d36ba8活跃:       是持久:       是自动启动: 是桥接:       virbr0