mirror of https://github.com/elunez/eladmin
添加运维系统
parent
f81b4fd34d
commit
7b11e81f23
|
|
@ -25,6 +25,11 @@
|
|||
<version>2.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--jwt-->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
|
|
@ -38,6 +43,18 @@
|
|||
<artifactId>quartz</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>ch.ethz.ganymed</groupId>
|
||||
<artifactId>ganymed-ssh2</artifactId>
|
||||
<version>build210</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.55</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
@ -56,4 +73,4 @@
|
|||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
package me.zhengjie.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-24 15:44
|
||||
*/
|
||||
@Configuration
|
||||
public class WebSocketConfig {
|
||||
|
||||
@Bean
|
||||
public ServerEndpointExporter serverEndpointExporter() {
|
||||
return new ServerEndpointExporter();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_app")
|
||||
public class App implements Serializable {
|
||||
|
||||
/**
|
||||
* 应用编号
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
*/
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 端口
|
||||
*/
|
||||
@Column(name = "port")
|
||||
private int port;
|
||||
|
||||
/**
|
||||
* 上传目录
|
||||
*/
|
||||
@Column(name = "upload_path")
|
||||
private String uploadPath;
|
||||
|
||||
/**
|
||||
* 部署目录
|
||||
*/
|
||||
@Column(name = "deploy_path")
|
||||
private String deployPath;
|
||||
|
||||
/**
|
||||
* 备份目录
|
||||
*/
|
||||
@Column(name = "backup_path")
|
||||
private String backupPath;
|
||||
|
||||
/**
|
||||
* 启动脚本
|
||||
*/
|
||||
@Column(name = "start_script")
|
||||
private String startScript;
|
||||
|
||||
/**
|
||||
* 部署脚本
|
||||
*/
|
||||
@Column(name = "deploy_script")
|
||||
private String deployScript;
|
||||
|
||||
public void copy(App source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_database")
|
||||
public class Database implements Serializable {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 数据库名称
|
||||
*/
|
||||
@Column(name = "name",nullable = false)
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 数据库连接地址
|
||||
*/
|
||||
@Column(name = "jdbc_url",nullable = false)
|
||||
private String jdbcUrl;
|
||||
|
||||
/**
|
||||
* 数据库密码
|
||||
*/
|
||||
@Column(name = "pwd",nullable = false)
|
||||
private String pwd;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@Column(name = "user_name",nullable = false)
|
||||
private String userName;
|
||||
|
||||
|
||||
public void copy(Database source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_deploy")
|
||||
public class Deploy implements Serializable {
|
||||
|
||||
/**
|
||||
* 部署编号
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用编号
|
||||
*/
|
||||
@Column(name = "app_id")
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* IP列表
|
||||
*/
|
||||
@Column(name = "ip")
|
||||
private String ip;
|
||||
|
||||
public void copy(Deploy source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_deploy_history")
|
||||
public class DeployHistory implements Serializable {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
*/
|
||||
@Column(name = "app_name",nullable = false)
|
||||
private String appName;
|
||||
|
||||
/**
|
||||
* 部署IP
|
||||
*/
|
||||
@Column(name = "ip",nullable = false)
|
||||
private String ip;
|
||||
|
||||
/**
|
||||
* 部署时间
|
||||
*/
|
||||
@Column(name = "deploy_date",nullable = false)
|
||||
private String deployDate;
|
||||
|
||||
/**
|
||||
* 部署人员
|
||||
*/
|
||||
@Column(name = "deploy_user",nullable = false)
|
||||
private String deployUser;
|
||||
|
||||
/**
|
||||
* 部署编号
|
||||
*/
|
||||
@Column(name = "deploy_id",nullable = false)
|
||||
private String deployId;
|
||||
|
||||
public void copy(DeployHistory source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_server_account")
|
||||
public class ServerAccount implements Serializable {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
@Column(name = "account")
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
@Column(name = "password")
|
||||
private String password;
|
||||
|
||||
public void copy(ServerAccount source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package me.zhengjie.modules.mnt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Entity
|
||||
@Data
|
||||
@Table(name="mnt_server")
|
||||
public class ServerDeploy implements Serializable {
|
||||
|
||||
/**
|
||||
* 服务器IP
|
||||
*/
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 服务器账号
|
||||
*/
|
||||
@Column(name = "account_id")
|
||||
private String accountId;
|
||||
|
||||
public void copy(ServerDeploy source){
|
||||
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.App;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface AppRepository extends JpaRepository<App, String>, JpaSpecificationExecutor<App> {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.Database;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DatabaseRepository extends JpaRepository<Database, String>, JpaSpecificationExecutor {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DeployHistoryRepository extends JpaRepository<DeployHistory, String>, JpaSpecificationExecutor {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.Deploy;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DeployRepository extends JpaRepository<Deploy, String>, JpaSpecificationExecutor {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.ServerAccount;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface ServerAccountRepository extends JpaRepository<ServerAccount, String>, JpaSpecificationExecutor {
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package me.zhengjie.modules.mnt.repository;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.ServerDeploy;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface ServerDeployRepository extends JpaRepository<ServerDeploy, String>, JpaSpecificationExecutor {
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.App;
|
||||
import me.zhengjie.modules.mnt.service.AppService;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppQueryCriteria;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "应用管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/app")
|
||||
public class AppController {
|
||||
|
||||
@Autowired
|
||||
private AppService appService;
|
||||
|
||||
public AppController(AppService appService){
|
||||
this.appService = this.appService;
|
||||
}
|
||||
|
||||
@Log("查询App")
|
||||
@ApiOperation(value = "查询App")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('app:list')")
|
||||
public ResponseEntity getApps(AppQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(appService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增App")
|
||||
@ApiOperation(value = "新增App")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('app:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody App resources){
|
||||
return new ResponseEntity(appService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改App")
|
||||
@ApiOperation(value = "修改App")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('app:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody App resources){
|
||||
appService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除App")
|
||||
@ApiOperation(value = "删除App")
|
||||
@DeleteMapping(value = "/{id}")
|
||||
@PreAuthorize("@el.check('app:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
appService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.Database;
|
||||
import me.zhengjie.modules.mnt.service.DatabaseService;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseQueryCriteria;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "数据库管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/database")
|
||||
public class DatabaseController {
|
||||
|
||||
@Autowired
|
||||
private DatabaseService databaseService;
|
||||
|
||||
@Log("查询Database")
|
||||
@ApiOperation(value = "查询Database")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('database:list')")
|
||||
public ResponseEntity getDatabases(DatabaseQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(databaseService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增Database")
|
||||
@ApiOperation(value = "新增Database")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('database:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody Database resources){
|
||||
return new ResponseEntity(databaseService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改Database")
|
||||
@ApiOperation(value = "修改Database")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('database:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody Database resources){
|
||||
databaseService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除Database")
|
||||
@ApiOperation(value = "删除Database")
|
||||
@DeleteMapping(value = "/{id}")
|
||||
@PreAuthorize("@el.check('database:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
databaseService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.Deploy;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.service.DeployService;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployQueryCriteria;
|
||||
import me.zhengjie.utils.FileUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "部署管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/deploy")
|
||||
public class DeployController {
|
||||
|
||||
private String fileSavePath = System.getProperty("java.io.tmpdir");
|
||||
|
||||
@Autowired
|
||||
private DeployService deployService;
|
||||
|
||||
@Log("查询Deploy")
|
||||
@ApiOperation(value = "查询Deploy")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('deploy:list')")
|
||||
public ResponseEntity getDeploys(DeployQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(deployService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增Deploy")
|
||||
@ApiOperation(value = "新增Deploy")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('deploy:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody Deploy resources){
|
||||
return new ResponseEntity(deployService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改Deploy")
|
||||
@ApiOperation(value = "修改Deploy")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody Deploy resources){
|
||||
deployService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除Deploy")
|
||||
@ApiOperation(value = "删除Deploy")
|
||||
@DeleteMapping(value = "/{id}")
|
||||
@PreAuthorize("@el.check('deploy:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
deployService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("上传文件Deploy")
|
||||
@ApiOperation(value = "上传文件Deploy")
|
||||
@PostMapping(value = "/upload")
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity upload(@RequestBody MultipartFile file, HttpServletRequest request, HttpServletResponse response)throws Exception{
|
||||
String id = request.getParameter("id");
|
||||
String fileName = "";
|
||||
if(file != null){
|
||||
fileName = file.getOriginalFilename();
|
||||
File deployFile = new File(fileSavePath+fileName);
|
||||
FileUtil.del(deployFile);
|
||||
file.transferTo(deployFile);
|
||||
//文件下一步要根据文件名字来
|
||||
deployService.deploy(fileSavePath+fileName ,id);
|
||||
}else{
|
||||
System.out.println("没有找到相对应的文件");
|
||||
}
|
||||
System.out.println("文件上传的原名称为:"+file.getOriginalFilename());
|
||||
Map map = new HashMap(2);
|
||||
map.put("errno",0);
|
||||
map.put("id",fileName);
|
||||
return new ResponseEntity(map,HttpStatus.OK);
|
||||
}
|
||||
@Log("系统还原")
|
||||
@ApiOperation(value = "系统还原")
|
||||
@PostMapping(value = "/serverReduction")
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity serverReduction(@Validated @RequestBody DeployHistory resources, HttpServletRequest request, HttpServletResponse response)throws Exception{
|
||||
String result = deployService.serverReduction(resources);
|
||||
return new ResponseEntity(result,HttpStatus.OK);
|
||||
}
|
||||
@Log("服务运行状态")
|
||||
@ApiOperation(value = "服务运行状态")
|
||||
@PostMapping(value = "/serverStatus")
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity serverStatus(@Validated @RequestBody Deploy resources, HttpServletRequest request, HttpServletResponse response)throws Exception{
|
||||
String result = deployService.serverStatus(resources);
|
||||
return new ResponseEntity(result,HttpStatus.OK);
|
||||
}
|
||||
@Log("启动服务")
|
||||
@ApiOperation(value = "启动服务")
|
||||
@PostMapping(value = "/startServer")
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity startServer(@Validated @RequestBody Deploy resources, HttpServletRequest request, HttpServletResponse response)throws Exception{
|
||||
String result = deployService.startServer(resources);
|
||||
return new ResponseEntity(result,HttpStatus.OK);
|
||||
}
|
||||
@Log("停止服务")
|
||||
@ApiOperation(value = "停止服务")
|
||||
@PostMapping(value = "/stopServer")
|
||||
@PreAuthorize("@el.check('deploy:edit')")
|
||||
public ResponseEntity stopServer(@Validated @RequestBody Deploy resources, HttpServletRequest request, HttpServletResponse response)throws Exception{
|
||||
String result = deployService.stopServer(resources);
|
||||
return new ResponseEntity(result,HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.service.DeployHistoryService;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryQueryCriteria;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "部署历史管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/deployHistory")
|
||||
public class DeployHistoryController {
|
||||
|
||||
@Autowired
|
||||
private DeployHistoryService deployhistoryService;
|
||||
|
||||
@Log("查询DeployHistory")
|
||||
@ApiOperation(value = "查询DeployHistory")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('deployHistory:list')")
|
||||
public ResponseEntity getDeployHistorys(DeployHistoryQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(deployhistoryService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增DeployHistory")
|
||||
@ApiOperation(value = "新增DeployHistory")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('deployHistory:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody DeployHistory resources){
|
||||
return new ResponseEntity(deployhistoryService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改DeployHistory")
|
||||
@ApiOperation(value = "修改DeployHistory")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('deployHistory:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody DeployHistory resources){
|
||||
deployhistoryService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除DeployHistory")
|
||||
@ApiOperation(value = "删除DeployHistory")
|
||||
@DeleteMapping(value = "/{id}")
|
||||
@PreAuthorize("hasAnyRole('deployHistory:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
deployhistoryService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.ServerAccount;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountQueryCriteria;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "服务器账号管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/serverAccount")
|
||||
public class ServerAccountController {
|
||||
|
||||
@Autowired
|
||||
private me.zhengjie.modules.mnt.service.ServerAccountService ServerAccountService;
|
||||
|
||||
@Log("查询ServerAccount")
|
||||
@ApiOperation(value = "查询ServerAccount")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('serverAccount:list')")
|
||||
public ResponseEntity getServerAccounts(ServerAccountQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(ServerAccountService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增ServerAccount")
|
||||
@ApiOperation(value = "新增ServerAccount")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('serverAccount:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody ServerAccount resources){
|
||||
return new ResponseEntity(ServerAccountService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改ServerAccount")
|
||||
@ApiOperation(value = "修改ServerAccount")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('serverAccount:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody ServerAccount resources){
|
||||
ServerAccountService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除ServerAccount")
|
||||
@ApiOperation(value = "删除ServerAccount")
|
||||
@DeleteMapping(value = "/{id}")
|
||||
@PreAuthorize("@el.check('serverAccount:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
ServerAccountService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package me.zhengjie.modules.mnt.rest;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import me.zhengjie.aop.log.Log;
|
||||
import me.zhengjie.modules.mnt.domain.ServerDeploy;
|
||||
import me.zhengjie.modules.mnt.service.ServerDeployService;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployQueryCriteria;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Api(tags = "服务器部署管理")
|
||||
@RestController
|
||||
@RequestMapping("/api/serverDeploy")
|
||||
public class ServerDeployController {
|
||||
|
||||
@Autowired
|
||||
private ServerDeployService serverDeployService;
|
||||
|
||||
@Log("查询Server")
|
||||
@ApiOperation(value = "查询Server")
|
||||
@GetMapping
|
||||
@PreAuthorize("@el.check('serverDeploy:list')")
|
||||
public ResponseEntity getServers(ServerDeployQueryCriteria criteria, Pageable pageable){
|
||||
return new ResponseEntity(serverDeployService.queryAll(criteria,pageable),HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("新增Server")
|
||||
@ApiOperation(value = "新增Server")
|
||||
@PostMapping
|
||||
@PreAuthorize("@el.check('serverDeploy:add')")
|
||||
public ResponseEntity create(@Validated @RequestBody ServerDeploy resources){
|
||||
return new ResponseEntity(serverDeployService.create(resources),HttpStatus.CREATED);
|
||||
}
|
||||
|
||||
@Log("修改Server")
|
||||
@ApiOperation(value = "修改Server")
|
||||
@PutMapping
|
||||
@PreAuthorize("@el.check('serverDeploy:edit')")
|
||||
public ResponseEntity update(@Validated @RequestBody ServerDeploy resources){
|
||||
serverDeployService.update(resources);
|
||||
return new ResponseEntity(HttpStatus.NO_CONTENT);
|
||||
}
|
||||
|
||||
@Log("删除Server")
|
||||
@ApiOperation(value = "删除Server")
|
||||
@DeleteMapping(value = "/{id:.+}")
|
||||
@PreAuthorize("@el.check('serverDeploy:del')")
|
||||
public ResponseEntity delete(@PathVariable String id){
|
||||
serverDeployService.delete(id);
|
||||
return new ResponseEntity(HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.App;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface AppService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(AppQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(AppQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
AppDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
AppDTO create(App resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @param resources
|
||||
*/
|
||||
void update(App resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.Database;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DatabaseService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(DatabaseQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(DatabaseQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
DatabaseDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
DatabaseDTO create(Database resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @param resources
|
||||
*/
|
||||
void update(Database resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author: ZhangHouYing
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DeployHistoryService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(DeployHistoryQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(DeployHistoryQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
DeployHistoryDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
DeployHistoryDTO create(DeployHistory resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @param resources
|
||||
*/
|
||||
void update(DeployHistory resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.Deploy;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface DeployService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(DeployQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(DeployQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
DeployDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @CacheEvict(allEntries = true)
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
DeployDTO create(Deploy resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @CacheEvict(allEntries = true)
|
||||
* @param resources
|
||||
*/
|
||||
void update(Deploy resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @CacheEvict(allEntries = true)
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
|
||||
/**
|
||||
* 部署文件到服务器
|
||||
* @param fileSavePath
|
||||
* @param appId
|
||||
* @return
|
||||
*/
|
||||
public String deploy(String fileSavePath, String appId);
|
||||
|
||||
/**
|
||||
* 查询部署状态
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
public String serverStatus(Deploy resources);
|
||||
/**
|
||||
* 启动服务
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
public String startServer(Deploy resources);
|
||||
/**
|
||||
* 停止服务
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
public String stopServer(Deploy resources);
|
||||
|
||||
/**
|
||||
* 停止服务
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
public String serverReduction(DeployHistory resources);
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.ServerAccount;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface ServerAccountService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(ServerAccountQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(ServerAccountQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
ServerAccountDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
ServerAccountDTO create(ServerAccount resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @param resources
|
||||
*/
|
||||
void update(ServerAccount resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package me.zhengjie.modules.mnt.service;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.ServerDeploy;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployQueryCriteria;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
public interface ServerDeployService {
|
||||
|
||||
/**
|
||||
* queryAll 分页
|
||||
* @param criteria
|
||||
* @param pageable
|
||||
* @return
|
||||
*/
|
||||
Object queryAll(ServerDeployQueryCriteria criteria, Pageable pageable);
|
||||
|
||||
/**
|
||||
* queryAll 不分页
|
||||
* @param criteria
|
||||
* @return
|
||||
*/
|
||||
public Object queryAll(ServerDeployQueryCriteria criteria);
|
||||
|
||||
/**
|
||||
* findById
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
ServerDeployDTO findById(String id);
|
||||
|
||||
/**
|
||||
* create
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
ServerDeployDTO create(ServerDeploy resources);
|
||||
|
||||
/**
|
||||
* update
|
||||
* @param resources
|
||||
*/
|
||||
void update(ServerDeploy resources);
|
||||
|
||||
/**
|
||||
* delete
|
||||
* @param id
|
||||
*/
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class AppDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 应用编号
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 端口
|
||||
*/
|
||||
private int port;
|
||||
|
||||
/**
|
||||
* 上传目录
|
||||
*/
|
||||
private String uploadPath;
|
||||
|
||||
/**
|
||||
* 部署目录
|
||||
*/
|
||||
private String deployPath;
|
||||
|
||||
/**
|
||||
* 备份目录
|
||||
*/
|
||||
private String backupPath;
|
||||
|
||||
/**
|
||||
* 启动脚本
|
||||
*/
|
||||
private String startScript;
|
||||
|
||||
/**
|
||||
* 部署脚本
|
||||
*/
|
||||
private String deployScript;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class AppQueryCriteria{
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String name;
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DatabaseDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 数据库名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 数据库连接地址
|
||||
*/
|
||||
private String jdbcUrl;
|
||||
|
||||
/**
|
||||
* 数据库密码
|
||||
*/
|
||||
private String pwd;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DatabaseQueryCriteria{
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 精确
|
||||
*/
|
||||
@Query
|
||||
private String jdbcUrl;
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DeployDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 部署编号
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用编号
|
||||
*/
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* IP列表
|
||||
*/
|
||||
private String ip;
|
||||
|
||||
|
||||
/**
|
||||
* 服务状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DeployHistoryDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 应用名称
|
||||
*/
|
||||
private String appName;
|
||||
|
||||
/**
|
||||
* 部署IP
|
||||
*/
|
||||
private String ip;
|
||||
|
||||
/**
|
||||
* 部署时间
|
||||
*/
|
||||
private String deployDate;
|
||||
|
||||
/**
|
||||
* 部署人员
|
||||
*/
|
||||
private String deployUser;
|
||||
|
||||
/**
|
||||
* 部署编号
|
||||
*/
|
||||
private String deployId;
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DeployHistoryQueryCriteria{
|
||||
|
||||
/**
|
||||
* 精确
|
||||
*/
|
||||
@Query
|
||||
private String deployId;
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String deployDate;
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class DeployQueryCriteria{
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.EQUAL)
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String ip;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class ServerAccountDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
private String password;
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class ServerAccountQueryCriteria{
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String account;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class ServerDeployDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 服务器IP
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 服务器账号
|
||||
*/
|
||||
private String accountId;
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package me.zhengjie.modules.mnt.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import me.zhengjie.annotation.Query;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Data
|
||||
public class ServerDeployQueryCriteria{
|
||||
|
||||
/**
|
||||
* 模糊
|
||||
*/
|
||||
@Query(type = Query.Type.INNER_LIKE)
|
||||
private String id;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import me.zhengjie.modules.mnt.domain.App;
|
||||
import me.zhengjie.modules.mnt.repository.AppRepository;
|
||||
import me.zhengjie.modules.mnt.service.AppService;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppQueryCriteria;
|
||||
import me.zhengjie.modules.mnt.service.mapper.AppMapper;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class AppServiceImpl implements AppService {
|
||||
|
||||
private AppRepository appRepository;
|
||||
|
||||
private AppMapper appMapper;
|
||||
|
||||
public AppServiceImpl(AppRepository appRepository, AppMapper appMapper) {
|
||||
this.appMapper = appMapper;
|
||||
this.appRepository = appRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(AppQueryCriteria criteria, Pageable pageable){
|
||||
Page<App> page = appRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(appMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(AppQueryCriteria criteria){
|
||||
return appMapper.toDto(appRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public AppDTO findById(String id) {
|
||||
Optional<App> app = appRepository.findById(id);
|
||||
ValidationUtil.isNull(app,"App","id",id);
|
||||
return appMapper.toDto(app.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AppDTO create(App resources) {
|
||||
resources.setId(IdUtil.fastUUID());
|
||||
return appMapper.toDto(appRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(App resources) {
|
||||
Optional<App> optionalApp = appRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull( optionalApp,"App","id",resources.getId());
|
||||
App App = optionalApp.get();
|
||||
App.copy(resources);
|
||||
appRepository.save(App);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
appRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import me.zhengjie.modules.mnt.domain.Database;
|
||||
import me.zhengjie.modules.mnt.repository.DatabaseRepository;
|
||||
import me.zhengjie.modules.mnt.service.DatabaseService;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseQueryCriteria;
|
||||
import me.zhengjie.modules.mnt.service.mapper.DatabaseMapper;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class DatabaseServiceImpl implements DatabaseService {
|
||||
|
||||
private DatabaseRepository databaseRepository;
|
||||
|
||||
private DatabaseMapper databaseMapper;
|
||||
|
||||
public DatabaseServiceImpl(DatabaseRepository databaseRepository,DatabaseMapper databaseMapper){
|
||||
this.databaseMapper = databaseMapper;
|
||||
this.databaseRepository = databaseRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(DatabaseQueryCriteria criteria, Pageable pageable){
|
||||
Page<Database> page = databaseRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(databaseMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(DatabaseQueryCriteria criteria){
|
||||
return databaseMapper.toDto(databaseRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseDTO findById(String id) {
|
||||
Optional<Database> database = databaseRepository.findById(id);
|
||||
ValidationUtil.isNull(database,"Database","id",id);
|
||||
return databaseMapper.toDto(database.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public DatabaseDTO create(Database resources) {
|
||||
resources.setId(IdUtil.simpleUUID());
|
||||
return databaseMapper.toDto(databaseRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(Database resources) {
|
||||
Optional<Database> optionalDatabase = databaseRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull( optionalDatabase,"Database","id",resources.getId());
|
||||
Database database = optionalDatabase.get();
|
||||
database.copy(resources);
|
||||
databaseRepository.save(database);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
databaseRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.repository.DeployHistoryRepository;
|
||||
import me.zhengjie.modules.mnt.service.DeployHistoryService;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryQueryCriteria;
|
||||
import me.zhengjie.modules.mnt.service.mapper.DeployHistoryMapper;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class DeployHistoryServiceImpl implements DeployHistoryService {
|
||||
|
||||
@Autowired
|
||||
private DeployHistoryRepository deployhistoryRepository;
|
||||
|
||||
@Autowired
|
||||
private DeployHistoryMapper deployhistoryMapper;
|
||||
|
||||
@Override
|
||||
public Object queryAll(DeployHistoryQueryCriteria criteria, Pageable pageable){
|
||||
Page<DeployHistory> page = deployhistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(deployhistoryMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(DeployHistoryQueryCriteria criteria){
|
||||
return deployhistoryMapper.toDto(deployhistoryRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeployHistoryDTO findById(String id) {
|
||||
Optional<DeployHistory> deployhistory = deployhistoryRepository.findById(id);
|
||||
ValidationUtil.isNull(deployhistory,"DeployHistory","id",id);
|
||||
return deployhistoryMapper.toDto(deployhistory.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public DeployHistoryDTO create(DeployHistory resources) {
|
||||
resources.setId(IdUtil.simpleUUID());
|
||||
return deployhistoryMapper.toDto(deployhistoryRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(DeployHistory resources) {
|
||||
Optional<DeployHistory> optionalDeployHistory = deployhistoryRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull( optionalDeployHistory,"DeployHistory","id",resources.getId());
|
||||
DeployHistory deployhistory = optionalDeployHistory.get();
|
||||
deployhistory.copy(resources);
|
||||
deployhistoryRepository.save(deployhistory);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
deployhistoryRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,427 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.zhengjie.exception.BadRequestException;
|
||||
import me.zhengjie.modules.mnt.domain.Deploy;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.repository.DeployRepository;
|
||||
import me.zhengjie.modules.mnt.service.*;
|
||||
import me.zhengjie.modules.mnt.service.dto.*;
|
||||
import me.zhengjie.modules.mnt.service.mapper.DeployMapper;
|
||||
import me.zhengjie.modules.mnt.util.ExecuteShellUtil;
|
||||
import me.zhengjie.modules.mnt.util.ScpClientUtil;
|
||||
import me.zhengjie.modules.mnt.websocket.MsgType;
|
||||
import me.zhengjie.modules.mnt.websocket.SocketMsg;
|
||||
import me.zhengjie.modules.mnt.websocket.WebSocketServer;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.SecurityUtils;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class DeployServiceImpl implements DeployService {
|
||||
|
||||
private final String FILE_SEPARATOR = File.separatorChar + "";
|
||||
|
||||
@Autowired
|
||||
private DeployRepository deployRepository;
|
||||
|
||||
@Autowired
|
||||
private DeployMapper deployMapper;
|
||||
|
||||
@Autowired
|
||||
private AppService appService;
|
||||
|
||||
@Autowired
|
||||
private ServerDeployService serverDeployService;
|
||||
|
||||
@Autowired
|
||||
private DeployHistoryService deployHistoryService;
|
||||
|
||||
@Autowired
|
||||
private ServerAccountService serverAccountService;
|
||||
|
||||
@Autowired
|
||||
private DatabaseService databaseService;
|
||||
|
||||
|
||||
@Override
|
||||
public Object queryAll(DeployQueryCriteria criteria, Pageable pageable) {
|
||||
Page<Deploy> page = deployRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
|
||||
return PageUtil.toPage(page.map(deployMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DeployDTO> queryAll(DeployQueryCriteria criteria) {
|
||||
return deployMapper.toDto(deployRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeployDTO findById(String id) {
|
||||
Optional<Deploy> Deploy = deployRepository.findById(id);
|
||||
ValidationUtil.isNull(Deploy, "Deploy", "id", id);
|
||||
return deployMapper.toDto(Deploy.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public DeployDTO create(Deploy resources) {
|
||||
resources.setId(IdUtil.simpleUUID());
|
||||
return deployMapper.toDto(deployRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(Deploy resources) {
|
||||
Optional<Deploy> optionalDeploy = deployRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull(optionalDeploy, "Deploy", "id", resources.getId());
|
||||
Deploy Deploy = optionalDeploy.get();
|
||||
Deploy.copy(resources);
|
||||
deployRepository.save(Deploy);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
deployRepository.deleteById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String deploy(String fileSavePath, String id) {
|
||||
return deployApp(fileSavePath, id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param fileSavePath 本机路径
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
private String deployApp(String fileSavePath, String id) {
|
||||
|
||||
DeployDTO deploy = findById(id);
|
||||
if (deploy == null) {
|
||||
sendMsg("部署信息不存在", MsgType.ERROR);
|
||||
throw new BadRequestException("部署信息不存在");
|
||||
}
|
||||
AppDTO app = appService.findById(deploy.getAppId());
|
||||
if (app == null) {
|
||||
sendMsg("包对应应用信息不存在", MsgType.ERROR);
|
||||
throw new BadRequestException("包对应应用信息不存在");
|
||||
}
|
||||
int port = app.getPort();
|
||||
//这个是服务器部署路径
|
||||
String uploadPath = app.getUploadPath();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String msg = "";
|
||||
String ip = deploy.getIp();
|
||||
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
|
||||
//判断是否第一次部署
|
||||
boolean flag = checkFile(executeShellUtil, app);
|
||||
//第一步要确认服务器上有这个目录
|
||||
executeShellUtil.execute("mkdir -p " + uploadPath);
|
||||
//上传文件
|
||||
msg = String.format("登陆到服务器:%s", ip);
|
||||
ScpClientUtil scpClientUtil = getScpClientUtil(ip);
|
||||
log.info(msg);
|
||||
sendMsg(msg, MsgType.INFO);
|
||||
msg = String.format("上传文件到服务器:%s<br>目录:%s下", fileSavePath, ip, uploadPath);
|
||||
sendMsg(msg, MsgType.INFO);
|
||||
scpClientUtil.putFile(fileSavePath, uploadPath);
|
||||
if (flag) {
|
||||
sendMsg("停止原来应用", MsgType.INFO);
|
||||
//停止应用
|
||||
stopApp(port, executeShellUtil);
|
||||
sendMsg("备份原来应用", MsgType.INFO);
|
||||
//备份应用
|
||||
backupApp(executeShellUtil, ip, app.getDeployPath(), app.getName(), app.getBackupPath(), id);
|
||||
}
|
||||
sendMsg("部署应用", MsgType.INFO);
|
||||
//部署文件,并启动应用
|
||||
String deployScript = app.getDeployScript();
|
||||
executeShellUtil.execute(deployScript);
|
||||
|
||||
sendMsg("启动应用", MsgType.INFO);
|
||||
String startScript = app.getStartScript();
|
||||
executeShellUtil.execute(startScript);
|
||||
//只有过5秒才能知道到底是不是启动成功了。
|
||||
sleep(5);
|
||||
boolean result = checkIsRunningStatus(port, executeShellUtil);
|
||||
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
|
||||
sendResultMsg(result, sb);
|
||||
|
||||
return "部署结束";
|
||||
}
|
||||
|
||||
private void sleep(int second) {
|
||||
try {
|
||||
Thread.sleep(second * 1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void backupApp(ExecuteShellUtil executeShellUtil, String ip, String fileSavePath, String appName, String backupPath, String id) {
|
||||
String deployDate = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (!backupPath.endsWith(FILE_SEPARATOR)) {
|
||||
backupPath += FILE_SEPARATOR;
|
||||
}
|
||||
backupPath += appName + FILE_SEPARATOR + deployDate + "\n";
|
||||
sb.append("mkdir -p ").append(backupPath);
|
||||
sb.append("mv -f ").append(fileSavePath);
|
||||
if (!fileSavePath.endsWith(FILE_SEPARATOR)) {
|
||||
sb.append(FILE_SEPARATOR);
|
||||
}
|
||||
sb.append(appName).append(" ").append(backupPath);
|
||||
log.info("备份应用脚本:" + sb.toString());
|
||||
executeShellUtil.execute(sb.toString());
|
||||
//还原信息入库
|
||||
DeployHistory deployHistory = new DeployHistory();
|
||||
deployHistory.setAppName(appName);
|
||||
deployHistory.setDeployDate(deployDate);
|
||||
deployHistory.setDeployUser(SecurityUtils.getUsername());
|
||||
deployHistory.setIp(ip);
|
||||
deployHistory.setDeployId(id);
|
||||
deployHistoryService.create(deployHistory);
|
||||
}
|
||||
|
||||
/**
|
||||
* 停App
|
||||
*
|
||||
* @param port
|
||||
* @param executeShellUtil
|
||||
* @return
|
||||
*/
|
||||
private void stopApp(int port, ExecuteShellUtil executeShellUtil) {
|
||||
//发送停止命令
|
||||
executeShellUtil.execute(String.format("lsof -i :%d|grep -v \"PID\"|awk '{print \"kill -9\",$2}'|sh", port));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定端口程序是否在运行
|
||||
*
|
||||
* @param port
|
||||
* @param executeShellUtil
|
||||
* @return true 正在运行 false 已经停止
|
||||
*/
|
||||
private boolean checkIsRunningStatus(int port, ExecuteShellUtil executeShellUtil) {
|
||||
String statusResult = executeShellUtil.executeForResult(String.format("fuser -n tcp %d", port));
|
||||
if ("".equals(statusResult.trim())) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void sendMsg(String msg, MsgType msgType) {
|
||||
try {
|
||||
WebSocketServer.sendInfo(new SocketMsg(msg, msgType), "deploy");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String serverStatus(Deploy resources) {
|
||||
String ip = resources.getIp();
|
||||
String appId = resources.getAppId();
|
||||
AppDTO app = appService.findById(appId);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
|
||||
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
|
||||
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
|
||||
if (result) {
|
||||
sb.append("<br>正在运行");
|
||||
sendMsg(sb.toString(), MsgType.INFO);
|
||||
} else {
|
||||
sb.append("<br>已停止!");
|
||||
sendMsg(sb.toString(), MsgType.ERROR);
|
||||
}
|
||||
log.info(sb.toString());
|
||||
return "执行完毕";
|
||||
}
|
||||
|
||||
|
||||
private boolean checkFile(ExecuteShellUtil executeShellUtil, AppDTO appDTO) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("find ");
|
||||
sb.append(appDTO.getDeployPath());
|
||||
sb.append(" -name ");
|
||||
sb.append(appDTO.getName());
|
||||
boolean flag = executeShellUtil.executeShell(sb.toString());
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动服务
|
||||
*
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String startServer(Deploy resources) {
|
||||
String ip = resources.getIp();
|
||||
String appId = resources.getAppId();
|
||||
AppDTO app = appService.findById(appId);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
|
||||
//为了防止重复启动,这里先停止应用
|
||||
stopApp(app.getPort(), executeShellUtil);
|
||||
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
|
||||
sendMsg("下发启动命令", MsgType.INFO);
|
||||
executeShellUtil.execute(app.getStartScript());
|
||||
//停止3秒,防止应用没有启动完成
|
||||
sleep(3);
|
||||
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
|
||||
sendResultMsg(result, sb);
|
||||
log.info(sb.toString());
|
||||
return "执行完毕";
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* 停止服务
|
||||
*
|
||||
* @param resources
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String stopServer(Deploy resources) {
|
||||
String ip = resources.getIp();
|
||||
String appId = resources.getAppId();
|
||||
AppDTO app = appService.findById(appId);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
|
||||
sb.append("服务器:").append(ip).append("<br>应用:").append(app.getName());
|
||||
sendMsg("下发停止命令", MsgType.INFO);
|
||||
//停止应用
|
||||
stopApp(app.getPort(), executeShellUtil);
|
||||
sleep(1);
|
||||
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
|
||||
if (result) {
|
||||
sb.append("<br>关闭失败!");
|
||||
sendMsg(sb.toString(), MsgType.ERROR);
|
||||
} else {
|
||||
sb.append("<br>关闭成功!");
|
||||
sendMsg(sb.toString(), MsgType.INFO);
|
||||
}
|
||||
log.info(sb.toString());
|
||||
return "执行完毕";
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
@Override
|
||||
public String serverReduction(DeployHistory resources) {
|
||||
String deployId = resources.getDeployId();
|
||||
Deploy deployInfo = deployRepository.findById(deployId).get();
|
||||
String deployDate = resources.getDeployDate();
|
||||
AppDTO app = appService.findById(deployInfo.getAppId());
|
||||
if (app == null) {
|
||||
sendMsg("应用信息不存在:" + resources.getAppName(), MsgType.ERROR);
|
||||
throw new BadRequestException("应用信息不存在:" + resources.getAppName());
|
||||
}
|
||||
String backupPath = app.getBackupPath();
|
||||
if (!backupPath.endsWith(FILE_SEPARATOR)) {
|
||||
backupPath += FILE_SEPARATOR;
|
||||
}
|
||||
backupPath += resources.getAppName() + FILE_SEPARATOR + deployDate;
|
||||
//这个是服务器部署路径
|
||||
String deployPath = app.getDeployPath();
|
||||
String ip = resources.getIp();
|
||||
ExecuteShellUtil executeShellUtil = getExecuteShellUtil(ip);
|
||||
String msg = "";
|
||||
|
||||
msg = String.format("登陆到服务器:%s", ip);
|
||||
log.info(msg);
|
||||
sendMsg(msg, MsgType.INFO);
|
||||
sendMsg("停止原来应用", MsgType.INFO);
|
||||
//停止应用
|
||||
stopApp(app.getPort(), executeShellUtil);
|
||||
//删除原来应用
|
||||
sendMsg("删除应用", MsgType.INFO);
|
||||
//考虑到系统安全性,必须限制下操作目录
|
||||
if (!deployPath.startsWith("/opt")) {
|
||||
throw new BadRequestException("部署路径必须在opt目录下:" + deployPath);
|
||||
}
|
||||
executeShellUtil.execute("rm -rf " + deployPath + FILE_SEPARATOR + resources.getAppName());
|
||||
|
||||
//还原应用
|
||||
sendMsg("还原应用", MsgType.INFO);
|
||||
executeShellUtil.execute("cp -r " + backupPath + "/. " + deployPath);
|
||||
sendMsg("启动应用", MsgType.INFO);
|
||||
executeShellUtil.execute(app.getStartScript());
|
||||
//只有过5秒才能知道到底是不是启动成功了。
|
||||
sleep(5);
|
||||
boolean result = checkIsRunningStatus(app.getPort(), executeShellUtil);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("服务器:").append(ip).append("<br>应用:").append(resources.getAppName());
|
||||
sendResultMsg(result, sb);
|
||||
return "";
|
||||
}
|
||||
|
||||
private ExecuteShellUtil getExecuteShellUtil(String ip) {
|
||||
ServerDeployDTO serverDeployDTO = serverDeployService.findById(ip);
|
||||
if (serverDeployDTO == null) {
|
||||
sendMsg("IP对应服务器信息不存在:" + ip, MsgType.ERROR);
|
||||
throw new BadRequestException("IP对应服务器信息不存在:" + ip);
|
||||
}
|
||||
String accountId = serverDeployDTO.getAccountId();
|
||||
ServerAccountDTO serverAccountDTO = serverAccountService.findById(accountId);
|
||||
if (serverAccountDTO == null) {
|
||||
sendMsg("IP对账号信息不存在:" + ip, MsgType.ERROR);
|
||||
throw new BadRequestException("IP对账号信息不存在:" + ip);
|
||||
}
|
||||
return new ExecuteShellUtil(ip, serverAccountDTO.getAccount(), serverAccountDTO.getPassword());
|
||||
}
|
||||
|
||||
|
||||
private ScpClientUtil getScpClientUtil(String ip) {
|
||||
ServerDeployDTO serverDeployDTO = serverDeployService.findById(ip);
|
||||
if (serverDeployDTO == null) {
|
||||
sendMsg("IP对应服务器信息不存在:" + ip, MsgType.ERROR);
|
||||
throw new BadRequestException("IP对应服务器信息不存在:" + ip);
|
||||
}
|
||||
String accountId = serverDeployDTO.getAccountId();
|
||||
ServerAccountDTO serverAccountDTO = serverAccountService.findById(accountId);
|
||||
if (serverAccountDTO == null) {
|
||||
sendMsg("IP对账号信息不存在:" + ip, MsgType.ERROR);
|
||||
throw new BadRequestException("IP对账号信息不存在:" + ip);
|
||||
}
|
||||
return ScpClientUtil.getInstance(ip, 22, serverAccountDTO.getAccount(), serverAccountDTO.getPassword());
|
||||
}
|
||||
|
||||
public void sendResultMsg(boolean result, StringBuilder sb) {
|
||||
if (result) {
|
||||
sb.append("<br>启动成功!");
|
||||
sendMsg(sb.toString(), MsgType.INFO);
|
||||
} else {
|
||||
sb.append("<br>启动失败!");
|
||||
sendMsg(sb.toString(), MsgType.ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import me.zhengjie.modules.mnt.domain.ServerAccount;
|
||||
import me.zhengjie.modules.mnt.repository.ServerAccountRepository;
|
||||
import me.zhengjie.modules.mnt.service.ServerAccountService;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountQueryCriteria;
|
||||
import me.zhengjie.modules.mnt.service.mapper.ServerAccountMapper;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class ServerAccountServiceImpl implements ServerAccountService {
|
||||
|
||||
@Autowired
|
||||
private ServerAccountRepository serverAccountRepository;
|
||||
|
||||
@Autowired
|
||||
private ServerAccountMapper serverAccountMapper;
|
||||
|
||||
@Override
|
||||
public Object queryAll(ServerAccountQueryCriteria criteria, Pageable pageable){
|
||||
Page<ServerAccount> page = serverAccountRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(serverAccountMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(ServerAccountQueryCriteria criteria){
|
||||
return serverAccountMapper.toDto(serverAccountRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServerAccountDTO findById(String id) {
|
||||
Optional<ServerAccount> ServerAccount = serverAccountRepository.findById(id);
|
||||
ValidationUtil.isNull(ServerAccount,"ServerAccount","id",id);
|
||||
return serverAccountMapper.toDto(ServerAccount.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ServerAccountDTO create(ServerAccount resources) {
|
||||
resources.setId(IdUtil.simpleUUID());
|
||||
return serverAccountMapper.toDto(serverAccountRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(ServerAccount resources) {
|
||||
Optional<ServerAccount> optionalServerAccount = serverAccountRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull( optionalServerAccount,"ServerAccount","id",resources.getId());
|
||||
ServerAccount ServerAccount = optionalServerAccount.get();
|
||||
ServerAccount.copy(resources);
|
||||
serverAccountRepository.save(ServerAccount);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
serverAccountRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package me.zhengjie.modules.mnt.service.impl;
|
||||
|
||||
import me.zhengjie.modules.mnt.domain.ServerDeploy;
|
||||
import me.zhengjie.modules.mnt.repository.ServerDeployRepository;
|
||||
import me.zhengjie.modules.mnt.service.ServerDeployService;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployDTO;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployQueryCriteria;
|
||||
import me.zhengjie.modules.mnt.service.mapper.ServerDeployMapper;
|
||||
import me.zhengjie.utils.PageUtil;
|
||||
import me.zhengjie.utils.QueryHelp;
|
||||
import me.zhengjie.utils.ValidationUtil;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Service
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class ServerDeployServiceImpl implements ServerDeployService {
|
||||
|
||||
private ServerDeployRepository serverDeployRepository;
|
||||
|
||||
private ServerDeployMapper serverDeployMapper;
|
||||
|
||||
public ServerDeployServiceImpl(ServerDeployRepository serverDeployRepository,ServerDeployMapper serverDeployMapper){
|
||||
this.serverDeployRepository = serverDeployRepository;
|
||||
this.serverDeployMapper = serverDeployMapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(ServerDeployQueryCriteria criteria, Pageable pageable){
|
||||
Page<ServerDeploy> page = serverDeployRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
||||
return PageUtil.toPage(page.map(serverDeployMapper::toDto));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object queryAll(ServerDeployQueryCriteria criteria){
|
||||
return serverDeployMapper.toDto(serverDeployRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServerDeployDTO findById(String id) {
|
||||
Optional<ServerDeploy> server = serverDeployRepository.findById(id);
|
||||
ValidationUtil.isNull(server,"ServerDeploy","id",id);
|
||||
return serverDeployMapper.toDto(server.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ServerDeployDTO create(ServerDeploy resources) {
|
||||
return serverDeployMapper.toDto(serverDeployRepository.save(resources));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void update(ServerDeploy resources) {
|
||||
Optional<ServerDeploy> optionalServer = serverDeployRepository.findById(resources.getId());
|
||||
ValidationUtil.isNull( optionalServer,"ServerDeploy","id",resources.getId());
|
||||
ServerDeploy serverDeploy = optionalServer.get();
|
||||
serverDeploy.copy(resources);
|
||||
serverDeployRepository.save(serverDeploy);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(String id) {
|
||||
serverDeployRepository.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.App;
|
||||
import me.zhengjie.modules.mnt.service.dto.AppDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface AppMapper extends BaseMapper<AppDTO, App> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.Database;
|
||||
import me.zhengjie.modules.mnt.service.dto.DatabaseDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface DatabaseMapper extends BaseMapper<DatabaseDTO, Database> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.DeployHistory;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployHistoryDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface DeployHistoryMapper extends BaseMapper<DeployHistoryDTO, DeployHistory> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.Deploy;
|
||||
import me.zhengjie.modules.mnt.service.dto.DeployDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface DeployMapper extends BaseMapper<DeployDTO, Deploy> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.ServerAccount;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerAccountDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface ServerAccountMapper extends BaseMapper<ServerAccountDTO, ServerAccount> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package me.zhengjie.modules.mnt.service.mapper;
|
||||
|
||||
import me.zhengjie.base.BaseMapper;
|
||||
import me.zhengjie.modules.mnt.domain.ServerDeploy;
|
||||
import me.zhengjie.modules.mnt.service.dto.ServerDeployDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
/**
|
||||
* @author zhanghouying
|
||||
* @date 2019-08-24
|
||||
*/
|
||||
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface ServerDeployMapper extends BaseMapper<ServerDeployDTO, ServerDeploy> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
package me.zhengjie.modules.mnt.util;
|
||||
|
||||
import com.jcraft.jsch.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* 执行shell命令
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019/8/10
|
||||
*/
|
||||
@Slf4j
|
||||
public class ExecuteShellUtil {
|
||||
|
||||
private String ipAddress;
|
||||
|
||||
private String username;
|
||||
|
||||
private String password;
|
||||
|
||||
public final int DEFAULT_SSH_PORT = 22;
|
||||
|
||||
private Vector<String> stdout;
|
||||
|
||||
public ExecuteShellUtil(final String ipAddress, final String username, final String password) {
|
||||
this.ipAddress = ipAddress;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
stdout = new Vector<String>();
|
||||
}
|
||||
|
||||
public int execute(final String command) {
|
||||
int returnCode = 0;
|
||||
JSch jsch = new JSch();
|
||||
try {
|
||||
Session session = jsch.getSession(username, ipAddress, DEFAULT_SSH_PORT);
|
||||
session.setPassword(password);
|
||||
session.setConfig("StrictHostKeyChecking", "no");
|
||||
session.connect(30000);
|
||||
|
||||
Channel channel = session.openChannel("exec");
|
||||
((ChannelExec) channel).setCommand(command);
|
||||
|
||||
channel.setInputStream(null);
|
||||
BufferedReader input = new BufferedReader(new InputStreamReader(channel.getInputStream()));
|
||||
|
||||
channel.connect();
|
||||
log.info("The remote command is: " + command);
|
||||
|
||||
String line;
|
||||
while ((line = input.readLine()) != null) {
|
||||
stdout.add(line);
|
||||
}
|
||||
input.close();
|
||||
|
||||
if (channel.isClosed()) {
|
||||
returnCode = channel.getExitStatus();
|
||||
}
|
||||
channel.disconnect();
|
||||
session.disconnect();
|
||||
} catch (JSchException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
public boolean executeShell(String command) {
|
||||
int result = execute(command);
|
||||
for (String str : stdout) {
|
||||
log.info(str);
|
||||
}
|
||||
if (result == 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public String executeForResult(String command) {
|
||||
execute(command);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String str : stdout) {
|
||||
sb.append(str);
|
||||
log.info(str);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回值有三条就代表成功了,2条是没启动,多余三条代表脚本有问题
|
||||
* @param command
|
||||
* @return
|
||||
*/
|
||||
public int checkAppStatus(String command) {
|
||||
execute(command);
|
||||
for (String str : stdout) {
|
||||
log.info(str);
|
||||
}
|
||||
return stdout.size();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
package me.zhengjie.modules.mnt.util;
|
||||
|
||||
import ch.ethz.ssh2.Connection;
|
||||
import ch.ethz.ssh2.SCPClient;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* 远程执行linux命令
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-10 10:06
|
||||
*/
|
||||
public class ScpClientUtil {
|
||||
|
||||
static private ScpClientUtil instance;
|
||||
|
||||
static synchronized public ScpClientUtil getInstance(String IP, int port, String username, String passward) {
|
||||
if (instance == null) {
|
||||
instance = new ScpClientUtil(IP, port, username, passward);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public ScpClientUtil(String IP, int port, String username, String passward) {
|
||||
this.ip = IP;
|
||||
this.port = port;
|
||||
this.username = username;
|
||||
this.password = passward;
|
||||
}
|
||||
|
||||
public void getFile(String remoteFile, String localTargetDirectory) {
|
||||
Connection conn = new Connection(ip, port);
|
||||
try {
|
||||
conn.connect();
|
||||
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
|
||||
if (!isAuthenticated) {
|
||||
System.err.println("authentication failed");
|
||||
}
|
||||
SCPClient client = new SCPClient(conn);
|
||||
client.get(remoteFile, localTargetDirectory);
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}finally{
|
||||
conn.close();
|
||||
}
|
||||
}
|
||||
|
||||
public void putFile(String localFile, String remoteTargetDirectory) {
|
||||
putFile(localFile, null, remoteTargetDirectory);
|
||||
}
|
||||
|
||||
public void putFile(String localFile, String remoteFileName, String remoteTargetDirectory) {
|
||||
putFile(localFile, remoteFileName, remoteTargetDirectory,null);
|
||||
}
|
||||
|
||||
public void putFile(String localFile, String remoteFileName, String remoteTargetDirectory, String mode) {
|
||||
Connection conn = new Connection(ip, port);
|
||||
try {
|
||||
conn.connect();
|
||||
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
|
||||
if (!isAuthenticated) {
|
||||
System.err.println("authentication failed");
|
||||
}
|
||||
SCPClient client = new SCPClient(conn);
|
||||
if ((mode == null) || (mode.length() == 0)) {
|
||||
mode = "0600";
|
||||
}
|
||||
if (remoteFileName == null) {
|
||||
client.put(localFile, remoteTargetDirectory);
|
||||
} else {
|
||||
client.put(localFile, remoteFileName, remoteTargetDirectory, mode);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(ScpClientUtil.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}finally{
|
||||
conn.close();
|
||||
}
|
||||
}
|
||||
|
||||
private String ip;
|
||||
private int port;
|
||||
private String username;
|
||||
private String password;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,132 @@
|
|||
package me.zhengjie.modules.mnt.util;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipException;
|
||||
import java.util.zip.ZipFile;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-10 13:34
|
||||
*/
|
||||
public class ZipUtils {
|
||||
/**
|
||||
* 解压文件
|
||||
*
|
||||
* @param zipFilePath 解压文件路径
|
||||
* @param outputFolder 输出解压文件路径
|
||||
*/
|
||||
public static void unZipIt(String zipFilePath, String outputFolder) {
|
||||
byte[] buffer = new byte[1024];
|
||||
|
||||
File folder = new File(outputFolder);
|
||||
if (!folder.exists()) {
|
||||
folder.mkdir();
|
||||
}
|
||||
try {
|
||||
//get the zip file content
|
||||
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
|
||||
ZipEntry ze = zis.getNextEntry();
|
||||
while (ze != null) {
|
||||
String fileName = ze.getName();
|
||||
File newFile = new File(outputFolder + File.separator + fileName);
|
||||
System.out.println("file unzip : " + newFile.getAbsoluteFile());
|
||||
//大部分网络上的源码,这里没有判断子目录
|
||||
if (ze.isDirectory()) {
|
||||
newFile.mkdirs();
|
||||
} else {
|
||||
new File(newFile.getParent()).mkdirs();
|
||||
FileOutputStream fos = new FileOutputStream(newFile);
|
||||
int len;
|
||||
while ((len = zis.read(buffer)) != -1) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
fos.close();
|
||||
}
|
||||
ze = zis.getNextEntry();
|
||||
}
|
||||
zis.closeEntry();
|
||||
zis.close();
|
||||
System.out.println("Done");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void unzip(File source, String out) throws IOException {
|
||||
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) {
|
||||
|
||||
ZipEntry entry = zis.getNextEntry();
|
||||
|
||||
while (entry != null) {
|
||||
|
||||
File file = new File(out, entry.getName());
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
file.mkdirs();
|
||||
} else {
|
||||
File parent = file.getParentFile();
|
||||
|
||||
if (!parent.exists()) {
|
||||
parent.mkdirs();
|
||||
}
|
||||
|
||||
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
|
||||
|
||||
byte[] buffer = new byte[Math.toIntExact(entry.getSize())];
|
||||
|
||||
int location;
|
||||
|
||||
while ((location = zis.read(buffer)) != -1) {
|
||||
bos.write(buffer, 0, location);
|
||||
}
|
||||
}
|
||||
}
|
||||
entry = zis.getNextEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 把所有文件都直接解压到指定目录(忽略子文件夹)
|
||||
*
|
||||
* @param zipFile
|
||||
* @param folderPath
|
||||
* @throws ZipException
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException {
|
||||
File desDir = new File(folderPath);
|
||||
if (!desDir.exists()) {
|
||||
desDir.mkdirs();
|
||||
}
|
||||
ZipFile zf = new ZipFile(zipFile);
|
||||
for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements(); ) {
|
||||
ZipEntry entry = ((ZipEntry) entries.nextElement());
|
||||
InputStream in = zf.getInputStream(entry);
|
||||
String str = folderPath;
|
||||
File desFile = new File(str, java.net.URLEncoder.encode(entry.getName(), "UTF-8"));
|
||||
|
||||
if (!desFile.exists()) {
|
||||
File fileParentDir = desFile.getParentFile();
|
||||
if (!fileParentDir.exists()) {
|
||||
fileParentDir.mkdirs();
|
||||
}
|
||||
}
|
||||
|
||||
OutputStream out = new FileOutputStream(desFile);
|
||||
byte[] buffer = new byte[1024 * 1024];
|
||||
int realLength = in.read(buffer);
|
||||
while (realLength != -1) {
|
||||
out.write(buffer, 0, realLength);
|
||||
realLength = in.read(buffer);
|
||||
}
|
||||
|
||||
out.close();
|
||||
in.close();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package me.zhengjie.modules.mnt.websocket;
|
||||
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-10 9:56
|
||||
*/
|
||||
public enum MsgType {
|
||||
CONNECT,CLOSE,INFO,ERROR
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package me.zhengjie.modules.mnt.websocket;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-10 9:55
|
||||
*/
|
||||
@Data
|
||||
public class SocketMsg {
|
||||
private String msg;
|
||||
private MsgType msgType;
|
||||
|
||||
public SocketMsg(String msg, MsgType msgType) {
|
||||
this.msg = msg;
|
||||
this.msgType = msgType;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
package me.zhengjie.modules.mnt.websocket;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.websocket.*;
|
||||
import javax.websocket.server.PathParam;
|
||||
import javax.websocket.server.ServerEndpoint;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
/**
|
||||
* @author: ZhangHouYing
|
||||
* @date: 2019-08-10 15:46
|
||||
*/
|
||||
@ServerEndpoint("/webSocket/{sid}")
|
||||
@Slf4j
|
||||
@Component
|
||||
public class WebSocketServer {
|
||||
|
||||
/**
|
||||
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
|
||||
*/
|
||||
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
|
||||
|
||||
/**
|
||||
* 与某个客户端的连接会话,需要通过它来给客户端发送数据
|
||||
*/
|
||||
private Session session;
|
||||
|
||||
/**
|
||||
* 接收sid
|
||||
*/
|
||||
private String sid="";
|
||||
/**
|
||||
* 连接建立成功调用的方法
|
||||
* */
|
||||
@OnOpen
|
||||
public void onOpen(Session session,@PathParam("sid") String sid) {
|
||||
this.session = session;
|
||||
//如果存在就先删除一个,防止重复推送消息
|
||||
for (WebSocketServer webSocket:webSocketSet) {
|
||||
if (webSocket.sid.equals(sid)) {
|
||||
webSocketSet.remove(webSocket);
|
||||
}
|
||||
}
|
||||
webSocketSet.add(this);
|
||||
this.sid=sid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接关闭调用的方法
|
||||
*/
|
||||
@OnClose
|
||||
public void onClose() {
|
||||
webSocketSet.remove(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 收到客户端消息后调用的方法
|
||||
*
|
||||
* @param message 客户端发送过来的消息*/
|
||||
@OnMessage
|
||||
public void onMessage(String message, Session session) {
|
||||
log.info("收到来"+sid+"的信息:"+message);
|
||||
//群发消息
|
||||
for (WebSocketServer item : webSocketSet) {
|
||||
try {
|
||||
item.sendMessage(message);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param session
|
||||
* @param error
|
||||
*/
|
||||
@OnError
|
||||
public void onError(Session session, Throwable error) {
|
||||
log.error("发生错误");
|
||||
error.printStackTrace();
|
||||
}
|
||||
/**
|
||||
* 实现服务器主动推送
|
||||
*/
|
||||
public void sendMessage(String message) throws IOException {
|
||||
this.session.getBasicRemote().sendText(message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 群发自定义消息
|
||||
* */
|
||||
public static void sendInfo(SocketMsg socketMsg,@PathParam("sid") String sid) throws IOException {
|
||||
String message = JSONObject.toJSONString(socketMsg);
|
||||
log.info("推送消息到"+sid+",推送内容:"+message);
|
||||
for (WebSocketServer item : webSocketSet) {
|
||||
try {
|
||||
//这里可以设定只推送给这个sid的,为null则全部推送
|
||||
if(sid==null) {
|
||||
item.sendMessage(message);
|
||||
}else if(item.sid.equals(sid)){
|
||||
item.sendMessage(message);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
package me.zhengjie.modules.security.config;
|
||||
|
||||
import me.zhengjie.annotation.AnonymousAccess;
|
||||
import me.zhengjie.config.ElPermissionConfig;
|
||||
import me.zhengjie.modules.security.security.JwtAuthenticationEntryPoint;
|
||||
import me.zhengjie.modules.security.security.JwtAuthorizationTokenFilter;
|
||||
import me.zhengjie.modules.security.service.JwtUserDetailsService;
|
||||
|
|
@ -108,7 +107,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
|||
"/*.html",
|
||||
"/**/*.html",
|
||||
"/**/*.css",
|
||||
"/**/*.js"
|
||||
"/**/*.js",
|
||||
"/webSocket/**"
|
||||
).anonymous()
|
||||
// swagger start
|
||||
.antMatchers("/swagger-ui.html").permitAll()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
|
||||
-- ----------------------------
|
||||
-- Records of menu
|
||||
-- ----------------------------
|
||||
|
||||
INSERT INTO `menu` VALUES (90, b'0', '运维管理', '', 0, 920, 'sys-tools', 'mnt', b'0', b'0', 'Mnt', '2019-11-09 10:31:08', NULL, 1);
|
||||
INSERT INTO `menu` VALUES (91, b'0', '账号管理', 'mnt/account/index', 90, 100, 'user', 'mnt/account', b'0', b'0', 'Account', '2019-11-09 10:32:05', 'serverAccount:list', 1);
|
||||
INSERT INTO `menu` VALUES (92, b'0', '服务器管理', 'mnt/serverDeploy/index', 90, 200, 'codeConsole', 'mnt/serverDeploy', b'0', b'0', 'ServerDeploy', '2019-11-10 10:29:25', 'serverDeploy:list', 1);
|
||||
INSERT INTO `menu` VALUES (93, b'0', '应用管理', 'mnt/app/index', 90, 300, 'java', 'mnt/app', b'0', b'0', 'App', '2019-11-10 11:05:16', 'app:list', 1);
|
||||
INSERT INTO `menu` VALUES (94, b'0', '部署管理', 'mnt/deploy/index', 90, 400, 'ipvisits', 'mnt/deploy', b'0', b'0', 'Deploy', '2019-11-10 15:56:55', 'deploy:list', 1);
|
||||
INSERT INTO `menu` VALUES (97, b'0', '部署备份管理', 'mnt/deployHistory/index', 90, 500, 'ipvisits', 'mnt/deployHistory', b'0', b'0', 'DeployHistory', '2019-11-10 16:49:44', 'deployHistory:list', 1);
|
||||
INSERT INTO `menu` VALUES (98, b'0', '数据库管理', 'mnt/database/index', 90, 600, 'zujian', 'mnt/database', b'0', b'0', 'Database', '2019-11-10 20:40:04', 'database:list', 1);
|
||||
INSERT INTO `menu` VALUES (99, b'0', '账户新增', '', 91, 1, '', '', b'0', b'0', '', '2019-11-16 14:03:05', 'serverAccount:add', 2);
|
||||
INSERT INTO `menu` VALUES (100, b'0', '账户编辑', '', 91, 2, '', '', b'0', b'0', '', '2019-11-16 14:06:26', 'serverAccount:edit', 2);
|
||||
INSERT INTO `menu` VALUES (101, b'0', '账户删除', '', 91, 3, '', '', b'0', b'0', '', '2019-11-16 14:06:45', 'serverAccount:del', 2);
|
||||
INSERT INTO `menu` VALUES (102, b'0', '删除', '', 97, 999, '', '', b'0', b'0', '', '2019-11-17 09:32:48', 'deployHistory:del', 2);
|
||||
INSERT INTO `menu` VALUES (103, b'0', '服务器新增', '', 92, 999, '', '', b'0', b'0', '', '2019-11-17 11:08:33', 'serverDeploy:add', 2);
|
||||
INSERT INTO `menu` VALUES (104, b'0', '服务器编辑', '', 92, 999, '', '', b'0', b'0', '', '2019-11-17 11:08:57', 'serverDeploy:edit', 2);
|
||||
INSERT INTO `menu` VALUES (105, b'0', '服务器删除', '', 92, 999, '', '', b'0', b'0', '', '2019-11-17 11:09:15', 'serverDeploy:del', 2);
|
||||
INSERT INTO `menu` VALUES (106, b'0', '应用新增', '', 93, 999, '', '', b'0', b'0', '', '2019-11-17 11:10:03', 'app:add', 2);
|
||||
INSERT INTO `menu` VALUES (107, b'0', '应用编辑', '', 93, 999, '', '', b'0', b'0', '', '2019-11-17 11:10:28', 'app:edit', 2);
|
||||
INSERT INTO `menu` VALUES (108, b'0', '应用删除', '', 93, 999, '', '', b'0', b'0', '', '2019-11-17 11:10:55', 'app:del', 2);
|
||||
INSERT INTO `menu` VALUES (109, b'0', '部署新增', '', 94, 999, '', '', b'0', b'0', '', '2019-11-17 11:11:22', 'deploy:add', 2);
|
||||
INSERT INTO `menu` VALUES (110, b'0', '部署编辑', '', 94, 999, '', '', b'0', b'0', '', '2019-11-17 11:11:41', 'deploy:edit', 2);
|
||||
INSERT INTO `menu` VALUES (111, b'0', '部署删除', '', 94, 999, '', '', b'0', b'0', '', '2019-11-17 11:12:01', 'deploy:del', 2);
|
||||
INSERT INTO `menu` VALUES (112, b'0', '数据库新增', '', 98, 999, '', '', b'0', b'0', '', '2019-11-17 11:12:43', 'database:add', 2);
|
||||
INSERT INTO `menu` VALUES (113, b'0', '数据库编辑', '', 98, 999, '', '', b'0', b'0', '', '2019-11-17 11:12:58', 'database:edit', 2);
|
||||
INSERT INTO `menu` VALUES (114, b'0', '数据库删除', '', 98, 999, '', '', b'0', b'0', '', '2019-11-17 11:13:14', 'database:del', 2);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_app
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_app`;
|
||||
CREATE TABLE `mnt_app` (
|
||||
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '应用编号',
|
||||
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用名称',
|
||||
`upload_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上传目录',
|
||||
`deploy_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署路径',
|
||||
`backup_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备份路径',
|
||||
`port` int(255) NULL DEFAULT NULL COMMENT '应用端口',
|
||||
`start_script` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '启动脚本',
|
||||
`deploy_script` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署脚本',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of mnt_app
|
||||
-- ----------------------------
|
||||
INSERT INTO `mnt_app` VALUES ('04a27b0a-6570-4fac-88be-abad072028ac', 'eladmin-monitor-2.2.jar', '/opt/upload', '/opt/monitor', '/opt/backup', 8777, 'cd /opt/monitor/\nnohup java -jar eladmin-monitor-2.2.jar >nohup.out 2>&1 &\n', 'mv /opt/upload/eladmin-monitor-2.2.jar /opt/monitor/\ncd /opt/monitor\nnohup java -jar eladmin-monitor-2.2.jar >nohup.out 2>&1 &\n');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_database
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_database`;
|
||||
CREATE TABLE `mnt_database` (
|
||||
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号',
|
||||
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
|
||||
`jdbc_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'jdbc连接',
|
||||
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号',
|
||||
`pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_deploy
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_deploy`;
|
||||
CREATE TABLE `mnt_deploy` (
|
||||
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号',
|
||||
`app_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用编号',
|
||||
`ip` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP地址',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_deploy_history
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_deploy_history`;
|
||||
CREATE TABLE `mnt_deploy_history` (
|
||||
`id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号',
|
||||
`app_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '应用名称',
|
||||
`deploy_date` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部署日期',
|
||||
`deploy_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部署用户',
|
||||
`ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '服务器IP',
|
||||
`deploy_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部署编号',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_server
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_server`;
|
||||
CREATE TABLE `mnt_server` (
|
||||
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'IP地址',
|
||||
`account_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账号编号',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mnt_server_account
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mnt_server_account`;
|
||||
CREATE TABLE `mnt_server_account` (
|
||||
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '编号',
|
||||
`account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账户',
|
||||
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
|
||||
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
Loading…
Reference in New Issue