From 6a1c7845f488ab5c87aa1eb7eaf3062cc8df5fd7 Mon Sep 17 00:00:00 2001 From: xuesijing Date: Mon, 3 Mar 2025 09:51:51 +0800 Subject: [PATCH 01/14] OCT:add httpUtils ut --- .../cmcc/magent/misc/HttpClientUtilsTest.java | 1 + .../com/cmcc/magent/misc/HttpUtilsTest.java | 27 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/cmcc/magent/misc/HttpClientUtilsTest.java b/src/test/java/com/cmcc/magent/misc/HttpClientUtilsTest.java index 6b5b409..47fcad8 100644 --- a/src/test/java/com/cmcc/magent/misc/HttpClientUtilsTest.java +++ b/src/test/java/com/cmcc/magent/misc/HttpClientUtilsTest.java @@ -137,6 +137,7 @@ public class HttpClientUtilsTest { } } + @Test @DisplayName("GET 成功") public void get_Success() throws IOException, ParseException { diff --git a/src/test/java/com/cmcc/magent/misc/HttpUtilsTest.java b/src/test/java/com/cmcc/magent/misc/HttpUtilsTest.java index 883e265..e4fa4ee 100644 --- a/src/test/java/com/cmcc/magent/misc/HttpUtilsTest.java +++ b/src/test/java/com/cmcc/magent/misc/HttpUtilsTest.java @@ -1,13 +1,23 @@ package com.cmcc.magent.misc; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import jakarta.servlet.http.HttpServletRequest; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; /** *

@@ -34,4 +44,17 @@ public class HttpUtilsTest { assertNotNull(instance); }); } + + @Test + public void testGetHttpRequestHeaders_nullrequest() throws Exception { + String result = HttpUtils.getHttpRequestHeaders(null); + // assertNotNull(result); + assertEquals("{}", result); + } + + @Test + public void testGetHttpRequestSrcIp_nullrequest() throws Exception { + String result = HttpUtils.getHttpRequestSrcIp(null); + assertEquals("unknown", result); + } } From 701348be1f74519bbbb47c6acadc04f217361853 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Sat, 8 Mar 2025 10:32:40 +0800 Subject: [PATCH 02/14] =?UTF-8?q?OCT=20REM:=201.=20=E9=9B=86=E6=88=90?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E9=AA=8C=E8=AF=81=E5=8A=9F=E8=83=BD=202.=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E6=AD=A5=E6=89=A7=E8=A1=8C=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=AE=8C=E6=88=90=E9=80=9A=E7=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 ++++++++++++++++++- .../com/cmcc/magent/config/MwCoreConfig.java | 19 +++++++++++++++++ .../interceptor/MwSignRequestInterceptor.java | 20 ++++++++++++++++++ .../magent/service/PlatformApiService.java | 3 +++ .../impl/MiddlewareManagerServiceImpl.java | 12 +++++++++++ src/main/resources/application.properties | 18 ++++++++++++++++ 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cmcc/magent/config/MwCoreConfig.java create mode 100644 src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java diff --git a/pom.xml b/pom.xml index e11b84d..58f0ac5 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,7 @@ 1.0.0 17 + 0.1.6-SNAPSHOT @@ -58,6 +59,11 @@ jacoco-maven-plugin 0.8.12 + + org.springframework.cloud + spring-cloud-starter-openfeign + 4.2.0 + org.springdoc springdoc-openapi-starter-webmvc-api @@ -143,7 +149,12 @@ com.cmcc.hy gzs-common-oss - 0.1.6-SNAPSHOT + ${gzs-common.version} + + + com.cmcc.hy + gzs-common-sign + ${gzs-common.version} net.logstash.logback @@ -181,6 +192,10 @@ org.springframework.boot spring-boot-starter-undertow + + org.springframework.cloud + spring-cloud-starter-openfeign + com.mybatis-flex mybatis-flex-spring-boot3-starter @@ -261,6 +276,10 @@ com.cmcc.hy gzs-common-oss + + com.cmcc.hy + gzs-common-sign + net.logstash.logback logstash-logback-encoder diff --git a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java new file mode 100644 index 0000000..c4b3a74 --- /dev/null +++ b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java @@ -0,0 +1,19 @@ +package com.cmcc.magent.config; + +import com.cmcc.hy.gzs.common.sign.autoconfigure.EnableSign; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RefreshScope +@ConfigurationProperties(prefix = "mw.core") +@Data +@EnableSign +public class MwCoreConfig { + + private String innerClientId = "mw-open-82hsbmz8"; + + private String innerClientSecret = "98rnk8pz6j08fp6q"; +} diff --git a/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java b/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java new file mode 100644 index 0000000..eb500cb --- /dev/null +++ b/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java @@ -0,0 +1,20 @@ +package com.cmcc.magent.interceptor; + +import com.cmcc.hy.gzs.common.feign.GzsSignRequestInterceptor; +import com.cmcc.magent.config.MwCoreConfig; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class MwSignRequestInterceptor implements GzsSignRequestInterceptor { + private final MwCoreConfig mwCoreProperties; + + @Override + public String getClientId() { + return "::";//mwCoreProperties.getInnerClientId(); + } + + @Override + public String getClientSecret() { + return "::";//mwCoreProperties.getInnerClientSecret(); + } +} diff --git a/src/main/java/com/cmcc/magent/service/PlatformApiService.java b/src/main/java/com/cmcc/magent/service/PlatformApiService.java index c4d21b6..93116b7 100644 --- a/src/main/java/com/cmcc/magent/service/PlatformApiService.java +++ b/src/main/java/com/cmcc/magent/service/PlatformApiService.java @@ -1,6 +1,8 @@ package com.cmcc.magent.service; +import com.cmcc.magent.interceptor.MwSignRequestInterceptor; import com.cmcc.magent.pojo.po.RegisterAgent; +import org.springframework.cloud.openfeign.FeignClient; import java.io.IOException; @@ -14,6 +16,7 @@ import java.io.IOException; * @version 1.0.0 * @since 2025-01-07 */ +@FeignClient(name = "/mw/agent", url = "/mw/agent", configuration = MwSignRequestInterceptor.class) public interface PlatformApiService { /** diff --git a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java index c65a0ba..9c05b1b 100644 --- a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java @@ -320,6 +320,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { } runCommand(workDir, command); log.info("---- Task {} Finished", data.getUid()); + }).whenComplete((v, t) -> { + if (t != null) { + log.error("---- Task {} Finished With Exception: {}", data.getUid(), t.getMessage()); + } else { + log.info("---- Task {} Finished: {}", data.getUid(), v); + } }); } @@ -397,6 +403,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { runCommand(workDir, cmd); log.info("---- Task {} Finished", data.getUid()); + }).whenComplete((v, t) -> { + if (t != null) { + log.error("---- Task {} Finished With Exception: {}", data.getUid(), t.getMessage()); + } else { + log.info("---- Task {} Finished: {}", data.getUid(), v); + } }); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7f3be19..64ad2e5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -81,3 +81,21 @@ thread.max-pool-size=10 thread.queue-capacity=25 thread.name-prefix=Async- +# Can support profiles, databases, or remote +gzs.sign.client-details-enabled=true +gzs.sign.client-details.'yj-xx-1234567'=1234567 +# Permission: Specifies the interface corresponding to client_id. If the default value is empty, there is no restriction. +gzs.sign.perm.'yj-yy-1234567'=/xx/xx,/xx/yy + +# default can be configured in the rule-group, for example, gzs.sign.rule-.yj.mode =0 +# [Optional] 1: strict mode, 0: common mode (default) +gzs.sign.rule.default.mode=0 +# [Optional] Mandatory check list (In any mode, the following interfaces require check) +gzs.sign.rule.default.required-list=POST:/xxx/xx,*:/xxx/yy/** +# [Optional] Optional check list (In any mode, the following interfaces can be checked) +gzs.sign.rule.default.optional-list=GET:/xxx/xx,*:/xxx/yy/* + +# [Optional] If base64 encoding is used, you can configure whether base64 encoding for url security is required in the signature algorithm based on different client_id. The default value is true +#gzs.sign.base64-url-safe.def = true +#gzs.sign.base64-url-safe.'as-xx-1234567' = false + From 8223e294bd90357f97755692858f53fe0eb47dff Mon Sep 17 00:00:00 2001 From: HuangXin Date: Sat, 8 Mar 2025 10:34:50 +0800 Subject: [PATCH 03/14] =?UTF-8?q?OCT=20REM:=201.=20=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E9=AA=8C=E8=AF=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cmcc/magent/config/MwCoreConfig.java | 21 ++++++++++++++++ .../interceptor/MwSignRequestInterceptor.java | 24 +++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java index c4b3a74..a2c84af 100644 --- a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java +++ b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java @@ -6,6 +6,17 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; +/** + * MwCoreConfig类用于配置与中间件核心相关的属性。 + * + *

该类包含客户端ID和客户端密钥,用于与GZS服务进行身份验证。

+ * + *

该配置类会在Spring容器启动时加载,并支持动态刷新配置。

+ * + * @author huangxin@cmhi.chinamobile.com + * @version 1.0.0 + * @since 2025-03-07 + */ @Configuration @RefreshScope @ConfigurationProperties(prefix = "mw.core") @@ -13,7 +24,17 @@ import org.springframework.context.annotation.Configuration; @EnableSign public class MwCoreConfig { + /** + * 内部客户端ID。 + * + *

默认为"mw-open-82hsbmz8",可通过配置文件进行覆盖。

+ */ private String innerClientId = "mw-open-82hsbmz8"; + /** + * 内部客户端密钥。 + * + *

默认为"98rnk8pz6j08fp6q",可通过配置文件进行覆盖。

+ */ private String innerClientSecret = "98rnk8pz6j08fp6q"; } diff --git a/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java b/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java index eb500cb..645a6a6 100644 --- a/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java +++ b/src/main/java/com/cmcc/magent/interceptor/MwSignRequestInterceptor.java @@ -4,17 +4,37 @@ import com.cmcc.hy.gzs.common.feign.GzsSignRequestInterceptor; import com.cmcc.magent.config.MwCoreConfig; import lombok.RequiredArgsConstructor; +/** + * MwSignRequestInterceptor类实现了GzsSignRequestInterceptor接口。 + * + *

该类用于拦截请求并提供客户端ID和客户端密钥,用于与GZS服务的身份验证。

+ * + * @author huangxin@cmhi.chinamobile.com + * @version 1.0.0 + * @since 2025-03-07 + */ @RequiredArgsConstructor public class MwSignRequestInterceptor implements GzsSignRequestInterceptor { + private final MwCoreConfig mwCoreProperties; + /** + * 获取客户端ID。 + * + * @return 客户端ID + */ @Override public String getClientId() { - return "::";//mwCoreProperties.getInnerClientId(); + return mwCoreProperties.getInnerClientId(); } + /** + * 获取客户端密钥。 + * + * @return 客户端密钥 + */ @Override public String getClientSecret() { - return "::";//mwCoreProperties.getInnerClientSecret(); + return mwCoreProperties.getInnerClientSecret(); } } From 0c35416d7dcf6a64e17dbfe3ab8bf056630bbc6a Mon Sep 17 00:00:00 2001 From: HuangXin Date: Sat, 8 Mar 2025 11:31:55 +0800 Subject: [PATCH 04/14] =?UTF-8?q?OCT=20REM:=201.=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=A8=A1=E5=BC=8F=E4=B8=8B=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E9=83=A8=E7=BD=B2=E5=91=BD=E4=BB=A4=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=BB=93=E6=9E=9C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../magent/service/PlatformApiService.java | 17 +++++-- .../impl/MiddlewareManagerServiceImpl.java | 10 +++- .../service/impl/PlatformApiServiceImpl.java | 50 +++++++++++++++++-- src/main/resources/application.properties | 2 +- 4 files changed, 68 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cmcc/magent/service/PlatformApiService.java b/src/main/java/com/cmcc/magent/service/PlatformApiService.java index 93116b7..5b42cf5 100644 --- a/src/main/java/com/cmcc/magent/service/PlatformApiService.java +++ b/src/main/java/com/cmcc/magent/service/PlatformApiService.java @@ -4,8 +4,6 @@ import com.cmcc.magent.interceptor.MwSignRequestInterceptor; import com.cmcc.magent.pojo.po.RegisterAgent; import org.springframework.cloud.openfeign.FeignClient; -import java.io.IOException; - /** * PlatformApiService 接口定义了与平台 API 通信的核心服务功能。 *

@@ -27,7 +25,18 @@ public interface PlatformApiService { * * @param agent 包含代理注册信息的 {@link RegisterAgent} 对象 * @return 平台返回的结果,通常为一个 JSON 格式的字符串 - * @throws IOException 如果在处理 JSON 时发生错误 */ - String registerAgent(RegisterAgent agent) throws IOException; + String registerAgent(RegisterAgent agent); + + /** + * 回报部署任务结果。 + *

+ * 该方法用于想平台报告部署任务执行的结果。 + *

+ * + * @param deploymentId 部署任务ID + * @param status 部署任务执行结果:0(部署中),1(正常),2(不正常) + * @return 平台返回的结果,通常为一个 JSON 格式的字符串 + */ + String responseDeploymentResult(String deploymentId, int status); } diff --git a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java index 9c05b1b..c217831 100644 --- a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java @@ -14,6 +14,7 @@ import com.cmcc.magent.misc.JsonUtils; import com.cmcc.magent.pojo.entry.MiddlewareData; import com.cmcc.magent.pojo.po.RemoteFileDetails; import com.cmcc.magent.service.MiddlewareManagerService; +import com.cmcc.magent.service.PlatformApiService; import com.fasterxml.jackson.core.JsonProcessingException; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -62,6 +63,9 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { @Resource private OssFactory ossFactory; + @Resource + private PlatformApiService platformApiService; + /** * 根据命令获取对应的文件名。 * @@ -322,9 +326,10 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { log.info("---- Task {} Finished", data.getUid()); }).whenComplete((v, t) -> { if (t != null) { + platformApiService.responseDeploymentResult(data.getUid(), 2); log.error("---- Task {} Finished With Exception: {}", data.getUid(), t.getMessage()); } else { - log.info("---- Task {} Finished: {}", data.getUid(), v); + log.info("---- Task {} Finished: {}", data.getUid(), platformApiService.responseDeploymentResult(data.getUid(), 1)); } }); } @@ -405,9 +410,10 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService { log.info("---- Task {} Finished", data.getUid()); }).whenComplete((v, t) -> { if (t != null) { + platformApiService.responseDeploymentResult(data.getUid(), 2); log.error("---- Task {} Finished With Exception: {}", data.getUid(), t.getMessage()); } else { - log.info("---- Task {} Finished: {}", data.getUid(), v); + log.info("---- Task {} Finished: {}", data.getUid(), platformApiService.responseDeploymentResult(data.getUid(), 1)); } }); } diff --git a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java index 0933ae9..56e7471 100644 --- a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java @@ -6,9 +6,12 @@ import com.cmcc.magent.misc.JsonUtils; import com.cmcc.magent.pojo.po.RegisterAgent; import com.cmcc.magent.service.PlatformApiService; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; /** * PlatformApiServiceImpl 是 {@link PlatformApiService} 的具体实现类。 @@ -26,6 +29,7 @@ import java.io.IOException; * @since 2025 -01-07 */ @Service +@Slf4j public class PlatformApiServiceImpl implements PlatformApiService { @Resource private PlatformServiceConfig platformServiceConfig; @@ -39,11 +43,49 @@ public class PlatformApiServiceImpl implements PlatformApiService { * * @param agent 包含代理注册信息的 {@link RegisterAgent} 实例 * @return 平台返回的注册结果,通常为 JSON 格式的字符串 - * @throws IOException IO 异常 */ @Override - public String registerAgent(RegisterAgent agent) throws IOException { - String reqString = JsonUtils.getJson(agent); - return HttpClientUtils.postJson(platformServiceConfig + "/register", null, reqString, null); + public String registerAgent(RegisterAgent agent) { + + String result = ""; + + try { + String reqString = JsonUtils.getJson(agent); + result = HttpClientUtils.postJson(platformServiceConfig + "/register", null, reqString, null); + } catch (IOException e) { + log.error("Register agent client {} exception: {}", agent.getDeviceId(), e.getMessage()); + } + + return result; + } + + /** + * 回报部署任务结果。 + *

+ * 该方法用于想平台报告部署任务执行的结果。 + *

+ * + * @param deploymentId 部署任务ID + * @param status 部署任务执行结果:0(部署中),1(正常),2(不正常) + * @return 平台返回的结果,通常为一个 JSON 格式的字符串 + */ + @Override + public String responseDeploymentResult(String deploymentId, int status) { + Map headers = new HashMap<>(4); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + + Map params = new HashMap<>(4); + params.put("deploymentId", deploymentId); + params.put("status", String.valueOf(status)); + + String result = ""; + + try { + result = HttpClientUtils.post(platformServiceConfig + "/innerapi/instance/update-status", headers, params, null); + } catch (IOException e) { + log.error("Report deployment {} result exception: {}", deploymentId, e.getMessage()); + } + + return result; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 64ad2e5..05d77dc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -67,7 +67,7 @@ protocol.crypto-type=0 # Platform Service # Manager Platform URL -service.platform-url=http://xajhuang.com:1300 +service.platform-url=https://172.21.44.35:50443/mw/core # APPID service.platform-appid=appid # cluster name From e74124c7eee32c5c14c919a18b6453cc091aa559 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Mon, 10 Mar 2025 10:50:25 +0800 Subject: [PATCH 05/14] =?UTF-8?q?OCT=20REM:=201.=20=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 17 ++++- .../magent/MiddlewareAgentApplication.java | 4 ++ .../com/cmcc/magent/config/MwCoreConfig.java | 6 +- .../magent/service/PlatformApiService.java | 40 ++++++----- .../service/impl/PlatformApiServiceImpl.java | 72 +++++++------------ src/main/resources/application.properties | 8 +-- .../magent/misc/ProtocolJsonUtilsTest.java | 1 + .../impl/ResourceUsageServiceImplTest.java | 3 + src/test/resources/application.properties | 4 +- 9 files changed, 85 insertions(+), 70 deletions(-) diff --git a/pom.xml b/pom.xml index 58f0ac5..2764994 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 1.0.0 17 - 0.1.6-SNAPSHOT + 0.1.7-SNAPSHOT @@ -64,6 +64,11 @@ spring-cloud-starter-openfeign 4.2.0 + + io.github.openfeign + feign-okhttp + 13.5 + org.springdoc springdoc-openapi-starter-webmvc-api @@ -195,6 +200,16 @@ org.springframework.cloud spring-cloud-starter-openfeign + + + commons-fileupload + commons-fileupload + + + + + io.github.openfeign + feign-okhttp com.mybatis-flex diff --git a/src/main/java/com/cmcc/magent/MiddlewareAgentApplication.java b/src/main/java/com/cmcc/magent/MiddlewareAgentApplication.java index fc3ad19..5e2b620 100644 --- a/src/main/java/com/cmcc/magent/MiddlewareAgentApplication.java +++ b/src/main/java/com/cmcc/magent/MiddlewareAgentApplication.java @@ -1,7 +1,9 @@ package com.cmcc.magent; +import com.cmcc.hy.gzs.common.sign.autoconfigure.EnableSign; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.scheduling.annotation.EnableScheduling; /** @@ -28,6 +30,8 @@ import org.springframework.scheduling.annotation.EnableScheduling; */ @SpringBootApplication @EnableScheduling +@EnableFeignClients +@EnableSign public class MiddlewareAgentApplication { /** diff --git a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java index a2c84af..1e076e0 100644 --- a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java +++ b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java @@ -5,6 +5,7 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; /** * MwCoreConfig类用于配置与中间件核心相关的属性。 @@ -17,11 +18,10 @@ import org.springframework.context.annotation.Configuration; * @version 1.0.0 * @since 2025-03-07 */ -@Configuration +@Component @RefreshScope -@ConfigurationProperties(prefix = "mw.core") +@ConfigurationProperties(prefix = "mw.agent") @Data -@EnableSign public class MwCoreConfig { /** diff --git a/src/main/java/com/cmcc/magent/service/PlatformApiService.java b/src/main/java/com/cmcc/magent/service/PlatformApiService.java index 5b42cf5..15d222e 100644 --- a/src/main/java/com/cmcc/magent/service/PlatformApiService.java +++ b/src/main/java/com/cmcc/magent/service/PlatformApiService.java @@ -1,8 +1,13 @@ package com.cmcc.magent.service; +import com.cmcc.hy.gzs.common.result.Result; import com.cmcc.magent.interceptor.MwSignRequestInterceptor; import com.cmcc.magent.pojo.po.RegisterAgent; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; /** * PlatformApiService 接口定义了与平台 API 通信的核心服务功能。 @@ -14,29 +19,32 @@ import org.springframework.cloud.openfeign.FeignClient; * @version 1.0.0 * @since 2025-01-07 */ -@FeignClient(name = "/mw/agent", url = "/mw/agent", configuration = MwSignRequestInterceptor.class) +@FeignClient(name = "agent-portal-feign", + url = "${service.platform-url}", + path = "/mw/core", + configuration = MwSignRequestInterceptor.class) public interface PlatformApiService { /** - * 注册代理(Agent)。 - *

- * 该方法用于将代理实例注册到平台,并返回平台生成的响应结果。 - *

+ * 注册代理。 * - * @param agent 包含代理注册信息的 {@link RegisterAgent} 对象 - * @return 平台返回的结果,通常为一个 JSON 格式的字符串 + * @param agent 要注册的代理信息,包含代理的相关属性。 + * @return 返回一个 {@link Result} 对象,包含注册结果的状态和消息。 */ - String registerAgent(RegisterAgent agent); + @PostMapping(path = "/register", consumes = MediaType.APPLICATION_JSON_VALUE) + Result registerAgent(@RequestBody RegisterAgent agent); + /** - * 回报部署任务结果。 - *

- * 该方法用于想平台报告部署任务执行的结果。 - *

+ * 响应部署结果。 + * + *

该方法用于更新指定部署的状态,服务器将根据传入的状态信息进行相应处理。

+ * + * @param deploymentId 部署的唯一标识符,用于指定需要更新状态的部署。 + * @param status 部署状态,整数类型,表示当前部署的状态,如成功、失败等。 + * @return 返回一个 {@link Result} 对象,包含操作结果的状态和相关信息。 * - * @param deploymentId 部署任务ID - * @param status 部署任务执行结果:0(部署中),1(正常),2(不正常) - * @return 平台返回的结果,通常为一个 JSON 格式的字符串 */ - String responseDeploymentResult(String deploymentId, int status); + @PostMapping(path = "/innerapi/instance/update-status", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + Result responseDeploymentResult(@RequestParam("deploymentId") String deploymentId, @RequestParam("status") Integer status); } diff --git a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java index 56e7471..229ba62 100644 --- a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java @@ -1,17 +1,13 @@ package com.cmcc.magent.service.impl; -import com.cmcc.magent.config.PlatformServiceConfig; -import com.cmcc.magent.misc.HttpClientUtils; -import com.cmcc.magent.misc.JsonUtils; +import com.cmcc.hy.gzs.common.result.Result; import com.cmcc.magent.pojo.po.RegisterAgent; import com.cmcc.magent.service.PlatformApiService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; /** * PlatformApiServiceImpl 是 {@link PlatformApiService} 的具体实现类。 @@ -30,62 +26,48 @@ import java.util.Map; */ @Service @Slf4j -public class PlatformApiServiceImpl implements PlatformApiService { +public class PlatformApiServiceImpl { @Resource - private PlatformServiceConfig platformServiceConfig; + private PlatformApiService platformApiService; /** - * 注册代理(Agent)。 - *

- * 通过向平台 API 提供的注册接口("/register")发送 POST 请求,完成代理的注册操作。 - * 请求体为转换为 JSON 格式的 {@link RegisterAgent} 对象。 - *

+ * 注册代理。 * - * @param agent 包含代理注册信息的 {@link RegisterAgent} 实例 - * @return 平台返回的注册结果,通常为 JSON 格式的字符串 + * @param agent 要注册的代理信息,包含代理的相关属性。 + * @return 返回一个 {@link Result} 对象,包含注册结果的状态和消息。 */ - @Override - public String registerAgent(RegisterAgent agent) { - - String result = ""; + public Result registerAgent(@RequestBody RegisterAgent agent) { + Result s = null; try { - String reqString = JsonUtils.getJson(agent); - result = HttpClientUtils.postJson(platformServiceConfig + "/register", null, reqString, null); - } catch (IOException e) { + s = platformApiService.registerAgent(agent); + } catch (Exception e) { log.error("Register agent client {} exception: {}", agent.getDeviceId(), e.getMessage()); } - return result; + return s; } /** - * 回报部署任务结果。 - *

- * 该方法用于想平台报告部署任务执行的结果。 - *

+ * 响应部署结果。 + * + *

该方法用于更新指定部署的状态,服务器将根据传入的状态信息进行相应处理。

+ * + * @param deploymentId 部署的唯一标识符,用于指定需要更新状态的部署。 + * @param status 部署状态,整数类型,表示当前部署的状态,如成功、失败等。 + * @return 返回一个 {@link Result} 对象,包含操作结果的状态和相关信息。 * - * @param deploymentId 部署任务ID - * @param status 部署任务执行结果:0(部署中),1(正常),2(不正常) - * @return 平台返回的结果,通常为一个 JSON 格式的字符串 */ - @Override - public String responseDeploymentResult(String deploymentId, int status) { - Map headers = new HashMap<>(4); - headers.put("Content-Type", "application/x-www-form-urlencoded"); - - Map params = new HashMap<>(4); - params.put("deploymentId", deploymentId); - params.put("status", String.valueOf(status)); - - String result = ""; + public Result responseDeploymentResult(@RequestParam("deploymentId") String deploymentId, + @RequestParam("status") Integer status) { + Result s = null; try { - result = HttpClientUtils.post(platformServiceConfig + "/innerapi/instance/update-status", headers, params, null); - } catch (IOException e) { - log.error("Report deployment {} result exception: {}", deploymentId, e.getMessage()); + s = platformApiService.responseDeploymentResult(deploymentId, status); + } catch (Exception e) { + log.error("Register agent client {} exception: {}", deploymentId, e.getMessage()); } - return result; + return s; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 05d77dc..4e450ea 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -83,17 +83,17 @@ thread.name-prefix=Async- # Can support profiles, databases, or remote gzs.sign.client-details-enabled=true -gzs.sign.client-details.'yj-xx-1234567'=1234567 +gzs.sign.client-details.'mw-open-82hsbmz8'=98rnk8pz6j08fp6q # Permission: Specifies the interface corresponding to client_id. If the default value is empty, there is no restriction. -gzs.sign.perm.'yj-yy-1234567'=/xx/xx,/xx/yy +#gzs.sign.perm.'yj-yy-1234567'=/xx/xx,/xx/yy # default can be configured in the rule-group, for example, gzs.sign.rule-.yj.mode =0 # [Optional] 1: strict mode, 0: common mode (default) -gzs.sign.rule.default.mode=0 +#gzs.sign.rule.default.mode=0 # [Optional] Mandatory check list (In any mode, the following interfaces require check) gzs.sign.rule.default.required-list=POST:/xxx/xx,*:/xxx/yy/** # [Optional] Optional check list (In any mode, the following interfaces can be checked) -gzs.sign.rule.default.optional-list=GET:/xxx/xx,*:/xxx/yy/* +#gzs.sign.rule.default.optional-list=GET:/xxx/xx,*:/xxx/yy/* # [Optional] If base64 encoding is used, you can configure whether base64 encoding for url security is required in the signature algorithm based on different client_id. The default value is true #gzs.sign.base64-url-safe.def = true diff --git a/src/test/java/com/cmcc/magent/misc/ProtocolJsonUtilsTest.java b/src/test/java/com/cmcc/magent/misc/ProtocolJsonUtilsTest.java index b81e464..a3f0936 100644 --- a/src/test/java/com/cmcc/magent/misc/ProtocolJsonUtilsTest.java +++ b/src/test/java/com/cmcc/magent/misc/ProtocolJsonUtilsTest.java @@ -48,6 +48,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ @SpringBootTest @DisplayName("ProtocolJsonUtils 测试类") +@SuppressWarnings("unchecked") public class ProtocolJsonUtilsTest { private ProtocolResp protocolResp; diff --git a/src/test/java/com/cmcc/magent/service/impl/ResourceUsageServiceImplTest.java b/src/test/java/com/cmcc/magent/service/impl/ResourceUsageServiceImplTest.java index a1e94b9..e6f4b98 100644 --- a/src/test/java/com/cmcc/magent/service/impl/ResourceUsageServiceImplTest.java +++ b/src/test/java/com/cmcc/magent/service/impl/ResourceUsageServiceImplTest.java @@ -82,6 +82,7 @@ public class ResourceUsageServiceImplTest { resourceUsageService.performTask(); + @SuppressWarnings("unchecked") CircularQueue resourceUsageQueue = (CircularQueue) ReflectionTestUtils.getField(resourceUsageService, "resourceUsageQueue"); assertNotNull(resourceUsageQueue, "Resource usage queue should not be null"); @@ -109,6 +110,7 @@ public class ResourceUsageServiceImplTest { resourceUsageService.performTask(); + @SuppressWarnings("unchecked") CircularQueue resourceUsageQueue = (CircularQueue) ReflectionTestUtils.getField(resourceUsageService, "resourceUsageQueue"); @@ -137,6 +139,7 @@ public class ResourceUsageServiceImplTest { resourceUsageService.performTask(); + @SuppressWarnings("unchecked") CircularQueue resourceUsageQueue = (CircularQueue) ReflectionTestUtils.getField(resourceUsageService, "resourceUsageQueue"); assertNotNull(resourceUsageQueue, "Resource usage queue should not be null"); diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 78440e4..616c4d4 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -56,7 +56,7 @@ protocol.crypto-type=0 # Platform Service # Manager Platform URL -service.platform-url=http://xajhuang.com:1300 +service.platform-url=http://xajhuang.com:3006/post # APPID service.platform-appid=appid # cluster name @@ -70,3 +70,5 @@ thread.max-pool-size=10 thread.queue-capacity=25 thread.name-prefix=Async- +gzs.sign.client-details-enabled=true +gzs.sign.client-details.'mw-open-82hsbmz8'=98rnk8pz6j08fp6q \ No newline at end of file From 0294b571fc2a9ac0fd9b7121e31c85ca1b5cfcf7 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Mon, 10 Mar 2025 10:51:00 +0800 Subject: [PATCH 06/14] =?UTF-8?q?OCT=20REM:=201.=20=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20PlatformApiServiceImpl=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PlatformApiServiceImplTest.java | 155 ++++++++---------- 1 file changed, 71 insertions(+), 84 deletions(-) diff --git a/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java b/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java index 5a7178a..f69880b 100644 --- a/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java +++ b/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java @@ -1,122 +1,109 @@ package com.cmcc.magent.service.impl; -import com.cmcc.magent.config.PlatformServiceConfig; -import com.cmcc.magent.misc.HttpClientUtils; -import com.cmcc.magent.misc.JsonUtils; +import com.cmcc.hy.gzs.common.result.Result; import com.cmcc.magent.pojo.po.RegisterAgent; -import jakarta.annotation.Resource; -import org.junit.jupiter.api.AfterEach; +import com.cmcc.magent.service.PlatformApiService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.springframework.boot.test.context.SpringBootTest; -import java.io.IOException; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mockStatic; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; /** - * 单元测试类 {@code PlatformApiServiceImplTest} 用于测试 {@link PlatformApiServiceImpl} 的功能。 + * PlatformApiServiceImplTest 类用于测试 {@link PlatformApiServiceImpl} 的功能。 *

- * 测试的主要目标是确保 {@link PlatformApiServiceImpl#registerAgent(RegisterAgent)} 方法能够正常工作, + * 该测试类包含多个单元测试,验证与 {@link PlatformApiService} 相关的方法的正确性。 *

* - *

测试中使用了 {@code MockWebServer} 来模拟 HTTP 请求和响应,避免依赖实际的外部服务。

- * - *

主要验证内容包括:

- *
    - *
  • 是否正确构造了 HTTP 请求(如方法和路径)。
  • - *
  • 是否正确处理了 HTTP 响应并返回预期结果。
  • - *
- * - *

依赖注入说明:

- *
    - *
  • 通过 {@code @Resource} 注入被测试的 {@code PlatformApiServiceImpl}。
  • - *
  • 通过 {@code @Autowired} 注入 {@code WebClient.Builder},用于生成测试时专用的 {@code WebClient}。
  • - *
- * * @author huangxin@cmhi.chinamobile.com * @version 1.0.0 - * @since 2025-01-14 + * @since 2025-03-07 */ -@SpringBootTest -@DisplayName("平台服务接口") +@DisplayName("平台访问接口测试") public class PlatformApiServiceImplTest { - /** - * 被测试的服务类 {@link PlatformApiServiceImpl}。 - */ - @Resource - private PlatformApiServiceImpl platformApiService; + @Mock + private PlatformApiService platformApiService; - @Resource - private PlatformServiceConfig platformServiceConfig; - - private MockedStatic platformMock; - - private MockedStatic jsonMock; + @InjectMocks + private PlatformApiServiceImpl platformApiServiceimpl; /** - * 在每个测试前进行设置。 - * 创建 HttpClient 和响应的 Mock 对象,并初始化 Mockito。 - * + * 在每个测试之前初始化 Mockito 注解。 */ @BeforeEach public void setUp() { MockitoAnnotations.openMocks(this); - platformMock = mockStatic(HttpClientUtils.class, Mockito.CALLS_REAL_METHODS); - jsonMock = mockStatic(JsonUtils.class); } /** - * 在每个测试后清理资源。 - */ - @AfterEach - public void tearDown() { - platformMock.close(); - jsonMock.close(); - } - - /** - * 测试 {@link PlatformApiServiceImpl#registerAgent(RegisterAgent)} 方法。 - * - *

验证以下内容:

- *
    - *
  • 是否正确发送了 HTTP POST 请求到指定路径(如 {@code /register})。
  • - *
  • 是否正确处理了 HTTP 响应并返回预期的结果。
  • - *
- * - *

测试流程:

- *
    - *
  1. 设置 MockWebServer 的响应内容为 {@code {"message": "Hello, World!"}}。
  2. - *
  3. 使用测试数据(如 {@link RegisterAgent} 对象)调用 {@code registerAgent} 方法。
  4. - *
  5. 验证返回值是否等于设置的响应内容。
  6. - *
  7. 验证发送的请求是否符合预期(如方法为 POST,路径为 /register)。
  8. - *
+ * 测试在成功执行情况下,调用 responseDeploymentResult 方法返回结果。 * */ @Test - @DisplayName("设备注册接口测试") - void testFetchData() throws IOException { - // 准备模拟的 HTTP 响应 - String mockResponse = "Mocked Response"; + @DisplayName("部署结果响应成功") + public void responseDeploymentResult_SuccessfulExecution_ReturnsResult() { + String deploymentId = "12345"; + Integer status = 1; + Result expectedResponse = Result.success("Deployment updated successfully"); - final RegisterAgent agent = RegisterAgent.builder().deviceId("123542535").build(); + when(platformApiService.responseDeploymentResult(deploymentId, status)).thenReturn(expectedResponse); - jsonMock.when(() -> JsonUtils.getJson(any(Object.class))).thenReturn(mockResponse); + Result actualResponse = platformApiServiceimpl.responseDeploymentResult(deploymentId, status); - platformMock.when(() -> HttpClientUtils.postJson(platformServiceConfig + "/register", null, mockResponse, null)).thenReturn( - "Mocked Response"); + assertNotNull(actualResponse); + assertEquals(expectedResponse, actualResponse); + } - // 调用被测试方法 - final String result = platformApiService.registerAgent(agent); + /** + * 测试在调用 responseDeploymentResult 方法时抛出异常,返回 null。 + * + * @throws RuntimeException 可能抛出的异常 + */ + @Test + @DisplayName("部署结果响应异常") + public void responseDeploymentResult_ExceptionThrown_ReturnsNull() { + String deploymentId = "12345"; + Integer status = 1; - // 验证结果 - assertThat(result).isEqualTo(mockResponse); + when(platformApiService.responseDeploymentResult(deploymentId, status)).thenThrow(new RuntimeException("Service exception")); + + assertThrows(RuntimeException.class, () -> platformApiService.responseDeploymentResult(deploymentId, status)); + } + + /** + * 测试在成功注册情况下,调用 registerAgent 方法返回成功结果。 + * + */ + @Test + @DisplayName("注册代理成功") + public void registerAgent_SuccessfulRegistration_ReturnsSuccessResult() { + RegisterAgent agent = new RegisterAgent("1234567890"); + Result expected = Result.success("Registration successful"); + when(platformApiService.registerAgent(agent)).thenReturn(expected); + + Result actual = platformApiService.registerAgent(agent); + + assertEquals(expected, actual); + } + + /** + * 测试在调用 registerAgent 方法时抛出异常,返回 null。 + * + * @throws RuntimeException 可能抛出的异常 + */ + @Test + @DisplayName("注册代理异常") + public void registerAgent_ExceptionThrown_ReturnsNull() { + RegisterAgent agent = new RegisterAgent("1234567890"); + when(platformApiService.registerAgent(agent)).thenThrow(new RuntimeException("Registration failedxxxx")); + + assertThrows(RuntimeException.class, () -> platformApiService.registerAgent(agent)); } } From 45a9daa9cbdcf6b6a24058c85bc9683788db215c Mon Sep 17 00:00:00 2001 From: HuangXin Date: Mon, 10 Mar 2025 14:07:10 +0800 Subject: [PATCH 07/14] =?UTF-8?q?OCT=20REM:=201.=20=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20PlatformApiService=20=E6=9C=8D=E5=8A=A1=20?= =?UTF-8?q?2.=20=E5=88=A0=E6=8E=89=E5=A4=9A=E4=BD=99=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=88=9D=E5=A7=8B=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cmcc/magent/config/MwCoreConfig.java | 2 - .../PlatformApiFeignClientService.java | 52 ++++++++++++++ .../magent/service/PlatformApiService.java | 15 +--- .../service/impl/PlatformApiServiceImpl.java | 22 +++--- src/main/resources/db/agent.mv.db | Bin 20480 -> 0 bytes .../impl/PlatformApiServiceImplTest.java | 66 ++++++++++++++---- 6 files changed, 116 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/cmcc/magent/service/PlatformApiFeignClientService.java delete mode 100644 src/main/resources/db/agent.mv.db diff --git a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java index 1e076e0..00df396 100644 --- a/src/main/java/com/cmcc/magent/config/MwCoreConfig.java +++ b/src/main/java/com/cmcc/magent/config/MwCoreConfig.java @@ -1,10 +1,8 @@ package com.cmcc.magent.config; -import com.cmcc.hy.gzs.common.sign.autoconfigure.EnableSign; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; /** diff --git a/src/main/java/com/cmcc/magent/service/PlatformApiFeignClientService.java b/src/main/java/com/cmcc/magent/service/PlatformApiFeignClientService.java new file mode 100644 index 0000000..d00b00c --- /dev/null +++ b/src/main/java/com/cmcc/magent/service/PlatformApiFeignClientService.java @@ -0,0 +1,52 @@ +package com.cmcc.magent.service; + +import com.cmcc.hy.gzs.common.result.Result; +import com.cmcc.magent.interceptor.MwSignRequestInterceptor; +import com.cmcc.magent.pojo.po.RegisterAgent; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * PlatformApiFeignClientService 接口定义了与平台 API 通信的核心服务功能。 + *

+ * 该接口包含与平台交互的关键操作,具体实现类负责与平台进行数据交互。 + *

+ * + * @author huangxin@cmhi.chinamobile.com + * @version 1.0.0 + * @since 2025-03-10 + */ +@FeignClient(name = "agent-portal-feign", + url = "${service.platform-url}", + path = "/mw/core", + configuration = MwSignRequestInterceptor.class) +public interface PlatformApiFeignClientService { + + /** + * 注册代理。 + * + * @param agent 要注册的代理信息,包含代理的相关属性。 + * @return 返回一个 {@link Result} 对象,包含注册结果的状态和消息。 + */ + @PostMapping(path = "/register", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + Result registerAgentFeign(@RequestBody RegisterAgent agent); + + + /** + * 响应部署结果。 + * + *

该方法用于更新指定部署的状态,服务器将根据传入的状态信息进行相应处理。

+ * + * @param deploymentId 部署的唯一标识符,用于指定需要更新状态的部署。 + * @param status 部署状态,整数类型,表示当前部署的状态,如成功、失败等。 + * @return 返回一个 {@link Result} 对象,包含操作结果的状态和相关信息。 + * + */ + @PostMapping(path = "/innerapi/instance/update-status", + consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE) + Result responseDeploymentResultFeign(@RequestParam("deploymentId") String deploymentId, @RequestParam("status") Integer status); +} diff --git a/src/main/java/com/cmcc/magent/service/PlatformApiService.java b/src/main/java/com/cmcc/magent/service/PlatformApiService.java index 15d222e..ae3fe26 100644 --- a/src/main/java/com/cmcc/magent/service/PlatformApiService.java +++ b/src/main/java/com/cmcc/magent/service/PlatformApiService.java @@ -1,13 +1,8 @@ package com.cmcc.magent.service; import com.cmcc.hy.gzs.common.result.Result; -import com.cmcc.magent.interceptor.MwSignRequestInterceptor; import com.cmcc.magent.pojo.po.RegisterAgent; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; /** * PlatformApiService 接口定义了与平台 API 通信的核心服务功能。 @@ -19,22 +14,15 @@ import org.springframework.web.bind.annotation.RequestParam; * @version 1.0.0 * @since 2025-01-07 */ -@FeignClient(name = "agent-portal-feign", - url = "${service.platform-url}", - path = "/mw/core", - configuration = MwSignRequestInterceptor.class) public interface PlatformApiService { - /** * 注册代理。 * * @param agent 要注册的代理信息,包含代理的相关属性。 * @return 返回一个 {@link Result} 对象,包含注册结果的状态和消息。 */ - @PostMapping(path = "/register", consumes = MediaType.APPLICATION_JSON_VALUE) Result registerAgent(@RequestBody RegisterAgent agent); - /** * 响应部署结果。 * @@ -45,6 +33,5 @@ public interface PlatformApiService { * @return 返回一个 {@link Result} 对象,包含操作结果的状态和相关信息。 * */ - @PostMapping(path = "/innerapi/instance/update-status", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) - Result responseDeploymentResult(@RequestParam("deploymentId") String deploymentId, @RequestParam("status") Integer status); + Result responseDeploymentResult(String deploymentId, Integer status); } diff --git a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java index 229ba62..64135c4 100644 --- a/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java +++ b/src/main/java/com/cmcc/magent/service/impl/PlatformApiServiceImpl.java @@ -2,15 +2,14 @@ package com.cmcc.magent.service.impl; import com.cmcc.hy.gzs.common.result.Result; import com.cmcc.magent.pojo.po.RegisterAgent; +import com.cmcc.magent.service.PlatformApiFeignClientService; import com.cmcc.magent.service.PlatformApiService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; /** - * PlatformApiServiceImpl 是 {@link PlatformApiService} 的具体实现类。 + * PlatformApiServiceImpl 是 {@link PlatformApiFeignClientService} 的具体实现类。 *

* 该类使用 与平台 API 进行交互,提供了注册代理的功能。 *

@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RequestParam; */ @Service @Slf4j -public class PlatformApiServiceImpl { +public class PlatformApiServiceImpl implements PlatformApiService { @Resource - private PlatformApiService platformApiService; + private PlatformApiFeignClientService platformApiServiceFeign; /** * 注册代理。 @@ -36,11 +35,12 @@ public class PlatformApiServiceImpl { * @param agent 要注册的代理信息,包含代理的相关属性。 * @return 返回一个 {@link Result} 对象,包含注册结果的状态和消息。 */ - public Result registerAgent(@RequestBody RegisterAgent agent) { + @Override + public Result registerAgent(RegisterAgent agent) { Result s = null; try { - s = platformApiService.registerAgent(agent); + s = platformApiServiceFeign.registerAgentFeign(agent); } catch (Exception e) { log.error("Register agent client {} exception: {}", agent.getDeviceId(), e.getMessage()); } @@ -58,14 +58,14 @@ public class PlatformApiServiceImpl { * @return 返回一个 {@link Result} 对象,包含操作结果的状态和相关信息。 * */ - public Result responseDeploymentResult(@RequestParam("deploymentId") String deploymentId, - @RequestParam("status") Integer status) { + @Override + public Result responseDeploymentResult(String deploymentId, Integer status) { Result s = null; try { - s = platformApiService.responseDeploymentResult(deploymentId, status); + s = platformApiServiceFeign.responseDeploymentResultFeign(deploymentId, status); } catch (Exception e) { - log.error("Register agent client {} exception: {}", deploymentId, e.getMessage()); + log.error("Response deployment {} result exception: {}", deploymentId, e.getMessage()); } return s; diff --git a/src/main/resources/db/agent.mv.db b/src/main/resources/db/agent.mv.db deleted file mode 100644 index 81e605269f5d9f8f01f3fa34999296440fc9efd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHP%WfOV6=lXh6?_0eeu>zK5Ip;n-A3iInId{VBDf0^0RH>?(I%Z1FA58}Kw4mgk zv&mU+G=ye;pH1DTY*H|Z#;{4f?UeWv2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5K;XSV z;3&@fC&d#X_ZKrD#>U2kmODjEF+AD7*7hDZGl> ztx6MB4^iXTLX{`gmeoSpRxyiO#hQh79h>=vV|u#ony%~VyXdIcIzqeHw2ADSp5wp) z^NH@dn(8Z9r?O%wo})OfBU7R%4raD0+tg*A@5-vj9O}x7yo-wEdbM!}-9HIDEFW}B zwc}Q$TdvfKC+Jgr7onYhWg-_##nMrwjI828t%9>(B?< z?RmQ#-N1YpvpEM>&&n5s{~qOXB%+3V=04-X}H2@-D3?RH@q%bVEN2{k&JPTbvS z42^c)4cBrqq9bIFrqx!0P$!U*``=g5i8%|ePe-*s3 zo9<}n_fB7F08>ED*T9qb`NRg!ruO8O4ycs)9hKO|s{2RdS9Pz-0EFgfiPt0Ue!|vr zz{IWxeFt7F58!;*8-k5~|CL@Sy3sLwct0=Mh!#e5gJ_sVW%vwdpJ1uoY{J*kwW{?> z%PQ6%?JYfYm0+i%GT-h%VA1&N8V~M#d^)i`_C{tk4PJXqb>xKE?frY`&dwl;Ht}bk zh%|2&0AN^63w>6#ju1u%mD+LRVXJE$cX=GUk3QLHMm;`iR_hP}&<`pniB6-dUAWrS zvIyeS)uAtldi%TR-p)@X2;C4>)`*u7h0E|sG+I`(7(~l?5A%yb=Lrw@ct5DxC|8~& z+An&$2cw(D6HKED5tWCP7AnI8Q*D&2OZO-G)sPiO@$o(0EFAacRz9V=Oig1yG&UR6<(8^x zYqqS}wnf2L5TbuS!I6B~#KQLsBGFawI*CaT=3UO8V{XdOEe4+Tz?cPoh2D8nCII?|GX6 zoz3HLN5Y-@g%mR3cr~n&OEO}b>-V0sN1Po8toUWY2X-7>tHW`~lieKWzcggaMnIMo zs#7;4%Y?|e^Wpg!tfP&1b9h#q&fcFHlO~)(Gug|HT=#rz58aD`?Efb6kVflu!KVez zKKBrF56y&!K;1(wFNaR55v32Dl(DUwF{LMlY({>r@{DrN3`I$Lrb+mAlpJ8}k=w!I zVfZ7aNu%p<>>2Q29;8zH|Ag%2K`Q<2FL@S|{>!85%w~iwfxw4_z+(QrVl};Ec#3Wt z?lor92~*o~)Jw(^I*V{Y{_lQuK#Scaap((De~4R&4zA%4lK-@u{#z=2E0u|-q)a>` zX5y(VV??t=CZ0Jn@eGrRXSGZ`d1T_L^3G^-ntw|2gXd?Eu(7=7Z3r_+*zmip%wYop<5Z0sG3X6K`&Z;mWE0S*JdY5_hlg92r{djMntCRHpuHdwNKaap$?3IcOU3WH~%OJeF?r-p)W0{RzhEzOL#(GT0}tTOFrEd`jXI> zuF}`8Nnd)N`9~V`C9V)96(!2AT&*kFAAq`ar9Q-!sJZm?O^}POmdo(httLrSvVqqA zXXoEHQX8?Bgs;?)ejh0`c=j)<7qhClLKA986fbK?W|&ARVamk|uClKhTBISx(oA8l zCe2kEJkyUbS7|6HPD%Yp!rNSwBDU#~@DOwv93Q$kkZ4jr28rf7p;YtNNUHgBDAn9} zSX-j`;`HqiSj@lY3HAJ6)7y~$gHC!4iS!B+QU1TIB?by-pdSYLKfI)2{hzCPm&C%@ zWg07sfd&8y;fl`Q_!1}pH^w){H8LTPHFsb=kQoxqu5nXXe##Lk$3itY48}Jx2 zedf7uDH5!clD>n~`)d>uu6@MUZg5TAWLdp - * 该测试类包含多个单元测试,验证与 {@link PlatformApiService} 相关的方法的正确性。 + * 该测试类包含多个单元测试,验证与 {@link PlatformApiFeignClientService} 相关的方法的正确性。 *

* * @author huangxin@cmhi.chinamobile.com @@ -29,17 +37,39 @@ import static org.mockito.Mockito.when; public class PlatformApiServiceImplTest { @Mock - private PlatformApiService platformApiService; + private PlatformApiFeignClientService platformApiServiceFeign; @InjectMocks - private PlatformApiServiceImpl platformApiServiceimpl; + private PlatformApiServiceImpl platformApiService; + + private Logger logger; /** * 在每个测试之前初始化 Mockito 注解。 */ @BeforeEach - public void setUp() { + public void setUp() throws NoSuchFieldException, IllegalAccessException { MockitoAnnotations.openMocks(this); + + logger = mock(Logger.class); + + // 获取 MyService 的 Class 对象 + Class clazz = PlatformApiServiceImpl.class; + // 获取 log 字段 + Field logField = clazz.getDeclaredField("log"); + // 设置字段可访问 + logField.setAccessible(true); + // 获取 Unsafe 实例 + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Unsafe unsafe = (Unsafe) unsafeField.get(null); + // 获取 log 字段的偏移量 + long offset = unsafe.staticFieldOffset(logField); + // 获取 log 字段所属的类对象 + Object base = unsafe.staticFieldBase(logField); + + // 使用 Unsafe 修改 log 字段的值 + unsafe.putObject(base, offset, logger); } /** @@ -53,9 +83,9 @@ public class PlatformApiServiceImplTest { Integer status = 1; Result expectedResponse = Result.success("Deployment updated successfully"); - when(platformApiService.responseDeploymentResult(deploymentId, status)).thenReturn(expectedResponse); + when(platformApiServiceFeign.responseDeploymentResultFeign(deploymentId, status)).thenReturn(expectedResponse); - Result actualResponse = platformApiServiceimpl.responseDeploymentResult(deploymentId, status); + Result actualResponse = platformApiService.responseDeploymentResult(deploymentId, status); assertNotNull(actualResponse); assertEquals(expectedResponse, actualResponse); @@ -69,12 +99,16 @@ public class PlatformApiServiceImplTest { @Test @DisplayName("部署结果响应异常") public void responseDeploymentResult_ExceptionThrown_ReturnsNull() { - String deploymentId = "12345"; - Integer status = 1; + String deploymentId = "12345"; + Integer status = 1; + Exception e = new RuntimeException("Service exception"); - when(platformApiService.responseDeploymentResult(deploymentId, status)).thenThrow(new RuntimeException("Service exception")); + when(platformApiServiceFeign.responseDeploymentResultFeign(deploymentId, status)).thenThrow(e); - assertThrows(RuntimeException.class, () -> platformApiService.responseDeploymentResult(deploymentId, status)); + Result ret = platformApiService.responseDeploymentResult(deploymentId, status); + + assertNull(ret); + verify(logger).error(eq("Response deployment {} result exception: {}"), eq("12345"), eq(e.getMessage())); } /** @@ -86,7 +120,7 @@ public class PlatformApiServiceImplTest { public void registerAgent_SuccessfulRegistration_ReturnsSuccessResult() { RegisterAgent agent = new RegisterAgent("1234567890"); Result expected = Result.success("Registration successful"); - when(platformApiService.registerAgent(agent)).thenReturn(expected); + when(platformApiServiceFeign.registerAgentFeign(agent)).thenReturn(expected); Result actual = platformApiService.registerAgent(agent); @@ -102,8 +136,12 @@ public class PlatformApiServiceImplTest { @DisplayName("注册代理异常") public void registerAgent_ExceptionThrown_ReturnsNull() { RegisterAgent agent = new RegisterAgent("1234567890"); - when(platformApiService.registerAgent(agent)).thenThrow(new RuntimeException("Registration failedxxxx")); + Exception e = new RuntimeException("Registration failedxxxx"); + when(platformApiServiceFeign.registerAgentFeign(agent)).thenThrow(e); - assertThrows(RuntimeException.class, () -> platformApiService.registerAgent(agent)); + Result ret = platformApiService.registerAgent(agent); + + assertNull(ret); + verify(logger).error(eq("Register agent client {} exception: {}"), eq("1234567890"), eq(e.getMessage())); } } From 639bb2976221a6d6f18f699ff37abf37a75ccdfc Mon Sep 17 00:00:00 2001 From: HuangXin Date: Mon, 10 Mar 2025 14:07:40 +0800 Subject: [PATCH 08/14] =?UTF-8?q?OCT=20REM:=201.=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A3=80=E6=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java b/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java index cf1c731..c01d97b 100644 --- a/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java +++ b/src/test/java/com/cmcc/magent/service/impl/PlatformApiServiceImplTest.java @@ -3,7 +3,6 @@ package com.cmcc.magent.service.impl; import com.cmcc.hy.gzs.common.result.Result; import com.cmcc.magent.pojo.po.RegisterAgent; import com.cmcc.magent.service.PlatformApiFeignClientService; -import com.cmcc.magent.service.PlatformApiService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 4c4136b36933aa8b91a7f0121be970e25136c045 Mon Sep 17 00:00:00 2001 From: xuesijing Date: Mon, 10 Mar 2025 15:56:44 +0800 Subject: [PATCH 09/14] OCT:add .crt and .key --- src/main/resources/application.properties | 14 ++- src/main/resources/certs/_.komect.com.crt | 119 ++++++++++++++++++++++ src/main/resources/certs/_.komect.com.key | 28 +++++ src/main/resources/certs/keystore.p12 | Bin 0 -> 7184 bytes 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/certs/_.komect.com.crt create mode 100644 src/main/resources/certs/_.komect.com.key create mode 100644 src/main/resources/certs/keystore.p12 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5f4317b..40daea1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,11 +5,17 @@ server.compression.enabled=true server.compression.mime-types=application/json server.compression.min-response-size=1KB -#server.port=8443 -server.ssl.key-store=classpath:mydomain.jks + +# 配置服务器端口为 HTTPS 默认端口 443 +#server.port=443 +# 配置密钥库类型为 PKCS12 +server.ssl.key-store-type=PKCS12 +# 配置密钥库文件路径,相对于 classpath +server.ssl.key-store=classpath:certs/keystore.p12 +# 配置密钥库密码 server.ssl.key-store-password=101010 -server.ssl.key-password=101010 -server.ssl.key-alias=mydomain +# 配置密钥别名 +server.ssl.key-alias=tomcat server.undertow.buffer-size=1024 diff --git a/src/main/resources/certs/_.komect.com.crt b/src/main/resources/certs/_.komect.com.crt new file mode 100644 index 0000000..e9a6e87 --- /dev/null +++ b/src/main/resources/certs/_.komect.com.crt @@ -0,0 +1,119 @@ +-----BEGIN CERTIFICATE----- +MIIG/zCCBeegAwIBAgIIUPS1tguj0LAwDQYJKoZIhvcNAQELBQAwgbQxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRow +GAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UECxMkaHR0cDovL2NlcnRz +LmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQDEypHbyBEYWRkeSBTZWN1 +cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwHhcNMjMwNjA4MDc0ODQ5WhcN +MjQwNzA5MDc0ODQ5WjCBgTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCea1meaxn+ec +gTESMBAGA1UEBwwJ5p2t5bee5biCMTMwMQYDVQQKDCrkuK3np7vvvIjmna3lt57v +vInkv6Hmga/mioDmnK/mnInpmZDlhazlj7gxFTATBgNVBAMMDCoua29tZWN0LmNv +bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALgQ3fh8pvHAn7NCkZxJ +q1VygM8DWR7qCZS55bMqaqceFdrly+bB+80WKfddXncD1pUKQ77SNsEZyC1DT+Ei +mOro8GITVl/iuZc6QtDM/ZeXnKDSrvxGL7j5EvOUYYAG1WEvZLzNptImWFoAZFF7 +h9+HmyZGWiEsCaDrunGNCJpwtborMkH8om6usa3SNaAdM9eKVzrX6yEc+AN3FcoY +/HQxz9rV7b3E4xjVoAkJRyuzihb0ITyYabFYuLI6u4UIlOEhf0SCr7W4KCKepuwS +Lg2MzVRiiuIRgZUqIzI8Oi5ta51mDYoaPxCz1bHiNCKvXqKdAMj6EePFtEkYgw2k +5lMCAwEAAaOCA0QwggNAMAwGA1UdEwEB/wQCMAAwKQYDVR0lBCIwIAYIKwYBBQUH +AwEGCCsGAQUFBwMCBgpghkgBhvhNAQIDMA4GA1UdDwEB/wQEAwIFoDA2BgNVHR8E +LzAtMCugKaAnhiVodHRwOi8vY3JsLmdvZGFkZHkuY29tL2dkaWcyczItMzQuY3Js +MF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwIwOTA3BggrBgEFBQcCARYraHR0cDov +L2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwBAgIw +dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2RhZGR5 +LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j +b20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMwojPX ++2yz8LQsgM4wIwYDVR0RBBwwGoIMKi5rb21lY3QuY29tggprb21lY3QuY29tMB0G +A1UdDgQWBBQFlcp3bINcQRB28YU7+JkTZNny0jCCAX8GCisGAQQB1nkCBAIEggFv +BIIBawFpAHYA7s3QZNXbGs7FXLedtM0TojKHRny87N7DUUhZRnEftZsAAAGImfrM +PQAABAMARzBFAiEAwa+pHvLsodr6zaIJHpuep/5KHQtFWdq5xjPxkRYimQACICag +BJw5onUWGDUuw4VDmO1baenKnAG+KdDcDHBdnySIAHYASLDja9qmRzQP5WoC+p0w +6xxSActW3SyB2bu/qznYhHMAAAGImfrNEQAABAMARzBFAiEAv+fe4tG+BSqZ3yeT +NbBDVtfvEMqxrTmAffGO+qT8Zr8CIAIjfZVueI2UAZdrShrRlzZZLK2Npd/t0i6o +4BIaw1o5AHcA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGImfrN +dAAABAMASDBGAiEA73dx8CnNv0WGtgByp+Uz3dLspndGI3hu1NOvMtjCCxMCIQD7 +BoJJe9knyxpvEOPY+O5ybWj/0HIirHxwJu+qpwp6ZzANBgkqhkiG9w0BAQsFAAOC +AQEABTskU6npLQQx5MUhAhoxH+nu+nz42E3A1vqljjHSey25QLtYKZG+7Zy4g9rZ +Lu09+/byhUL4VSYXaVbuxkwCu2DRnDH34C31Ons3JN5biE/kAqaXA0e+84sUGoot +UtDTe11F1bWwPO3/WYXICGO+GaukUwI4EZP69n6aROMS4+bXiYDqVqbcjq2v9yoq +JoOAkQOSg9fEYkz/oO/xqkTEK1uNjWErWiDW3vuWaXfya2lyRQYasfuryKSNBzhJ +W9tqNooO7Y1kbVSRrZ44kWyBWn0bVQGKzmHeckFP7rkYQi/g34UorHvMUUcJkaLE +p3lPKExQ4l0G4+CNqI2ZawgBrg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3 +MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UE +CxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQD +EypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYuswZLiBCGzD +BNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz6ojcnqOv +K/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am+GZHY23e +cSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1gO7GyQ5HY +pDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQWOlDxSq7n +eTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB0lL7AgMB +AAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqFBxBnKLbv +9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v +b2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5n +b2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEG +CCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv +MA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyIBslQj6Zz +91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwlTxFWMMS2 +RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKocyQetawi +DsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1KrKQ0U11 +GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkKrqeKM+2x +LXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEfTCCA2WgAwIBAgIDG+cVMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVT +MSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIEluYy4xMTAvBgNVBAsTKEdv +IERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMTAx +MDcwMDAwWhcNMzEwNTMwMDcwMDAwWjCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHku +Y29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1 +dGhvcml0eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3Fi +CPH6WTT3G8kYo/eASVjpIoMTpsUgQwE7hPHmhUmfJ+r2hBtOoLTbcJjHMgGxBT4H +Tu70+k8vWTAi56sZVmvigAf88xZ1gDlRe+X5NbZ0TqmNghPktj+pA4P6or6KFWp/ +3gvDthkUBcrqw6gElDtGfDIN8wBmIsiNaW02jBEYt9OyHGC0OPoCjM7T3UYH3go+ +6118yHz7sCtTpJJiaVElBWEaRIGMLKlDliPfrDqBmg4pxRyp6V0etp6eMAo5zvGI +gPtLXcwy7IViQyU0AlYnAZG0O3AqP26x6JyIAX2f1PnbU21gnb8s51iruF9G/M7E +GwM8CetJMVxpRrPgRwIDAQABo4IBFzCCARMwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9BUFuIMGU2g/eMB8GA1Ud +IwQYMBaAFNLEsNKR1EwRcbNhyz2h/t2oatTjMDQGCCsGAQUFBwEBBCgwJjAkBggr +BgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDIGA1UdHwQrMCkwJ6Al +oCOGIWh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LmNybDBGBgNVHSAEPzA9 +MDsGBFUdIAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2RhZGR5LmNv +bS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAWQtTvZKGEacke+1bMc8d +H2xwxbhuvk679r6XUOEwf7ooXGKUwuN+M/f7QnaF25UcjCJYdQkMiGVnOQoWCcWg +OJekxSOTP7QYpgEGRJHjp2kntFolfzq3Ms3dhP8qOCkzpN1nsoX+oYggHFCJyNwq +9kIDN0zmiN/VryTyscPfzLXs4Jlet0lUIDyUGAzHHFIYSaRt4bNYC8nY7NmuHDKO +KHAN4v6mF56ED71XcLNa6R+ghlO773z/aQvgSMO3kwvIClTErF0UZzdsyqUvMQg3 +qm5vjLyb4lddJIGvl5echK1srDdMZvNhkREg5L4wn3qkKQmw4TRfZHcYQFHfjDCm +rw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- diff --git a/src/main/resources/certs/_.komect.com.key b/src/main/resources/certs/_.komect.com.key new file mode 100644 index 0000000..b7f2434 --- /dev/null +++ b/src/main/resources/certs/_.komect.com.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4EN34fKbxwJ+z +QpGcSatVcoDPA1ke6gmUueWzKmqnHhXa5cvmwfvNFin3XV53A9aVCkO+0jbBGcgt +Q0/hIpjq6PBiE1Zf4rmXOkLQzP2Xl5yg0q78Ri+4+RLzlGGABtVhL2S8zabSJlha +AGRRe4ffh5smRlohLAmg67pxjQiacLW6KzJB/KJurrGt0jWgHTPXilc61+shHPgD +dxXKGPx0Mc/a1e29xOMY1aAJCUcrs4oW9CE8mGmxWLiyOruFCJThIX9Egq+1uCgi +nqbsEi4NjM1UYoriEYGVKiMyPDoubWudZg2KGj8Qs9Wx4jQir16inQDI+hHjxbRJ +GIMNpOZTAgMBAAECggEBAJtIl4r/1nOTdudrXJ6GRAYlQGfkwjXjacvP/Onm+e0c +44E1Zoy50G1XqnXmjkBHu6sm6ro8bDcCQi91Xxlm760WcV28RJ1GEB5151Jx7esK +2/eNZlSr/azGbGeUIaE5oqCHtCvYL0mRUe4z8G4RkjJRG+Hxbi4YEdNxq2wKeFyZ +EqZXBPfw259tY5lIZn3lE+3IuDJw9LDOVT/xq/ZFHgULbPYEBOj8tp/BbF6JOrjl +CPOkjdRIM8ompztlxBce3biVXVFP22dH9D5221Cj3sYc79LkONOjaKWklsGCjbNO +UCcZJZ70hZpdJCUBN2CMJcolBH+xT5B+kPnyj2pRQlECgYEA9UlbXTmGAyEacJVp +FfwVEIVjIJOxm5XZ7uI0/06MURviMDfVsOdXrswF6GcoJo1VT88Cmz1zn1/olPEW +Zardwch/8TXbA5+hUXEUN68h9mfZucliewZePX5uPN5+WiaClZ5WQjUTpjR1IFGk +Y3wn55B15ZKZyw7EPtulnpcvYokCgYEAwBr6espToQ57rU4Vh92T/pSuhumPZJIm +yVVhf+iEQT9Y9BSfM9reYxhwVZQVTdryQaFz0yQ1XIxG2tn6edfpnjUy+NAgsrdT +WAgzDKru0l7ht3/sr5By6yWRbyUYcPBV6FSAbiFKrV467YovVtcCfQdVNNUt8e7t +/ufQS8zqevsCgYEAkAnc2hjOhoXo9dX3WM6oPARoWpgAgyHzUWGKx6YDphmesLwJ +A5JGnkH28iupm0IBqBUjLbBfdmamuNf+VAOLp6Eq6KW8kBssaxvhSHXSltUTORN2 +flIWAzx8Vcg+IIhexKevdb+fY0mIwkrPIxCkikn9wateHqz0Nwla749OZykCgYAc +O9rUcSgZY6eJsRA5B7fYksGT0n/gqBpLPOE3i1Tkwgqw1NcRJ/nHVrAr47e92ZAB +VVlQjuHI2FURlTfa8IDFX8w+BVjI62i0Z4AZPIYdJRTHg2Wl5/T72mmljC4rayc1 +HjZB+WKgWFkQ0F5kxPT4qzs6qJo4FIWmESvr+BH+QQKBgGJ+ZT90jsERQfMzv6aL +OW8huYImT0NvRKqIG0K14amm1ku0G+rL8HMy0JIJUs0x5BqwacUEBHffQkAPQOIh +/6XBAsiZD10QlomuDMl1sOQSKacIOFlH8KFPM0RdgCRQk5oiYmdh2CeavkjkE9Cp +HpC22rgeJoxV9fq5Zd2diWJh +-----END PRIVATE KEY----- diff --git a/src/main/resources/certs/keystore.p12 b/src/main/resources/certs/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..65d4b2fdb2c035dd9d127f4c18b101f760e3ff1a GIT binary patch literal 7184 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 literal 0 HcmV?d00001 From e840c0eb6fbdcc7f3fad902fae2135afc3c7425e Mon Sep 17 00:00:00 2001 From: xuesijing Date: Wed, 12 Mar 2025 10:29:24 +0800 Subject: [PATCH 10/14] =?UTF-8?q?OCT:=E6=B7=BB=E5=8A=A0server.ssl=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f9ce5c3..ad469c0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,15 +6,9 @@ server.compression.mime-types=application/json server.compression.min-response-size=1KB -# 配置服务器端口为 HTTPS 默认端口 443 -#server.port=443 -# 配置密钥库类型为 PKCS12 server.ssl.key-store-type=PKCS12 -# 配置密钥库文件路径,相对于 classpath server.ssl.key-store=classpath:certs/keystore.p12 -# 配置密钥库密码 server.ssl.key-store-password=101010 -# 配置密钥别名 server.ssl.key-alias=tomcat From fac6ed9f2454392f0c6e7e4b0cde7030c1ebb43a Mon Sep 17 00:00:00 2001 From: xuesijing Date: Wed, 12 Mar 2025 10:46:08 +0800 Subject: [PATCH 11/14] =?UTF-8?q?OCT:=E6=B7=BB=E5=8A=A0https=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mydomain.jks | Bin 2748 -> 0 bytes .../com/cmcc/magent/misc/HttpUtilsTest.java | 16 ---------------- 2 files changed, 16 deletions(-) delete mode 100644 src/main/resources/mydomain.jks diff --git a/src/main/resources/mydomain.jks b/src/main/resources/mydomain.jks deleted file mode 100644 index 03df2a7c6819568aa35c8cec99cc2b3601d71e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 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 Date: Wed, 12 Mar 2025 20:06:54 +0800 Subject: [PATCH 12/14] =?UTF-8?q?OCT=20REM:=201.=20=E4=BF=AE=E6=AD=A3api-d?= =?UTF-8?q?ocs=E5=9C=A8HTTPS=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98=202.=20URL=20=E9=93=BE=E6=8E=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=B8=BA=20HTTPS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ src/main/java/com/cmcc/magent/config/CommonConfigure.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2764994..f46354b 100644 --- a/pom.xml +++ b/pom.xml @@ -255,6 +255,11 @@ org.springdoc springdoc-openapi-starter-webmvc-ui
+ + org.jetbrains.kotlin + kotlin-reflect + 2.1.20-RC2 + org.mapstruct mapstruct diff --git a/src/main/java/com/cmcc/magent/config/CommonConfigure.java b/src/main/java/com/cmcc/magent/config/CommonConfigure.java index aeb2b3c..2297fff 100644 --- a/src/main/java/com/cmcc/magent/config/CommonConfigure.java +++ b/src/main/java/com/cmcc/magent/config/CommonConfigure.java @@ -190,7 +190,7 @@ public class CommonConfigure { log.error("Unable get local ip address: {}", e.getMessage()); } finally { setGlobalVars(serverProperties.getServlet().getContextPath(), - "http://" + addr + ":" + serverProperties.getPort() + serverProperties.getServlet().getContextPath(), + "https://" + addr + ":" + serverProperties.getPort() + serverProperties.getServlet().getContextPath(), addr, serverProperties.getPort()); log.info("baseUrl: {}", BASEURL); From ccea5be970aa0ffea615ce8039a1ebb579be7e83 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Fri, 14 Mar 2025 16:42:42 +0800 Subject: [PATCH 13/14] =?UTF-8?q?OCT=20REM:=201.=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E5=8C=85=E3=80=81=E5=90=AF=E5=8A=A8=E3=80=81=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E6=9C=8D=E5=8A=A1=E9=85=8D=E7=BD=AE=202.=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E4=B8=AD=E9=97=B4=E4=BB=B6=E5=90=8D=E7=A7=B0=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assembly.xml | 65 +++++++++++++++++++ bin/start.sh | 8 +++ bin/stop.sh | 15 +++++ pom.xml | 20 ++++++ .../pojo/dto/DeployMiddlewareFileReq.java | 1 - .../pojo/dto/DeploymentMiddlewareReq.java | 1 - 6 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 assembly.xml create mode 100644 bin/start.sh create mode 100644 bin/stop.sh diff --git a/assembly.xml b/assembly.xml new file mode 100644 index 0000000..1d0abf3 --- /dev/null +++ b/assembly.xml @@ -0,0 +1,65 @@ + + ${project.version} + + tgz + + + + ./target/ + + MiddlewareAgent.jar + + ${file.separator} + + + ./config + ${file.separator}config + + + ./bin + ${file.separator}bin + + + ../ + ${file.separator} + + ../CHANGELOG.md + ../README.md + + + + src/main/resources/ + + **/* + * + + + **/git.properties + **/smart-doc.json + **/db/** + + ${file.separator} + + + + + false + true + lib + provided + + + false + true + lib + system + + + false + true + lib + runtime + + + \ No newline at end of file diff --git a/bin/start.sh b/bin/start.sh new file mode 100644 index 0000000..00956cf --- /dev/null +++ b/bin/start.sh @@ -0,0 +1,8 @@ +#!/bin/bash +JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n " +JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false " +JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -server -Xms512M -Xmx512M -Xss256K -XX:MetaspaceSize=16M -XX:MaxMetaspaceSize=128M -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=8 -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof" +WORK_PATH=$(cd `dirname $0`; pwd) +cd $WORK_PATH +cd .. +$JAVA_HOME/bin/java $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $JAVA_OPTS -jar MiddlewareAgent.jar & \ No newline at end of file diff --git a/bin/stop.sh b/bin/stop.sh new file mode 100644 index 0000000..2386c20 --- /dev/null +++ b/bin/stop.sh @@ -0,0 +1,15 @@ +#!/bin/bash +APP_NAME=CommonFramework-exec + +pids=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'` +for pid in $pids +do + echo stop $APP_NAME java process: $pid + kill -9 $pid +done + +nr_pids=`ps -ef | grep $APP_NAME | grep -v grep | wc -l` +while [ $nr_pids -gt 0 ] +do + nr_pids=`ps -ef | grep $APP_NAME | grep -v grep | wc -l` +done \ No newline at end of file diff --git a/pom.xml b/pom.xml index f46354b..b96b68a 100644 --- a/pom.xml +++ b/pom.xml @@ -331,6 +331,7 @@ + MiddlewareAgent @@ -382,6 +383,25 @@ + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + assembly.xml + + + + + make-assembly + package + + single + + + + org.jacoco jacoco-maven-plugin diff --git a/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java b/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java index 0652fec..4a397fe 100644 --- a/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java +++ b/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java @@ -34,7 +34,6 @@ public class DeployMiddlewareFileReq { * 中间件类型,不能为空,并且必须是指定的固定值之一(Redis, Nginx, Keepalived)。 */ @NotBlank(message = "middleware Not Blank", groups = {ValidGroups.MiddlewareDeploymentReqValid.class}) - @ValidFixValues(value = {"Redis", "Nginx", "Keepalived"}, ignoreSwitchCase = true, groups = {ValidGroups.MiddlewareDeploymentReqValid.class}) private String middleware; /** diff --git a/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java b/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java index 67d45c0..4d2fc7e 100644 --- a/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java +++ b/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java @@ -34,7 +34,6 @@ public class DeploymentMiddlewareReq { * 中间件类型,不能为空,并且必须是指定的固定值之一(Redis, Nginx, Keepalived)。 */ @NotBlank(message = "middleware Not Blank", groups = {ValidGroups.MiddlewareDeploymentReqValid.class}) - @ValidFixValues(value = {"Redis", "Nginx", "Keepalived"}, ignoreSwitchCase = true, groups = {ValidGroups.MiddlewareDeploymentReqValid.class}) private String middleware; /** From d750edc2d04d516833c0b954a3816691d6f267d5 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Fri, 14 Mar 2025 16:43:13 +0800 Subject: [PATCH 14/14] =?UTF-8?q?OCT=20REM:=201.=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A3=80=E6=B5=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java | 1 - .../java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java b/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java index 4a397fe..f49e2da 100644 --- a/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java +++ b/src/main/java/com/cmcc/magent/pojo/dto/DeployMiddlewareFileReq.java @@ -2,7 +2,6 @@ package com.cmcc.magent.pojo.dto; import com.cmcc.magent.pojo.po.RemoteFileDetails; import com.cmcc.magent.validation.group.ValidGroups; -import com.cmcc.magent.validation.valids.ValidFixValues; import com.fasterxml.jackson.annotation.JsonInclude; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; diff --git a/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java b/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java index 4d2fc7e..d200e1a 100644 --- a/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java +++ b/src/main/java/com/cmcc/magent/pojo/dto/DeploymentMiddlewareReq.java @@ -2,7 +2,6 @@ package com.cmcc.magent.pojo.dto; import com.cmcc.magent.pojo.po.RemoteFileDetails; import com.cmcc.magent.validation.group.ValidGroups; -import com.cmcc.magent.validation.valids.ValidFixValues; import com.fasterxml.jackson.annotation.JsonInclude; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty;