mirror of
https://gitee.com/lijiahangmax/orion-ops.git
synced 2026-09-24 15:30:00 +08:00
upgrade orion kit version.
This commit is contained in:
+1
-1
@@ -2,6 +2,7 @@ package com.orion.ops.controller;
|
||||
|
||||
import com.orion.lang.wrapper.DataGrid;
|
||||
import com.orion.lang.wrapper.Wrapper;
|
||||
import com.orion.net.remote.TerminalType;
|
||||
import com.orion.ops.annotation.EventLog;
|
||||
import com.orion.ops.annotation.RequireRole;
|
||||
import com.orion.ops.annotation.RestWrapper;
|
||||
@@ -19,7 +20,6 @@ import com.orion.ops.entity.vo.TerminalAccessVO;
|
||||
import com.orion.ops.handler.terminal.manager.TerminalSessionManager;
|
||||
import com.orion.ops.service.api.MachineTerminalService;
|
||||
import com.orion.ops.utils.Valid;
|
||||
import com.orion.remote.TerminalType;
|
||||
import com.orion.utils.Strings;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.orion.ops.controller;
|
||||
|
||||
import com.orion.id.ObjectIds;
|
||||
import com.orion.net.base.file.sftp.SftpErrorMessage;
|
||||
import com.orion.ops.annotation.EventLog;
|
||||
import com.orion.ops.annotation.RestWrapper;
|
||||
import com.orion.ops.consts.Const;
|
||||
@@ -18,9 +19,7 @@ import com.orion.ops.service.api.SftpService;
|
||||
import com.orion.ops.utils.Currents;
|
||||
import com.orion.ops.utils.PathBuilders;
|
||||
import com.orion.ops.utils.Valid;
|
||||
import com.orion.remote.channel.sftp.SftpErrorMessage;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.collect.Lists;
|
||||
import com.orion.utils.io.Files1;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@@ -379,8 +378,7 @@ public class SftpController {
|
||||
* @return RuntimeException
|
||||
*/
|
||||
private RuntimeException convertError(RuntimeException e) {
|
||||
if (SftpErrorMessage.NO_SUCH_FILE.getMessage().toLowerCase().contains(Strings.def(e.getMessage()).toLowerCase())) {
|
||||
// if (SftpErrorMessage.NO_SUCH_FILE.isCause(e)) {
|
||||
if (SftpErrorMessage.NO_SUCH_FILE.isCause(e)) {
|
||||
return Exceptions.argument(MessageConst.NO_SUCH_FILE);
|
||||
} else {
|
||||
return e;
|
||||
|
||||
@@ -13,7 +13,7 @@ import com.orion.ops.entity.domain.ApplicationMachineDO;
|
||||
*/
|
||||
public interface ApplicationMachineDAO extends BaseMapper<ApplicationMachineDO> {
|
||||
|
||||
/**NO_SUCH_FILE
|
||||
/**
|
||||
* 更新版本
|
||||
*
|
||||
* @param update update
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.orion.ops.entity.vo.sftp;
|
||||
|
||||
import com.orion.net.base.file.sftp.SftpFile;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.remote.channel.sftp.SftpFile;
|
||||
import com.orion.utils.convert.TypeStore;
|
||||
import com.orion.utils.io.FileType;
|
||||
import com.orion.utils.io.Files1;
|
||||
|
||||
+2
-2
@@ -4,6 +4,7 @@ import com.orion.constant.Letters;
|
||||
import com.orion.exception.ExecuteException;
|
||||
import com.orion.exception.LogException;
|
||||
import com.orion.lang.io.OutputAppender;
|
||||
import com.orion.net.remote.ExitCode;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.consts.app.ActionStatus;
|
||||
@@ -12,7 +13,6 @@ import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.ops.dao.ApplicationActionLogDAO;
|
||||
import com.orion.ops.entity.domain.ApplicationActionLogDO;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.ExitCode;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
@@ -228,7 +228,7 @@ public abstract class AbstractActionHandler implements IActionHandler {
|
||||
Integer exitCode = this.getExitCode();
|
||||
if (exitCode != null) {
|
||||
log.append(" exitcode: ")
|
||||
.append(ExitCode.SUCCESS.getCode().equals(exitCode)
|
||||
.append(ExitCode.isSuccess(exitCode)
|
||||
? Utils.getStainKeyWords(exitCode, StainCode.GLOSS_BLUE)
|
||||
: Utils.getStainKeyWords(exitCode, StainCode.GLOSS_RED));
|
||||
}
|
||||
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
package com.orion.ops.handler.app.action;
|
||||
|
||||
import com.orion.remote.channel.BaseExecutor;
|
||||
import com.orion.utils.io.Streams;
|
||||
|
||||
/**
|
||||
* 执行操作-传输产物
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @see com.orion.ops.consts.app.ActionType#RELEASE_TRANSFER
|
||||
* @since 2022/2/11 16:01
|
||||
*/
|
||||
public abstract class AbstractTransferActionHandler<E extends BaseExecutor> extends AbstractActionHandler {
|
||||
|
||||
protected E executor;
|
||||
|
||||
public AbstractTransferActionHandler(Long actionId, MachineActionStore store) {
|
||||
super(actionId, store);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate() {
|
||||
super.terminate();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
}
|
||||
|
||||
}
|
||||
+6
-8
@@ -1,9 +1,10 @@
|
||||
package com.orion.ops.handler.app.action;
|
||||
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.ExitCode;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.ExitCode;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.io.Streams;
|
||||
@@ -34,13 +35,10 @@ public class CommandActionHandler extends AbstractActionHandler {
|
||||
this.appendLog(Utils.getStainKeyWords("# 开始执行\n", StainCode.GLOSS_BLUE));
|
||||
// 打开executor
|
||||
this.executor = store.getSessionStore().getCommandExecutor(Strings.replaceCRLF(action.getActionCommand()));
|
||||
executor.inherit()
|
||||
.sync()
|
||||
.transfer(appender)
|
||||
.connect()
|
||||
.exec();
|
||||
// 执行命令
|
||||
CommandExecutors.syncExecCommand(executor, appender);
|
||||
this.exitCode = executor.getExitCode();
|
||||
if (!ExitCode.SUCCESS.getCode().equals(exitCode)) {
|
||||
if (!ExitCode.isSuccess(exitCode)) {
|
||||
throw Exceptions.execute("*** 命令执行失败 exitCode: " + exitCode);
|
||||
}
|
||||
}
|
||||
|
||||
+9
-6
@@ -1,8 +1,8 @@
|
||||
package com.orion.ops.handler.app.action;
|
||||
|
||||
import com.beust.jcommander.internal.Maps;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.ops.entity.domain.ApplicationActionLogDO;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.utils.collect.Maps;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.OutputStream;
|
||||
@@ -84,27 +84,30 @@ public class MachineActionStore {
|
||||
/**
|
||||
* 构建产物文件
|
||||
*
|
||||
* @see AbstractTransferActionHandler
|
||||
* @see SftpTransferActionHandler
|
||||
* @see ScpTransferActionHandler
|
||||
*/
|
||||
private String bundlePath;
|
||||
|
||||
/**
|
||||
* 产物传输路径
|
||||
*
|
||||
* @see AbstractTransferActionHandler
|
||||
* @see SftpTransferActionHandler
|
||||
* @see ScpTransferActionHandler
|
||||
*/
|
||||
private String transferPath;
|
||||
|
||||
/**
|
||||
* 产物传输方式
|
||||
*
|
||||
* @see AbstractTransferActionHandler
|
||||
* @see SftpTransferActionHandler
|
||||
* @see ScpTransferActionHandler
|
||||
* @see com.orion.ops.consts.app.TransferMode
|
||||
*/
|
||||
private String transferMode;
|
||||
|
||||
public MachineActionStore() {
|
||||
this.actions = Maps.newLinkedHashMap();
|
||||
this.actions = Maps.newLinkedMap();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+22
-18
@@ -1,5 +1,9 @@
|
||||
package com.orion.ops.handler.app.action;
|
||||
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.ExitCode;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.consts.command.CommandConst;
|
||||
@@ -7,9 +11,6 @@ import com.orion.ops.consts.env.EnvConst;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.ExitCode;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
@@ -30,12 +31,14 @@ import java.util.Map;
|
||||
* @see com.orion.ops.consts.app.TransferMode#SCP
|
||||
* @since 2022/4/26 23:58
|
||||
*/
|
||||
public class ScpTransferActionHandler extends AbstractTransferActionHandler<CommandExecutor> {
|
||||
public class ScpTransferActionHandler extends AbstractActionHandler {
|
||||
|
||||
protected static MachineInfoService machineInfoService = SpringHolder.getBean(MachineInfoService.class);
|
||||
|
||||
private SessionStore session;
|
||||
|
||||
private CommandExecutor executor;
|
||||
|
||||
@Getter
|
||||
private Integer exitCode;
|
||||
|
||||
@@ -55,7 +58,7 @@ public class ScpTransferActionHandler extends AbstractTransferActionHandler<Comm
|
||||
String scpCommand = Strings.def(action.getActionCommand(), CommandConst.SCP_TRANSFER_DEFAULT);
|
||||
Map<String, String> params = Maps.newMap();
|
||||
params.put(EnvConst.BUNDLE_PATH, bundlePath);
|
||||
params.put(EnvConst.TRANSFER_PATH, store.getTransferPath());
|
||||
params.put(EnvConst.TRANSFER_PATH, store.getTransferPath().replaceAll(Strings.SPACE, "\\\\\\\\ "));
|
||||
params.put(EnvConst.TARGET_USERNAME, store.getMachineUsername());
|
||||
params.put(EnvConst.TARGET_HOST, store.getMachineHost());
|
||||
scpCommand = Strings.format(scpCommand, EnvConst.SYMBOL, params);
|
||||
@@ -71,33 +74,34 @@ public class ScpTransferActionHandler extends AbstractTransferActionHandler<Comm
|
||||
this.session = machineInfoService.openSessionStore(Const.HOST_MACHINE_ID);
|
||||
// 打开executor
|
||||
this.executor = session.getCommandExecutor(Strings.replaceCRLF(scpCommand));
|
||||
executor.inherit()
|
||||
.sync()
|
||||
.transfer(appender)
|
||||
.connect()
|
||||
.exec();
|
||||
// 执行命令
|
||||
CommandExecutors.syncExecCommand(executor, appender);
|
||||
this.exitCode = executor.getExitCode();
|
||||
this.appendLog(Const.LF);
|
||||
if (!ExitCode.SUCCESS.getCode().equals(exitCode)) {
|
||||
if (!ExitCode.isSuccess(exitCode)) {
|
||||
throw Exceptions.execute("*** 命令执行失败 exitCode: " + exitCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate() {
|
||||
super.terminate();
|
||||
// 关闭宿主机session
|
||||
Streams.close(session);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(String command) {
|
||||
executor.write(command);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate() {
|
||||
super.terminate();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
// 关闭宿主机session
|
||||
Streams.close(session);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
// 关闭宿主机session
|
||||
Streams.close(session);
|
||||
}
|
||||
|
||||
+29
-11
@@ -1,15 +1,16 @@
|
||||
package com.orion.ops.handler.app.action;
|
||||
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.ops.service.api.MachineEnvService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.collect.Maps;
|
||||
import com.orion.utils.io.Files1;
|
||||
import com.orion.utils.io.Streams;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
@@ -24,10 +25,14 @@ import java.util.Map;
|
||||
* @see com.orion.ops.consts.app.TransferMode#SFTP
|
||||
* @since 2022/4/26 23:57
|
||||
*/
|
||||
public class SftpTransferActionHandler extends AbstractTransferActionHandler<SftpExecutor> {
|
||||
public class SftpTransferActionHandler extends AbstractActionHandler {
|
||||
|
||||
private static final String SPACE = " ";
|
||||
|
||||
protected static MachineEnvService machineEnvService = SpringHolder.getBean(MachineEnvService.class);
|
||||
|
||||
private SftpExecutor executor;
|
||||
|
||||
public SftpTransferActionHandler(Long actionId, MachineActionStore store) {
|
||||
super(actionId, store);
|
||||
}
|
||||
@@ -47,22 +52,21 @@ public class SftpTransferActionHandler extends AbstractTransferActionHandler<Sft
|
||||
// 删除远程文件
|
||||
String transferPath = store.getTransferPath();
|
||||
executor.rm(transferPath);
|
||||
String space = " ";
|
||||
String bundleAbsolutePath = bundleFile.getAbsolutePath();
|
||||
// 拼接头文件
|
||||
StringBuilder headerLog = new StringBuilder(Const.LF)
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append(Utils.getStainKeyWords("source: ", StainCode.GLOSS_GREEN))
|
||||
.append(Utils.getStainKeyWords(bundleAbsolutePath, StainCode.GLOSS_BLUE))
|
||||
.append(Const.LF)
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append(Utils.getStainKeyWords("target: ", StainCode.GLOSS_GREEN))
|
||||
.append(Utils.getStainKeyWords(transferPath, StainCode.GLOSS_BLUE))
|
||||
.append(Const.LF_2);
|
||||
headerLog.append(StainCode.prefix(StainCode.GLOSS_GREEN))
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append("类型")
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append(" target")
|
||||
.append(StainCode.SUFFIX)
|
||||
.append(Const.LF);
|
||||
@@ -74,9 +78,9 @@ public class SftpTransferActionHandler extends AbstractTransferActionHandler<Sft
|
||||
String remoteFile = entity.getValue();
|
||||
// 文件夹则创建
|
||||
if (localFile.isDirectory()) {
|
||||
StringBuilder createDirLog = new StringBuilder(space)
|
||||
StringBuilder createDirLog = new StringBuilder(SPACE)
|
||||
.append(Utils.getStainKeyWords("mkdir", StainCode.GLOSS_GREEN))
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append(Utils.getStainKeyWords(remoteFile, StainCode.GLOSS_BLUE))
|
||||
.append(Const.LF);
|
||||
this.appendLog(createDirLog.toString());
|
||||
@@ -84,9 +88,9 @@ public class SftpTransferActionHandler extends AbstractTransferActionHandler<Sft
|
||||
continue;
|
||||
}
|
||||
// 文件则传输
|
||||
StringBuilder transferLog = new StringBuilder(space)
|
||||
StringBuilder transferLog = new StringBuilder(SPACE)
|
||||
.append(Utils.getStainKeyWords("touch", StainCode.GLOSS_GREEN))
|
||||
.append(space)
|
||||
.append(SPACE)
|
||||
.append(Utils.getStainKeyWords(remoteFile, StainCode.GLOSS_BLUE))
|
||||
.append(StainCode.prefix(StainCode.GLOSS_BLUE))
|
||||
.append(" (")
|
||||
@@ -123,4 +127,18 @@ public class SftpTransferActionHandler extends AbstractTransferActionHandler<Sft
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate() {
|
||||
super.terminate();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
// 关闭executor
|
||||
Streams.close(executor);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -2,6 +2,7 @@ package com.orion.ops.handler.app.machine;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.able.Executable;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
@@ -23,7 +24,6 @@ import com.orion.ops.service.api.ApplicationEnvService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.service.api.WebSideMessageService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
|
||||
+1
-1
@@ -1,6 +1,7 @@
|
||||
package com.orion.ops.handler.app.machine;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.consts.app.ActionStatus;
|
||||
@@ -13,7 +14,6 @@ import com.orion.ops.handler.app.action.MachineActionStore;
|
||||
import com.orion.ops.service.api.ApplicationActionLogService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.io.Streams;
|
||||
|
||||
+30
-12
@@ -1,6 +1,11 @@
|
||||
package com.orion.ops.handler.exec;
|
||||
|
||||
import com.orion.constant.Letters;
|
||||
import com.orion.exception.DisableException;
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.ExitCode;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
@@ -15,9 +20,6 @@ import com.orion.ops.handler.tail.TailSessionHolder;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.service.api.WebSideMessageService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.ExitCode;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
@@ -104,12 +106,8 @@ public class CommandExecHandler implements IExecHandler {
|
||||
// 打开executor
|
||||
this.sessionStore = machineInfoService.openSessionStore(machine);
|
||||
this.executor = sessionStore.getCommandExecutor(Strings.replaceCRLF(record.getExecCommand()));
|
||||
// 开始执行
|
||||
executor.inherit()
|
||||
.sync()
|
||||
.transfer(logOutputStream)
|
||||
.connect()
|
||||
.exec();
|
||||
// 执行命令
|
||||
CommandExecutors.syncExecCommand(executor, logOutputStream);
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
}
|
||||
@@ -117,13 +115,15 @@ public class CommandExecHandler implements IExecHandler {
|
||||
try {
|
||||
if (terminated) {
|
||||
// 停止回调
|
||||
log.info("execHandler-执行停止 execId: {}", execId);
|
||||
this.terminatedCallback();
|
||||
} else if (ex == null) {
|
||||
// 完成回调
|
||||
this.completeCallback();
|
||||
} else if (ex instanceof DisableException) {
|
||||
// 机器未启用回调
|
||||
this.machineDisableCallback();
|
||||
} else {
|
||||
// 失败回调
|
||||
// 执行失败回调
|
||||
this.exceptionCallback(ex);
|
||||
}
|
||||
} finally {
|
||||
@@ -217,6 +217,7 @@ public class CommandExecHandler implements IExecHandler {
|
||||
* 停止回调
|
||||
*/
|
||||
private void terminatedCallback() {
|
||||
log.info("execHandler-执行停止 execId: {}", execId);
|
||||
// 更新状态
|
||||
this.updateStatus(ExecStatus.TERMINATED);
|
||||
// 拼接日志
|
||||
@@ -243,7 +244,7 @@ public class CommandExecHandler implements IExecHandler {
|
||||
.append(Utils.getStainKeyWords("# 命令执行完毕", StainCode.GLOSS_GREEN))
|
||||
.append(Letters.LF);
|
||||
sb.append("exitcode: ")
|
||||
.append(ExitCode.SUCCESS.getCode().equals(exitCode)
|
||||
.append(ExitCode.isSuccess(exitCode)
|
||||
? Utils.getStainKeyWords(exitCode, StainCode.GLOSS_BLUE)
|
||||
: Utils.getStainKeyWords(exitCode, StainCode.GLOSS_RED))
|
||||
.append(Letters.LF);
|
||||
@@ -265,6 +266,23 @@ public class CommandExecHandler implements IExecHandler {
|
||||
webSideMessageService.addMessage(MessageType.EXEC_SUCCESS, record.getUserId(), record.getUserName(), params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 机器未启用回调
|
||||
*/
|
||||
private void machineDisableCallback() {
|
||||
log.info("execHandler-机器停用停止 execId: {}", execId);
|
||||
// 更新状态
|
||||
this.updateStatus(ExecStatus.TERMINATED);
|
||||
// 拼接日志
|
||||
StringBuilder log = new StringBuilder()
|
||||
.append(Const.LF)
|
||||
.append(Utils.getStainKeyWords("# 命令执行机器未启用", StainCode.GLOSS_YELLOW))
|
||||
.append(Letters.TAB)
|
||||
.append(Utils.getStainKeyWords(Dates.format(endTime), StainCode.GLOSS_BLUE))
|
||||
.append(Const.LF);
|
||||
this.appendLog(log.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 异常回调
|
||||
*
|
||||
|
||||
+28
-10
@@ -1,6 +1,11 @@
|
||||
package com.orion.ops.handler.scheduler.machine;
|
||||
|
||||
import com.orion.constant.Letters;
|
||||
import com.orion.exception.DisableException;
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.ExitCode;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.StainCode;
|
||||
import com.orion.ops.consts.scheduler.SchedulerTaskMachineStatus;
|
||||
@@ -10,9 +15,6 @@ import com.orion.ops.entity.domain.SchedulerTaskMachineRecordDO;
|
||||
import com.orion.ops.handler.tail.TailSessionHolder;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.ExitCode;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
@@ -89,11 +91,7 @@ public class TaskMachineHandler implements ITaskMachineHandler {
|
||||
// 获取执行器
|
||||
this.executor = sessionStore.getCommandExecutor(Strings.replaceCRLF(machineRecord.getExecCommand()));
|
||||
// 开始执行
|
||||
executor.inherit()
|
||||
.sync()
|
||||
.transfer(logOutputStream)
|
||||
.connect()
|
||||
.exec();
|
||||
CommandExecutors.syncExecCommand(executor, logOutputStream);
|
||||
this.exitCode = executor.getExitCode();
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
@@ -106,8 +104,11 @@ public class TaskMachineHandler implements ITaskMachineHandler {
|
||||
} else if (ex == null) {
|
||||
// 完成回调
|
||||
this.completeCallback();
|
||||
} else if (ex instanceof DisableException) {
|
||||
// 机器未启用回调
|
||||
this.machineDisableCallback();
|
||||
} else {
|
||||
// 异常回调
|
||||
// 执行异常回调
|
||||
this.exceptionCallback(ex);
|
||||
throw Exceptions.runtime(ex);
|
||||
}
|
||||
@@ -138,7 +139,7 @@ public class TaskMachineHandler implements ITaskMachineHandler {
|
||||
*/
|
||||
private void completeCallback() {
|
||||
log.info("调度任务-机器操作-完成 machineRecordId: {}, exitCode: {}", machineRecordId, exitCode);
|
||||
final boolean execSuccess = ExitCode.SUCCESS.getCode().equals(exitCode);
|
||||
final boolean execSuccess = ExitCode.isSuccess(exitCode);
|
||||
// 更新状态
|
||||
if (execSuccess) {
|
||||
this.updateStatus(SchedulerTaskMachineStatus.SUCCESS);
|
||||
@@ -169,6 +170,23 @@ public class TaskMachineHandler implements ITaskMachineHandler {
|
||||
this.appendLog(log.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 机器未启用回调
|
||||
*/
|
||||
private void machineDisableCallback() {
|
||||
log.error("调度任务-机器操作-机器停用停止 machineRecordId: {}", machineRecordId);
|
||||
// 更新状态
|
||||
this.updateStatus(SchedulerTaskMachineStatus.TERMINATED);
|
||||
// 拼接日志
|
||||
StringBuilder log = new StringBuilder()
|
||||
.append(Const.LF)
|
||||
.append(Utils.getStainKeyWords("# 调度任务执行机器未启用", StainCode.GLOSS_YELLOW))
|
||||
.append(Letters.TAB)
|
||||
.append(Utils.getStainKeyWords(Dates.format(endTime), StainCode.GLOSS_BLUE))
|
||||
.append(Const.LF);
|
||||
this.appendLog(log.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 异常回调
|
||||
*/
|
||||
|
||||
+3
-8
@@ -1,5 +1,7 @@
|
||||
package com.orion.ops.handler.sftp;
|
||||
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.sftp.SftpTransferStatus;
|
||||
import com.orion.ops.dao.FileTransferLogDAO;
|
||||
@@ -7,8 +9,6 @@ import com.orion.ops.entity.domain.FileTransferLogDO;
|
||||
import com.orion.ops.entity.dto.FileTransferNotifyDTO;
|
||||
import com.orion.ops.service.api.MachineEnvService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.support.progress.ByteTransferProgress;
|
||||
import com.orion.support.progress.ByteTransferRateProgress;
|
||||
@@ -78,7 +78,7 @@ public abstract class FileTransferProcessor implements IFileTransferProcessor {
|
||||
// 检查是否可以用文件系统传输
|
||||
if (SftpSupport.checkUseFileSystem(executor)) {
|
||||
// 直接拷贝
|
||||
this.usingFsCopy();
|
||||
SftpSupport.usingFsCopy(this);
|
||||
} else {
|
||||
// 处理
|
||||
this.handler();
|
||||
@@ -111,11 +111,6 @@ public abstract class FileTransferProcessor implements IFileTransferProcessor {
|
||||
*/
|
||||
protected abstract void handler();
|
||||
|
||||
/**
|
||||
* 使用fileSystem 拷贝文件
|
||||
*/
|
||||
protected abstract void usingFsCopy();
|
||||
|
||||
/**
|
||||
* 初始化进度条
|
||||
*/
|
||||
|
||||
+2
-2
@@ -1,5 +1,7 @@
|
||||
package com.orion.ops.handler.sftp;
|
||||
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.event.EventKeys;
|
||||
import com.orion.ops.consts.event.EventParamsHolder;
|
||||
@@ -7,8 +9,6 @@ import com.orion.ops.entity.domain.MachineInfoDO;
|
||||
import com.orion.ops.service.api.MachineEnvService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.service.api.SftpService;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.utils.collect.Maps;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.orion.ops.handler.sftp;
|
||||
|
||||
import com.orion.id.UUIds;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.sftp.SftpTransferStatus;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.handler.sftp.impl.UploadFileProcessor;
|
||||
import com.orion.utils.io.Files1;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
@@ -14,6 +17,7 @@ import java.io.File;
|
||||
* @version 1.0.0
|
||||
* @since 2021/12/13 11:05
|
||||
*/
|
||||
@Slf4j
|
||||
public class SftpSupport {
|
||||
|
||||
private SftpSupport() {
|
||||
@@ -37,4 +41,31 @@ public class SftpSupport {
|
||||
return exist;
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用 file system copy
|
||||
*
|
||||
* @param processor processor
|
||||
*/
|
||||
public static void usingFsCopy(FileTransferProcessor processor) {
|
||||
// upload
|
||||
String remoteFile = processor.record.getRemoteFile();
|
||||
String localFile = processor.record.getLocalFile();
|
||||
String localAbsolutePath = Files1.getPath(SystemEnvAttr.SWAP_PATH.getValue(), localFile);
|
||||
log.info("sftp文件传输-使用FSC fileToken: {}, machineId: {}, local: {}, remote: {}",
|
||||
processor.fileToken, processor.machineId, localAbsolutePath, remoteFile);
|
||||
// 复制
|
||||
File sourceFile;
|
||||
if (processor instanceof UploadFileProcessor) {
|
||||
sourceFile = new File(localAbsolutePath);
|
||||
} else {
|
||||
sourceFile = new File(remoteFile);
|
||||
}
|
||||
Files1.copy(sourceFile, new File(remoteFile));
|
||||
// 通知进度
|
||||
long fileSize = sourceFile.length();
|
||||
processor.notifyProgress(Files1.getSize(fileSize), Files1.getSize(fileSize), "100");
|
||||
// 通知状态
|
||||
processor.updateStatusAndNotify(SftpTransferStatus.FINISH.getStatus(), 100D, fileSize);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,12 +1,12 @@
|
||||
package com.orion.ops.handler.sftp.direct;
|
||||
|
||||
import com.orion.able.SafeCloseable;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
import com.orion.ops.handler.sftp.SftpSupport;
|
||||
import com.orion.ops.service.api.MachineEnvService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Valid;
|
||||
import com.orion.utils.io.Files1;
|
||||
@@ -87,7 +87,7 @@ public class DirectDownloader implements SafeCloseable {
|
||||
return Files1.openInputStreamFast(path);
|
||||
} else {
|
||||
// 不是本机获取sftp文件
|
||||
return executor.getInputStream(path);
|
||||
return executor.openInputStream(path);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("直接下载远程文件-执行失败 machineId: {}, path: {}, e: {}", machineId, path, e);
|
||||
|
||||
+2
-22
@@ -1,18 +1,15 @@
|
||||
package com.orion.ops.handler.sftp.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.net.remote.channel.sftp.SftpDownloader;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.sftp.SftpTransferStatus;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.ops.entity.domain.FileTransferLogDO;
|
||||
import com.orion.ops.handler.sftp.FileTransferProcessor;
|
||||
import com.orion.remote.channel.sftp.bigfile.SftpDownload;
|
||||
import com.orion.utils.Threads;
|
||||
import com.orion.utils.io.Files1;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* 文件下载处理器
|
||||
*
|
||||
@@ -43,26 +40,9 @@ public class DownloadFileProcessor extends FileTransferProcessor {
|
||||
String localAbsolutePath = Files1.getPath(SystemEnvAttr.SWAP_PATH.getValue(), localFile);
|
||||
log.info("sftp文件下载-开始传输 fileToken: {}, machineId: {}, local: {}, remote: {}",
|
||||
fileToken, machineId, localAbsolutePath, remoteFile);
|
||||
SftpDownload download = executor.download(remoteFile, localAbsolutePath);
|
||||
SftpDownloader download = executor.download(remoteFile, localAbsolutePath);
|
||||
this.initProgress(download.getProgress());
|
||||
download.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void usingFsCopy() {
|
||||
String remoteFile = record.getRemoteFile();
|
||||
String localFile = record.getLocalFile();
|
||||
String localAbsolutePath = Files1.getPath(SystemEnvAttr.SWAP_PATH.getValue(), localFile);
|
||||
log.info("sftp文件上传-使用FSC fileToken: {}, machineId: {}, local: {}, remote: {}",
|
||||
fileToken, machineId, localAbsolutePath, remoteFile);
|
||||
// 复制
|
||||
File sourceFile = new File(remoteFile);
|
||||
Files1.copy(sourceFile, new File(localAbsolutePath));
|
||||
// 通知进度
|
||||
long fileSize = sourceFile.length();
|
||||
super.notifyProgress(Files1.getSize(fileSize), Files1.getSize(fileSize), "100");
|
||||
// 通知状态
|
||||
super.updateStatusAndNotify(SftpTransferStatus.FINISH.getStatus(), 100D, fileSize);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-22
@@ -1,18 +1,15 @@
|
||||
package com.orion.ops.handler.sftp.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.net.remote.channel.sftp.SftpUploader;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.sftp.SftpTransferStatus;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
import com.orion.ops.entity.domain.FileTransferLogDO;
|
||||
import com.orion.ops.handler.sftp.FileTransferProcessor;
|
||||
import com.orion.remote.channel.sftp.bigfile.SftpUpload;
|
||||
import com.orion.utils.Threads;
|
||||
import com.orion.utils.io.Files1;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* 文件上传处理器
|
||||
*
|
||||
@@ -43,26 +40,9 @@ public class UploadFileProcessor extends FileTransferProcessor {
|
||||
String localAbsolutePath = Files1.getPath(SystemEnvAttr.SWAP_PATH.getValue(), localFile);
|
||||
log.info("sftp文件上传-开始传输 fileToken: {}, machineId: {}, local: {}, remote: {}",
|
||||
fileToken, machineId, localAbsolutePath, remoteFile);
|
||||
SftpUpload upload = executor.upload(remoteFile, localAbsolutePath);
|
||||
SftpUploader upload = executor.upload(remoteFile, localAbsolutePath);
|
||||
this.initProgress(upload.getProgress());
|
||||
upload.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void usingFsCopy() {
|
||||
String remoteFile = record.getRemoteFile();
|
||||
String localFile = record.getLocalFile();
|
||||
String localAbsolutePath = Files1.getPath(SystemEnvAttr.SWAP_PATH.getValue(), localFile);
|
||||
log.info("sftp文件上传-使用FSC fileToken: {}, machineId: {}, local: {}, remote: {}",
|
||||
fileToken, machineId, localAbsolutePath, remoteFile);
|
||||
// 复制
|
||||
File sourceFile = new File(localAbsolutePath);
|
||||
Files1.copy(sourceFile, new File(remoteFile));
|
||||
// 通知进度
|
||||
long fileSize = sourceFile.length();
|
||||
super.notifyProgress(Files1.getSize(fileSize), Files1.getSize(fileSize), "100");
|
||||
// 通知状态
|
||||
super.updateStatusAndNotify(SftpTransferStatus.FINISH.getStatus(), 100D, fileSize);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+10
-10
@@ -1,6 +1,9 @@
|
||||
package com.orion.ops.handler.tail.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.net.base.ssh.IRemoteExecutor;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.ws.WsCloseCode;
|
||||
@@ -8,9 +11,6 @@ import com.orion.ops.handler.tail.ITailHandler;
|
||||
import com.orion.ops.handler.tail.TailFileHint;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.utils.WebSockets;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.BaseRemoteExecutor;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.io.Streams;
|
||||
@@ -73,12 +73,12 @@ public class ExecTailFileHandler implements ITailHandler {
|
||||
}
|
||||
// 打开 command
|
||||
this.executor = sessionStore.getCommandExecutor(Strings.replaceCRLF(hint.getCommand()));
|
||||
executor.inherit()
|
||||
.scheduler(SchedulerPools.TAIL_SCHEDULER)
|
||||
.callback(this::callback)
|
||||
.streamHandler(this::handler)
|
||||
.connect()
|
||||
.exec();
|
||||
executor.inherit();
|
||||
executor.scheduler(SchedulerPools.TAIL_SCHEDULER);
|
||||
executor.callback(this::callback);
|
||||
executor.streamHandler(this::handler);
|
||||
executor.connect();
|
||||
executor.exec();
|
||||
log.info("tail EXEC_TAIL 监听文件开始 token: {}", token);
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ public class ExecTailFileHandler implements ITailHandler {
|
||||
* @param executor executor
|
||||
*/
|
||||
@SneakyThrows
|
||||
private void callback(BaseRemoteExecutor executor) {
|
||||
private void callback(IRemoteExecutor executor) {
|
||||
log.info("tail EXEC_TAIL 监听文件结束 token: {}", token);
|
||||
if (session.isOpen()) {
|
||||
session.close(WsCloseCode.EOF_CALLBACK.close());
|
||||
|
||||
+1
-1
@@ -1,6 +1,7 @@
|
||||
package com.orion.ops.handler.terminal;
|
||||
|
||||
import com.orion.lang.wrapper.Tuple;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.ops.consts.KeyConst;
|
||||
import com.orion.ops.consts.terminal.TerminalOperate;
|
||||
import com.orion.ops.consts.ws.WsCloseCode;
|
||||
@@ -14,7 +15,6 @@ import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.service.api.MachineTerminalService;
|
||||
import com.orion.ops.service.api.PassportService;
|
||||
import com.orion.ops.utils.WebSockets;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.utils.Strings;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
|
||||
+9
-9
@@ -1,5 +1,8 @@
|
||||
package com.orion.ops.handler.terminal;
|
||||
|
||||
import com.orion.net.base.ssh.IRemoteExecutor;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.ShellExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.SchedulerPools;
|
||||
import com.orion.ops.consts.system.SystemEnvAttr;
|
||||
@@ -11,9 +14,6 @@ import com.orion.ops.entity.domain.MachineTerminalLogDO;
|
||||
import com.orion.ops.entity.dto.TerminalSizeDTO;
|
||||
import com.orion.ops.service.api.MachineTerminalService;
|
||||
import com.orion.ops.utils.PathBuilders;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.BaseRemoteExecutor;
|
||||
import com.orion.remote.channel.ssh.ShellExecutor;
|
||||
import com.orion.spring.SpringHolder;
|
||||
import com.orion.utils.Arrays1;
|
||||
import com.orion.utils.Strings;
|
||||
@@ -115,11 +115,11 @@ public class TerminalOperateHandler implements IOperateHandler {
|
||||
|
||||
@Override
|
||||
public void connect() {
|
||||
executor.connect()
|
||||
.scheduler(SchedulerPools.TERMINAL_SCHEDULER)
|
||||
.callback(this::callback)
|
||||
.streamHandler(this::streamHandler)
|
||||
.exec();
|
||||
executor.connect();
|
||||
executor.scheduler(SchedulerPools.TERMINAL_SCHEDULER);
|
||||
executor.callback(this::callback);
|
||||
executor.streamHandler(this::streamHandler);
|
||||
executor.exec();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -127,7 +127,7 @@ public class TerminalOperateHandler implements IOperateHandler {
|
||||
*
|
||||
* @param executor executor
|
||||
*/
|
||||
private void callback(BaseRemoteExecutor executor) {
|
||||
private void callback(IRemoteExecutor executor) {
|
||||
if (close) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.orion.ops.runner;
|
||||
|
||||
import com.orion.net.remote.channel.SessionHolder;
|
||||
import com.orion.ops.service.api.MachineKeyService;
|
||||
import com.orion.remote.channel.SessionHolder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.core.annotation.Order;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package com.orion.ops.service.api;
|
||||
|
||||
import com.orion.lang.wrapper.DataGrid;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.ops.consts.machine.MachineProperties;
|
||||
import com.orion.ops.entity.domain.MachineInfoDO;
|
||||
import com.orion.ops.entity.request.MachineInfoRequest;
|
||||
import com.orion.ops.entity.vo.MachineInfoVO;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
+1
-1
@@ -2,6 +2,7 @@ package com.orion.ops.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.id.UUIds;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.KeyConst;
|
||||
import com.orion.ops.consts.event.EventKeys;
|
||||
@@ -27,7 +28,6 @@ import com.orion.ops.handler.sftp.hint.FileTransferHint;
|
||||
import com.orion.ops.service.api.BatchUploadService;
|
||||
import com.orion.ops.service.api.MachineInfoService;
|
||||
import com.orion.ops.utils.Currents;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.collect.Lists;
|
||||
import com.orion.utils.collect.Maps;
|
||||
|
||||
+61
-19
@@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.orion.exception.AuthenticationException;
|
||||
import com.orion.exception.ConnectionRuntimeException;
|
||||
import com.orion.lang.wrapper.DataGrid;
|
||||
import com.orion.lang.wrapper.HttpWrapper;
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.channel.SessionHolder;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
import com.orion.ops.consts.event.EventKeys;
|
||||
@@ -26,9 +29,6 @@ import com.orion.ops.utils.DataQuery;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.ops.utils.ValueMix;
|
||||
import com.orion.process.Processes;
|
||||
import com.orion.remote.channel.SessionHolder;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.Valid;
|
||||
@@ -89,16 +89,19 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
public Long addMachine(MachineInfoRequest request) {
|
||||
// 检查proxyId
|
||||
this.checkProxy(request.getProxyId());
|
||||
// 检查名称
|
||||
this.checkNamePresent(null, request.getName());
|
||||
// 检查唯一标识
|
||||
this.checkTagPresent(null, request.getTag());
|
||||
MachineInfoDO entity = new MachineInfoDO();
|
||||
String password = request.getPassword();
|
||||
this.copyProperties(request, entity);
|
||||
// 添加机器
|
||||
entity.setMachineStatus(Const.ENABLE);
|
||||
machineInfoDAO.insert(entity);
|
||||
String password = request.getPassword();
|
||||
if (Strings.isNotBlank(password)) {
|
||||
entity.setPassword(ValueMix.encrypt(password));
|
||||
machineInfoDAO.updateById(entity);
|
||||
}
|
||||
machineInfoDAO.insert(entity);
|
||||
Long id = entity.getId();
|
||||
// 初始化环境变量
|
||||
machineEnvService.initEnv(id);
|
||||
@@ -110,11 +113,16 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Integer updateMachine(MachineInfoRequest request) {
|
||||
Long id = request.getId();
|
||||
// 检查proxyId
|
||||
this.checkProxy(request.getProxyId());
|
||||
// 检查名称
|
||||
this.checkNamePresent(id, request.getName());
|
||||
// 检查唯一标识
|
||||
this.checkTagPresent(id, request.getTag());
|
||||
MachineInfoDO entity = new MachineInfoDO();
|
||||
String password = request.getPassword();
|
||||
this.copyProperties(request, entity);
|
||||
String password = request.getPassword();
|
||||
if (Strings.isNotBlank(password)) {
|
||||
entity.setPassword(ValueMix.encrypt(password));
|
||||
}
|
||||
@@ -208,11 +216,15 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
MachineInfoDO machine = machineInfoDAO.selectById(id);
|
||||
Valid.notNull(machine, MessageConst.INVALID_MACHINE);
|
||||
String sourceMachineName = machine.getMachineName();
|
||||
String targetMachineName = sourceMachineName + Utils.getCopySuffix();
|
||||
String sourceMachineTag = machine.getMachineTag();
|
||||
String copySuffix = Utils.getCopySuffix();
|
||||
String targetMachineName = sourceMachineName + copySuffix;
|
||||
String targetMachineTag = sourceMachineTag + copySuffix;
|
||||
machine.setId(null);
|
||||
machine.setCreateTime(null);
|
||||
machine.setUpdateTime(null);
|
||||
machine.setMachineName(targetMachineName);
|
||||
machine.setMachineTag(targetMachineTag);
|
||||
machineInfoDAO.insert(machine);
|
||||
Long insertId = machine.getId();
|
||||
// 复制环境变量
|
||||
@@ -275,7 +287,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
Valid.notNull(machine, MessageConst.INVALID_MACHINE);
|
||||
// 检查状态
|
||||
if (!Const.ENABLE.equals(machine.getMachineStatus())) {
|
||||
throw Exceptions.codeArgument(HttpWrapper.HTTP_ERROR_CODE, MessageConst.MACHINE_NOT_ENABLE);
|
||||
throw Exceptions.disable(MessageConst.MACHINE_DISABLE);
|
||||
}
|
||||
Long id = machine.getId();
|
||||
// 查询超时间
|
||||
@@ -291,7 +303,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
if (e instanceof ConnectionRuntimeException) {
|
||||
// retry
|
||||
log.info("远程机器建立连接-连接失败");
|
||||
} else if (e instanceof AuthenticationException) {
|
||||
msg = MessageConst.AUTH_EXCEPTION_MESSAGE;
|
||||
break;
|
||||
@@ -302,7 +314,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
}
|
||||
String errorMessage = "机器 " + machine.getMachineHost() + " " + msg;
|
||||
log.error(errorMessage, ex);
|
||||
throw Exceptions.codeArgument(HttpWrapper.HTTP_ERROR_CODE, errorMessage, ex);
|
||||
throw Exceptions.app(errorMessage, ex);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -320,7 +332,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
session = SessionHolder.getSession(machine.getMachineHost(), machine.getSshPort(), machine.getUsername());
|
||||
String password = machine.getPassword();
|
||||
if (Strings.isNotBlank(password)) {
|
||||
session.setPassword(ValueMix.decrypt(password));
|
||||
session.password(ValueMix.decrypt(password));
|
||||
}
|
||||
MachineProxyDO proxy = null;
|
||||
if (proxyId != null) {
|
||||
@@ -333,13 +345,13 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
proxyPassword = ValueMix.decrypt(proxyPassword);
|
||||
}
|
||||
if (ProxyType.HTTP.equals(proxyType)) {
|
||||
session.setHttpProxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
session.httpProxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
} else if (ProxyType.SOCKET4.equals(proxyType)) {
|
||||
session.setSocket4Proxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
session.socket4Proxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
} else if (ProxyType.SOCKET5.equals(proxyType)) {
|
||||
session.setSocket5Proxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
session.socket5Proxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
}
|
||||
session.setHttpProxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
session.httpProxy(proxy.getProxyHost(), proxy.getProxyPort(), proxy.getProxyUsername(), proxyPassword);
|
||||
}
|
||||
session.connect(timeout);
|
||||
log.info("远程机器建立连接-成功 {}@{}:{}", machine.getUsername(), machine.getMachineHost(), machine.getSshPort());
|
||||
@@ -352,7 +364,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
|
||||
@Override
|
||||
public String getPropertiesResultSync(Long id, MachineProperties property) {
|
||||
return getCommandResultSync(id, property.getCommand());
|
||||
return this.getCommandResultSync(id, property.getCommand());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -401,7 +413,7 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
session = this.openSessionStore(id);
|
||||
executor = session.getCommandExecutor(Strings.replaceCRLF(command));
|
||||
executor.connect();
|
||||
String res = SessionStore.getCommandOutputResultString(executor);
|
||||
String res = CommandExecutors.getCommandOutputResultString(executor);
|
||||
log.info("执行机器命令-成功 {} {} {}", id, command, res);
|
||||
return res;
|
||||
} catch (Exception e) {
|
||||
@@ -431,6 +443,36 @@ public class MachineInfoServiceImpl implements MachineInfoService {
|
||||
Valid.notNull(proxy, MessageConst.INVALID_PROXY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查 name 是否存在
|
||||
*
|
||||
* @param id id
|
||||
* @param name name
|
||||
*/
|
||||
private void checkNamePresent(Long id, String name) {
|
||||
LambdaQueryWrapper<MachineInfoDO> presentWrapper = new LambdaQueryWrapper<MachineInfoDO>()
|
||||
.ne(id != null, MachineInfoDO::getId, id)
|
||||
.eq(MachineInfoDO::getMachineName, name);
|
||||
boolean present = DataQuery.of(machineInfoDAO).wrapper(presentWrapper).present();
|
||||
com.orion.ops.utils.Valid.isTrue(!present, MessageConst.NAME_PRESENT);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查 tag 是否存在
|
||||
*
|
||||
* @param id id
|
||||
* @param tag tag
|
||||
*/
|
||||
private void checkTagPresent(Long id, String tag) {
|
||||
LambdaQueryWrapper<MachineInfoDO> presentWrapper = new LambdaQueryWrapper<MachineInfoDO>()
|
||||
.ne(id != null, MachineInfoDO::getId, id)
|
||||
.eq(MachineInfoDO::getMachineTag, tag);
|
||||
boolean present = DataQuery.of(machineInfoDAO).wrapper(presentWrapper).present();
|
||||
com.orion.ops.utils.Valid.isTrue(!present, MessageConst.TAG_PRESENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 复制属性
|
||||
*/
|
||||
|
||||
+1
-1
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.orion.id.ObjectIds;
|
||||
import com.orion.lang.collect.LimitList;
|
||||
import com.orion.lang.wrapper.DataGrid;
|
||||
import com.orion.net.remote.channel.SessionHolder;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
import com.orion.ops.consts.event.EventKeys;
|
||||
@@ -18,7 +19,6 @@ import com.orion.ops.utils.DataQuery;
|
||||
import com.orion.ops.utils.PathBuilders;
|
||||
import com.orion.ops.utils.Valid;
|
||||
import com.orion.ops.utils.ValueMix;
|
||||
import com.orion.remote.channel.SessionHolder;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.codec.Base64s;
|
||||
import com.orion.utils.collect.Maps;
|
||||
|
||||
+2
-3
@@ -2,7 +2,7 @@ package com.orion.ops.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.orion.lang.wrapper.DataGrid;
|
||||
import com.orion.lang.wrapper.HttpWrapper;
|
||||
import com.orion.net.remote.TerminalType;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.KeyConst;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
@@ -25,7 +25,6 @@ import com.orion.ops.utils.Currents;
|
||||
import com.orion.ops.utils.DataQuery;
|
||||
import com.orion.ops.utils.Valid;
|
||||
import com.orion.ops.utils.ValueMix;
|
||||
import com.orion.remote.TerminalType;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.convert.Converts;
|
||||
@@ -68,7 +67,7 @@ public class MachineTerminalServiceImpl implements MachineTerminalService {
|
||||
MachineInfoDO machine = machineInfoService.selectById(machineId);
|
||||
Valid.notNull(machine, MessageConst.INVALID_MACHINE);
|
||||
if (!Const.ENABLE.equals(machine.getMachineStatus())) {
|
||||
throw Exceptions.codeArgument(HttpWrapper.HTTP_ERROR_CODE, MessageConst.MACHINE_NOT_ENABLE);
|
||||
throw Exceptions.disable(MessageConst.MACHINE_DISABLE);
|
||||
}
|
||||
// 设置accessToken
|
||||
Long userId = Currents.getUserId();
|
||||
|
||||
@@ -5,6 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.orion.id.ObjectIds;
|
||||
import com.orion.id.UUIds;
|
||||
import com.orion.lang.io.IgnoreOutputStream;
|
||||
import com.orion.net.base.file.sftp.SftpFile;
|
||||
import com.orion.net.remote.CommandExecutors;
|
||||
import com.orion.net.remote.channel.SessionStore;
|
||||
import com.orion.net.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.net.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.KeyConst;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
@@ -36,10 +41,6 @@ import com.orion.ops.utils.Currents;
|
||||
import com.orion.ops.utils.PathBuilders;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.ops.utils.Valid;
|
||||
import com.orion.remote.channel.SessionStore;
|
||||
import com.orion.remote.channel.sftp.SftpExecutor;
|
||||
import com.orion.remote.channel.sftp.SftpFile;
|
||||
import com.orion.remote.channel.ssh.CommandExecutor;
|
||||
import com.orion.utils.Exceptions;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.collect.Lists;
|
||||
@@ -390,10 +391,7 @@ public class SftpServiceImpl implements SftpService {
|
||||
try (SessionStore session = machineInfoService.openSessionStore(machine);
|
||||
CommandExecutor executor = session.getCommandExecutor(Strings.replaceCRLF(command))) {
|
||||
// 执行命令
|
||||
executor.sync()
|
||||
.transfer(new IgnoreOutputStream())
|
||||
.connect()
|
||||
.exec();
|
||||
CommandExecutors.syncExecCommand(executor, new IgnoreOutputStream());
|
||||
} catch (Exception e) {
|
||||
throw Exceptions.app(MessageConst.EXECUTE_SFTP_ZIP_COMMAND_ERROR, e);
|
||||
}
|
||||
@@ -524,7 +522,7 @@ public class SftpServiceImpl implements SftpService {
|
||||
SftpExecutor executor = sftpBasicExecutorHolder.getBasicExecutor(machineId);
|
||||
SftpFile file = executor.getFile(transferLog.getRemoteFile());
|
||||
if (file != null) {
|
||||
executor.rmFile(transferLog.getRemoteFile());
|
||||
executor.removeFile(transferLog.getRemoteFile());
|
||||
}
|
||||
} else {
|
||||
// 删除本地文件
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.orion.ops.service.impl;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.orion.location.region.LocationRegions;
|
||||
import com.orion.location.region.core.Region;
|
||||
import com.orion.net.remote.channel.SessionHolder;
|
||||
import com.orion.ops.consts.Const;
|
||||
import com.orion.ops.consts.EnableType;
|
||||
import com.orion.ops.consts.MessageConst;
|
||||
@@ -24,7 +25,6 @@ import com.orion.ops.service.api.SystemEnvService;
|
||||
import com.orion.ops.service.api.SystemService;
|
||||
import com.orion.ops.utils.FileCleaner;
|
||||
import com.orion.ops.utils.Utils;
|
||||
import com.orion.remote.channel.SessionHolder;
|
||||
import com.orion.utils.Strings;
|
||||
import com.orion.utils.Threads;
|
||||
import com.orion.utils.Valid;
|
||||
|
||||
Reference in New Issue
Block a user