diff --git a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/AppConst.java b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/AppConst.java index 4d657f35..bf927fef 100644 --- a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/AppConst.java +++ b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/AppConst.java @@ -14,7 +14,7 @@ public interface AppConst extends OrionConst { /** * 同 ${orion.version} 迭代时候需要手动更改 */ - String VERSION = "2.1.6"; + String VERSION = "2.1.7"; /** * 同 ${spring.application.name} diff --git a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/ExtraFieldConst.java b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/ExtraFieldConst.java index f0060c82..e8c4c48d 100644 --- a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/ExtraFieldConst.java +++ b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/constant/ExtraFieldConst.java @@ -21,6 +21,8 @@ public interface ExtraFieldConst extends FieldConst { String USERNAME = "username"; + String HOME = "home"; + String STATUS_NAME = "statusName"; String KEY_NAME = "keyName"; diff --git a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/PathUtils.java b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/PathUtils.java index 61631269..b361d857 100644 --- a/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/PathUtils.java +++ b/orion-visor-framework/orion-visor-framework-common/src/main/java/com/orion/visor/framework/common/utils/PathUtils.java @@ -1,6 +1,8 @@ package com.orion.visor.framework.common.utils; import com.orion.lang.utils.Objects1; +import com.orion.lang.utils.Systems; +import com.orion.lang.utils.io.Files1; import com.orion.visor.framework.common.constant.AppConst; import com.orion.visor.framework.common.constant.Const; @@ -24,9 +26,25 @@ public class PathUtils { * @return 用户目录 */ public static String getHomePath(boolean isWindows, String username) { + return getHomePath(isWindows, username, false); + } + + /** + * 获取用户根目录 + * + * @param isWindows isWindows + * @param username 用户名 + * @param prependSeparator 是否在头部添加分隔符 + * @return 用户目录 + */ + public static String getHomePath(boolean isWindows, String username, boolean prependSeparator) { if (isWindows) { // windows - return "C:/Users/" + username; + if (prependSeparator) { + return "/C:/Users/" + username; + } else { + return "C:/Users/" + username; + } } else { // linux if (Const.ROOT.equals(username)) { @@ -66,4 +84,34 @@ public class PathUtils { return path.toString(); } + /** + * 头部添加分隔符 + * + * @param path path + * @return path + */ + public static String prependSeparator(String path) { + if (path.startsWith("/")) { + return path; + } + return "/" + path; + } + + /** + * 获取 orion path + * + * @param path path + * @return path + */ + public static String getOrionPath(String path) { + path = Systems.HOME_DIR + + Files1.SEPARATOR + + AppConst.ORION + + Files1.SEPARATOR + + AppConst.APP_NAME + + Files1.SEPARATOR + + path; + return Files1.getPath(path); + } + } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/convert/HostConvert.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/convert/HostConvert.java index e2b06b92..ff6eefc2 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/convert/HostConvert.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/convert/HostConvert.java @@ -40,4 +40,6 @@ public interface HostConvert { List toList(List domain); + List toBaseList(List domain); + } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/domain/UploadTaskFileDO.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/domain/UploadTaskFileDO.java index 655e790a..0f76c622 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/domain/UploadTaskFileDO.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/domain/UploadTaskFileDO.java @@ -48,6 +48,10 @@ public class UploadTaskFileDO extends BaseDO { @TableField("file_path") private String filePath; + @Schema(description = "实际文件路径") + @TableField("real_file_path") + private String realFilePath; + @Schema(description = "文件大小") @TableField("file_size") private Long fileSize; diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/vo/UploadTaskFileVO.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/vo/UploadTaskFileVO.java index dbd6e800..5ade5702 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/vo/UploadTaskFileVO.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/entity/vo/UploadTaskFileVO.java @@ -40,6 +40,9 @@ public class UploadTaskFileVO implements Serializable { @Schema(description = "文件路径") private String filePath; + @Schema(description = "实际文件路径") + private String realFilePath; + @Schema(description = "文件大小") private Long fileSize; diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/enums/HostSshOsTypeEnum.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/enums/HostSshOsTypeEnum.java index 63d07784..393ac2fe 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/enums/HostSshOsTypeEnum.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/enums/HostSshOsTypeEnum.java @@ -40,4 +40,24 @@ public enum HostSshOsTypeEnum { return LINUX; } + /** + * 是否为 linux 系统 + * + * @param type type + * @return isLinux + */ + public static boolean isLinux(String type) { + return LINUX.name().equals(type); + } + + /** + * 是否为 windows 系统 + * + * @param type type + * @return isWindows + */ + public static boolean isWindows(String type) { + return WINDOWS.name().equals(type); + } + } diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java index d500c493..0d63c03e 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/BaseExecCommandHandler.java @@ -17,6 +17,7 @@ import com.orion.net.host.ssh.command.CommandExecutor; import com.orion.spring.SpringHolder; import com.orion.visor.framework.common.constant.ErrorMessage; import com.orion.visor.framework.common.file.FileClient; +import com.orion.visor.framework.common.utils.PathUtils; import com.orion.visor.module.asset.dao.ExecHostLogDAO; import com.orion.visor.module.asset.entity.domain.ExecHostLogDO; import com.orion.visor.module.asset.entity.dto.HostTerminalConnectDTO; @@ -159,11 +160,8 @@ public abstract class BaseExecCommandHandler implements IExecCommandHandler { // 打开 sftp sftpExecutor = sessionStore.getSftpExecutor(execHostCommand.getFileNameCharset()); sftpExecutor.connect(); - // 必须要以 / 开头 - String scriptPath = execHostCommand.getScriptPath(); - if (!scriptPath.startsWith("/")) { - scriptPath = "/" + scriptPath; - } + // 文件上传必须要以 / 开头 + String scriptPath = PathUtils.prependSeparator(execHostCommand.getScriptPath()); // 创建文件 sftpExecutor.touch(scriptPath); // 写入命令 @@ -225,29 +223,33 @@ public abstract class BaseExecCommandHandler implements IExecCommandHandler { Long id = execHostCommand.getHostLogId(); String statusName = status.name(); log.info("BaseExecCommandHandler.updateStatus start id: {}, status: {}", id, statusName); - updateRecord.setId(id); - updateRecord.setStatus(statusName); - if (ExecHostStatusEnum.RUNNING.equals(status)) { - // 运行中 - updateRecord.setStartTime(new Date()); - } else if (ExecHostStatusEnum.COMPLETED.equals(status)) { - // 完成 - updateRecord.setFinishTime(new Date()); - updateRecord.setExitCode(executor.getExitCode()); - this.exitCode = executor.getExitCode(); - } else if (ExecHostStatusEnum.FAILED.equals(status)) { - // 失败 - updateRecord.setFinishTime(new Date()); - updateRecord.setErrorMessage(this.getErrorMessage(ex)); - } else if (ExecHostStatusEnum.TIMEOUT.equals(status)) { - // 超时 - updateRecord.setFinishTime(new Date()); - } else if (ExecHostStatusEnum.INTERRUPTED.equals(status)) { - // 中断 - updateRecord.setFinishTime(new Date()); + try { + updateRecord.setId(id); + updateRecord.setStatus(statusName); + if (ExecHostStatusEnum.RUNNING.equals(status)) { + // 运行中 + updateRecord.setStartTime(new Date()); + } else if (ExecHostStatusEnum.COMPLETED.equals(status)) { + // 完成 + updateRecord.setFinishTime(new Date()); + updateRecord.setExitCode(executor.getExitCode()); + this.exitCode = executor.getExitCode(); + } else if (ExecHostStatusEnum.FAILED.equals(status)) { + // 失败 + updateRecord.setFinishTime(new Date()); + updateRecord.setErrorMessage(this.getErrorMessage(ex)); + } else if (ExecHostStatusEnum.TIMEOUT.equals(status)) { + // 超时 + updateRecord.setFinishTime(new Date()); + } else if (ExecHostStatusEnum.INTERRUPTED.equals(status)) { + // 中断 + updateRecord.setFinishTime(new Date()); + } + int effect = execHostLogDAO.updateById(updateRecord); + log.info("BaseExecCommandHandler.updateStatus finish id: {}, effect: {}", id, effect); + } catch (Exception e) { + log.error("BaseExecCommandHandler.updateStatus error id: {}", id, e); } - int effect = execHostLogDAO.updateById(updateRecord); - log.info("BaseExecCommandHandler.updateStatus finish id: {}, effect: {}", id, effect); } @Override diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java index c467571d..bcbeb0aa 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/exec/command/handler/ExecTaskHandler.java @@ -154,24 +154,28 @@ public class ExecTaskHandler implements IExecTaskHandler { */ private void updateStatus(ExecStatusEnum status) { Long id = execCommand.getLogId(); - String statusName = status.name(); - log.info("ExecTaskHandler-updateStatus start id: {}, status: {}", id, statusName); - ExecLogDO update = new ExecLogDO(); - update.setId(id); - update.setStatus(statusName); - if (ExecStatusEnum.RUNNING.equals(status)) { - // 执行中 - this.startTime = new Date(); - update.setStartTime(new Date()); - } else if (ExecStatusEnum.COMPLETED.equals(status)) { - // 执行完成 - update.setFinishTime(new Date()); - } else if (ExecStatusEnum.FAILED.equals(status)) { - // 执行失败 - update.setFinishTime(new Date()); + try { + String statusName = status.name(); + log.info("ExecTaskHandler-updateStatus start id: {}, status: {}", id, statusName); + ExecLogDO update = new ExecLogDO(); + update.setId(id); + update.setStatus(statusName); + if (ExecStatusEnum.RUNNING.equals(status)) { + // 执行中 + this.startTime = new Date(); + update.setStartTime(new Date()); + } else if (ExecStatusEnum.COMPLETED.equals(status)) { + // 执行完成 + update.setFinishTime(new Date()); + } else if (ExecStatusEnum.FAILED.equals(status)) { + // 执行失败 + update.setFinishTime(new Date()); + } + int effect = execLogDAO.updateById(update); + log.info("ExecTaskHandler-updateStatus finish id: {}, effect: {}", id, effect); + } catch (Exception e) { + log.error("ExecTaskHandler-updateStatus error id: {}", id, e); } - int effect = execLogDAO.updateById(update); - log.info("ExecTaskHandler-updateStatus finish id: {}, effect: {}", id, effect); } /** diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/task/FileUploadTask.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/task/FileUploadTask.java index f1ffd443..a73848d1 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/task/FileUploadTask.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/task/FileUploadTask.java @@ -1,11 +1,9 @@ package com.orion.visor.module.asset.handler.host.upload.task; import com.orion.lang.utils.Threads; -import com.orion.lang.utils.io.Files1; import com.orion.lang.utils.io.Streams; import com.orion.lang.utils.time.Dates; import com.orion.spring.SpringHolder; -import com.orion.visor.framework.common.constant.Const; import com.orion.visor.framework.common.constant.ExtraFieldConst; import com.orion.visor.module.asset.dao.UploadTaskDAO; import com.orion.visor.module.asset.dao.UploadTaskFileDAO; @@ -143,7 +141,7 @@ public class FileUploadTask implements IFileUploadTask { .map(s -> FileUploadFileItemDTO.builder() .id(s.getId()) .fileId(s.getFileId()) - .remotePath(Files1.getPath(Const.SLASH + record.getRemotePath() + Const.SLASH + s.getFilePath())) + .remotePath(s.getRealFilePath()) .status(UploadTaskFileStatusEnum.WAITING.name()) .current(0L) .build()) diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/uploader/FileUploader.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/uploader/FileUploader.java index c6a1f26e..35c8d795 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/uploader/FileUploader.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/handler/host/upload/uploader/FileUploader.java @@ -1,8 +1,5 @@ package com.orion.visor.module.asset.handler.host.upload.uploader; -import com.orion.lang.utils.Strings; -import com.orion.lang.utils.collect.Maps; -import com.orion.lang.utils.io.Files1; import com.orion.lang.utils.io.Streams; import com.orion.net.host.SessionStore; import com.orion.net.host.sftp.SftpExecutor; @@ -10,12 +7,10 @@ import com.orion.spring.SpringHolder; import com.orion.visor.framework.common.constant.Const; import com.orion.visor.framework.common.enums.EndpointDefine; import com.orion.visor.framework.common.file.FileClient; -import com.orion.visor.framework.common.utils.PathUtils; import com.orion.visor.module.asset.dao.UploadTaskFileDAO; import com.orion.visor.module.asset.define.config.AppSftpConfig; import com.orion.visor.module.asset.entity.domain.UploadTaskFileDO; import com.orion.visor.module.asset.entity.dto.HostTerminalConnectDTO; -import com.orion.visor.module.asset.enums.HostSshOsTypeEnum; import com.orion.visor.module.asset.enums.UploadTaskFileStatusEnum; import com.orion.visor.module.asset.handler.host.jsch.SessionStores; import com.orion.visor.module.asset.handler.host.upload.model.FileUploadFileItemDTO; @@ -28,7 +23,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -106,10 +100,8 @@ public class FileUploader implements IFileUploader { private boolean initSession() { log.info("HostFileUploader.initSession start taskId: {}, hostId: {}", taskId, hostId); try { - // 替换用户路径 - HostTerminalConnectDTO connectInfo = hostTerminalService.getTerminalConnectInfo(hostId); - this.replaceRemotePathVariable(connectInfo.getOsType(), connectInfo.getUsername()); // 打开会话 + HostTerminalConnectDTO connectInfo = hostTerminalService.getTerminalConnectInfo(hostId); this.sessionStore = SessionStores.openSessionStore(connectInfo); this.executor = sessionStore.getSftpExecutor(connectInfo.getFileNameCharset()); executor.connect(); @@ -222,27 +214,6 @@ public class FileUploader implements IFileUploader { uploadTaskFileDAO.updateById(update); } - /** - * 替换文件路径变量 - * - * @param osType osType - * @param username username - */ - private void replaceRemotePathVariable(String osType, String username) { - // 包含变量 - if (!files.get(0).getRemotePath().contains(Const.DOLLAR)) { - return; - } - String home = PathUtils.getHomePath(HostSshOsTypeEnum.WINDOWS.name().equals(osType), username); - // 替换变量 - Map env = Maps.newMap(4); - env.put("username", username); - env.put("home", home); - for (FileUploadFileItemDTO file : files) { - file.setRemotePath(Files1.getPath(Strings.format(file.getRemotePath(), env))); - } - } - @Override public void cancel() { log.info("HostFileUploader.cancel taskId: {}, hostId: {}, canceled: {}, closed: {}", taskId, hostId, canceled, closed); diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/service/impl/UploadTaskServiceImpl.java b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/service/impl/UploadTaskServiceImpl.java index 1515b279..c382e454 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/service/impl/UploadTaskServiceImpl.java +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/com/orion/visor/module/asset/service/impl/UploadTaskServiceImpl.java @@ -3,6 +3,7 @@ package com.orion.visor.module.asset.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.orion.lang.annotation.Keep; +import com.orion.lang.define.collect.MultiHashMap; import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.utils.Arrays1; import com.orion.lang.utils.Booleans; @@ -15,9 +16,11 @@ import com.orion.lang.utils.time.Dates; import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.visor.framework.common.constant.Const; import com.orion.visor.framework.common.constant.ErrorMessage; +import com.orion.visor.framework.common.constant.ExtraFieldConst; import com.orion.visor.framework.common.enums.EndpointDefine; import com.orion.visor.framework.common.file.FileClient; import com.orion.visor.framework.common.security.LoginUser; +import com.orion.visor.framework.common.utils.PathUtils; import com.orion.visor.framework.common.utils.SqlUtils; import com.orion.visor.framework.common.utils.Valid; import com.orion.visor.framework.mybatis.core.query.Conditions; @@ -28,20 +31,21 @@ import com.orion.visor.module.asset.convert.UploadTaskFileConvert; import com.orion.visor.module.asset.dao.HostDAO; import com.orion.visor.module.asset.dao.UploadTaskDAO; import com.orion.visor.module.asset.dao.UploadTaskFileDAO; +import com.orion.visor.module.asset.entity.domain.HostDO; import com.orion.visor.module.asset.entity.domain.UploadTaskDO; import com.orion.visor.module.asset.entity.domain.UploadTaskFileDO; import com.orion.visor.module.asset.entity.dto.UploadTaskExtraDTO; import com.orion.visor.module.asset.entity.request.upload.*; import com.orion.visor.module.asset.entity.vo.*; -import com.orion.visor.module.asset.enums.HostTypeEnum; -import com.orion.visor.module.asset.enums.UploadTaskFileStatusEnum; -import com.orion.visor.module.asset.enums.UploadTaskStatusEnum; +import com.orion.visor.module.asset.enums.*; +import com.orion.visor.module.asset.handler.host.config.model.HostSshConfigModel; import com.orion.visor.module.asset.handler.host.upload.FileUploadTasks; import com.orion.visor.module.asset.handler.host.upload.manager.FileUploadTaskManager; import com.orion.visor.module.asset.handler.host.upload.model.FileUploadFileItemDTO; import com.orion.visor.module.asset.handler.host.upload.task.IFileUploadTask; import com.orion.visor.module.asset.handler.host.upload.uploader.IFileUploader; import com.orion.visor.module.asset.service.AssetAuthorizedDataService; +import com.orion.visor.module.asset.service.HostConfigService; import com.orion.visor.module.asset.service.UploadTaskFileService; import com.orion.visor.module.asset.service.UploadTaskService; import com.orion.visor.module.infra.api.FileUploadApi; @@ -83,6 +87,9 @@ public class UploadTaskServiceImpl implements UploadTaskService { @Resource private AssetAuthorizedDataService assetAuthorizedDataService; + @Resource + private HostConfigService hostConfigService; + @Resource private FileUploadTaskManager fileUploadTaskManager; @@ -103,10 +110,9 @@ public class UploadTaskServiceImpl implements UploadTaskService { // 检查主机是否有权限 this.checkHostPermission(hostIdList); // 查询主机信息 - List hosts = hostDAO.selectBaseByIdList(hostIdList) - .stream() - .map(HostConvert.MAPPER::toBase) - .collect(Collectors.toList()); + List hosts = this.getUploadTaskHosts(hostIdList); + // 计算文件路径 + MultiHashMap realRemoteFilePathMap = this.setFileRealRemotePath(request, hosts); // 转换 UploadTaskDO record = UploadTaskConvert.MAPPER.to(request); record.setUserId(user.getId()); @@ -117,7 +123,7 @@ public class UploadTaskServiceImpl implements UploadTaskService { record.setHostCount(hostIdList.size()); UploadTaskExtraDTO extra = UploadTaskExtraDTO.builder() .hostIdList(hostIdList) - .hosts(hosts) + .hosts(HostConvert.MAPPER.toBaseList(hosts)) .build(); record.setExtraInfo(JSON.toJSONString(extra)); // 插入任务表 @@ -132,6 +138,7 @@ public class UploadTaskServiceImpl implements UploadTaskService { .hostId(hostId) .fileId(s.getFileId()) .filePath(s.getFilePath()) + .realFilePath(realRemoteFilePathMap.get(hostId, s.getFileId())) .fileSize(s.getFileSize()) .status(UploadTaskFileStatusEnum.WAITING.name()) .build()) @@ -336,6 +343,68 @@ public class UploadTaskServiceImpl implements UploadTaskService { } } + /** + * 查询上传任务主机信息 + * + * @param hostIdList hostIdList + * @return hosts + */ + public List getUploadTaskHosts(List hostIdList) { + // 查询主机信息 + List hosts = hostDAO.selectBatchIds(hostIdList); + // 检查主机数量 + Valid.eq(hosts.size(), hostIdList.size(), ErrorMessage.HOST_ABSENT); + // 检查主机状态 + boolean allEnabled = hosts.stream() + .map(HostDO::getStatus) + .allMatch(s -> HostStatusEnum.ENABLED.name().equals(s)); + Valid.isTrue(allEnabled, ErrorMessage.HOST_NOT_ENABLED); + return hosts; + } + + /** + * 设置文件实际路径 + * + * @param request request + * @param hosts hosts + * @return realRemoteFilePathMap + */ + public MultiHashMap setFileRealRemotePath(UploadTaskCreateRequest request, + List hosts) { + MultiHashMap realRemoteFilePathMap = MultiHashMap.create(); + // 计算上传目录 + String remotePath = request.getRemotePath(); + List files = request.getFiles(); + boolean containsEnv = remotePath.contains(Const.DOLLAR); + if (containsEnv) { + // 获取主机配置信息 + Map hostConfigMap = hostConfigService.buildHostConfigMap(hosts, HostTypeEnum.SSH); + hostConfigMap.forEach((k, v) -> { + // 替换占位符 + String username = v.getUsername(); + String home = PathUtils.getHomePath(HostSshOsTypeEnum.isWindows(v.getOsType()), username); + // 替换环境变量路径 + Map env = Maps.newMap(4); + env.put(ExtraFieldConst.USERNAME, username); + env.put(ExtraFieldConst.HOME, home); + // 设置主机上传路径 + String realRemotePath = Files1.getPath(Strings.format(remotePath, env)); + for (UploadTaskFileRequest file : files) { + realRemoteFilePathMap.put(k, file.getFileId(), Files1.getPath(realRemotePath, file.getFilePath())); + } + }); + } else { + // 无占位符 + for (UploadTaskFileRequest file : files) { + String path = Files1.getPath(remotePath, file.getFilePath()); + for (HostDO host : hosts) { + realRemoteFilePathMap.put(host.getId(), file.getFileId(), path); + } + } + } + return realRemoteFilePathMap; + } + /** * 检查文件完整性 * diff --git a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml index af04e293..60d8fa41 100644 --- a/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml +++ b/orion-visor-module-asset/orion-visor-module-asset-service/src/main/resources/mapper/UploadTaskFileMapper.xml @@ -9,6 +9,7 @@ + @@ -22,7 +23,7 @@ - id, task_id, host_id, file_id, file_path, file_size, status, start_time, end_time, create_time, update_time, creator, updater, deleted + id, task_id, host_id, file_id, file_path, real_file_path, file_size, status, start_time, end_time, create_time, update_time, creator, updater, deleted