Search in sources :

Example 1 with SSHCallback

use of com.sohu.cache.ssh.SSHTemplate.SSHCallback in project cachecloud by sohutv.

the class SSHUtil method getMachineInfo.

/**
     * Get HostPerformanceEntity[cpuUsage, memUsage, load] by ssh.<br>
     * 方法返回前已经释放了所有资源,调用方不需要关心
     *
     * @param ip
     * @param userName
     * @param password
     * @throws Exception
     * @since 1.0.0
     */
public static MachineStats getMachineInfo(String ip, int port, String userName, String password) throws SSHException {
    if (StringUtil.isBlank(ip)) {
        try {
            throw new IllegalParamException("Param ip is empty!");
        } catch (IllegalParamException e) {
            throw new SSHException(e.getMessage(), e);
        }
    }
    port = IntegerUtil.defaultIfSmallerThan0(port, ConstUtils.SSH_PORT_DEFAULT);
    final MachineStats systemPerformanceEntity = new MachineStats();
    systemPerformanceEntity.setIp(ip);
    sshTemplate.execute(ip, port, userName, password, new SSHCallback() {

        public Result call(SSHSession session) {
            //解析top命令
            session.executeCommand(COMMAND_TOP, new DefaultLineProcessor() {

                public void process(String line, int lineNum) throws Exception {
                    if (lineNum > 5) {
                        return;
                    }
                    if (1 == lineNum) {
                        // 第一行,通常是这样:
                        // top - 19:58:52 up 416 days, 30 min, 1 user, load average:
                        // 0.00, 0.00, 0.00
                        int loadAverageIndex = line.indexOf(LOAD_AVERAGE_STRING);
                        String loadAverages = line.substring(loadAverageIndex).replace(LOAD_AVERAGE_STRING, EMPTY_STRING);
                        String[] loadAverageArray = loadAverages.split(",");
                        if (3 == loadAverageArray.length) {
                            systemPerformanceEntity.setLoad(StringUtil.trimToEmpty(loadAverageArray[0]));
                        }
                    } else if (3 == lineNum) {
                        // 第三行通常是这样:
                        // , 0.0% sy, 0.0% ni, 100.0% id, 0.0% wa,
                        // 0.0% hi, 0.0% si
                        // redhat:%Cpu(s):  0.0 us
                        // centos7:Cpu(s): 0.0% us
                        double cpuUs = getUsCpu(line);
                        systemPerformanceEntity.setCpuUsage(String.valueOf(cpuUs));
                    }
                }
            });
            //解析memory
            session.executeCommand(COMMAND_MEM, new LineProcessor() {

                private String totalMem;

                private String freeMem;

                private String buffersMem;

                private String cachedMem;

                public void process(String line, int lineNum) throws Exception {
                    if (line.contains(MEM_TOTAL)) {
                        totalMem = matchMemLineNumber(line).trim();
                    } else if (line.contains(MEM_FREE)) {
                        freeMem = matchMemLineNumber(line).trim();
                    } else if (line.contains(MEM_BUFFERS)) {
                        buffersMem = matchMemLineNumber(line).trim();
                    } else if (line.contains(MEM_CACHED)) {
                        cachedMem = matchMemLineNumber(line).trim();
                    }
                }

                public void finish() {
                    if (!StringUtil.isBlank(totalMem, freeMem, buffersMem)) {
                        Long totalMemLong = NumberUtils.toLong(totalMem);
                        Long freeMemLong = NumberUtils.toLong(freeMem);
                        Long buffersMemLong = NumberUtils.toLong(buffersMem);
                        Long cachedMemLong = NumberUtils.toLong(cachedMem);
                        Long usedMemFree = freeMemLong + buffersMemLong + cachedMemLong;
                        Double memoryUsage = 1 - (NumberUtils.toDouble(usedMemFree.toString()) / NumberUtils.toDouble(totalMemLong.toString()) / 1.0);
                        systemPerformanceEntity.setMemoryTotal(String.valueOf(totalMemLong));
                        systemPerformanceEntity.setMemoryFree(String.valueOf(usedMemFree));
                        DecimalFormat df = new DecimalFormat("0.00");
                        systemPerformanceEntity.setMemoryUsageRatio(df.format(memoryUsage * 100));
                    }
                }
            });
            // 统计磁盘使用状况
            /**
	             * 内容通常是这样: Filesystem 容量 已用 可用 已用% 挂载点 /dev/xvda2 5.8G 3.2G 2.4G
	             * 57% / /dev/xvda1 99M 8.0M 86M 9% /boot none 769M 0 769M 0%
	             * /dev/shm /dev/xvda7 68G 7.1G 57G 12% /home /dev/xvda6 2.0G 36M
	             * 1.8G 2% /tmp /dev/xvda5 2.0G 199M 1.7G 11% /var
	             * */
            session.executeCommand(COMMAND_DF_LH, new LineProcessor() {

                private Map<String, String> diskUsageMap = new HashMap<String, String>();

                public void process(String line, int lineNum) throws Exception {
                    if (lineNum == 1) {
                        return;
                    }
                    line = line.replaceAll(" {1,}", WORD_SEPARATOR);
                    String[] lineArray = line.split(WORD_SEPARATOR);
                    if (6 == lineArray.length) {
                        String diskUsage = lineArray[4];
                        String mountedOn = lineArray[5];
                        diskUsageMap.put(mountedOn, diskUsage);
                    }
                }

                public void finish() {
                    systemPerformanceEntity.setDiskUsageMap(diskUsageMap);
                }
            });
            return null;
        }
    });
    // 统计当前网络流量 @TODO 
    Double traffic = 0.0;
    systemPerformanceEntity.setTraffic(traffic.toString());
    return systemPerformanceEntity;
}
Also used : DefaultLineProcessor(com.sohu.cache.ssh.SSHTemplate.DefaultLineProcessor) SSHCallback(com.sohu.cache.ssh.SSHTemplate.SSHCallback) DecimalFormat(java.text.DecimalFormat) MachineStats(com.sohu.cache.entity.MachineStats) LineProcessor(com.sohu.cache.ssh.SSHTemplate.LineProcessor) DefaultLineProcessor(com.sohu.cache.ssh.SSHTemplate.DefaultLineProcessor) SSHException(com.sohu.cache.exception.SSHException) Result(com.sohu.cache.ssh.SSHTemplate.Result) SSHSession(com.sohu.cache.ssh.SSHTemplate.SSHSession) IllegalParamException(com.sohu.cache.exception.IllegalParamException) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with SSHCallback

use of com.sohu.cache.ssh.SSHTemplate.SSHCallback in project cachecloud by sohutv.

the class SSHUtil method execute.

/**
     * SSH 方式登录远程主机,执行命令,方法内部会关闭所有资源,调用方无须关心。
     *
     * @param ip       主机ip
     * @param username 用户名
     * @param password 密码
     * @param command  要执行的命令
     */
public static String execute(String ip, int port, String username, String password, final String command) throws SSHException {
    if (StringUtil.isBlank(command)) {
        return EMPTY_STRING;
    }
    port = IntegerUtil.defaultIfSmallerThan0(port, ConstUtils.SSH_PORT_DEFAULT);
    Result rst = sshTemplate.execute(ip, port, username, password, new SSHCallback() {

        public Result call(SSHSession session) {
            return session.executeCommand(command);
        }
    });
    if (rst.isSuccess()) {
        return rst.getResult();
    }
    return "";
}
Also used : SSHSession(com.sohu.cache.ssh.SSHTemplate.SSHSession) SSHCallback(com.sohu.cache.ssh.SSHTemplate.SSHCallback) Result(com.sohu.cache.ssh.SSHTemplate.Result)

Aggregations

Result (com.sohu.cache.ssh.SSHTemplate.Result)2 SSHCallback (com.sohu.cache.ssh.SSHTemplate.SSHCallback)2 SSHSession (com.sohu.cache.ssh.SSHTemplate.SSHSession)2 MachineStats (com.sohu.cache.entity.MachineStats)1 IllegalParamException (com.sohu.cache.exception.IllegalParamException)1 SSHException (com.sohu.cache.exception.SSHException)1 DefaultLineProcessor (com.sohu.cache.ssh.SSHTemplate.DefaultLineProcessor)1 LineProcessor (com.sohu.cache.ssh.SSHTemplate.LineProcessor)1 DecimalFormat (java.text.DecimalFormat)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1