From c00d2ecee6c3cda9894c0b55c3fa16f416a9e8f4 Mon Sep 17 00:00:00 2001 From: nagocoler Date: Thu, 30 Nov 2023 18:37:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E5=9C=A8=E5=90=AF=E5=8A=A8=E6=97=B6=E8=BF=9B=E8=A1=8C=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E4=B8=BB=E6=9C=BA=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- itbaima-monitor-client/pom.xml | 5 ++ .../example/config/ServerConfiguration.java | 18 ++++++- .../com/example/entity/data/BaseDetail.java | 17 ++++++ .../java/com/example/utils/MonitorUtils.java | 54 +++++++++++++++++++ .../main/java/com/example/utils/NetUtils.java | 26 +++++++++ .../example/controller/ClientController.java | 16 ++++-- .../java/com/example/entity/dto/Client.java | 2 + .../com/example/entity/dto/ClientDetail.java | 20 +++++++ .../entity/vo/request/ClientDetailVO.java | 24 +++++++++ .../filter/JwtAuthenticationFilter.java | 3 ++ .../example/mapper/ClientDetailMapper.java | 9 ++++ .../com/example/service/ClientService.java | 2 + .../service/impl/ClientServiceImpl.java | 21 ++++++++ 13 files changed, 211 insertions(+), 6 deletions(-) create mode 100644 itbaima-monitor-client/src/main/java/com/example/entity/data/BaseDetail.java create mode 100644 itbaima-monitor-client/src/main/java/com/example/utils/MonitorUtils.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientDetail.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/entity/vo/request/ClientDetailVO.java create mode 100644 itbaima-monitor-server/src/main/java/com/example/mapper/ClientDetailMapper.java diff --git a/itbaima-monitor-client/pom.xml b/itbaima-monitor-client/pom.xml index ba3c1ac..f2ab547 100644 --- a/itbaima-monitor-client/pom.xml +++ b/itbaima-monitor-client/pom.xml @@ -36,6 +36,11 @@ spring-boot-starter-test test + + com.github.oshi + oshi-core + 6.4.0 + diff --git a/itbaima-monitor-client/src/main/java/com/example/config/ServerConfiguration.java b/itbaima-monitor-client/src/main/java/com/example/config/ServerConfiguration.java index 5276493..f8dab56 100644 --- a/itbaima-monitor-client/src/main/java/com/example/config/ServerConfiguration.java +++ b/itbaima-monitor-client/src/main/java/com/example/config/ServerConfiguration.java @@ -2,9 +2,13 @@ package com.example.config; import com.alibaba.fastjson2.JSONObject; import com.example.entity.ConnectionConfig; +import com.example.entity.data.BaseDetail; +import com.example.utils.MonitorUtils; import com.example.utils.NetUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,13 +21,16 @@ import java.util.Scanner; @Slf4j @Configuration -public class ServerConfiguration { +public class ServerConfiguration implements ApplicationRunner { @Resource NetUtils net; + @Resource + MonitorUtils monitor; + @Bean - ConnectionConfig connectionConfig(){ + ConnectionConfig connectionConfig() { log.info("正在加载服务端连接配置..."); ConnectionConfig config = this.readConfigurationFromFile(); if(config == null) @@ -31,6 +38,13 @@ public class ServerConfiguration { return config; } + @Override + public void run(ApplicationArguments args) throws Exception { + log.info("正在向服务端更新基本系统信息..."); + BaseDetail detail = monitor.monitorBaseData(); + net.updateBaseDetails(detail); + } + private ConnectionConfig registerToServer() { Scanner scanner = new Scanner(System.in); String token, address; diff --git a/itbaima-monitor-client/src/main/java/com/example/entity/data/BaseDetail.java b/itbaima-monitor-client/src/main/java/com/example/entity/data/BaseDetail.java new file mode 100644 index 0000000..af56758 --- /dev/null +++ b/itbaima-monitor-client/src/main/java/com/example/entity/data/BaseDetail.java @@ -0,0 +1,17 @@ +package com.example.entity.data; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class BaseDetail { + String osArch; + String osName; + String osVersion; + int osBit; + int cpuCore; + double memory; + double disk; + String ip; +} diff --git a/itbaima-monitor-client/src/main/java/com/example/utils/MonitorUtils.java b/itbaima-monitor-client/src/main/java/com/example/utils/MonitorUtils.java new file mode 100644 index 0000000..a0c42af --- /dev/null +++ b/itbaima-monitor-client/src/main/java/com/example/utils/MonitorUtils.java @@ -0,0 +1,54 @@ +package com.example.utils; + +import com.example.entity.data.BaseDetail; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import oshi.SystemInfo; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.hardware.NetworkIF; +import oshi.hardware.HWDiskStore; +import oshi.software.os.OperatingSystem; + +import java.io.IOException; +import java.net.NetworkInterface; +import java.util.Properties; + +@Slf4j +@Component +public class MonitorUtils { + + private final SystemInfo info = new SystemInfo(); + private final Properties properties = System.getProperties(); + + public BaseDetail monitorBaseData() { + OperatingSystem os = info.getOperatingSystem(); + HardwareAbstractionLayer hardware = info.getHardware(); + double memory = hardware.getMemory().getTotal() / 1024.0 / 1024 / 1024; + double diskSize = hardware.getDiskStores().stream().mapToLong(HWDiskStore::getSize).sum() / 1024.0 / 1024 / 1024; + try { + String ip = null; + for (NetworkIF network : hardware.getNetworkIFs()) { + String[] iPv4addr = network.getIPv4addr(); + NetworkInterface ni = network.queryNetworkInterface(); + if(!ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual() + && (ni.getName().startsWith("eth") || ni.getName().startsWith("en")) + && iPv4addr.length > 0) { + ip = network.getIPv4addr()[0]; + break; + } + } + return new BaseDetail() + .setOsBit(os.getBitness()) + .setOsArch(properties.getProperty("os.arch")) + .setOsVersion(os.getVersionInfo().getVersion()) + .setOsName(os.getFamily()) + .setCpuCore(hardware.getProcessor().getLogicalProcessorCount()) + .setMemory(memory) + .setDisk(diskSize) + .setIp(ip); + } catch (IOException e) { + log.error("读取系统基本信息时出错", e); + return null; + } + } +} diff --git a/itbaima-monitor-client/src/main/java/com/example/utils/NetUtils.java b/itbaima-monitor-client/src/main/java/com/example/utils/NetUtils.java index 96fc28d..8b48343 100644 --- a/itbaima-monitor-client/src/main/java/com/example/utils/NetUtils.java +++ b/itbaima-monitor-client/src/main/java/com/example/utils/NetUtils.java @@ -3,6 +3,7 @@ package com.example.utils; import com.alibaba.fastjson2.JSONObject; import com.example.entity.ConnectionConfig; import com.example.entity.Response; +import com.example.entity.data.BaseDetail; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; @@ -34,6 +35,31 @@ public class NetUtils { return response.success(); } + public void updateBaseDetails(BaseDetail detail){ + Response response = this.doPost("/detail", detail); + if(response.success()) { + log.info("系统基本信息更新已完成"); + } else { + log.error("系统基本信息更新失败: {}", response.getMessage()); + } + } + + private Response doPost(String url, Object data) { + try { + String rawData = JSONObject.from(data).toJSONString(); + HttpRequest request = HttpRequest.newBuilder().POST(HttpRequest.BodyPublishers.ofString(rawData)) + .uri(new URI(config.getAddress() + "/monitor" + url)) + .header("Content-Type", "application/json") + .header("Authorization", config.getToken()) + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + return JSONObject.parseObject(response.body()).to(Response.class); + } catch (Exception e) { + log.error("在发起服务端请求时出现错误", e); + return Response.errorResponse(e); + } + } + private Response doGet(String url) { return this.doGet(url, config.getAddress(), config.getToken()); } diff --git a/itbaima-monitor-server/src/main/java/com/example/controller/ClientController.java b/itbaima-monitor-server/src/main/java/com/example/controller/ClientController.java index 817cd70..3590f32 100644 --- a/itbaima-monitor-server/src/main/java/com/example/controller/ClientController.java +++ b/itbaima-monitor-server/src/main/java/com/example/controller/ClientController.java @@ -1,12 +1,13 @@ package com.example.controller; import com.example.entity.RestBean; +import com.example.entity.dto.Client; +import com.example.entity.vo.request.ClientDetailVO; import com.example.service.ClientService; +import com.example.utils.Const; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/monitor") @@ -20,4 +21,11 @@ public class ClientController { return service.verifyAndRegister(token) ? RestBean.success() : RestBean.failure(401, "客户端注册失败,请检查Token是否正确"); } + + @PostMapping("/detail") + public RestBean updateClientDetails(@RequestAttribute(Const.ATTR_CLIENT) Client client, + @RequestBody @Valid ClientDetailVO vo) { + service.updateClientDetail(vo, client); + return RestBean.success(); + } } diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/dto/Client.java b/itbaima-monitor-server/src/main/java/com/example/entity/dto/Client.java index dedc9bd..2bc30eb 100644 --- a/itbaima-monitor-server/src/main/java/com/example/entity/dto/Client.java +++ b/itbaima-monitor-server/src/main/java/com/example/entity/dto/Client.java @@ -1,5 +1,6 @@ package com.example.entity.dto; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.example.entity.BaseData; import lombok.AllArgsConstructor; @@ -11,6 +12,7 @@ import java.util.Date; @TableName("db_client") @AllArgsConstructor public class Client implements BaseData { + @TableId Integer id; String name; String token; diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientDetail.java b/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientDetail.java new file mode 100644 index 0000000..8066889 --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/dto/ClientDetail.java @@ -0,0 +1,20 @@ +package com.example.entity.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("db_client_detail") +public class ClientDetail { + @TableId + Integer id; + String osArch; + String osName; + String osVersion; + int osBit; + int cpuCore; + double memory; + double disk; + String ip; +} diff --git a/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/ClientDetailVO.java b/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/ClientDetailVO.java new file mode 100644 index 0000000..57a1e88 --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/entity/vo/request/ClientDetailVO.java @@ -0,0 +1,24 @@ +package com.example.entity.vo.request; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ClientDetailVO { + @NotNull + String osArch; + @NotNull + String osName; + @NotNull + String osVersion; + @NotNull + int osBit; + @NotNull + int cpuCore; + @NotNull + double memory; + @NotNull + double disk; + @NotNull + String ip; +} diff --git a/itbaima-monitor-server/src/main/java/com/example/filter/JwtAuthenticationFilter.java b/itbaima-monitor-server/src/main/java/com/example/filter/JwtAuthenticationFilter.java index c17c4fa..a719751 100644 --- a/itbaima-monitor-server/src/main/java/com/example/filter/JwtAuthenticationFilter.java +++ b/itbaima-monitor-server/src/main/java/com/example/filter/JwtAuthenticationFilter.java @@ -1,6 +1,7 @@ package com.example.filter; import com.auth0.jwt.interfaces.DecodedJWT; +import com.example.entity.RestBean; import com.example.entity.dto.Client; import com.example.service.ClientService; import com.example.utils.Const; @@ -43,6 +44,8 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { Client client = service.findClient(authorization); if(client == null) { response.setStatus(401); + response.setCharacterEncoding("utf-8"); + response.getWriter().write(RestBean.failure(401, "未授权").asJsonString()); return; } else { request.setAttribute(Const.ATTR_CLIENT, client); diff --git a/itbaima-monitor-server/src/main/java/com/example/mapper/ClientDetailMapper.java b/itbaima-monitor-server/src/main/java/com/example/mapper/ClientDetailMapper.java new file mode 100644 index 0000000..ce92416 --- /dev/null +++ b/itbaima-monitor-server/src/main/java/com/example/mapper/ClientDetailMapper.java @@ -0,0 +1,9 @@ +package com.example.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.entity.dto.ClientDetail; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ClientDetailMapper 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 22bce27..9ae3763 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,10 +2,12 @@ package com.example.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.entity.dto.Client; +import com.example.entity.vo.request.ClientDetailVO; public interface ClientService extends IService { String registerToken(); Client findClient(String token); Client findClient(Integer id); boolean verifyAndRegister(String token); + void updateClientDetail(ClientDetailVO vo, Client client); } 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 dd69c94..6a334e3 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 @@ -2,15 +2,21 @@ package com.example.service.impl; 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.mapper.ClientDetailMapper; import com.example.mapper.ClientMapper; import com.example.service.ClientService; import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.security.SecureRandom; import java.util.Date; import java.util.HashMap; +import java.util.Objects; import java.util.Random; @Slf4j @@ -22,6 +28,9 @@ public class ClientServiceImpl extends ServiceImpl impleme private final HashMap clientIdCache = new HashMap<>(); private final HashMap clientTokenCache = new HashMap<>(); + @Resource + private ClientDetailMapper detailMapper; + @PostConstruct public void initClientCache() { this.list().forEach(this::addClientCache); @@ -57,6 +66,18 @@ public class ClientServiceImpl extends ServiceImpl impleme return false; } + @Override + public void updateClientDetail(ClientDetailVO vo, Client client) { + ClientDetail detail = new ClientDetail(); + BeanUtils.copyProperties(vo, detail); + detail.setId(client.getId()); + if(Objects.nonNull(detailMapper.selectById(client.getId()))) { + detailMapper.updateById(detail); + } else { + detailMapper.insert(detail); + } + } + private void addClientCache(Client client) { clientIdCache.put(client.getId(), client); clientTokenCache.put(client.getToken(), client);