Kaynağa Gözat

新增 dagent 启动时注册到 dmaster 功能

reghao 5 yıl önce
ebeveyn
işleme
a20c403fee
28 değiştirilmiş dosya ile 266 ekleme ve 122 silme
  1. 2 1
      common/src/main/java/cn/reghao/autodop/common/mq/MsgType.java
  2. 15 0
      common/src/main/java/cn/reghao/autodop/common/utils/HostAddress.java
  3. 33 20
      common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java
  4. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/mq/RabbitConfig.java
  5. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/service/MachineStatusScheduler.java
  6. 25 9
      dagent/src/main/java/cn/reghao/autodop/dagent/utils/AfterAppStart.java
  7. 5 5
      dagent/src/main/resources/application-dev.yml
  8. 3 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java
  9. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  10. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/config/WebSecurityConfig.java
  11. 20 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/IndexController.java
  12. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserController.java
  13. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/GrantedAuthorityImpl.java
  14. 6 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Role.java
  15. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/JwtTokenFilter.java
  16. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordAuthProvider.java
  17. 13 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordException.java
  18. 59 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/UserService.java
  19. 15 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/vo/UserAuthVO.java
  20. 14 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/mq/MessageDispatcher.java
  21. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/mq/RabbitConfig.java
  22. 8 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/AfterAppStart.java
  23. 0 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/node/SysStatService.java
  24. 6 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/node/controller/NodeController.java
  25. 12 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/node/service/NodeService.java
  26. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/SysController.java
  27. 12 5
      scripts/build-and-deploy.sh
  28. 1 1
      scripts/deploy.sh

+ 2 - 1
common/src/main/java/cn/reghao/autodop/common/mq/MsgType.java

@@ -7,7 +7,8 @@ package cn.reghao.autodop.common.mq;
  * @date 2019-10-18 14:31:29
  */
 public enum MsgType {
-    deploy("Deploy"), log("Log"), status("Status");
+    deploy("Deploy"), log("Log"), status("Status"),
+    dagentStart("Plain"), dagentHeartbeat("DagentHeartbeat");
 
     private String value;
 

+ 15 - 0
common/src/main/java/cn/reghao/autodop/common/utils/HostAddress.java

@@ -0,0 +1,15 @@
+package cn.reghao.autodop.common.utils;
+
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2020-10-14 15:25:53
+ */
+@Data
+public class HostAddress {
+    private String iface;
+    private String mac;
+    private String ipv4;
+    private String ipv6;
+}

+ 33 - 20
common/src/main/java/cn/reghao/autodop/common/utils/NetworkUtil.java

@@ -1,6 +1,5 @@
 package cn.reghao.autodop.common.utils;
 
-import lombok.AllArgsConstructor;
 import lombok.Data;
 
 import java.net.*;
@@ -13,37 +12,51 @@ import java.util.List;
  * @date 2020-03-11 09:12:36
  */
 public class NetworkUtil {
-    /**
-     * 获取本机物理网卡 IPv4 地址(不获取 loopback 和虚拟接口的地址)
-     *
-     * @date 2019-10-23 下午9:27
-     */
-    public static List<IPAddress> ipv4() throws SocketException {
-        List<IPAddress> addresses = new ArrayList<>();
-
+    public static List<HostAddress> hostAddr() throws SocketException {
+        List<HostAddress> list = new ArrayList<>();
         Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+        // 遍历主机的网络接口
         while (interfaces.hasMoreElements()) {
             NetworkInterface iface = interfaces.nextElement();
+            String name = iface.getName();
+            // 过滤掉 localhost 和虚拟网卡
+            if (name.startsWith("lo") || name.startsWith("docker") || name.startsWith("v")) {
+                continue;
+            }
+
+            HostAddress hostAddress = new HostAddress();
+            hostAddress.setIface(name);
+            hostAddress.setMac(macAddr(iface.getHardwareAddress()));
+
             Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();
             while (inetAddrs.hasMoreElements()) {
                 InetAddress address = inetAddrs.nextElement();
-                if (address instanceof Inet4Address && !address.isLoopbackAddress()) {
-                    String iface1 = iface.getName();
-                    String addr = address.getHostAddress();
-                    if (!iface1.startsWith("docker") && !iface1.startsWith("v")) {
-                        addresses.add(new IPAddress(iface1, addr));
+                if (!address.isLoopbackAddress()) {
+                    if (address instanceof Inet4Address) {
+                        hostAddress.setIpv4(address.getHostAddress());
+                    } else if (address instanceof Inet6Address) {
+                        hostAddress.setIpv6(address.getHostAddress());
                     }
                 }
             }
+            list.add(hostAddress);
         }
 
-        return addresses;
+        return list;
     }
 
-    @Data
-    @AllArgsConstructor
-    static public class IPAddress {
-        private String iface;
-        private String address;
+    /**
+     * 返回 52-54-00-bf-ab-2d 格式的 MAC 地址
+     *
+     * @param
+     * @return
+     * @date 2020-10-14 下午1:53
+     */
+    private static String macAddr(byte[] addr) {
+        String[] hexadecimal = new String[addr.length];
+        for (int i = 0; i < addr.length; i++) {
+            hexadecimal[i] = String.format("%02x", addr[i]);
+        }
+        return String.join("-", hexadecimal);
     }
 }

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/mq/RabbitConfig.java

@@ -24,7 +24,7 @@ public class RabbitConfig {
 
     @Bean
     public Queue dagentQueue() throws SocketException {
-        String address = NetworkUtil.ipv4().get(0).getAddress();
+        String address = NetworkUtil.hostAddr().get(0).getIpv4();
         String queueName = "dagent.rpc@" + address;
         return new Queue(queueName, true);
     }

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/service/MachineStatusScheduler.java

@@ -50,7 +50,7 @@ public class MachineStatusScheduler {
         List<NetConnStat> connStats = net.netstat();
 
         SysStat sysStat = new SysStat();
-        sysStat.setHost(NetworkUtil.ipv4().get(0).getAddress());
+        sysStat.setHost(NetworkUtil.hostAddr().get(0).getIpv4());
         sysStat.setCpu(cpuUsage);
         sysStat.setMem(memUsage);
         sysStat.setProcessStats(processes);

+ 25 - 9
dagent/src/main/java/cn/reghao/autodop/dagent/utils/AfterAppStart.java

@@ -1,12 +1,18 @@
 package cn.reghao.autodop.dagent.utils;
 
-import cn.reghao.autodop.common.http.HttpApi;
+import cn.reghao.autodop.common.mq.MessageSender;
+import cn.reghao.autodop.common.mq.MqMessage;
+import cn.reghao.autodop.common.mq.MsgType;
+import cn.reghao.autodop.common.utils.HostAddress;
+import cn.reghao.autodop.common.utils.NetworkUtil;
 import cn.reghao.autodop.dagent.config.DmasterProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * Spring Boot 应用启动完成后执行,此时所有的 bean 都已初始化
  *
@@ -17,29 +23,39 @@ import org.springframework.stereotype.Component;
 @Component
 public class AfterAppStart implements ApplicationRunner {
     private DmasterProperties properties;
+    private MessageSender sender;
 
-    public AfterAppStart(DmasterProperties properties) {
+    public AfterAppStart(DmasterProperties properties, MessageSender sender) {
         this.properties = properties;
+        this.sender = sender;
     }
 
     @Override
-    public void run(ApplicationArguments args) {
+    public void run(ApplicationArguments args) throws Exception {
         activate();
     }
 
     /**
-     * TODO 启动后注册到 autodop-dmaster
-     *
      * @param
      * @return
      * @date 2019-09-26 下午5:23
      */
-    private void activate() {
-        registerToMaster();
+    private void activate() throws Exception {
+        notifyDmaster();
         log.info("dagent 应用已启动...");
     }
 
-    private void registerToMaster() {
-        String url = HttpApi.url(properties.getAddress(), properties.getPort(), properties.getApi());
+    private void notifyDmaster() throws Exception {
+        List<HostAddress> list = NetworkUtil.hostAddr();
+        if (list.isEmpty()) {
+            throw new Exception("");
+        }
+
+        String routeKey = "dmaster@" + properties.getAddress();
+        MqMessage<HostAddress> mqMessage = new MqMessage<>();
+        mqMessage.setMsgType(MsgType.dagentStart.name());
+        mqMessage.setMsg(list.get(0));
+        mqMessage.setSendTime(System.currentTimeMillis());
+        sender.send(routeKey, mqMessage);
     }
 }

+ 5 - 5
dagent/src/main/resources/application-dev.yml

@@ -1,13 +1,13 @@
 dmaster:
-  address: localhost
+  address: 192.168.0.222
   port: 4000
-  api: /api/machine/status
+  api: /api/node/start
 spring:
   rabbitmq:
-    host: mq.reghao.cn
+    host: mq.srv.iquizoo.com
     port: 5672
-    username: reghao
-    password: gL2dOiWYqXiKKsv5LOt9
+    username: iquizoo-mq1
+    password: z2pT1PXR
     virtual-host: /
 #    host: localhost
 #    port: 5672

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/BuildService.java

@@ -57,11 +57,13 @@ public class BuildService {
         List<BuildDeployResult> list = new ArrayList<>();
         for (AppOrchestration app : apps.getContent()) {
             BuildLog buildLog = buildLogRepository.findFirstByIsDeleteFalseAndAppIdOrderByCreateTimeDesc(app.getAppId());
-            if (buildLog != null) {
+            if (buildLog != null && buildLog.getStatusCode() == 0) {
                 // 若 app 构建成功,则找出其部署日志
                 List<DeployLog> deployLogs = deployLogRepository.findByIsDeleteFalseAndBuildLog(buildLog);
                 if (!deployLogs.isEmpty()) {
                     list.add(BuildDeployResult.fromDeployLogs(deployLogs));
+                } else {
+                    list.add(new BuildDeployResult(app.getAppId()));
                 }
             } else {
                 list.add(new BuildDeployResult(app.getAppId()));

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java

@@ -149,6 +149,7 @@ public class AppIntegrate {
             buildLog.setUpdateTotalTime(System.currentTimeMillis() - start);
             log.info("{} 更新完成...", app.getAppId());
         } catch (Exception e) {
+            // TODO codeup IP 白名单异常
             buildException(buildLog, e);
             return buildLog;
         }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/config/WebSecurityConfig.java

@@ -39,7 +39,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .expressionHandler(webExpressionHandler())
                 .antMatchers("/**").permitAll()
                 // TODO 放行所有接口(测试时使用)
-                //.antMatchers("/api/**").permitAll()
+                //.antMatchers("/api/node/**").permitAll()
                 .antMatchers("/logout").permitAll()
                 .antMatchers("/actuator/health").permitAll()
                 .anyRequest().authenticated();

+ 20 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/IndexController.java

@@ -7,6 +7,7 @@ import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.entity.UserAuth;
 import cn.reghao.autodop.dmaster.auth.repository.PermissionRepository;
 import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.auth.vo.UserAuthVO;
 import cn.reghao.autodop.dmaster.common.utils.UserContext;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -36,8 +37,26 @@ public class IndexController {
         this.permissionRepository = permissionRepository;
     }
 
-    @GetMapping("/user/info")
+    @GetMapping("/api/user/info")
     public ResponseEntity<String> userInfo() {
+        UserAuth auth = UserContext.currentUser();
+        UserAuthVO vo = UserAuthVO.from(auth);
+
+        UserResultData userResultData = new UserResultData();
+        userResultData.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
+        userResultData.setIntroduction("I am a super administrator");
+        userResultData.setName(vo.getUsername());
+        userResultData.setRoles(vo.getRoles());
+
+        UserResult userResult = new UserResult();
+        userResult.setCode(20000);
+        userResult.setData(userResultData);
+
+        return ResponseEntity.ok().body(JsonUtil.objectToJson(userResult));
+    }
+
+    @GetMapping("/user/info")
+    public ResponseEntity<String> userInfo1() {
         UserResultData userResultData = new UserResultData();
         userResultData.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
         userResultData.setIntroduction("I am a super administrator");

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserController.java

@@ -43,7 +43,7 @@ public class UserController {
 
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     @PutMapping("/{type}")
-    public ResponseEntity<String> modify(@PathVariable("type") int type, @RequestBody String json) {
+    public ResponseEntity<String> modify(@PathVariable("type") int type, @RequestBody String json) throws Exception {
         userService.addOrUpdate(type, json);
         return ResponseEntity.ok().body(WebResult.success("ok"));
     }

+ 2 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/GrantedAuthorityImpl.java

@@ -4,7 +4,7 @@ import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.SpringSecurityCoreVersion;
 import org.springframework.util.Assert;
 
-import javax.persistence.Embeddable;
+import javax.persistence.*;
 
 /**
  * SimpleGrantedAuthority 的重写
@@ -16,10 +16,9 @@ import javax.persistence.Embeddable;
 public class GrantedAuthorityImpl implements GrantedAuthority {
     private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
 
-    private final String role;
+    private String role;
 
     public GrantedAuthorityImpl() {
-        this.role = "";
     }
 
     public GrantedAuthorityImpl(String role) {

+ 6 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Role.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.auth.entity;
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -11,6 +12,7 @@ import javax.persistence.Entity;
  * @author reghao
  * @date 2019/03/14 21:46:13
  */
+@NoArgsConstructor
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Entity
@@ -18,4 +20,8 @@ public class Role extends BaseEntity {
     @Column(nullable = false, unique = true)
     private String name;
     private String description;
+
+    public Role(String name) {
+        this.name = name;
+    }
 }

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/JwtTokenFilter.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.auth.jwt;
 
 import cn.reghao.autodop.dmaster.auth.entity.GrantedAuthorityImpl;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.entity.UserAuth;
 import cn.reghao.autodop.dmaster.common.utils.UserContext;
 import org.springframework.security.core.Authentication;

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordAuthProvider.java

@@ -4,7 +4,6 @@ import cn.reghao.autodop.common.utils.security.Cryptor;
 import cn.reghao.autodop.common.utils.security.Md5Cryptor;
 import cn.reghao.autodop.dmaster.auth.entity.UserAuth;
 import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
@@ -35,9 +34,10 @@ public class UsernamePasswordAuthProvider implements AuthenticationProvider {
         // TODO 缓存中查找
         // 从数据库中获取用户认证信息
         UserAuth userAuth = (UserAuth) userDetailsService.loadUserByUsername(username);
-        String encodedPassword = cryptor.encrypt(password + userAuth.getSalt());
-        if (!userAuth.getPassword().equals(encodedPassword)) {
-            throw new DisabledException("用户名/密码错误");
+        String encryptedPwd = cryptor.encrypt(password + userAuth.getSalt());
+        if (!userAuth.getPassword().equals(encryptedPwd)) {
+            // TODO 禁用 DaoAuthenticationProvider,当前 provider 认证失败后即返回给前端
+            throw new UsernamePasswordException("用户名/密码错误");
         }
 
         return new UsernamePasswordAuthenticationToken(userAuth, password, userAuth.getAuthorities());

+ 13 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/jwt/UsernamePasswordException.java

@@ -0,0 +1,13 @@
+package cn.reghao.autodop.dmaster.auth.jwt;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * @author reghao
+ * @date 2020-10-09 22:26:09
+ */
+public class UsernamePasswordException extends AuthenticationException {
+    public UsernamePasswordException(String msg) {
+        super(msg);
+    }
+}

+ 59 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/UserService.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.common.utils.security.Cryptor;
 import cn.reghao.autodop.common.utils.security.Md5Cryptor;
 import cn.reghao.autodop.common.utils.security.Salt;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
+import cn.reghao.autodop.dmaster.auth.entity.GrantedAuthorityImpl;
 import cn.reghao.autodop.dmaster.auth.entity.Permission;
 import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.entity.UserAuth;
@@ -18,6 +19,8 @@ import org.springframework.stereotype.Service;
 
 import java.security.NoSuchAlgorithmException;
 import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -40,7 +43,7 @@ public class UserService {
         this.permissionRepository = permissionRepository;
     }
 
-    public void addOrUpdate(int type, String json) {
+    public void addOrUpdate(int type, String json) throws Exception {
         switch (type) {
             case 1:
                 Role role = (Role) JsonUtil.jsonToObject(json, Role.class);
@@ -76,7 +79,19 @@ public class UserService {
                 break;
             case 3:
                 UserAuthVO vo = (UserAuthVO) JsonUtil.jsonToObject(json, UserAuthVO.class);
-                UserAuth userAuth = vo.to();
+                UserAuth userAuth = UserAuthVO.to(vo);
+                Set<GrantedAuthorityImpl> authorities = userAuth.authorities();
+                Set<GrantedAuthorityImpl> authoritiesEntity = new HashSet<>();
+                for (GrantedAuthorityImpl authority : authorities) {
+                    String roleName = authority.getAuthority();
+                    Role entity = roleRepository.findRoleByName(roleName);
+                    if (entity == null) {
+                        throw new Exception(roleName + " 不存在...");
+                    }
+                    authoritiesEntity.add(new GrantedAuthorityImpl(entity.getName()));
+                }
+                userAuth.setAuthorities(authoritiesEntity);
+
                 UserAuth authEntity = userAuthRepository.findUserAuthByUsername(userAuth.getUsername());
                 if (authEntity == null) {
                     String password = userAuth.getPassword();
@@ -84,19 +99,21 @@ public class UserService {
                     String encryptedPwd = cryptor.encrypt(password + salt);
                     userAuth.setPassword(encryptedPwd);
                     userAuth.setSalt(salt);
-                    userAuthRepository.save(userAuth);
                 } else {
+                    // 修改密码
                     if (!authEntity.getPassword().equals(userAuth.getPassword())) {
                         String password = userAuth.getPassword();
                         String salt = Salt.get(64);
                         String encryptedPwd = cryptor.encrypt(password + salt);
-                        authEntity.setPassword(encryptedPwd);
-                        authEntity.setSalt(salt);
+                        userAuth.setPassword(encryptedPwd);
+                        userAuth.setSalt(salt);
+
+                        userAuth.setCreateTime(authEntity.getCreateTime());
+                        userAuth.setUpdateTime(LocalDateTime.now());
                     }
-                    authEntity.setAuthorities(userAuth.authorities());
-                    authEntity.setUpdateTime(LocalDateTime.now());
-                    userAuthRepository.save(authEntity);
                 }
+                userAuth.setIsDelete(false);
+                userAuthRepository.save(userAuth);
                 break;
             default:
                 break;
@@ -114,7 +131,7 @@ public class UserService {
                 rolePageList.setList(rolePage.getContent().stream()
                         .peek(role -> {
                             String name = role.getName().split(rolePrefix)[1];
-                            role.setName(name);
+                            role.setName(name.toLowerCase());
                         })
                         .collect(Collectors.toList()));
 
@@ -128,7 +145,7 @@ public class UserService {
                         .peek(permission -> {
                             Role role = permission.getRole();
                             String name = role.getName().split(rolePrefix)[1];
-                            role.setName(name);
+                            role.setName(name.toLowerCase());
                         }).collect(Collectors.toList()));
                 return permissionPageList;
             case 3:
@@ -137,7 +154,7 @@ public class UserService {
                 userAuthVOPageList.setTotalSize(userAuthPage.getTotalElements());
                 userAuthVOPageList.setTotalPages(userAuthPage.getTotalPages());
                 userAuthVOPageList.setList(userAuthPage.getContent().stream()
-                        .map(UserAuthVO::new)
+                        .map(UserAuthVO::from)
                         .collect(Collectors.toList()));
                 return userAuthVOPageList;
             default:
@@ -160,4 +177,35 @@ public class UserService {
                 break;
         }
     }
+
+    public void checkOrSetAdmin() {
+        String roleName = rolePrefix + "ADMIN";
+        Role roleEntity = roleRepository.findRoleByName(roleName);
+        if (roleEntity == null) {
+            Role role = new Role(roleName);
+            role.setDescription("管理员");
+            role.setIsDelete(false);
+            roleEntity = roleRepository.save(role);
+        }
+
+        String adminName = "admin";
+        UserAuth authEntity = userAuthRepository.findUserAuthByUsername(adminName);
+        if (authEntity == null) {
+            UserAuth userAuth = new UserAuth();
+            userAuth.setUsername("admin");
+            userAuth.setPassword("admin123456");
+            Set<GrantedAuthorityImpl> authorities = new HashSet<>();
+            authorities.add(new GrantedAuthorityImpl(roleEntity.getName()));
+            userAuth.setAuthorities(authorities);
+
+            String password = userAuth.getPassword();
+            String salt = Salt.get(64);
+            String encryptedPwd = cryptor.encrypt(password + salt);
+            userAuth.setPassword(encryptedPwd);
+            userAuth.setSalt(salt);
+
+            userAuth.setIsDelete(false);
+            userAuthRepository.save(userAuth);
+        }
+    }
 }

+ 15 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/vo/UserAuthVO.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.auth.vo;
 
 import cn.reghao.autodop.dmaster.auth.entity.GrantedAuthorityImpl;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.entity.UserAuth;
 import lombok.Data;
 import org.springframework.security.core.GrantedAuthority;
@@ -18,19 +19,24 @@ public class UserAuthVO {
     private String password;
     private List<String> roles;
 
-    public UserAuthVO(UserAuth userAuth) {
-        this.username = userAuth.getUsername();
-        this.password = userAuth.getPassword();
-        this.roles = userAuth.getAuthorities().stream()
+    public static UserAuthVO from(UserAuth userAuth) {
+        UserAuthVO vo = new UserAuthVO();
+        vo.setUsername(userAuth.getUsername());
+        vo.setPassword(userAuth.getPassword());
+        vo.setRoles(userAuth.getAuthorities().stream()
                 .map(GrantedAuthority::getAuthority)
-                .map(role -> role.split("ROLE_")[1])
-                .collect(Collectors.toList());
+                .map(role -> role.replace("ROLE_", ""))
+                .map(String::toLowerCase)
+                .collect(Collectors.toList()));
+        return vo;
     }
 
-    public UserAuth to() {
+    public static UserAuth to(UserAuthVO userAuthVO) {
         UserAuth userAuth = new UserAuth();
-        userAuth.setUsername(this.getUsername());
-        userAuth.setAuthorities(this.getRoles().stream()
+        userAuth.setUsername(userAuthVO.getUsername());
+        userAuth.setPassword(userAuthVO.getPassword());
+        userAuth.setAuthorities(userAuthVO.getRoles().stream()
+                .map(String::toUpperCase)
                 .map(role -> "ROLE_" + role)
                 .map(GrantedAuthorityImpl::new)
                 .collect(Collectors.toSet()));

+ 14 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/mq/MessageDispatcher.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.common.mq;
 
+import cn.reghao.autodop.common.mq.MsgType;
 import cn.reghao.autodop.common.utils.JsonUtil;
 import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
@@ -20,9 +21,20 @@ public class MessageDispatcher implements MessageListener {
         JsonObject jsonObject = JsonUtil.jsonObject(body);
         String msgType = jsonObject.get("msgType").getAsString();
         try {
-            log.info("{}", body);
+            switch (MsgType.valueOf(msgType)) {
+                case dagentStart:
+                    handleMsgFromDagent(body);
+                    break;
+                case dagentHeartbeat:
+                    break;
+                default:
+            }
         } catch (Exception e) {
-            //e.printStackTrace();
+            log.error(e.getMessage());
         }
     }
+
+    private void handleMsgFromDagent(String msg) {
+        log.info("dagent 启动时发送的消息 -> {}", msg);
+    }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/mq/RabbitConfig.java

@@ -17,7 +17,7 @@ import java.net.SocketException;
 public class RabbitConfig {
     @Bean
     public Queue dagentQueue() throws SocketException {
-        String address = NetworkUtil.ipv4().get(0).getAddress();
+        String address = NetworkUtil.hostAddr().get(0).getIpv4();
         String queueName = "dmaster@" + address;
         return new Queue(queueName, true);
     }

+ 8 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/AfterAppStart.java

@@ -8,6 +8,7 @@ import cn.reghao.autodop.dmaster.app.entity.LocalDir;
 import cn.reghao.autodop.dmaster.app.entity.build.AppCompile;
 import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.LocalDirRepository;
+import cn.reghao.autodop.dmaster.auth.service.UserService;
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.ApplicationArguments;
@@ -34,16 +35,20 @@ import java.util.stream.Collectors;
 public class AfterAppStart implements ApplicationRunner {
     private LocalDirRepository localDirRepository;
     private AppCompileRepository compileRepository;
+    private UserService userService;
 
-    public AfterAppStart(LocalDirRepository localDirRepository, AppCompileRepository compileRepository) {
+    public AfterAppStart(LocalDirRepository localDirRepository,
+                         AppCompileRepository compileRepository,
+                         UserService userService) {
         this.localDirRepository = localDirRepository;
         this.compileRepository = compileRepository;
+        this.userService = userService;
     }
 
     @Override
     public void run(ApplicationArguments args) {
         try {
-            String hostId = NetworkUtil.ipv4().get(0).getAddress();
+            String hostId = NetworkUtil.hostAddr().get(0).getIpv4();
             LocalDir localDir = localDirRepository.findByHostId(hostId);
             if (localDir == null) {
                 String home = System.getProperty("user.home");
@@ -70,6 +75,7 @@ public class AfterAppStart implements ApplicationRunner {
         SysConfig.compileDir = localDir.getCompileDir();
         SysConfig.packDir = localDir.getPackDir();
         checkAndSetLocalDir();
+        userService.checkOrSetAdmin();
         //checkCompilerVersion();
     }
 

+ 0 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/node/SysStatService.java

@@ -1,26 +0,0 @@
-package cn.reghao.autodop.dmaster.node;
-
-import cn.reghao.autodop.common.machine.pojo.SysStat;
-import cn.reghao.autodop.common.utils.JsonUtil;
-import org.springframework.stereotype.Service;
-
-import java.util.Queue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:48:04
- */
-@Service
-public class SysStatService {
-    private Queue<SysStat> queue = new LinkedBlockingQueue<>();
-
-    public void extract(String json) {
-        SysStat sysStat = (SysStat) JsonUtil.jsonToObject(json, SysStat.class);
-        queue.add(sysStat);
-    }
-
-    public SysStat get() {
-        return queue.poll();
-    }
-}

+ 6 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/node/MachineController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/node/controller/NodeController.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.node;
+package cn.reghao.autodop.dmaster.node.controller;
 
 import cn.reghao.autodop.common.result.WebResult;
 import io.swagger.annotations.Api;
@@ -9,26 +9,19 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2019-11-15 08:44:50
  */
-@Api(tags = "机节点接口")
+@Api(tags = "机节点接口")
 @RestController
 @RequestMapping("/api/node")
-public class MachineController {
-    private SysStatService sysStatService;
-
-    public MachineController(SysStatService sysStatService) {
-        this.sysStatService = sysStatService;
-    }
-
+public class NodeController {
     @ApiOperation(value = "")
-    @PostMapping("/status")
+    @PostMapping("/start")
     public String add(@RequestBody String json) {
-        sysStatService.extract(json);
-        return "ok";
+        return WebResult.success("ok");
     }
 
     @ApiOperation(value = "")
     @GetMapping("/status")
     public String get() {
-        return WebResult.success(sysStatService.get());
+        return WebResult.success("ok");
     }
 }

+ 12 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/node/service/NodeService.java

@@ -0,0 +1,12 @@
+package cn.reghao.autodop.dmaster.node.service;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2019-11-15 08:48:04
+ */
+@Service
+public class NodeService {
+
+}

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/MonitorController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/SysController.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.sys;
 
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.*;
@@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2019-11-15 08:44:50
  */
-@Api(tags = "监控接口")
+@Api(tags = "系统接口")
 @RestController
-@RequestMapping("/api/monitor")
-public class MonitorController {
+@RequestMapping("/api/sys")
+public class SysController {
 }

+ 12 - 5
scripts/build-and-deploy.sh

@@ -4,10 +4,17 @@
 #!/bin/bash
 
 #sh build.sh test dmaster
-#sh deploy.sh autodop-dmaster 192.168.0.50 gjs &
+#sh deploy.sh autodop-dmaster 192.168.0.50 azy &
 
 #sh build.sh test dagent
-#sh deploy.sh autodop-dagent 192.168.0.171 gjs &
-#sh deploy.sh autodop-dagent 192.168.0.172 guanjingsong &
-#sh deploy.sh autodop-dagent 192.168.0.173 guanjingsong &
-#sh deploy.sh autodop-dagent 192.168.0.174 guanjingsong &
+#sh deploy.sh autodop-dagent 192.168.0.171 azy &
+#sh deploy.sh autodop-dagent 192.168.0.172 azy &
+#sh deploy.sh autodop-dagent 192.168.0.173 azy &
+#sh deploy.sh autodop-dagent 192.168.0.174 azy &
+
+#sh deploy.sh autodop-dagent 192.168.0.214 azy &
+#sh deploy.sh autodop-dagent 192.168.0.220 azy &
+#sh deploy.sh autodop-dagent 192.168.0.239 azy &
+#
+#sh deploy.sh autodop-dagent 192.168.0.191 azy &
+#sh deploy.sh autodop-dagent 192.168.0.201 azy &

+ 1 - 1
scripts/deploy.sh

@@ -15,7 +15,7 @@ if [ -z ${app_name} ] || [ -z ${remote_host} ] || [ -z ${password} ]; then
 fi
 
 # 存放应用的根目录
-remote_jar_home="/opt/services/autodop"
+remote_jar_home="/opt/services/dagent"
 local_jar_home="/home/reghao/tmp/autodop/app"
 cd ${local_jar_home}/${app_name}