org.javatuples
javatuples
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/Nacos.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/Nacos.java
index 61a6f81a..72bc9c4e 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/Nacos.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/Nacos.java
@@ -16,17 +16,30 @@
package com.alibaba.nacos;
+import com.alibaba.nacos.sys.filter.NacosTypeExcludeFilter;
import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.FilterType;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* Nacos starter.
+ *
+ * Use @SpringBootApplication and @ComponentScan at the same time, using CUSTOM type filter to control module enabled.
+ *
*
* @author nacos
*/
-@SpringBootApplication(scanBasePackages = "com.alibaba.nacos")
+@SpringBootApplication
+@ComponentScan(basePackages = "com.alibaba.nacos", excludeFilters = {
+ @Filter(type = FilterType.CUSTOM, classes = {NacosTypeExcludeFilter.class}),
+ @Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}),
+ @Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})
@ServletComponentScan
@EnableScheduling
public class Nacos {
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleConfig.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleConfig.java
index 2afdaaef..160a4b47 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleConfig.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleConfig.java
@@ -19,6 +19,7 @@ package com.alibaba.nacos.console.config;
import com.alibaba.nacos.console.filter.XssFilter;
import com.alibaba.nacos.core.code.ControllerMethodsCache;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
@@ -42,10 +43,13 @@ import java.time.ZoneId;
@EnableScheduling
@PropertySource("/application.properties")
public class ConsoleConfig {
-
+
@Autowired
private ControllerMethodsCache methodsCache;
-
+
+ @Value("${nacos.console.ui.enabled:true}")
+ private boolean consoleUiEnabled;
+
/**
* Init.
*/
@@ -56,7 +60,7 @@ public class ConsoleConfig {
methodsCache.initClassMethod("com.alibaba.nacos.config.server.controller");
methodsCache.initClassMethod("com.alibaba.nacos.console.controller");
}
-
+
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
@@ -69,14 +73,18 @@ public class ConsoleConfig {
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
-
+
@Bean
public XssFilter xssFilter() {
return new XssFilter();
}
-
+
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(ZoneId.systemDefault().toString());
}
+
+ public boolean isConsoleUiEnabled() {
+ return consoleUiEnabled;
+ }
}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleModuleStateBuilder.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleModuleStateBuilder.java
new file mode 100644
index 00000000..bc036ad0
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/config/ConsoleModuleStateBuilder.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 1999-2023 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.nacos.console.config;
+
+import com.alibaba.nacos.sys.module.ModuleState;
+import com.alibaba.nacos.sys.module.ModuleStateBuilder;
+import com.alibaba.nacos.sys.utils.ApplicationUtils;
+
+/**
+ * Console module state builder.
+ *
+ * @author xiweng.yy
+ */
+public class ConsoleModuleStateBuilder implements ModuleStateBuilder {
+
+ public static final String CONSOLE_MODULE = "console";
+
+ private static final String CONSOLE_UI_ENABLED = "console_ui_enabled";
+
+ @Override
+ public ModuleState build() {
+ ModuleState result = new ModuleState(CONSOLE_MODULE);
+ try {
+ ConsoleConfig consoleConfig = ApplicationUtils.getBean(ConsoleConfig.class);
+ result.newState(CONSOLE_UI_ENABLED, consoleConfig.isConsoleUiEnabled());
+ } catch (Exception ignored) {
+ }
+ return result;
+ }
+}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
index f5b0e981..70988587 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
@@ -16,11 +16,10 @@
package com.alibaba.nacos.console.controller;
-import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
-import com.alibaba.nacos.naming.controllers.OperatorController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.alibaba.nacos.console.paramcheck.ConsoleDefaultHttpParamExtractor;
+import com.alibaba.nacos.core.cluster.health.ModuleHealthCheckerHolder;
+import com.alibaba.nacos.core.cluster.health.ReadinessResult;
+import com.alibaba.nacos.core.paramcheck.ExtractorManager;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
@@ -36,20 +35,9 @@ import javax.servlet.http.HttpServletRequest;
*/
@RestController("consoleHealth")
@RequestMapping("/v1/console/health")
+@ExtractorManager.Extractor(httpExtractor = ConsoleDefaultHttpParamExtractor.class)
public class HealthController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class);
-
- private final ConfigInfoPersistService configInfoPersistService;
-
- private final OperatorController apiCommands;
-
- @Autowired
- public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) {
- this.configInfoPersistService = configInfoPersistService;
- this.apiCommands = apiCommands;
- }
-
+
/**
* Whether the Nacos is in broken states or not, and cannot recover except by being restarted.
*
@@ -60,7 +48,7 @@ public class HealthController {
public ResponseEntity liveness() {
return ResponseEntity.ok().body("OK");
}
-
+
/**
* Ready to receive the request or not.
*
@@ -69,42 +57,11 @@ public class HealthController {
*/
@GetMapping("/readiness")
public ResponseEntity readiness(HttpServletRequest request) {
- boolean isConfigReadiness = isConfigReadiness();
- boolean isNamingReadiness = isNamingReadiness(request);
-
- if (isConfigReadiness && isNamingReadiness) {
+ ReadinessResult result = ModuleHealthCheckerHolder.getInstance().checkReadiness();
+ if (result.isSuccess()) {
return ResponseEntity.ok().body("OK");
}
-
- if (!isConfigReadiness && !isNamingReadiness) {
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config and Naming are not in readiness");
- }
-
- if (!isConfigReadiness) {
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Config is not in readiness");
- }
-
- return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Naming is not in readiness");
- }
-
- private boolean isConfigReadiness() {
- // check db
- try {
- configInfoPersistService.configInfoCount("");
- return true;
- } catch (Exception e) {
- LOGGER.error("Config health check fail.", e);
- }
- return false;
- }
-
- private boolean isNamingReadiness(HttpServletRequest request) {
- try {
- apiCommands.metrics(request);
- return true;
- } catch (Exception e) {
- LOGGER.error("Naming health check fail.", e);
- }
- return false;
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result.getResultMessage());
}
+
}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
index ffe1e31d..fe358c08 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
@@ -21,10 +21,11 @@ import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.model.RestResultUtils;
import com.alibaba.nacos.common.utils.StringUtils;
-import com.alibaba.nacos.config.server.service.repository.CommonPersistService;
-import com.alibaba.nacos.console.model.Namespace;
-import com.alibaba.nacos.console.model.NamespaceAllInfo;
-import com.alibaba.nacos.console.service.NamespaceOperationService;
+import com.alibaba.nacos.console.paramcheck.ConsoleDefaultHttpParamExtractor;
+import com.alibaba.nacos.core.namespace.repository.NamespacePersistService;
+import com.alibaba.nacos.core.namespace.model.Namespace;
+import com.alibaba.nacos.core.paramcheck.ExtractorManager;
+import com.alibaba.nacos.core.service.NamespaceOperationService;
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
import org.springframework.beans.factory.annotation.Autowired;
@@ -47,18 +48,21 @@ import java.util.regex.Pattern;
*/
@RestController
@RequestMapping("/v1/console/namespaces")
+@ExtractorManager.Extractor(httpExtractor = ConsoleDefaultHttpParamExtractor.class)
public class NamespaceController {
-
+
@Autowired
- private CommonPersistService commonPersistService;
-
+ private NamespacePersistService namespacePersistService;
+
@Autowired
private NamespaceOperationService namespaceOperationService;
-
+
private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
-
+
+ private final Pattern namespaceNameCheckPattern = Pattern.compile("^[^@#$%^&*]+$");
+
private static final int NAMESPACE_ID_MAX_LENGTH = 128;
-
+
/**
* Get namespace list.
*
@@ -68,7 +72,7 @@ public class NamespaceController {
public RestResult> getNamespaces() {
return RestResultUtils.success(namespaceOperationService.getNamespaceList());
}
-
+
/**
* get namespace all info by namespace id.
*
@@ -76,10 +80,10 @@ public class NamespaceController {
* @return namespace all info
*/
@GetMapping(params = "show=all")
- public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException {
+ public Namespace getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException {
return namespaceOperationService.getNamespace(namespaceId);
}
-
+
/**
* create namespace.
*
@@ -90,8 +94,8 @@ public class NamespaceController {
@PostMapping
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId,
- @RequestParam("namespaceName") String namespaceName,
- @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
+ @RequestParam("namespaceName") String namespaceName,
+ @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
if (StringUtils.isBlank(namespaceId)) {
namespaceId = UUID.randomUUID().toString();
} else {
@@ -102,6 +106,14 @@ public class NamespaceController {
if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
return false;
}
+ // check unique
+ if (namespacePersistService.tenantInfoCountByTenantId(namespaceId) > 0) {
+ return false;
+ }
+ }
+ // contains illegal chars
+ if (!namespaceNameCheckPattern.matcher(namespaceName).matches()) {
+ return false;
}
try {
return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc);
@@ -109,7 +121,7 @@ public class NamespaceController {
return false;
}
}
-
+
/**
* check namespaceId exist.
*
@@ -121,9 +133,9 @@ public class NamespaceController {
if (StringUtils.isBlank(namespaceId)) {
return false;
}
- return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0);
+ return (namespacePersistService.tenantInfoCountByTenantId(namespaceId) > 0);
}
-
+
/**
* edit namespace.
*
@@ -135,11 +147,15 @@ public class NamespaceController {
@PutMapping
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
public Boolean editNamespace(@RequestParam("namespace") String namespace,
- @RequestParam("namespaceShowName") String namespaceShowName,
- @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
+ @RequestParam("namespaceShowName") String namespaceShowName,
+ @RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
+ // contains illegal chars
+ if (!namespaceNameCheckPattern.matcher(namespaceShowName).matches()) {
+ return false;
+ }
return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc);
}
-
+
/**
* del namespace by id.
*
@@ -151,5 +167,5 @@ public class NamespaceController {
public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
return namespaceOperationService.removeNamespace(namespaceId);
}
-
+
}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java
index aa5ead4b..4c6cf055 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/ServerStateController.java
@@ -16,16 +16,28 @@
package com.alibaba.nacos.console.controller;
-import com.alibaba.nacos.common.utils.VersionUtils;
+import com.alibaba.nacos.common.model.RestResult;
+import com.alibaba.nacos.common.model.RestResultUtils;
+import com.alibaba.nacos.console.paramcheck.ConsoleDefaultHttpParamExtractor;
+import com.alibaba.nacos.core.paramcheck.ExtractorManager;
import com.alibaba.nacos.sys.env.EnvUtil;
+import com.alibaba.nacos.sys.module.ModuleState;
+import com.alibaba.nacos.sys.module.ModuleStateHolder;
+import com.alibaba.nacos.sys.utils.DiskUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
+import static com.alibaba.nacos.common.utils.StringUtils.FOLDER_SEPARATOR;
+import static com.alibaba.nacos.common.utils.StringUtils.TOP_PATH;
+import static com.alibaba.nacos.common.utils.StringUtils.WINDOWS_FOLDER_SEPARATOR;
+
/**
* Server state controller.
*
@@ -33,8 +45,13 @@ import java.util.Map;
*/
@RestController
@RequestMapping("/v1/console/server")
+@ExtractorManager.Extractor(httpExtractor = ConsoleDefaultHttpParamExtractor.class)
public class ServerStateController {
-
+
+ private static final String ANNOUNCEMENT_FILE = "announcement.conf";
+
+ private static final String GUIDE_FILE = "console-guide.conf";
+
/**
* Get server state of current server.
*
@@ -43,13 +60,34 @@ public class ServerStateController {
@GetMapping("/state")
public ResponseEntity