From f06c2fd68f9a157ff2496f4c44146b7e1ea03181 Mon Sep 17 00:00:00 2001 From: nagocoler Date: Thu, 14 Dec 2023 17:33:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90SSH=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/controller/MonitorController.java | 29 +++++- .../com/example/entity/dto/ClientSsh.java | 16 ++++ .../entity/vo/request/SshConnectionVO.java | 17 ++++ .../entity/vo/response/SshSettingsVO.java | 11 +++ .../com/example/mapper/ClientSshMapper.java | 9 ++ .../com/example/service/ClientService.java | 12 +-- .../service/impl/ClientServiceImpl.java | 42 +++++++-- .../src/component/ClientDetails.vue | 12 ++- .../src/component/TerminalWindow.vue | 91 +++++++++++++++++++ itbaima-monitor-web/src/views/main/Manage.vue | 25 ++++- 10 files changed, 239 insertions(+), 25 deletions(-) create mode 100644 itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientSsh.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/entity/vo/request/SshConnectionVO.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/entity/vo/response/SshSettingsVO.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/mapper/ClientSshMapper.java create mode 100644 itbaima-monitor-web/src/component/TerminalWindow.vue diff --git a/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java b/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java index 9cd5041..5154f79 100644 --- a/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java +++ b/itbaima-monitor-server/src/main/java/com/example/controller/MonitorController.java @@ -5,10 +5,8 @@ import com.example.entity.dto.Account; import com.example.entity.vo.request.RenameClientVO; import com.example.entity.vo.request.RenameNodeVO; import com.example.entity.vo.request.RuntimeDetailVO; -import com.example.entity.vo.response.ClientDetailsVO; -import com.example.entity.vo.response.ClientPreviewVO; -import com.example.entity.vo.response.ClientSimpleVO; -import com.example.entity.vo.response.RuntimeHistoryVO; +import com.example.entity.vo.request.SshConnectionVO; +import com.example.entity.vo.response.*; import com.example.service.AccountService; import com.example.service.ClientService; import com.example.utils.Const; @@ -128,6 +126,29 @@ public class MonitorController { } } + @PostMapping("/ssh-save") + public RestBean saveSshConnection(@RequestBody @Valid SshConnectionVO vo, + @RequestAttribute(Const.ATTR_USER_ID) int userId, + @RequestAttribute(Const.ATTR_USER_ROLE) String userRole) { + if(this.permissionCheck(userId, userRole, vo.getId())) { + service.saveClientSshConnection(vo); + return RestBean.success(); + } else { + return RestBean.noPermission(); + } + } + + @GetMapping("/ssh") + public RestBean sshSettings(int clientId, + @RequestAttribute(Const.ATTR_USER_ID) int userId, + @RequestAttribute(Const.ATTR_USER_ROLE) String userRole) { + if(this.permissionCheck(userId, userRole, clientId)) { + return RestBean.success(service.sshSettings(clientId)); + } else { + return RestBean.noPermission(); + } + } + private List accountAccessClients(int uid) { Account account = accountService.getById(uid); return account.getClientList(); diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientSsh.java b/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientSsh.java new file mode 100644 index 0000000..c24d11d --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientSsh.java @@ -0,0 +1,16 @@ +package com.example.entity.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.example.entity.BaseData; +import lombok.Data; + +@Data +@TableName("db_client_ssh") +public class ClientSsh implements BaseData { + @TableId + Integer id; + Integer port; + String username; + String password; +} diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/SshConnectionVO.java b/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/SshConnectionVO.java new file mode 100644 index 0000000..deb52a4 --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/SshConnectionVO.java @@ -0,0 +1,17 @@ +package com.example.entity.vo.request; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +@Data +public class SshConnectionVO { + int id; + int port; + @NotNull + @Length(min = 1) + String username; + @NotNull + @Length(min = 1) + String password; +} diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/SshSettingsVO.java b/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/SshSettingsVO.java new file mode 100644 index 0000000..e73384f --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/vo/response/SshSettingsVO.java @@ -0,0 +1,11 @@ +package com.example.entity.vo.response; + +import lombok.Data; + +@Data +public class SshSettingsVO { + String ip; + int port = 22; + String username; + String password; +} diff --git a/itbaima-monitor-server/src/main/java/com/example/mapper/ClientSshMapper.java b/itbaima-monitor-server/src/main/java/com/example/mapper/ClientSshMapper.java new file mode 100644 index 0000000..2add66d --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/mapper/ClientSshMapper.java @@ -0,0 +1,9 @@ +package com.example.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.entity.dto.ClientSsh; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ClientSshMapper extends BaseMapper { +} diff --git a/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java b/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java index 3874af9..9990ddc 100644 --- a/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java +++ b/itbaima-monitor-server/src/main/java/com/example/service/ClientService.java @@ -2,14 +2,8 @@ package com.example.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.entity.dto.Client; -import com.example.entity.vo.request.ClientDetailVO; -import com.example.entity.vo.request.RenameClientVO; -import com.example.entity.vo.request.RenameNodeVO; -import com.example.entity.vo.request.RuntimeDetailVO; -import com.example.entity.vo.response.ClientDetailsVO; -import com.example.entity.vo.response.ClientPreviewVO; -import com.example.entity.vo.response.ClientSimpleVO; -import com.example.entity.vo.response.RuntimeHistoryVO; +import com.example.entity.vo.request.*; +import com.example.entity.vo.response.*; import java.util.List; @@ -28,4 +22,6 @@ public interface ClientService extends IService { RuntimeHistoryVO clientRuntimeDetailsHistory(int clientId); RuntimeDetailVO clientRuntimeDetailsNow(int clientId); void deleteClient(int clientId); + void saveClientSshConnection(SshConnectionVO vo); + SshSettingsVO sshSettings(int clientId); } diff --git a/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java b/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java index 4ac1942..3ba427a 100644 --- a/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java +++ b/itbaima-monitor-server/src/main/java/com/example/service/impl/ClientServiceImpl.java @@ -4,16 +4,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.entity.dto.Client; import com.example.entity.dto.ClientDetail; -import com.example.entity.vo.request.ClientDetailVO; -import com.example.entity.vo.request.RenameClientVO; -import com.example.entity.vo.request.RenameNodeVO; -import com.example.entity.vo.request.RuntimeDetailVO; -import com.example.entity.vo.response.ClientDetailsVO; -import com.example.entity.vo.response.ClientPreviewVO; -import com.example.entity.vo.response.ClientSimpleVO; -import com.example.entity.vo.response.RuntimeHistoryVO; +import com.example.entity.dto.ClientSsh; +import com.example.entity.vo.request.*; +import com.example.entity.vo.response.*; import com.example.mapper.ClientDetailMapper; import com.example.mapper.ClientMapper; +import com.example.mapper.ClientSshMapper; import com.example.service.ClientService; import com.example.utils.InfluxDbUtils; import jakarta.annotation.PostConstruct; @@ -39,6 +35,9 @@ public class ClientServiceImpl extends ServiceImpl impleme @Resource InfluxDbUtils influx; + @Resource + ClientSshMapper sshMapper; + @PostConstruct public void initClientCache() { clientTokenCache.clear(); @@ -160,6 +159,33 @@ public class ClientServiceImpl extends ServiceImpl impleme currentRuntime.remove(clientId); } + @Override + public void saveClientSshConnection(SshConnectionVO vo) { + Client client = clientIdCache.get(vo.getId()); + if(client == null) return; + ClientSsh ssh = new ClientSsh(); + BeanUtils.copyProperties(vo, ssh); + if(Objects.nonNull(sshMapper.selectById(client.getId()))) { + sshMapper.updateById(ssh); + } else { + sshMapper.insert(ssh); + } + } + + @Override + public SshSettingsVO sshSettings(int clientId) { + ClientDetail detail = detailMapper.selectById(clientId); + ClientSsh ssh = sshMapper.selectById(clientId); + SshSettingsVO vo; + if(ssh == null) { + vo = new SshSettingsVO(); + } else { + vo = ssh.asViewObject(SshSettingsVO.class); + } + vo.setIp(detail.getIp()); + return vo; + } + private boolean isOnline(RuntimeDetailVO runtime) { return runtime != null && System.currentTimeMillis() - runtime.getTimestamp() < 60 * 1000; } diff --git a/itbaima-monitor-web/src/component/ClientDetails.vue b/itbaima-monitor-web/src/component/ClientDetails.vue index 04fc999..f06d4b1 100644 --- a/itbaima-monitor-web/src/component/ClientDetails.vue +++ b/itbaima-monitor-web/src/component/ClientDetails.vue @@ -4,7 +4,7 @@ import {get, post} from "@/net"; import {copyIp, cpuNameToImage, fitByUnit, osNameToIcon, percentageToStatus, rename} from "@/tools"; import {ElMessage, ElMessageBox} from "element-plus"; import RuntimeHistory from "@/component/RuntimeHistory.vue"; -import {Delete} from "@element-plus/icons-vue"; +import {Connection, Delete} from "@element-plus/icons-vue"; const locations = [ {name: 'cn', desc: '中国大陆'}, @@ -20,7 +20,7 @@ const props = defineProps({ id: Number, update: Function }) -const emits = defineEmits(['delete']) +const emits = defineEmits(['delete', 'terminal']) const details = reactive({ base: {}, @@ -101,8 +101,12 @@ watch(() => props.id, init, { immediate: true }) 服务器信息 - 删除此主机 +
+ SSH远程连接 + 删除此主机 +
diff --git a/itbaima-monitor-web/src/component/TerminalWindow.vue b/itbaima-monitor-web/src/component/TerminalWindow.vue new file mode 100644 index 0000000..2459052 --- /dev/null +++ b/itbaima-monitor-web/src/component/TerminalWindow.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/itbaima-monitor-web/src/views/main/Manage.vue b/itbaima-monitor-web/src/views/main/Manage.vue index 00ef62e..ee736c8 100644 --- a/itbaima-monitor-web/src/views/main/Manage.vue +++ b/itbaima-monitor-web/src/views/main/Manage.vue @@ -7,6 +7,7 @@ import RegisterCard from "@/component/RegisterCard.vue"; import {Plus} from "@element-plus/icons-vue"; import {useRoute} from "vue-router"; import {useStore} from "@/store"; +import TerminalWindow from "@/component/TerminalWindow.vue"; const locations = [ {name: 'cn', desc: '中国大陆'}, @@ -54,6 +55,16 @@ const register = reactive({ token: '' }) const refreshToken = () => get('/api/monitor/register', token => register.token = token) + +function openTerminal(id) { + terminal.show = true + terminal.id = id + detail.show = false +} +const terminal = reactive({ + show: false, + id: -1 +})