package com.wgcloud.controller; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.github.pagehelper.PageInfo; import com.wgcloud.config.CommonConfig; import com.wgcloud.dto.MessageDto; import com.wgcloud.entity.AccountInfo; import com.wgcloud.entity.DbInfo; import com.wgcloud.service.DbInfoService; import com.wgcloud.service.DbTableService; import com.wgcloud.service.LogInfoService; import com.wgcloud.util.*; import com.wgcloud.util.jdbc.ConnectionUtil; import com.wgcloud.util.jdbc.RDSConnection; import com.wgcloud.util.staticvar.StaticKeys; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @version v3.3 * @ClassName:DbInfoController.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: 数据源配置 * @Copyright: 2019-2021 wgcloud. All rights reserved. */ @Controller @RequestMapping("/dbInfo") public class DbInfoController { private static final Logger logger = LoggerFactory.getLogger(DbInfoController.class); @Resource private DbInfoService dbInfoService; @Resource private DbTableService dbTableService; @Resource private LogInfoService logInfoService; @Resource private ConnectionUtil connectionUtil; @Resource private RedisUtil redisUtil; @Resource private MongoDbUtil mongoDbUtil; @Autowired private CommonConfig commonConfig; @Autowired private TokenUtils tokenUtils; /** * agent查询监控数据源列表 * * @param paramBean * @return */ @ResponseBody @RequestMapping(value = "agentList") public String agentList(@RequestBody String paramBean) { JSONObject agentJsonObject = (JSONObject) JSONUtil.parse(paramBean); if (!tokenUtils.checkAgentToken(agentJsonObject)) { logger.error(StaticKeys.TOKEN_ERROR); return ResDataUtils.resetErrorJson(StaticKeys.TOKEN_ERROR); } Map params = new HashMap(); try { if (null != agentJsonObject.get("dbInfoNames") && !StringUtils.isEmpty(agentJsonObject.get("dbInfoNames").toString())) { params.put("dbInfoNames", agentJsonObject.get("dbInfoNames").toString().split(",")); } List dbInfoList = dbInfoService.selectAllByParams(params); //数据源信息加密处理 begin for (DbInfo dbInfo : dbInfoList) { dbInfo.setUserName(DESUtil.encryption(dbInfo.getUserName())); dbInfo.setDbUrl(DESUtil.encryption(dbInfo.getDbUrl())); dbInfo.setPasswd(DESUtil.encryption(dbInfo.getPasswd())); } //数据源信息加密处理 end //将server-backup节点处理的数据源,标记起来,server节点就不监控这些数据源了 ServerBackupUtil.cacheSaveDbInfoId(dbInfoList); return ResDataUtils.resetSuccessJson(dbInfoList); } catch (Exception e) { logger.error("agent获取监控数据源信息错误", e); logInfoService.save("agent获取监控数据源信息错误", e.toString(), StaticKeys.LOG_XTCZ); return ResDataUtils.resetErrorJson(e.toString()); } } /** * 测试数据库连接 * * @param model * @param request * @return */ @ResponseBody @RequestMapping(value = "validate") public String valdateDbInfo(DbInfo DbInfo, Model model, HttpServletRequest request) { MessageDto messageDto = new MessageDto(); try { if (RDSConnection.KEY_REDIS.equals(DbInfo.getDbType())) { String pong = redisUtil.connectRedis(DbInfo); if (StringUtils.isEmpty(pong)) { messageDto.setCode("1"); messageDto.setMsg("连接Redis错误,请检查参数是否正确。请在系统信息里查看日志"); } else { messageDto.setCode("0"); messageDto.setMsg("连接Redis成功"); } } else if (RDSConnection.KEY_MONGODB.equals(DbInfo.getDbType())) { mongoDbUtil.connectMongoDb(DbInfo); if (StaticKeys.DOWN_STATE.equals(DbInfo.getDbState())) { messageDto.setCode("1"); messageDto.setMsg("连接MongoDb错误,请检查参数是否正确。请在系统信息里查看日志"); } else { messageDto.setCode("0"); messageDto.setMsg("连接MongoDb成功"); } } else { JdbcTemplate JdbcTemplate = connectionUtil.getJdbcTemplate(DbInfo); if (JdbcTemplate == null) { messageDto.setCode("1"); messageDto.setMsg("连接数据库错误,请检查参数是否正确。请在系统信息里查看日志"); } else { messageDto.setCode("0"); messageDto.setMsg("连接数据库成功"); } } } catch (Exception e) { logger.error("测试数据源信息错误", e); logInfoService.save("测试数据源信息错误", e.toString(), StaticKeys.LOG_XTCZ); } return JSONUtil.toJsonStr(messageDto); } /** * 根据条件查询列表 * * @param model * @param request * @return */ @RequestMapping(value = "list") public String dbInfoList(DbInfo DbInfo, Model model, HttpServletRequest request) { Map params = new HashMap(); try { StringBuffer url = new StringBuffer(); if (!StringUtils.isEmpty(DbInfo.getAccount())) { params.put("account", DbInfo.getAccount()); url.append("&account=").append(DbInfo.getAccount()); } //校验是否需要添加过滤用户查询条件 HostUtil.addAccountquery(request, params); PageInfo pageInfo = dbInfoService.selectByParams(params, DbInfo.getPage(), DbInfo.getPageSize()); //设置累积告警次数 begin if (StaticKeys.TRUE_VAL.equals(commonConfig.getShowWarnCount())) { Map paramsLogInfo = new HashMap(); for (DbInfo dbInfo : pageInfo.getList()) { String warnQueryWd = "数据源连接失败告警:" + dbInfo.getAliasName(); paramsLogInfo.clear(); paramsLogInfo.put("hostname", warnQueryWd); dbInfo.setWarnCount(logInfoService.countByParams(paramsLogInfo)); dbInfo.setWarnQueryWd(warnQueryWd); } } //设置累积告警次数 end //设置数据库logo dbInfoService.dbAddLogo(pageInfo.getList()); PageUtil.initPageNumber(pageInfo, model); //设置用户列表 HostUtil.addAccountListModel(model); model.addAttribute("pageUrl", "/dbInfo/list?1=1" + url.toString()); model.addAttribute("page", pageInfo); } catch (Exception e) { logger.error("查询数据源信息错误", e); logInfoService.save("查询数据源信息错误", e.toString(), StaticKeys.LOG_XTCZ); } return "mysql/dbList"; } /** * 添加 * * @param model * @param request * @return */ @RequestMapping(value = "edit") public String edit(Model model, HttpServletRequest request) { String errorMsg = "添加数据源错误"; String id = request.getParameter("id"); DbInfo dbInfo = new DbInfo(); try { if (StringUtils.isEmpty(id)) { model.addAttribute("dbInfo", dbInfo); return "mysql/addDb"; } dbInfo = dbInfoService.selectById(id); model.addAttribute("dbInfo", dbInfo); } catch (Exception e) { logger.error(errorMsg, e); logInfoService.save(errorMsg, e.toString(), StaticKeys.LOG_XTCZ); } return "mysql/addDb"; } /** * 保存数据源信息 * * @param DbInfo * @param model * @param request * @return */ @RequestMapping(value = "save") public String saveDbInfo(DbInfo DbInfo, Model model, HttpServletRequest request) { try { if (StringUtils.isEmpty(DbInfo.getId())) { AccountInfo accountInfo = HostUtil.getAccountByRequest(request); if (null != accountInfo) { if (!StaticKeys.ROLE_ADMIN.equals(accountInfo.getRole())) { DbInfo.setAccount(accountInfo.getAccount()); } } dbInfoService.save(DbInfo); dbInfoService.saveLog(request, StaticKeys.LOG_ADD, DbInfo); } else { dbInfoService.updateById(DbInfo); dbInfoService.saveLog(request, StaticKeys.LOG_UPDATE, DbInfo); } } catch (Exception e) { logger.error("保存数据源错误", e); logInfoService.save("保存数据源错误", e.toString(), StaticKeys.LOG_XTCZ); } return "redirect:/dbInfo/list?msg=save"; } /** * 删除数据源 * * @param model * @param request * @param redirectAttributes * @return */ @RequestMapping(value = "del") public String delete(Model model, HttpServletRequest request, RedirectAttributes redirectAttributes) { String errorMsg = "删除数据源信息错误"; DbInfo DbInfo = new DbInfo(); try { if (!StringUtils.isEmpty(request.getParameter("id"))) { String[] ids = request.getParameter("id").split(","); for (String id : ids) { DbInfo = dbInfoService.selectById(id); dbInfoService.saveLog(request, StaticKeys.LOG_DEL, DbInfo); dbTableService.deleteByDbInfoId(DbInfo.getId()); } dbInfoService.deleteById(ids); } } catch (Exception e) { logger.error(errorMsg, e); logInfoService.save(errorMsg, e.toString(), StaticKeys.LOG_XTCZ); } return "redirect:/dbInfo/list?msg=del"; } }