in hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/MonitorServiceImpl.java [242:412]
public void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgumentException {
// The request monitoring parameter matches the monitoring parameter definition mapping check
Monitor monitor = monitorDto.getMonitor();
monitor.setHost(monitor.getHost().trim());
monitor.setName(monitor.getName().trim());
Map<String, Param> paramMap = monitorDto.getParams()
.stream()
.peek(param -> {
param.setMonitorId(monitor.getId());
String value = param.getParamValue() == null ? null : param.getParamValue().trim();
param.setParamValue(value);
})
.collect(Collectors.toMap(Param::getField, param -> param));
// Check name uniqueness and can not equal app type
if (isModify != null) {
Optional<Job> defineOptional = appService.getAppDefineOption(monitor.getName());
if (defineOptional.isPresent()) {
throw new IllegalArgumentException("Monitoring name cannot be the existed monitoring type name!");
}
Optional<Monitor> monitorOptional = monitorDao.findMonitorByNameEquals(monitor.getName());
if (monitorOptional.isPresent()) {
Monitor existMonitor = monitorOptional.get();
if (isModify) {
if (!existMonitor.getId().equals(monitor.getId())) {
throw new IllegalArgumentException("Monitoring name already exists!");
}
} else {
throw new IllegalArgumentException("Monitoring name already exists!");
}
}
}
// the dispatch collector must exist if pin
if (StringUtils.hasText(monitorDto.getCollector())) {
Optional<Collector> optionalCollector = collectorDao.findCollectorByName(monitorDto.getCollector());
if (optionalCollector.isEmpty()) {
throw new IllegalArgumentException("The pinned collector does not exist.");
}
} else {
monitorDto.setCollector(null);
}
// Parameter definition structure verification
List<ParamDefine> paramDefines = appService.getAppParamDefines(monitorDto.getMonitor().getApp());
if (!CollectionUtils.isEmpty(paramDefines)) {
for (ParamDefine paramDefine : paramDefines) {
String field = paramDefine.getField();
Param param = paramMap.get(field);
if (paramDefine.isRequired() && (param == null || param.getParamValue() == null)) {
throw new IllegalArgumentException("Params field " + field + " is required.");
}
if (param != null && StringUtils.hasText(param.getParamValue())) {
switch (paramDefine.getType()) {
case "number":
double doubleValue;
try {
doubleValue = Double.parseDouble(param.getParamValue());
} catch (Exception e) {
throw new IllegalArgumentException("Params field " + field + " type "
+ paramDefine.getType() + " is invalid.");
}
if (paramDefine.getRange() != null) {
if (!IntervalExpressionUtil.validNumberIntervalExpress(doubleValue,
paramDefine.getRange())) {
throw new IllegalArgumentException("Params field " + field + " type "
+ paramDefine.getType() + " over range " + paramDefine.getRange());
}
}
param.setType(CommonConstants.PARAM_TYPE_NUMBER);
break;
case "textarea":
Short textareaLimit = paramDefine.getLimit();
if (textareaLimit != null && param.getParamValue().length() > textareaLimit) {
throw new IllegalArgumentException("Params field " + field + " type "
+ paramDefine.getType() + " over limit " + param.getParamValue());
}
break;
case "text":
Short textLimit = paramDefine.getLimit();
if (textLimit != null && param.getParamValue().length() > textLimit) {
throw new IllegalArgumentException("Params field " + field + " type "
+ paramDefine.getType() + " over limit " + textLimit);
}
break;
case "host":
String hostValue = param.getParamValue();
if (hostValue.toLowerCase().contains(NetworkConstants.HTTP_HEADER)) {
hostValue = hostValue.replaceAll(PATTERN_HTTP, SignConstants.BLANK);
}
if (hostValue.toLowerCase().contains(NetworkConstants.HTTPS_HEADER)) {
hostValue = hostValue.replace(PATTERN_HTTPS, SignConstants.BLANK);
}
if (!IpDomainUtil.validateIpDomain(hostValue)) {
throw new IllegalArgumentException("Params field " + field + " value "
+ hostValue + " is invalid host value.");
}
break;
case "password":
// The plaintext password needs to be encrypted for transmission and storage
String passwordValue = param.getParamValue();
if (!AesUtil.isCiphertext(passwordValue)) {
passwordValue = AesUtil.aesEncode(passwordValue);
param.setParamValue(passwordValue);
}
param.setType(CommonConstants.PARAM_TYPE_PASSWORD);
break;
case "boolean":
// boolean check
String booleanValue = param.getParamValue();
if (!"true".equalsIgnoreCase(booleanValue) && !"false".equalsIgnoreCase(booleanValue)) {
throw new IllegalArgumentException("Params field " + field + " value "
+ booleanValue + " is invalid boolean value.");
}
break;
case "radio":
// radio single value check
List<ParamDefine.Option> options = paramDefine.getOptions();
boolean invalid = true;
if (options != null) {
for (ParamDefine.Option option : options) {
if (param.getParamValue().equalsIgnoreCase(option.getValue())) {
invalid = false;
break;
}
}
}
if (invalid) {
throw new IllegalArgumentException("Params field " + field + " value "
+ param.getParamValue() + " is invalid option value");
}
break;
case "checkbox":
List<ParamDefine.Option> checkboxOptions = paramDefine.getOptions();
boolean checkboxInvalid = true;
if (checkboxOptions != null) {
for (ParamDefine.Option option : checkboxOptions) {
if (param.getParamValue().equalsIgnoreCase(option.getValue())) {
checkboxInvalid = false;
break;
}
}
}
if (checkboxInvalid) {
throw new IllegalArgumentException("Params field " + field + " value "
+ param.getParamValue() + " is invalid checkbox value");
}
break;
case "metrics-field":
case "key-value":
if (JsonUtil.fromJson(param.getParamValue(), new TypeReference<>() {
}) == null) {
throw new IllegalArgumentException("Params field " + field + " value "
+ param.getParamValue() + " is invalid key-value value");
}
break;
case "array":
String[] arrays = param.getParamValue().split(",");
if (arrays.length == 0) {
throw new IllegalArgumentException("Param field" + field + " value "
+ param.getParamValue() + " is invalid arrays value");
}
if (param.getParamValue().startsWith("[") && param.getParamValue().endsWith("]")) {
param.setParamValue(param.getParamValue().substring(1, param.getParamValue().length() - 1));
}
break;
// todo More parameter definitions and actual value format verification
default:
throw new IllegalArgumentException("ParamDefine type " + paramDefine.getType() + " is invalid.");
}
}
}
}
}