diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java index 4d23a8bb..7094af08 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/InputTypeEnum.java @@ -123,6 +123,14 @@ public enum InputTypeEnum { new String[]{"type", "sessionId", "path", "mod"}, SftpChangeModRequest.class), + /** + * SFTP 下载文件夹 flat + */ + SFTP_DOWNLOAD_DIRECTORY_FLAT("df", + SftpDownloadDirectoryFlatHandler.class, + new String[]{"type", "sessionId", "currentPath", "path"}, + SftpDownloadDirectoryFlatRequest.class), + /** * SFTP 获取内容 */ @@ -139,10 +147,6 @@ public enum InputTypeEnum { new String[]{"type", "sessionId", "path", "content"}, SftpSetContentRequest.class), - // TODO - // UPLOAD - // DOWNLOAD - ; private static final char SEPARATOR = '|'; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java index 593afde4..7f52e06d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/enums/OutputTypeEnum.java @@ -75,6 +75,11 @@ public enum OutputTypeEnum { */ SFTP_CHMOD("cm", "${type}|${sessionId}|${result}|${msg}"), + /** + * SFTP 下载文件夹 flat + */ + SFTP_DOWNLOAD_DIRECTORY_FLAT("df", "${type}|${sessionId}|${currentPath}|${body}"), + /** * SFTP 获取文件内容 */ diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadDirectoryFlatHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadDirectoryFlatHandler.java new file mode 100644 index 00000000..e3f64ba7 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/SftpDownloadDirectoryFlatHandler.java @@ -0,0 +1,51 @@ +package com.orion.ops.module.asset.handler.host.terminal.handler; + +import com.orion.ops.framework.common.enums.BooleanBit; +import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; +import com.orion.ops.module.asset.handler.host.terminal.model.request.SftpDownloadDirectoryFlatRequest; +import com.orion.ops.module.asset.handler.host.terminal.model.response.SftpDownloadDirectoryFlatResponse; +import com.orion.ops.module.asset.handler.host.terminal.session.ISftpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketSession; + +/** + * sftp 下载文件夹 flat + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/19 11:13 + */ +@Slf4j +@Component +public class SftpDownloadDirectoryFlatHandler extends AbstractTerminalHandler { + + @Override + public void handle(WebSocketSession channel, SftpDownloadDirectoryFlatRequest payload) { + // 获取会话 + ISftpSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); + String path = payload.getPath(); + log.info("SftpDownloadDirectoryFlatHandler-handle session: {}, path: {}", payload.getSessionId(), path); + Exception ex = null; + // 获取文件夹内的全部文件 + try { + // TODO + + } catch (Exception e) { + log.error("SftpDownloadDirectoryFlatHandler-handle error", e); + ex = e; + } + // 返回 + this.send(channel, + OutputTypeEnum.SFTP_DOWNLOAD_DIRECTORY_FLAT, + SftpDownloadDirectoryFlatResponse.builder() + .sessionId(payload.getSessionId()) + .currentPath(payload.getPath()) + // TODO + .body("") + .result(BooleanBit.of(ex == null).getValue()) + .msg(this.getErrorMessage(ex)) + .build()); + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java index 4fa9a1e2..046acd71 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/handler/TerminalConnectHandler.java @@ -103,6 +103,7 @@ public class TerminalConnectHandler extends AbstractTerminalHandler + * i|eff00a1|currentPath|path + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/6 13:31 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(name = "SftpDownloadDirectoryFlatRequest", description = "sftp 下载文件夹 flat 实体对象") +public class SftpDownloadDirectoryFlatRequest extends SftpBaseRequest { + + @Schema(description = "当前路径") + private Integer currentPath; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/SftpDownloadDirectoryFlatResponse.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/SftpDownloadDirectoryFlatResponse.java new file mode 100644 index 00000000..b96af1dc --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/model/response/SftpDownloadDirectoryFlatResponse.java @@ -0,0 +1,31 @@ +package com.orion.ops.module.asset.handler.host.terminal.model.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * sftp 下载文件夹 flat 实体对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2024/2/6 16:20 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(name = "SftpDownloadDirectoryFlatResponse", description = "sftp 下载文件夹 flat 实体对象") +public class SftpDownloadDirectoryFlatResponse extends SftpBaseResponse { + + @Schema(description = "currentPath") + private String currentPath; + + @Schema(description = "body") + private String body; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SftpSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SftpSession.java index ac67ba8a..215173a4 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SftpSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SftpSession.java @@ -32,8 +32,6 @@ import java.util.stream.Collectors; @Slf4j public class SftpSession extends TerminalSession implements ISftpSession { - private final TerminalConfig config; - private final SessionStore sessionStore; private SftpExecutor executor; @@ -42,9 +40,8 @@ public class SftpSession extends TerminalSession implements ISftpSession { WebSocketSession channel, SessionStore sessionStore, TerminalConfig config) { - super(sessionId, channel); + super(sessionId, channel, config); this.sessionStore = sessionStore; - this.config = config; } @Override diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java index 155966e7..e8badc95 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/SshSession.java @@ -9,8 +9,8 @@ import com.orion.ops.module.asset.define.AssetThreadPools; import com.orion.ops.module.asset.handler.host.terminal.constant.TerminalMessage; import com.orion.ops.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.ops.module.asset.handler.host.terminal.model.TerminalConfig; -import com.orion.ops.module.asset.handler.host.terminal.model.response.TerminalCloseResponse; import com.orion.ops.module.asset.handler.host.terminal.model.response.SshOutputResponse; +import com.orion.ops.module.asset.handler.host.terminal.model.response.TerminalCloseResponse; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.WebSocketSession; @@ -29,8 +29,6 @@ import java.io.InputStream; @Slf4j public class SshSession extends TerminalSession implements ISshSession { - private final TerminalConfig config; - private final SessionStore sessionStore; private ShellExecutor executor; @@ -42,9 +40,8 @@ public class SshSession extends TerminalSession implements ISshSession { WebSocketSession channel, SessionStore sessionStore, TerminalConfig config) { - super(sessionId, channel); + super(sessionId, channel, config); this.sessionStore = sessionStore; - this.config = config; } @Override diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java index 2f3b2c51..fda35870 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/terminal/session/TerminalSession.java @@ -1,6 +1,7 @@ package com.orion.ops.module.asset.handler.host.terminal.session; import com.orion.ops.module.asset.enums.HostConnectStatusEnum; +import com.orion.ops.module.asset.handler.host.terminal.model.TerminalConfig; import com.orion.ops.module.asset.service.HostConnectLogService; import com.orion.spring.SpringHolder; import lombok.Getter; @@ -22,11 +23,14 @@ public abstract class TerminalSession implements ITerminalSession { protected final WebSocketSession channel; + protected final TerminalConfig config; + protected volatile boolean close; - public TerminalSession(String sessionId, WebSocketSession channel) { + public TerminalSession(String sessionId, WebSocketSession channel, TerminalConfig config) { this.sessionId = sessionId; this.channel = channel; + this.config = config; } /** diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table-header.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table-header.vue index 12198476..ec8ca4e0 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table-header.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table-header.vue @@ -190,7 +190,7 @@ selectedFiles: Array }>(); - const emits = defineEmits(['loadFile']); + const emits = defineEmits(['update:selectedFiles', 'loadFile', 'download']); const showHiddenFile = ref(false); const analysisPaths = ref>([]); @@ -268,8 +268,8 @@ // 下载文件 const downloadFile = () => { - // TODO - console.log(props.selectedFiles); + emits('download', [...props.selectedFiles]); + emits('update:selectedFiles', []); }; diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table.vue index 6ca73ad5..b4c9be4f 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-table.vue @@ -68,7 +68,7 @@ - ; }>(); - const emits = defineEmits(['update:selectedFiles', 'loadFile', 'editFile']); + const emits = defineEmits(['update:selectedFiles', 'loadFile', 'editFile', 'download']); const openSftpMoveModal = inject(openSftpMoveModalKey) as (sessionId: string, path: string) => void; const openSftpChmodModal = inject(openSftpChmodModalKey) as (sessionId: string, path: string, permission: number) => void; @@ -204,12 +204,9 @@ }; // 是否可编辑 - const canEditable = (size: number, attr: string) => { - const typeValue = formatFileType(attr).value; - // 非文件夹和链接文件 并且文件小于 配置大小(MB) 可以编辑 - return FILE_TYPE.DIRECTORY.value !== typeValue - && FILE_TYPE.LINK_FILE.value !== typeValue - && size <= previewSize * 1024 * 1024; + const canEditable = (size: number, isDir: boolean) => { + // 非文件夹并且文件小于 配置大小(MB) 可以编辑 + return !isDir && size <= previewSize * 1024 * 1024; }; // 点击文件名称 @@ -235,8 +232,7 @@ // 下载文件 const downloadFile = (path: string) => { - // TODO - console.log(path); + emits('download', [path]); }; // 移动文件 diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue index 569a87a7..9ef464dd 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-upload-modal.vue @@ -112,20 +112,8 @@ return true; } // 添加到上传列表 - const files = fileList.value.map(s => { - return { - fileId: nextId(10), - type: TransferType.UPLOAD, - hostId: hostId.value, - name: s.file.webkitRelativePath || s.file.name, - currentSize: 0, - totalSize: s.file.size, - status: TransferStatus.WAITING, - parentPath: parentPath.value, - file: s.file - }; - }); - transferManager.addTransfer(files); + const files = fileList.value.map(s => s.file); + transferManager.addUpload(hostId.value, parentPath.value, files); Message.success('已开始上传, 点击右侧传输列表查看进度'); // 清空 handlerClear(); diff --git a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue index b29cb4e4..8555bc09 100644 --- a/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue +++ b/orion-ops-ui/src/views/host/terminal/components/sftp/sftp-view.vue @@ -11,10 +11,11 @@ :hide-icon="true"> + @load-file="loadFiles" + @download="downloadFiles" /> + @edit-file="editFile" + @download="downloadFiles" />