| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 org.apache.streampark.console.core.service.impl; |
| |
| import org.apache.streampark.console.core.bean.DockerConfig; |
| import org.apache.streampark.console.core.bean.MavenConfig; |
| import org.apache.streampark.console.core.bean.ResponseResult; |
| import org.apache.streampark.console.core.bean.SenderEmail; |
| import org.apache.streampark.console.core.entity.Setting; |
| import org.apache.streampark.console.core.mapper.SettingMapper; |
| import org.apache.streampark.console.core.service.SettingService; |
| |
| import org.apache.commons.lang3.StringUtils; |
| |
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| import com.github.dockerjava.api.DockerClient; |
| import com.github.dockerjava.api.model.AuthConfig; |
| import com.github.dockerjava.api.model.AuthResponse; |
| import com.github.dockerjava.core.DefaultDockerClientConfig; |
| import com.github.dockerjava.core.DockerClientConfig; |
| import com.github.dockerjava.core.DockerClientImpl; |
| import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; |
| import com.github.dockerjava.transport.DockerHttpClient; |
| import lombok.extern.slf4j.Slf4j; |
| import org.springframework.stereotype.Service; |
| import org.springframework.transaction.annotation.Propagation; |
| import org.springframework.transaction.annotation.Transactional; |
| |
| import javax.annotation.PostConstruct; |
| import javax.mail.MessagingException; |
| import javax.mail.Session; |
| import javax.mail.Transport; |
| |
| import java.util.List; |
| import java.util.Optional; |
| import java.util.Properties; |
| |
| @Slf4j |
| @Service |
| @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) |
| public class SettingServiceImpl extends ServiceImpl<SettingMapper, Setting> |
| implements SettingService { |
| |
| private final Setting emptySetting = new Setting(); |
| |
| @PostConstruct |
| public void loadSettings() { |
| list().forEach(x -> SETTINGS.put(x.getSettingKey(), x)); |
| } |
| |
| @Override |
| public Setting get(String key) { |
| LambdaQueryWrapper<Setting> queryWrapper = |
| new LambdaQueryWrapper<Setting>().eq(Setting::getSettingKey, key); |
| return this.getOne(queryWrapper); |
| } |
| |
| @Override |
| public boolean update(Setting setting) { |
| try { |
| String value = StringUtils.trimToNull(setting.getSettingValue()); |
| setting.setSettingValue(value); |
| |
| Setting entity = new Setting(); |
| entity.setSettingValue(setting.getSettingValue()); |
| LambdaQueryWrapper<Setting> queryWrapper = |
| new LambdaQueryWrapper<Setting>().eq(Setting::getSettingKey, setting.getSettingKey()); |
| this.update(entity, queryWrapper); |
| |
| getMavenConfig().updateConfig(); |
| |
| Optional<Setting> optional = Optional.ofNullable(SETTINGS.get(setting.getSettingKey())); |
| optional.ifPresent(x -> x.setSettingValue(value)); |
| return true; |
| } catch (Exception e) { |
| return false; |
| } |
| } |
| |
| @Override |
| public MavenConfig getMavenConfig() { |
| return MavenConfig.fromSetting(); |
| } |
| |
| @Override |
| public DockerConfig getDockerConfig() { |
| return DockerConfig.fromSetting(); |
| } |
| |
| @Override |
| public String getStreamParkAddress() { |
| return SETTINGS |
| .getOrDefault(SettingService.KEY_STREAMPARK_ADDRESS, emptySetting) |
| .getSettingValue(); |
| } |
| |
| @Override |
| public String getIngressModeDefault() { |
| return SETTINGS |
| .getOrDefault(SettingService.KEY_INGRESS_MODE_DEFAULT, emptySetting) |
| .getSettingValue(); |
| } |
| |
| @Override |
| public ResponseResult checkDocker(DockerConfig dockerConfig) { |
| DockerClientConfig config = |
| DefaultDockerClientConfig.createDefaultConfigBuilder() |
| .withRegistryUrl(dockerConfig.getAddress()) |
| .build(); |
| |
| DockerHttpClient httpClient = |
| new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).build(); |
| |
| ResponseResult result = new ResponseResult(); |
| |
| try (DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient)) { |
| AuthConfig authConfig = |
| new AuthConfig() |
| .withUsername(dockerConfig.getUsername()) |
| .withPassword(dockerConfig.getPassword()) |
| .withRegistryAddress(dockerConfig.getAddress()); |
| AuthResponse response = dockerClient.authCmd().withAuthConfig(authConfig).exec(); |
| if (response.getStatus().equals("Login Succeeded")) { |
| result.setStatus(200); |
| } else { |
| result.setStatus(500); |
| result.setMsg("docker login failed, status: " + response.getStatus()); |
| } |
| } catch (Exception e) { |
| if (e.getMessage().contains("LastErrorException")) { |
| result.setStatus(400); |
| } else if (e.getMessage().contains("Status 401")) { |
| result.setStatus(500); |
| result.setMsg( |
| "Failed to validate Docker registry, unauthorized: incorrect username or password "); |
| } else { |
| result.setStatus(500); |
| result.setMsg("Failed to validate Docker registry, error: " + e.getMessage()); |
| } |
| } |
| return result; |
| } |
| |
| @Override |
| public boolean updateDocker(DockerConfig dockerConfig) { |
| List<Setting> settings = DockerConfig.toSettings(dockerConfig); |
| for (Setting each : settings) { |
| if (!update(each)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| @Override |
| public SenderEmail getSenderEmail() { |
| try { |
| String host = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_HOST).getSettingValue(); |
| String port = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_PORT).getSettingValue(); |
| String from = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_FROM).getSettingValue(); |
| String userName = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_USERNAME).getSettingValue(); |
| String password = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_PASSWORD).getSettingValue(); |
| String ssl = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_SSL).getSettingValue(); |
| |
| SenderEmail senderEmail = new SenderEmail(); |
| senderEmail.setHost(host); |
| if (StringUtils.isNotBlank(port)) { |
| senderEmail.setPort(Integer.parseInt(port)); |
| } |
| senderEmail.setFrom(from); |
| senderEmail.setUserName(userName); |
| senderEmail.setPassword(password); |
| if (StringUtils.isNotBlank(ssl)) { |
| senderEmail.setSsl(Boolean.parseBoolean(ssl)); |
| } |
| return senderEmail; |
| } catch (Exception e) { |
| log.warn("Fault Alert Email is not set."); |
| } |
| return null; |
| } |
| |
| @Override |
| public ResponseResult checkEmail(SenderEmail senderEmail) { |
| ResponseResult result = new ResponseResult(); |
| Properties props = new Properties(); |
| props.put("mail.smtp.auth", "true"); |
| if (senderEmail.isSsl()) { |
| props.put("mail.smtp.starttls.enable", "true"); |
| } |
| props.put("mail.smtp.host", senderEmail.getHost()); |
| props.put("mail.smtp.port", senderEmail.getPort()); |
| |
| Session session = Session.getInstance(props); |
| try { |
| Transport transport = session.getTransport("smtp"); |
| transport.connect( |
| senderEmail.getHost(), senderEmail.getUserName(), senderEmail.getPassword()); |
| transport.close(); |
| result.setStatus(200); |
| } catch (MessagingException e) { |
| result.setStatus(500); |
| result.setMsg("connect to target mail server failed: " + e.getMessage()); |
| } |
| return result; |
| } |
| |
| @Override |
| public boolean updateEmail(SenderEmail senderEmail) { |
| List<Setting> settings = SenderEmail.toSettings(senderEmail); |
| for (Setting each : settings) { |
| if (!update(each)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| } |