From 7e3ca4a5ed195bd3c2f8bde57774d050f3c5eb3d Mon Sep 17 00:00:00 2001 From: sunyongjie Date: Fri, 8 Mar 2024 08:22:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E9=80=82=E9=85=8DPM8204raid?= =?UTF-8?q?=E5=8D=A1=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=B7=B2=E7=9F=A5=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iboot/base/api/service/DeviceService.java | 3 +- .../iboot/base/api/service/InnerService.java | 2 - .../iboot/base/api/service/OuterService.java | 4 +- .../iboot/base/api/util/CommonUtil.java | 38 ++- .../auth/controller/SysLoginController.java | 4 +- .../auth/service/impl/AuthServiceImpl.java | 116 +++---- .../application/business/InnerController.java | 11 - .../application/business/OuterController.java | 13 +- .../application/constant/CommonConstant.java | 7 +- .../constant/ienum/AuthExceptionEnum.java | 10 +- .../filter/JwtAuthenticationTokenFilter.java | 11 +- .../user/enums/SysUserExceptionEnum.java | 14 +- .../user/mapper/SysUserMapper.java | 11 + .../user/service/SysUserService.java | 5 +- .../user/service/impl/SysUserServiceImpl.java | 128 +++++++- .../src/main/resources/application.properties | 5 +- .../main/resources/mapper/SysUserMapper.xml | 31 +- .../base/core/impl/DeviceServiceImpl.java | 288 +++++++----------- .../core/impl/IBootTemplateServiceImpl.java | 3 + .../base/core/impl/InnerServiceImpl.java | 5 - .../base/core/impl/OuterServiceImpl.java | 8 +- .../OsExplorerTemplateCreateServiceImpl.java | 3 +- .../RaidTemplateCreateServiceImpl.java | 11 +- 23 files changed, 399 insertions(+), 332 deletions(-) diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/DeviceService.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/DeviceService.java index 150fece..261be6d 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/DeviceService.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/DeviceService.java @@ -8,7 +8,6 @@ import com.inspur.ispim.cosmos.iboot.base.api.entity.DeviceEntity; import java.util.List; public interface DeviceService { - List getAll(); Page deviceList(DeviceQueryBean queryBean); @@ -18,7 +17,7 @@ public interface DeviceService { ResultBean deviceDelete(DeviceQueryBean queryBean); - ResultBean devicePowerManage(DeviceQueryBean queryBean, String mode); + ResultBean devicePowerManage(DeviceQueryBean queryBean, DevicePowerEnum mode); ResultBean deviceRefresh(DeviceQueryBean queryBean); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/InnerService.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/InnerService.java index 2b57067..20ce215 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/InnerService.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/InnerService.java @@ -12,8 +12,6 @@ import com.inspur.ispim.cosmos.iboot.base.api.entity.IBootTaskHostLogEntity; */ public interface InnerService { - ApiResult getAll(); - /** * 接受任务状态接口说明, * 必传项:id必传,TaskHostStatusEnum必传,需要修改的状态, diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/OuterService.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/OuterService.java index 5a23676..cf75e21 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/OuterService.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/service/OuterService.java @@ -6,6 +6,7 @@ import com.inspur.cdc.commons.lang.web.Page; import com.inspur.ispim.cosmos.iboot.base.api.bean.IBootTemplateQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.ResultBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceDiskCloneBean; +import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DevicePowerEnum; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.ServerManageNetworkBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.image.*; @@ -28,7 +29,6 @@ import java.util.Map; * 面向用户的服务 */ public interface OuterService { - ApiResult getAllDevices(); ResultBean deviceList(DeviceQueryBean queryBean); @@ -38,7 +38,7 @@ public interface OuterService { ResultBean deviceDelete(DeviceQueryBean queryBean); - ResultBean devicePowerManage(DeviceQueryBean queryBean, String mode); + ResultBean devicePowerManage(DeviceQueryBean queryBean, DevicePowerEnum mode); ResultBean deviceRefresh(DeviceQueryBean queryBean); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/util/CommonUtil.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/util/CommonUtil.java index 9e52ed5..3f73c21 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/util/CommonUtil.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-api/src/main/java/com/inspur/ispim/cosmos/iboot/base/api/util/CommonUtil.java @@ -3,6 +3,7 @@ package com.inspur.ispim.cosmos.iboot.base.api.util; import cn.hutool.core.util.StrUtil; import com.inspur.cdc.commons.lang.deployUtil.utils.OperationSystemUtil; +import com.inspur.ispim.cosmos.iboot.base.api.bean.ExecuteResultBean; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.StringUtils; @@ -345,12 +346,6 @@ public class CommonUtil { return matcher.matches(); } - public static void main(String[] args) { - String version = "06.00.03_Standard_20220128.hpm"; - String newversion = isfmformatVersion(version); - String ss = ""; - } - /** * 获取iboot dhcp ip */ @@ -399,4 +394,35 @@ public class CommonUtil { } return null; } + + public static ExecuteResultBean executeWindowsCommand(String command) { + ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command); + builder.directory(new File("C:\\")); + return executeCommand(builder); + } + + public static ExecuteResultBean executeLinuxCommand(String command) { + ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", command); + builder.redirectErrorStream(true); + return executeCommand(builder); + } + + private static ExecuteResultBean executeCommand(ProcessBuilder builder) { + try { + Process process = builder.start(); + int exitValue = process.waitFor(); + LinkedList result = new LinkedList<>(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + String line = null; + while ((line = reader.readLine()) != null) { + result.add(line); + } + log.info(result.toString()); + } + return new ExecuteResultBean(exitValue, result); + } catch (IOException | InterruptedException e) { + log.error(e.getMessage()); + return new ExecuteResultBean(-1, Collections.singletonList(e.getMessage())); + } + } } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/controller/SysLoginController.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/controller/SysLoginController.java index 633b1bb..c3e8960 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/controller/SysLoginController.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/controller/SysLoginController.java @@ -22,7 +22,7 @@ public class SysLoginController { String password = dict.getStr("password"); if (StrUtil.isNotEmpty(subject) && StrUtil.isNotEmpty(account) && StrUtil.isEmpty(password)) { String[] subjects = subject.split(","); - for (String sub : subjects) { + for (String sub: subjects) { if (sub.contains("CN=")) { account = sub.substring(sub.indexOf("=") + 1); certAuth = true; @@ -34,7 +34,7 @@ public class SysLoginController { return new SuccessResponseData(token); } - @GetMapping("/logout") + @GetMapping("/iboot/sys/logout") public SuccessResponseData logout() { authService.logout(); return new SuccessResponseData(true); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/service/impl/AuthServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/service/impl/AuthServiceImpl.java index f233b95..27d6f81 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/service/impl/AuthServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/auth/service/impl/AuthServiceImpl.java @@ -2,6 +2,8 @@ package com.inspur.ispim.cosmos.iboot.base.application.auth.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.inspur.ispim.cosmos.iboot.base.application.auth.bean.JwtPayLoad; @@ -17,7 +19,6 @@ import com.inspur.ispim.cosmos.iboot.base.application.auth.util.JwtTokenUtil; import com.inspur.ispim.cosmos.iboot.base.application.cache.UserCache; import com.inspur.ispim.cosmos.iboot.base.application.constant.CommonConstant; import com.inspur.ispim.cosmos.iboot.base.application.constant.Constant; -import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AdminTypeEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AuthExceptionEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.CommonStatusEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.ServerExceptionEnum; @@ -68,21 +69,26 @@ public class AuthServiceImpl implements AuthService, UserDetailsService { } } SysUser sysUser = sysUserService.getUserByCount(account); - - //用户不存在,账号或密码错误 + // 用户不存在,账号或密码错误 if (ObjectUtil.isEmpty(sysUser)) { -// throw new AuthException(AuthExceptionEnum.NO_LOGIN_USER); - //用户登录时对每个登录错误尝试发出相同的报错信息(比如:提示"输入的用户名或者密码错误!"),不能提示具体的错误原因(比如:口令必须是8位、用户不存在、密码错误等) -// Integer loginFailCount = sysUser.getLoginFailCount(); + // 用户登录时对每个登录错误尝试发出相同的报错信息(比如:提示"输入的用户名或者密码错误!"),不能提示具体的错误原因(比如:口令必须是8位、用户不存在、密码错误等) throw new AuthException(AuthExceptionEnum.ACCOUNT_PWD_ERROR); } - + // 用户锁定,判断是否解锁 + if (sysUser.getStatus() == 1) { + if (ObjectUtil.isNotEmpty(sysUser.getFirstLoginFailTime()) && DateUtil.between(sysUser.getFirstLoginFailTime(), DateUtil.date().toJdkDate(), DateUnit.SECOND) <= CommonConstant.USER_LOCKED_TIME) { + throw new AuthException(AuthExceptionEnum.USER_LOCKED); + } else { + // 解锁用户 + sysUserService.unlockUser(sysUser); + } + } if (!certAuth) { String passwordBcrypt = sysUser.getPassword(); - //验证账号密码是否正确 + // 验证账号密码是否正确 if (ObjectUtil.isEmpty(passwordBcrypt) || !BCrypt.checkpw(password, passwordBcrypt)) { - //判断用户是否到达锁定逻辑 - this.judgeUserLoginCount(sysUser); + // 判断用户是否到达锁定逻辑 + sysUserService.judgeUserLoginCount(sysUser); throw new AuthException(AuthExceptionEnum.ACCOUNT_PWD_ERROR); } } @@ -139,22 +145,20 @@ public class AuthServiceImpl implements AuthService, UserDetailsService { JwtPayLoad jwtPayLoad = null; HttpServletRequest request = HttpServletUtil.getRequest(); if (ObjectUtil.isNotNull(request)) { - //获取token + // 获取token String token = this.getTokenFromRequest(request); //如果token为空直接返回 if (ObjectUtil.isEmpty(token)) { return; } - try { - //校验token,错误则抛异常,待确定 + // 校验token,错误则抛异常,待确定 this.checkToken(token); - //根据token获取JwtPayLoad部分 + // 根据token获取JwtPayLoad部分 jwtPayLoad = JwtTokenUtil.getJwtPayLoad(token); } catch (Exception e) { LOGGER.error("logout Exception", e); } - if (ObjectUtil.isNotEmpty(jwtPayLoad)) { //获取缓存的key String loginUserCacheKey = jwtPayLoad.getUuid(); @@ -201,13 +205,13 @@ public class AuthServiceImpl implements AuthService, UserDetailsService { private void clearUser(String loginUserKey, String account, String token) { try { if (StrUtil.isNotEmpty(loginUserKey)) { - //获取缓存的用户 + // 获取缓存的用户 Object cacheObject = userCache.get(loginUserKey); - //如果缓存的用户存在,清除会话,否则表示该会话信息已失效,不执行任何操作 + // 如果缓存的用户存在,清除会话,否则表示该会话信息已失效,不执行任何操作 if (ObjectUtil.isNotEmpty(cacheObject)) { - //清除登录会话 + // 清除登录会话 userCache.remove(loginUserKey); - //创建退出登录日志 + // 创建退出登录日志 } } } catch (Exception e) { @@ -217,43 +221,36 @@ public class AuthServiceImpl implements AuthService, UserDetailsService { private String doLogin(SysUser sysUser) { Integer sysUserStatus = sysUser.getStatus(); - //验证账号是否被冻结 + // 验证账号是否被冻结 if (CommonStatusEnum.DISABLE.getCode().equals(sysUserStatus)) { throw new AuthException(AuthExceptionEnum.ACCOUNT_FREEZE_ERROR); } - - //构造SysLoginUser + // 构造SysLoginUser SysLoginUser sysLoginUser = this.genSysLoginUser(sysUser); - - //构造jwtPayLoad + // 构造jwtPayLoad JwtPayLoad jwtPayLoad = new JwtPayLoad(sysUser.getId(), sysUser.getAccount()); - - //生成token + // 生成token String token = JwtTokenUtil.generateToken(jwtPayLoad); - - //缓存token与登录用户信息对应, 默认2个小时 + // 缓存token与登录用户信息对应, 默认2个小时 this.cacheLoginUser(jwtPayLoad, sysLoginUser, token); - - //设置最后登录ip和时间 + // 设置最后登录ip和时间 sysUser.setLastLoginIp(IpAddressUtil.getIp(HttpServletUtil.getRequest())); sysUser.setLastLoginTime(DateTime.now()); - - //更新用户登录信息 + // 更新失败次数 + sysUser.setLoginFailCount(0); + // 更新用户登录信息 sysUserService.updateById(sysUser); - - //登录成功,设置SpringSecurityContext上下文,方便获取用户 + // 登录成功,设置SpringSecurityContext上下文,方便获取用户 this.setSpringSecurityContextAuthentication(sysLoginUser); - - //如果开启限制单用户登陆,则踢掉原来的用户 + // 如果开启限制单用户登陆,则踢掉原来的用户 Boolean enableSingleLogin = ConstantContextHolder.getEnableSingleLogin(); if (enableSingleLogin) { - //获取所有的登陆用户 + // 获取所有的登陆用户 Map allLoginUsers = userCache.getAllKeyValues(); for (Map.Entry loginedUserEntry : allLoginUsers.entrySet()) { String loginedUserKey = loginedUserEntry.getKey(); SysLoginUser loginedUser = loginedUserEntry.getValue(); - - //如果账号名称相同,并且redis缓存key和刚刚生成的用户的uuid不一样,则清除以前登录的 + // 如果账号名称相同,并且redis缓存key和刚刚生成的用户的uuid不一样,则清除以前登录的 if (loginedUser.getName().equals(sysUser.getName()) && !loginedUserKey.equals(jwtPayLoad.getUuid())) { this.clearUser(loginedUserKey, loginedUser.getAccount(), token); @@ -277,45 +274,4 @@ public class AuthServiceImpl implements AuthService, UserDetailsService { } } - /** - * 判断用户登录失败次数, 先获取失败次数若大于5次则将该用户锁定 - * - * @param sysUser 用户 - * @return 结果 true 在范围内 - */ - private void judgeUserLoginCount(SysUser sysUser) { - - //不支持锁定超级管理员 - if (AdminTypeEnum.SUPER_ADMIN.getCode().equals(sysUser.getAdminType())) { - return; - } - String account = sysUser.getAccount(); - - //判断是否连续登录失败, 主要判断第一次登录时间与当前时间比较 - if (isInLoginFailTimeScope(sysUser)) { - log.info(">>> [{}] 用户符合锁定条件, 已被锁定!", account); - throw new AuthException(AuthExceptionEnum.USER_LOCKED); - } else { - log.info(">>> [{}] 用户不符合连续时间内登录失败次数条件, 已清除锁定标志!", account); - } - } - - - /** - * 判断用户登录失败时间在规定范围内 - * - * @param sysUser 用户 - * @return 结果 true 在范围内 - */ - private boolean isInLoginFailTimeScope(SysUser sysUser) { - if (ObjectUtil.isNull(sysUser.getFirstLoginFailTime())) { - return false; - } - return false; - //todo判断是否联系登录失败.先跳过 -// String account = sysUser.getAccount(); -// String lastLoginFailTimeStr = ""; -// Date lastLoginFailTime = DateUtil.parse(lastLoginFailTimeStr); -// return DateUtil.between(lastLoginFailTime, DateUtil.date().toJdkDate(), DateUnit.SECOND) <= CommonConstant.LOGIN_FAILED_CYCLE; - } } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/InnerController.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/InnerController.java index d95f72c..002ff26 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/InnerController.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/InnerController.java @@ -32,17 +32,6 @@ public class InnerController { @Autowired private InnerService innerService; - @RequestMapping(value = "/all", method = RequestMethod.GET) - public ApiResult getDeviceList(ServletRequest req) { - try { - log.error("getting all device list " + req.getRemoteAddr()); - return innerService.getAll(); - } catch (Exception e) { - log.error(e.getMessage(), e); - return ApiResult.fail(); - } - } - @RequestMapping(value = "/taskStatusChange", method = RequestMethod.POST) public ApiResult acceptStatusChangeBean(@RequestBody IBootTaskHostEntity iBootTaskHostEntity) { try { diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/OuterController.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/OuterController.java index e1de418..ca2a8d0 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/OuterController.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/business/OuterController.java @@ -9,6 +9,7 @@ import com.inspur.cdc.commons.lang.web.ApiResult; import com.inspur.ispim.cosmos.iboot.base.api.bean.IBootTemplateQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.ResultBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceDiskCloneBean; +import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DevicePowerEnum; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.ServerManageNetworkBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.image.Chunk; @@ -59,12 +60,6 @@ public class OuterController { @Autowired private OuterService outerService; - @Operation(summary = "查询所有设备列表", description = "查询所有设备列表") - @RequestMapping(value = "/all-device", method = RequestMethod.GET) - public ApiResult getByCondition() { - return outerService.getAllDevices(); - } - @Operation(summary = "设备列表", description = "设备列表") @PostMapping("/device/list") public ApiResult deviceList(@RequestBody DeviceQueryBean deviceQueryBean) { @@ -133,7 +128,7 @@ public class OuterController { @Operation(summary = "设备电源管理-关机", description = "设备电源管理-关机") @PostMapping("/device/power/{mode}") - public ApiResult devicePowerManage(@PathVariable("mode") String mode, @RequestBody DeviceQueryBean deviceQueryBean) { + public ApiResult devicePowerManage(@PathVariable("mode") DevicePowerEnum mode, @RequestBody DeviceQueryBean deviceQueryBean) { ResultBean resultBean = outerService.devicePowerManage(deviceQueryBean, mode); return resultBean.isFlag() ? ApiResult.success(mode) : ApiResult.fail(resultBean.getMessage()); } @@ -168,6 +163,10 @@ public class OuterController { @PostMapping(value = "/device/template/upload") public ApiResult deviceTemplateUpload(@RequestBody MultipartFile file) { try { + String filename = file.getOriginalFilename(); + if (StringUtils.isBlank(filename) || !filename.endsWith(".xlsx")) { + return ApiResult.fail(Languages.getString("cosmos.iboot.device.template.file.error")); + } byte[] content = file.getBytes(); if (content.length >> 20 > 1) { return ApiResult.fail(Languages.getString("iboot.device.file.oversize", 1)); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/CommonConstant.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/CommonConstant.java index 9c0aa0a..507729f 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/CommonConstant.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/CommonConstant.java @@ -30,7 +30,7 @@ public interface CommonConstant { /** * 用户锁定时间,单位为秒 */ - long USER_LOCKED_TIME = 5 * 60L; + long USER_LOCKED_TIME = 30 * 60L; /** * 用户锁定时间,单位为秒 @@ -42,4 +42,9 @@ public interface CommonConstant { */ int MAX_LOGIN_FAILED_LOCK_COUNT = 5; + /** + * 连续失败间隔 + */ + long FAIL_TIME_INTERVAL = 5 * 60L; + } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/ienum/AuthExceptionEnum.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/ienum/AuthExceptionEnum.java index 9dc61ff..927c071 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/ienum/AuthExceptionEnum.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/constant/ienum/AuthExceptionEnum.java @@ -14,27 +14,27 @@ public enum AuthExceptionEnum implements AbstractBaseExceptionEnum { /** * 账号密码错误 */ - ACCOUNT_PWD_ERROR(2, "用户名或密码错误,失败" + CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT + "次后会被锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), + ACCOUNT_PWD_ERROR(1, "用户名或密码错误,失败" + CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT + "次后会被锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), /** * 请求token错误 */ - REQUEST_TOKEN_ERROR(401, "请求token错误"), + REQUEST_TOKEN_ERROR(1, "请求token错误"), /** * 账号被冻结 */ - ACCOUNT_FREEZE_ERROR(7, "账号被冻结,请联系管理员"), + ACCOUNT_FREEZE_ERROR(1, "账号被冻结,请联系管理员"), /** * 失败次数过多锁定 */ - USER_LOCKED(10, "用户名或密码错误,失败" + CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT + "次后会被锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), + USER_LOCKED(1, "用户已锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), /** * 解密错误 */ - DECRYPT_ERROR(14, "用户名密码解密错误"); + DECRYPT_ERROR(1, "用户名密码解密错误"); private final Integer code; diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/filter/JwtAuthenticationTokenFilter.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/filter/JwtAuthenticationTokenFilter.java index 17620a2..be18cf8 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/filter/JwtAuthenticationTokenFilter.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/filter/JwtAuthenticationTokenFilter.java @@ -6,6 +6,7 @@ import com.inspur.ispim.cosmos.iboot.base.application.auth.bean.SysLoginUser; import com.inspur.ispim.cosmos.iboot.base.application.auth.exception.AuthException; import com.inspur.ispim.cosmos.iboot.base.application.auth.service.AuthService; import com.inspur.ispim.cosmos.iboot.base.application.auth.util.ResponseUtil; +import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AuthExceptionEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.ServerExceptionEnum; import jakarta.annotation.Resource; import jakarta.servlet.FilterChain; @@ -42,18 +43,20 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { String token = authService.getTokenFromRequest(request); if (StrUtil.isNotEmpty(token)) { sysLoginUser = authService.getLoginUserByToken(token); + if (ObjectUtil.isEmpty(sysLoginUser)) { + ResponseUtil.responseExceptionError(response, AuthExceptionEnum.REQUEST_TOKEN_ERROR.getCode(), AuthExceptionEnum.REQUEST_TOKEN_ERROR.getMessage(), ""); + return; + } } } catch (AuthException ae) { - //token过期或者token失效的情况,响应给前端 + // token过期或者token失效的情况,响应给前端 ResponseUtil.responseExceptionError(response, ae.getCode(), ae.getErrorMessage(), ""); return; } - // 2.如果当前登录用户不为空,就设置spring security上下文 - if (ObjectUtil.isNotNull(sysLoginUser)) { + if (ObjectUtil.isNotEmpty(sysLoginUser)) { authService.setSpringSecurityContextAuthentication(sysLoginUser); } - // 3.其他情况放开过滤 filterChain.doFilter(request, response); } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/enums/SysUserExceptionEnum.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/enums/SysUserExceptionEnum.java index 0cd947f..ceded30 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/enums/SysUserExceptionEnum.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/enums/SysUserExceptionEnum.java @@ -1,6 +1,7 @@ package com.inspur.ispim.cosmos.iboot.base.application.user.enums; +import com.inspur.ispim.cosmos.iboot.base.application.constant.CommonConstant; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AbstractBaseExceptionEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.ExpEnumCodeFactory; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.ExpEnumType; @@ -17,23 +18,28 @@ public enum SysUserExceptionEnum implements AbstractBaseExceptionEnum { /** * 原密码错误 */ - USER_PWD_ERROR(3, "原密码错误,请检查!"), + USER_PWD_ERROR(1, "原密码错误,请检查!" + CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT + "次后会被锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), + + /** + * + */ + USER_PWD_LOCKED(1, "用户已锁定," + CommonConstant.USER_LOCKED_TIME_MIN + "分钟后解锁"), /** * 新密码与原密码相同 */ - USER_PWD_REPEAT(4, "新密码与原密码相同,请检查!"), + USER_PWD_REPEAT(1, "新密码与原密码相同,请检查!"), /** * 新密码与用户名相同 */ - USER_PWD_REPEAT_ACCOUNT(7, "新密码与用户名相同,请重新设置"), + USER_PWD_REPEAT_ACCOUNT(1, "新密码与用户名相同,请重新设置"), /** * 新密码与用户名倒写相同 */ - USER_PWD_REPEAT_ACCOUNT_REVERSE(7, "新密码与用户名倒写相同,请重新设置"); + USER_PWD_REPEAT_ACCOUNT_REVERSE(1, "新密码与用户名倒写相同,请重新设置"); private final Integer code; diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/mapper/SysUserMapper.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/mapper/SysUserMapper.java index e70443e..810f1ba 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/mapper/SysUserMapper.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/mapper/SysUserMapper.java @@ -7,6 +7,8 @@ import com.inspur.ispim.cosmos.iboot.base.application.user.entity.SysUser; import com.inspur.ispim.cosmos.iboot.base.application.user.result.SysUserResult; import org.apache.ibatis.annotations.Param; +import java.util.Date; + public interface SysUserMapper extends BaseMapper { @@ -23,4 +25,13 @@ public interface SysUserMapper extends BaseMapper { // 客服对接 SysUser getOneVSysUserById(Long userId); + + void unlockUser(String account); + + void lockUser(String account); + + void resetFailCount(String account); + + void updateFailTime(@Param("account") String account, @Param("failTime") Date failTime); + } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/SysUserService.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/SysUserService.java index bfc394b..c1b7085 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/SysUserService.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/SysUserService.java @@ -8,7 +8,10 @@ public interface SysUserService extends IService { SysUser getUserByCount(String account); - void updatePwd(SysUserParam sysUserParam); + void unlockUser(SysUser sysUser); + + void judgeUserLoginCount(SysUser sysUser); + } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/impl/SysUserServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/impl/SysUserServiceImpl.java index 22a49e6..3dcd5c9 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/impl/SysUserServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/java/com/inspur/ispim/cosmos/iboot/base/application/user/service/impl/SysUserServiceImpl.java @@ -1,5 +1,7 @@ package com.inspur.ispim.cosmos.iboot.base.application.user.service.impl; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.BCrypt; @@ -7,13 +9,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.inspur.ispim.cosmos.iboot.base.application.auth.exception.AuthException; import com.inspur.ispim.cosmos.iboot.base.application.auth.exception.ServiceException; import com.inspur.ispim.cosmos.iboot.base.application.constant.Constant; +import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AdminTypeEnum; import com.inspur.ispim.cosmos.iboot.base.application.constant.ienum.AuthExceptionEnum; +import com.inspur.ispim.cosmos.iboot.base.application.constant.CommonConstant; import com.inspur.ispim.cosmos.iboot.base.application.user.entity.SysUser; import com.inspur.ispim.cosmos.iboot.base.application.user.enums.SysUserExceptionEnum; import com.inspur.ispim.cosmos.iboot.base.application.user.mapper.SysUserMapper; import com.inspur.ispim.cosmos.iboot.base.application.user.param.SysUserParam; import com.inspur.ispim.cosmos.iboot.base.application.user.service.SysUserService; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.crypto.Cipher; @@ -22,10 +28,11 @@ import java.security.interfaces.RSAPrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; import java.util.Date; + +@Slf4j @Service public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - @Resource private SysUserMapper sysUserMapper; @@ -55,7 +62,6 @@ public class SysUserServiceImpl extends ServiceImpl impl password = new String(decrypt(Base64.getDecoder().decode(password), Constant.PRIVATE_KEY)); sysUserParam.setPassword(password); } - if (StrUtil.isNotEmpty(newPassword)) { newPassword = new String(decrypt(Base64.getDecoder().decode(newPassword), Constant.PRIVATE_KEY)); sysUserParam.setNewPassword(newPassword); @@ -63,21 +69,31 @@ public class SysUserServiceImpl extends ServiceImpl impl } catch (Exception e) { throw new AuthException(AuthExceptionEnum.DECRYPT_ERROR); } - SysUser sysUser = this.querySysUser(sysUserParam); - //密码与用户名相同 + // 判断是否锁定 + // 用户锁定,判断是否解锁 + if (sysUser.getStatus() == 1) { + if (ObjectUtil.isNotEmpty(sysUser.getLastUpdPwdTime()) && DateUtil.between(sysUser.getLastUpdPwdTime(), DateUtil.date().toJdkDate(), DateUnit.SECOND) <= CommonConstant.USER_LOCKED_TIME) { + throw new AuthException(SysUserExceptionEnum.USER_PWD_LOCKED); + } else { + // 解锁用户 + sysUserMapper.unlockUser(sysUser.getAccount()); + } + } + // 密码与用户名相同 if (sysUserParam.getNewPassword().equals(sysUser.getAccount())) { throw new ServiceException(SysUserExceptionEnum.USER_PWD_REPEAT_ACCOUNT); } - //密码与用户名倒写相同 + // 密码与用户名倒写相同 if (sysUserParam.getNewPassword().equals(StrUtil.reverse(sysUser.getAccount()))) { throw new ServiceException(SysUserExceptionEnum.USER_PWD_REPEAT_ACCOUNT_REVERSE); } - //新密码与原密码相同 + // 新密码与原密码相同 if (sysUserParam.getNewPassword().equals(sysUserParam.getPassword())) { throw new ServiceException(SysUserExceptionEnum.USER_PWD_REPEAT); } if (!BCrypt.checkpw(sysUserParam.getPassword(), sysUser.getPassword())) { + this.judgeUserUpdateCount(sysUser); throw new ServiceException(SysUserExceptionEnum.USER_PWD_ERROR); } sysUser.setPassword(BCrypt.hashpw(sysUserParam.getNewPassword(), BCrypt.gensalt())); @@ -92,4 +108,104 @@ public class SysUserServiceImpl extends ServiceImpl impl } return sysUser; } + + public void unlockUser(SysUser sysUser) { + if (StringUtils.isNotEmpty(sysUser.getAccount())) { + sysUserMapper.unlockUser(sysUser.getAccount()); + sysUserMapper.resetFailCount(sysUser.getAccount()); + } + } + + /** + * 判断用户登录失败次数, 先获取失败次数若大于5次则将该用户锁定 + * + * @param sysUser 用户 + * @return 结果 true 在范围内 + */ + public void judgeUserLoginCount(SysUser sysUser) { + // 不支持锁定超级管理员 + if (AdminTypeEnum.SUPER_ADMIN.getCode().equals(sysUser.getAdminType())) { + return; + } + String account = sysUser.getAccount(); + //判断是否连续登录失败, 主要判断第一次登录时间与当前时间比较 + if (isInLoginFailTimeScope(sysUser)) { + log.info(">>> [{}] 用户符合锁定条件, 已被锁定!", account); + throw new AuthException(AuthExceptionEnum.USER_LOCKED); + } else { + log.info(">>> [{}] 用户不符合连续时间内登录失败次数条件, 已清除锁定标志!", account); + } + } + + /** + * 判断用户登录失败时间在规定范围内 + * + * @param sysUser 用户 + * @return 结果 true 在范围内 + */ + private boolean isInLoginFailTimeScope(SysUser sysUser) { + // 更新失败时间 + sysUserMapper.updateFailTime(sysUser.getAccount(), DateUtil.date().toJdkDate()); + if (ObjectUtil.isEmpty(sysUser.getFirstLoginFailTime())) { + sysUserMapper.userLoginFailCountIncrement(sysUser.getAccount()); + return false; + } + // 判断是否在锁定时间内 + if (DateUtil.between(sysUser.getFirstLoginFailTime(), DateUtil.date().toJdkDate(), DateUnit.SECOND) <= CommonConstant.FAIL_TIME_INTERVAL) { + sysUserMapper.userLoginFailCountIncrement(sysUser.getAccount()); + if (sysUser.getLoginFailCount() + 1 >= CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT) { + // 锁定用户 + sysUserMapper.lockUser(sysUser.getAccount()); + return true; + } + } else { + //失败次数归零 + sysUserMapper.resetFailCount(sysUser.getAccount()); + sysUserMapper.userLoginFailCountIncrement(sysUser.getAccount()); + } + return false; + } + + public void judgeUserUpdateCount(SysUser sysUser) { + // 不支持锁定超级管理员 + if (AdminTypeEnum.SUPER_ADMIN.getCode().equals(sysUser.getAdminType())) { + return; + } + String account = sysUser.getAccount(); + //判断是否连续登录失败, 主要判断第一次登录时间与当前时间比较 + if (isInUpdateFailTimeScope(sysUser)) { + log.info(">>> [{}] 用户符合锁定条件, 已被锁定!", account); + throw new AuthException(SysUserExceptionEnum.USER_PWD_LOCKED); + } else { + log.info(">>> [{}] 用户不符合连续时间内修改失败次数条件, 已清除锁定标志!", account); + } + } + + private boolean isInUpdateFailTimeScope(SysUser sysUser) { + // 更新失败时间 + if (ObjectUtil.isEmpty(sysUser.getFirstLoginFailTime())) { + sysUser.setLastUpdPwdTime(DateUtil.date().toJdkDate()); + sysUser.setLoginFailCount(1); + sysUserMapper.updateById(sysUser); + return false; + } + sysUser.setLastUpdPwdTime(DateUtil.date().toJdkDate()); + // 判断是否在锁定时间内 + if (DateUtil.between(sysUser.getLastUpdPwdTime(), DateUtil.date().toJdkDate(), DateUnit.SECOND) <= CommonConstant.FAIL_TIME_INTERVAL) { + if (sysUser.getLoginFailCount() + 1 >= CommonConstant.MAX_LOGIN_FAILED_LOCK_COUNT) { + // 锁定用户 + sysUser.setLoginFailCount(sysUser.getLoginFailCount() + 1); + sysUser.setStatus(1); + sysUserMapper.updateById(sysUser); + return true; + } + + } else { + //失败次数归零 + sysUser.setLoginFailCount(1); + sysUserMapper.updateById(sysUser); + } + return false; + } + } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/application.properties b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/application.properties index 7bd65f5..e358aec 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/application.properties +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/application.properties @@ -22,10 +22,9 @@ jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator # ****************************************[MySQL][START]************************************************ spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://address=(protocol=tcp)(host=100.2.74.193)(port=3306)/inmanagedb?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true +spring.datasource.url=jdbc:mysql://address=(protocol=tcp)(host=100.2.230.246)(port=3306)/inmanagedb?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root -spring.datasource.password=Inspur1! -#ENC(9MYWiSn2/0+KFBQ5STSP4E3sxJXd6Rcu) +spring.datasource.password=ENC(9MYWiSn2/0+KFBQ5STSP4E3sxJXd6Rcu) mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/mapper/SysUserMapper.xml b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/mapper/SysUserMapper.xml index c8c970b..23ff78f 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/mapper/SysUserMapper.xml +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-application/src/main/resources/mapper/SysUserMapper.xml @@ -32,10 +32,10 @@ UPDATE cosmos_iboot_sys_user SET login_fail_count = login_fail_count + 1 - WHERE - account = #{account} + WHERE account = #{account} - + + @@ -43,4 +43,29 @@ + + + + + + + + + diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/DeviceServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/DeviceServiceImpl.java index cc76cf0..4375172 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/DeviceServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/DeviceServiceImpl.java @@ -18,6 +18,7 @@ import com.inspur.cdc.commons.lang.util.CommonCheck; import com.inspur.cdc.commons.lang.web.Page; import com.inspur.cdc.commons.lang.web.PageRequest; import com.inspur.ispim.cosmos.commons.exception.PimException; +import com.inspur.ispim.cosmos.iboot.base.api.bean.ExecuteResultBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.ResultBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.TemplateTypeEnum; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.*; @@ -29,9 +30,11 @@ import com.inspur.ispim.cosmos.iboot.base.api.service.DeviceService; import com.inspur.ispim.cosmos.iboot.base.api.service.IBootTemplateService; import com.inspur.ispim.cosmos.iboot.base.api.util.CommonUtil; import com.inspur.ispim.cosmos.iboot.base.api.util.IBootPathConstant; +import com.inspur.ispim.cosmos.iboot.base.api.util.RSAEncryptDecrypt; import com.inspur.ispim.cosmos.iboot.base.core.mapper.DeviceMapper; import com.inspur.ispim.cosmos.iboot.base.core.mapper.IBootRepositoryImageMapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.usermodel.*; @@ -53,7 +56,6 @@ import java.util.stream.Collectors; import static cn.hutool.core.bean.BeanUtil.beanToMap; import static com.inspur.cdc.commons.lang.consts.CdcConsts.VERIFY_IPV4_PATTERN; import static com.inspur.cdc.commons.lang.consts.CdcConsts.VERIFY_IPV6_PATTERN; -import static com.inspur.ispim.cosmos.iboot.base.api.util.IBootPathConstant.ibootBasePath; import static com.inspur.ispim.cosmos.iboot.base.api.util.IBootPathConstant.webserviceBasePath; /** @@ -65,8 +67,6 @@ public class DeviceServiceImpl implements DeviceService { protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final String IBOOT_USERNAME = "inmanage"; private static final String IBOOT_PW = "manage1!"; - // PXE重启 - private static final String PXE_RESET = "pxereset"; private static final String COMMAND_SERVICE_STATUS = "systemctl status tftp nginx dhcpd smb xinetd|grep \"●\\|Active:\""; private static final String COMMAND_IP_ADDR = "ip a|grep \"state UP\" -A2 --no-group-separator|grep \"inet \"|awk '{print $2}'"; private static final String COMMAND_DHCP_IP = "cat " + webserviceBasePath + "dhcpip"; @@ -82,15 +82,10 @@ public class DeviceServiceImpl implements DeviceService { this.iBootRepositoryImageMapper = iBootRepositoryImageMapper; } - @Override - public List getAll() { - return deviceMapper.getAll(); - } - @Override public Page deviceList(DeviceQueryBean queryBean) { this.handleDeviceQueryBean(queryBean); - return Pages.of(queryBean).page(deviceMapper.queryListWithPage(queryBean)); + return Pages.of(queryBean).page(deviceMapper.queryListWithPage(queryBean).stream().peek(e -> e.setManageUser(null)).peek(e -> e.setManagePassword(null)).collect(Collectors.toList())); } @Override @@ -118,9 +113,9 @@ public class DeviceServiceImpl implements DeviceService { } @Override - public ResultBean devicePowerManage(DeviceQueryBean queryBean, String mode) { - if (!StringUtils.equalsAny(mode, "on", "off", "reset", PXE_RESET)) { - return new ResultBean(false, Languages.getString("cosmos.iboot.device.parameter.error"), null); + public ResultBean devicePowerManage(DeviceQueryBean queryBean, DevicePowerEnum mode) { + if (mode == null) { + return new ResultBean(false, Languages.getString("cosmos.iboot.device.parameter.null"), null); } this.handleDeviceQueryBean(queryBean); List deviceEntities = deviceMapper.queryListWithPage(queryBean); @@ -135,34 +130,34 @@ public class DeviceServiceImpl implements DeviceService { return new ResultBean(true, null, null); } - private void powerControl(DeviceEntity deviceEntity, String powerStatus) { - if (StringUtils.isBlank(powerStatus) || Objects.isNull(deviceEntity) || deviceEntity.getStatus() == DeviceStatusEnum.Busy) { + private void powerControl(DeviceEntity deviceEntity, DevicePowerEnum mode) { + if (mode == null || Objects.isNull(deviceEntity) || deviceEntity.getStatus() == DeviceStatusEnum.Busy) { return; } - if (powerStatus.equals("on")) { + if (mode == DevicePowerEnum.on) { if (IpmiStatusEnum.AVAILABLE == deviceEntity.getIpmiStatus() && DeviceStatusEnum.Offline == deviceEntity.getStatus()) { - powerControlOutofband(deviceEntity, powerStatus); + powerControlOutofband(deviceEntity, mode); } else { log.error("[{}]IPMI状态为[{}],设备状态为[{}],不可开机", CommonCheck.convertValidLog(deviceEntity.getId()), deviceEntity.getIpmiStatus(), deviceEntity.getStatus()); } } else if (DeviceStatusEnum.Online == deviceEntity.getStatus() && StringUtils.isNotBlank(deviceEntity.getDhcpIp())) { - String content = null; - if (powerStatus.equals("off")) { - content = "{\"type\":\"Shutdown\"}"; - } else if (powerStatus.equals("reset")) { - content = "{\"type\":\"Reboot\"}"; - } else if (PXE_RESET.equals(powerStatus)) { - content = "{\"type\":\"PXErestart\"}"; + Map content = null; + if (mode == DevicePowerEnum.off) { + content = Collections.singletonMap("type", "Shutdown"); + } else if (mode == DevicePowerEnum.reset) { + content = Collections.singletonMap("type", "Reboot"); + } else if (mode == DevicePowerEnum.pxereset) { + content = Collections.singletonMap("type", "PXErestart"); } - if (StringUtils.isNotBlank(content)) { - try (HttpResponse response = HttpRequest.post("http://" + deviceEntity.getDhcpIp() + ":16061/powerSupply").body(content).execute()) { - log.info("[{}]执行带内电源管理[{}]", CommonCheck.convertValidLog(deviceEntity.getDhcpIp()), CommonCheck.convertValidLog(powerStatus)); + if (content != null) { + try (HttpResponse response = HttpRequest.post("http://" + deviceEntity.getDhcpIp() + ":16061/powerSupply").body(OBJECT_MAPPER.writeValueAsString(content)).execute()) { + log.info("[{}]执行带内电源管理[{}]", CommonCheck.convertValidLog(deviceEntity.getDhcpIp()), CommonCheck.convertValidLog(mode.name())); } catch (Exception e) { - log.info("[{}]执行带内电源管理[{}]", CommonCheck.convertValidLog(deviceEntity.getDhcpIp()), CommonCheck.convertValidLog(powerStatus)); + log.info("[{}]执行带内电源管理[{}]", CommonCheck.convertValidLog(deviceEntity.getDhcpIp()), CommonCheck.convertValidLog(mode.name())); } } } else { - powerControlOutofband(deviceEntity, powerStatus); + powerControlOutofband(deviceEntity, mode); } } @@ -177,8 +172,8 @@ public class DeviceServiceImpl implements DeviceService { } - private void powerControlOutofband(DeviceEntity deviceEntity, String powerStatus) { - if (StringUtils.isBlank(powerStatus) || Objects.isNull(deviceEntity) || StringUtils.isBlank(deviceEntity.getManageIp()) || IpmiStatusEnum.AVAILABLE != deviceEntity.getIpmiStatus()) { + private void powerControlOutofband(DeviceEntity deviceEntity, DevicePowerEnum mode) { + if (mode == null || Objects.isNull(deviceEntity) || StringUtils.isBlank(deviceEntity.getManageIp()) || IpmiStatusEnum.AVAILABLE != deviceEntity.getIpmiStatus()) { log.error("[{}]执行带外电源管理失败", CommonCheck.convertValidLog(deviceEntity.getId())); return; } @@ -187,17 +182,17 @@ public class DeviceServiceImpl implements DeviceService { String password = IBOOT_PW; if (!StringUtils.isAnyBlank(deviceEntity.getManageUser(), deviceEntity.getManagePassword())) { userName = deviceEntity.getManageUser(); - password = deviceEntity.getManagePassword(); + password = RSAEncryptDecrypt.maxResultDecrypt(deviceEntity.getManagePassword()); } - if (PXE_RESET.equals(powerStatus)) { + if (mode == DevicePowerEnum.pxereset) { if (CommonUtil.setSysBoot(deviceEntity.getManageIp(), userName, password, "pxe")) { reset(deviceEntity.getManageIp(), userName, password); } else { log.error("[{}]设置pxe重启失败", CommonCheck.convertValidLog(deviceEntity.getSn())); } } else { - CommonUtil.powerControl(deviceEntity.getManageIp(), userName, password, powerStatus); + CommonUtil.powerControl(deviceEntity.getManageIp(), userName, password, mode.name()); } } catch (Exception e) { log.error(e.getMessage()); @@ -313,6 +308,12 @@ public class DeviceServiceImpl implements DeviceService { } deviceEntity.setId(UUID.fastUUID().toString(true)); deviceEntity.setHeartbeatTime(new Date()); + try { + deviceEntity.setManagePassword(RSAEncryptDecrypt.encrypt(deviceEntity.getManagePassword())); + } catch (Exception e) { + log.error("密码加密异常:{}", e.getMessage()); + return new ResultBean(false, Languages.getString("cosmos.iboot.device.parameter.error"), null); + } deviceMapper.batchInsert(Collections.singletonList(deviceEntity)); if (deviceEntity.getManageAccount() == ManageAccountEnum.ON) { UserCfgBean userCfgBean = new UserCfgBean(); @@ -389,6 +390,13 @@ public class DeviceServiceImpl implements DeviceService { } } + try { + deviceEntity.setManagePassword(RSAEncryptDecrypt.encrypt(deviceEntity.getManagePassword())); + } catch (Exception e) { + log.error("密码加密异常:{}", e.getMessage()); + return new ResultBean(false, Languages.getString("cosmos.iboot.device.parameter.error"), null); + } + deviceMapper.updateById(deviceEntity); return new ResultBean(true, null, null); } @@ -402,6 +410,12 @@ public class DeviceServiceImpl implements DeviceService { if (Objects.isNull(deviceEntity)) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.resource.not.exist"), null); } + try { + deviceEntity.setManagePassword(RSAEncryptDecrypt.maxResultDecrypt(deviceEntity.getManagePassword())); + } catch (Exception e) { + log.error("密码解密异常:{}", e.getMessage()); + return new ResultBean(false, Languages.getString("cosmos.iboot.device.parameter.error"), null); + } return new ResultBean(true, null, deviceEntity); } @@ -641,8 +655,8 @@ public class DeviceServiceImpl implements DeviceService { } entity.setManageIp(ip); entity.setHeartbeatTime(new Date()); + entity.setManagePassword(RSAEncryptDecrypt.encrypt(password)); entity.setManageUser(username); - entity.setManagePassword(password); entity.setIpmiFail(IpmiFailEnum.CONNECTION); deviceEntities.add(entity); } @@ -672,7 +686,7 @@ public class DeviceServiceImpl implements DeviceService { } } } catch (Exception e) { - log.error(e.getMessage()); + log.error("添加异常:{}", e.getMessage()); } return new ResultBean(true, null, null); } @@ -713,19 +727,16 @@ public class DeviceServiceImpl implements DeviceService { List list = deviceMapper.getAll(); // 测试IPMI连通性 list.stream().filter(entity -> StringUtils.isNotBlank(entity.getManageIp())).forEach(entity -> { - ProcessBuilder builder; + ExecuteResultBean result; if (OperationSystemUtil.isWindows()) { - builder = new ProcessBuilder("cmd.exe", "/c", "ping", "-n", "2", entity.getManageIp()); + result = CommonUtil.executeWindowsCommand("ping -n 2 " + entity.getManageIp()); } else { - builder = new ProcessBuilder("/bin/sh", "-c", "ping -c 2 " + entity.getManageIp()); + result = CommonUtil.executeLinuxCommand("ping -c 2 " + entity.getManageIp()); } - builder.redirectErrorStream(true); try { - Process process = builder.start(); - int exitValue = process.waitFor(); - if (exitValue == 0) { + if (result.getCode() == 0) { if (!StringUtils.isAnyBlank(entity.getManageUser(), entity.getManagePassword())) { - String ps = CommonUtil.getPowerStatus(entity.getManageIp(), entity.getManageUser(), entity.getManagePassword()); + String ps = CommonUtil.getPowerStatus(entity.getManageIp(), entity.getManageUser(), RSAEncryptDecrypt.maxResultDecrypt(entity.getManagePassword())); if (StringUtils.isNotEmpty(ps)) { entity.setIpmiStatus(IpmiStatusEnum.AVAILABLE); entity.setIpmiFail(IpmiFailEnum.NORMAL); @@ -746,9 +757,6 @@ public class DeviceServiceImpl implements DeviceService { } else { entity.setIpmiFail(IpmiFailEnum.CONNECTION); } - } catch (IOException | InterruptedException ex) { - log.error("[{}]IPMI状态刷新异常:{}", CommonCheck.convertValidLog(entity.getSn()), CommonCheck.convertValidLog(ex.getMessage())); - entity.setIpmiFail(IpmiFailEnum.CONFIGURATION); } catch (Exception ex) { log.error("[{}]IPMI状态刷新异常:{}", CommonCheck.convertValidLog(entity.getSn()), CommonCheck.convertValidLog(ex.getMessage())); entity.setIpmiFail(IpmiFailEnum.CREDENTIALS); @@ -769,10 +777,10 @@ public class DeviceServiceImpl implements DeviceService { @Override public ResultBean getServiceState() { if (!OperationSystemUtil.isWindows()) { - Map result = new HashMap<>(Map.of("tftp", "inactive", "nginx", "inactive", "dhcpd", "inactive", "smb", "inactive", "xinetd", "inactive")); - Map> out = executeCommand(COMMAND_SERVICE_STATUS); - if (Objects.nonNull(out.get(0)) && !out.get(0).isEmpty()) { - Iterator iterator = out.get(0).iterator(); + Map status = new HashMap<>(Map.of("tftp", "inactive", "nginx", "inactive", "dhcpd", "inactive", "smb", "inactive", "xinetd", "inactive")); + ExecuteResultBean result = CommonUtil.executeLinuxCommand(COMMAND_SERVICE_STATUS); + if (result.getCode() == 0 && CollectionUtils.isNotEmpty(result.getOutput())) { + Iterator iterator = result.getOutput().iterator(); while (iterator.hasNext()) { String line = iterator.next().trim(); if (line.contains("service")) { @@ -781,38 +789,37 @@ public class DeviceServiceImpl implements DeviceService { continue; } String name = info[1].replace(".service", ""); - if (!result.containsKey(name) || line.contains("could not be found")) { + if (!status.containsKey(name) || line.contains("could not be found")) { continue; } if (iterator.hasNext()) { line = iterator.next().trim(); String[] item = line.split("\\s+"); if (item.length > 2 && item[1].contains("active")) { - result.put(name, item[1]); + status.put(name, item[1]); } } } } } - return new ResultBean(true, null, result); + return new ResultBean(true, null, status); } else { Map result = new HashMap<>(); //获取windows的安装路径 - String dhcpStatusResult = (String) executeWindows(IBootPathConstant.ibootWindowsBatPath + "StatusDUALServer.bat").getData(); -// String nfsStatusResult= executeWindows(IBootPathConstant.ibootWindowsBatPath+"StatusNFSServer.bat"); - String nginxStatusResult = (String) executeWindows(IBootPathConstant.ibootWindowsBatPath + "StatusNginxServer.bat").getData(); - String tftpStatusResult = (String) executeWindows(IBootPathConstant.ibootWindowsBatPath + "StatusTFTPServer.bat").getData(); - if (dhcpStatusResult.contains("RUNNING")) { + ExecuteResultBean dhcpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StatusDUALServer.bat"); + ExecuteResultBean nginxResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StatusNginxServer.bat"); + ExecuteResultBean tftpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StatusTFTPServer.bat"); + if (dhcpResult.getCode() == 0 && CollectionUtils.isNotEmpty(dhcpResult.getOutput()) && dhcpResult.getOutput().stream().anyMatch(e -> e.contains("RUNNING"))) { result.put("dhcpd", "active"); } else { result.put("dhcpd", "inactive"); } - if (nginxStatusResult.contains("RUNNING")) { + if (nginxResult.getCode() == 0 && CollectionUtils.isNotEmpty(nginxResult.getOutput()) && nginxResult.getOutput().stream().anyMatch(e -> e.contains("RUNNING"))) { result.put("nginx", "active"); } else { result.put("nginx", "inactive"); } - if (tftpStatusResult.contains("RUNNING")) { + if (tftpResult.getCode() == 0 && CollectionUtils.isNotEmpty(tftpResult.getOutput()) && tftpResult.getOutput().stream().anyMatch(e -> e.contains("RUNNING"))) { result.put("xinetd", "active"); result.put("tftp", "active"); } else { @@ -824,34 +831,6 @@ public class DeviceServiceImpl implements DeviceService { } } - public synchronized ResultBean executeWindows(String path) { - ResultBean resultBean = new ResultBean(true, "", ""); - try { - ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", path); - // 设置工作目录 - pb.directory(new File("C:\\")); - // 启动进程并等待程序执行完成 - Process process = pb.start(); - process.waitFor(); - // 获取进程的输入流并转换为BufferedReader对象 - InputStream inputStream = process.getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - // 读取输出并打印 - String output = ""; - String line; - while ((line = reader.readLine()) != null) { - System.out.println(line); - output += line; - } - resultBean.setData(output); - return resultBean; - } catch (IOException | InterruptedException e) { - log.error(e.getMessage()); - resultBean.setFlag(false); - return resultBean; - } - } - @Override public ResultBean changeServiceState(String name, String mode) { if (!StringUtils.equalsAnyIgnoreCase(mode, "start", "stop", "restart") @@ -870,8 +849,8 @@ public class DeviceServiceImpl implements DeviceService { new CustomizableThreadFactory("iboot-device-service-manage"), new ThreadPoolExecutor.AbortPolicy()); executor.submit(() -> { - Map> out = executeCommand(command[0]); - if (out.containsKey(0)) { + ExecuteResultBean result = CommonUtil.executeLinuxCommand(command[0]); + if (result.getCode() == 0) { log.info("[{}]执行[{}]命令成功", name, mode); } else { log.error("[{}]执行[{}]命令失败", name, mode); @@ -879,28 +858,24 @@ public class DeviceServiceImpl implements DeviceService { }); return new ResultBean(true, Languages.getString("cosmos.iboot.device.acceptance.result.success"), null); } else { + ExecuteResultBean dhcpResult; + ExecuteResultBean nginxResult; + ExecuteResultBean tftpResult; if (!mode.equalsIgnoreCase("stop")) { //获取windows的安装路径 - ResultBean dhcpResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StartDUALServer.bat"); -// String nfsStatusResult= executeWindows(IBootPathConstant.ibootWindowsBatPath+"StatusNFSServer.bat"); - ResultBean nginxResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StartNginxServer.bat"); - ResultBean tftpResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StartTFTPServer.bat"); - if (dhcpResult.isFlag() && nginxResult.isFlag() && tftpResult.isFlag()) { - return new ResultBean(true, Languages.getString("cosmos.iboot.device.acceptance.result.success"), null); - } else { - return new ResultBean(false, null, null); - } + dhcpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StartDUALServer.bat"); + nginxResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StartNginxServer.bat"); + tftpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StartTFTPServer.bat"); } else { //获取windows的安装路径 - ResultBean dhcpResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StopDUALServer.bat"); -// String nfsStatusResult= executeWindows(IBootPathConstant.ibootWindowsBatPath+"StatusNFSServer.bat"); - ResultBean nginxResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StopNginxServer.bat"); - ResultBean tftpResult = executeWindows(IBootPathConstant.ibootWindowsBatPath + "StopTFTPServer.bat"); - if (dhcpResult.isFlag() && nginxResult.isFlag() && tftpResult.isFlag()) { - return new ResultBean(true, Languages.getString("cosmos.iboot.device.acceptance.result.success"), null); - } else { - return new ResultBean(false, null, null); - } + dhcpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StopDUALServer.bat"); + nginxResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StopNginxServer.bat"); + tftpResult = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "StopTFTPServer.bat"); + } + if (dhcpResult.getCode() == 0 && nginxResult.getCode() == 0 && tftpResult.getCode() == 0) { + return new ResultBean(true, Languages.getString("cosmos.iboot.device.acceptance.result.success"), null); + } else { + return new ResultBean(false, null, null); } } } @@ -918,15 +893,15 @@ public class DeviceServiceImpl implements DeviceService { } private ResultBean getManageNetworkForWindows() { - Map> out1 = this.executeWinCommand(IBootPathConstant.ibootWindowsBatPath + "GetLocalIP.bat"); - Map> out2 = this.executeWinCommand(IBootPathConstant.ibootWindowsBatPath + "GetDHCPIP.bat"); - Map> out3 = this.executeWinCommand(IBootPathConstant.ibootWindowsBatPath + "GetDHCPRange.bat"); + ExecuteResultBean result1 = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "GetLocalIP.bat"); + ExecuteResultBean result2 = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "GetDHCPIP.bat"); + ExecuteResultBean result3 = CommonUtil.executeWindowsCommand(IBootPathConstant.ibootWindowsBatPath + "GetDHCPRange.bat"); // 获取网络设备列表 - if (!out1.containsKey(0)) { + if (result1.getCode() != 0) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.network.address.error"), null); } - List ip = out1.get(0); + List ip = result1.getOutput(); if (Objects.isNull(ip) || ip.isEmpty()) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.network.address.invalid"), null); } @@ -942,11 +917,11 @@ public class DeviceServiceImpl implements DeviceService { manageNetworkBean.setIp(ip); // 获取DHCP IP与DHCP范围 - if (out2.containsKey(0) && Objects.nonNull(out2.get(0)) && !out2.get(0).isEmpty() && out2.get(0).get(0).matches(VERIFY_IPV4_PATTERN)) { - String[] dhcp = {out2.get(0).get(0)}; + if (result2.getCode() == 0 && CollectionUtils.isNotEmpty(result2.getOutput()) && result2.getOutput().stream().anyMatch(e -> e.matches(VERIFY_IPV4_PATTERN))) { + String[] dhcp = {result2.getOutput().get(0)}; ip.stream().filter(e -> e.contains(dhcp[0])).findAny().ifPresent(manageNetworkBean::setDhcpIp); - if (StringUtils.isNotBlank(manageNetworkBean.getDhcpIp()) && out3.containsKey(0) && Objects.nonNull(out3.get(0)) && !out3.get(0).isEmpty()) { - String[] range = out3.get(0).get(0).trim().split("-"); + if (StringUtils.isNotBlank(manageNetworkBean.getDhcpIp()) && result3.getCode() == 0 && CollectionUtils.isNotEmpty(result3.getOutput())) { + String[] range = result3.getOutput().get(0).trim().split("-"); if (range.length == 2) { manageNetworkBean.setDhcpRangeBegin(range[0]); manageNetworkBean.setDhcpRangeEnd(range[1]); @@ -967,14 +942,14 @@ public class DeviceServiceImpl implements DeviceService { } private ResultBean getManageNetworkForLinux() { - Map> out1 = this.executeCommand(COMMAND_IP_ADDR); - Map> out2 = this.executeCommand(COMMAND_DHCP_IP); - Map> out3 = this.executeCommand(COMMAND_DHCP_RANGE); - Map> out4 = this.executeCommand(COMMAND_NGINX_IP); - if (!out1.containsKey(0)) { + ExecuteResultBean result1 = CommonUtil.executeLinuxCommand(COMMAND_IP_ADDR); + ExecuteResultBean result2 = CommonUtil.executeLinuxCommand(COMMAND_DHCP_IP); + ExecuteResultBean result3 = CommonUtil.executeLinuxCommand(COMMAND_DHCP_RANGE); + ExecuteResultBean result4 = CommonUtil.executeLinuxCommand(COMMAND_NGINX_IP); + if (result1.getCode() != 0) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.network.address.error"), null); } - List ip = out1.get(0); + List ip = result1.getOutput(); if (Objects.isNull(ip) || ip.isEmpty()) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.network.address.invalid"), null); } @@ -982,11 +957,11 @@ public class DeviceServiceImpl implements DeviceService { ServerManageNetworkBean manageNetworkBean = new ServerManageNetworkBean(); manageNetworkBean.setIp(ip); - if (out2.containsKey(0) && Objects.nonNull(out2.get(0)) && !out2.get(0).isEmpty() && out2.get(0).get(0).matches(VERIFY_IPV4_PATTERN)) { // v7.2只适配IPv4 - String[] dhcp = {out2.get(0).get(0)}; + if (result2.getCode() == 0 && CollectionUtils.isNotEmpty(result2.getOutput()) && result2.getOutput().stream().anyMatch(e -> e.matches(VERIFY_IPV4_PATTERN))) { // 只适配IPv4 + String[] dhcp = {result2.getOutput().get(0)}; ip.stream().filter(e -> e.contains(dhcp[0])).findAny().ifPresent(manageNetworkBean::setDhcpIp); - if (StringUtils.isNotBlank(manageNetworkBean.getDhcpIp()) && out3.containsKey(0) && Objects.nonNull(out3.get(0)) && !out3.get(0).isEmpty()) { - List dhcpConf = out3.get(0); + if (StringUtils.isNotBlank(manageNetworkBean.getDhcpIp()) && result3.getCode() == 0 && CollectionUtils.isNotEmpty(result3.getOutput())) { + List dhcpConf = result3.getOutput(); int index = -1; for (String line : dhcpConf) { index++; @@ -1011,8 +986,8 @@ public class DeviceServiceImpl implements DeviceService { } } } - if (out4.containsKey(0) && Objects.nonNull(out4.get(0)) && !out4.get(0).isEmpty() && out4.get(0).get(0).matches(VERIFY_IPV4_PATTERN)) { - manageNetworkBean.setNginxIp(out4.get(0).get(0)); + if (result4.getCode() == 0 && CollectionUtils.isNotEmpty(result4.getOutput()) && result4.getOutput().stream().anyMatch(e -> e.matches(VERIFY_IPV4_PATTERN))) { + manageNetworkBean.setNginxIp(result4.getOutput().get(0)); } return new ResultBean(true, null, manageNetworkBean); } @@ -1069,11 +1044,10 @@ public class DeviceServiceImpl implements DeviceService { if (Ipv4Util.ipv4ToLong(dhcpRangeBegin) >= Ipv4Util.ipv4ToLong(dhcpRangeEnd)) { return new ResultBean(false, Languages.getString("cosmos.iboot.device.network.valid.error"), null); } - Map> out; + ExecuteResultBean result; if (OperationSystemUtil.isLinux()) { -// String command = String.join(" ", COMMAND_MANAGE_IP, dhcpIp, nginxIp, beginIp, Ipv4Util.getMaskByMaskBit(dhcpMask), dhcpRangeBegin, dhcpRangeEnd); String command = String.join(" ", "imcli config iboot", dhcpIp, nginxIp, beginIp, Ipv4Util.getMaskByMaskBit(dhcpMask), dhcpRangeBegin, dhcpRangeEnd); - out = executeCommand(command); + result = CommonUtil.executeLinuxCommand(command); } else { File nginx = new File(IBootPathConstant.webServerIpFile); if (nginx.exists()) { @@ -1085,55 +1059,9 @@ public class DeviceServiceImpl implements DeviceService { log.error("写入Nginx IP失败,{}", e.getMessage()); } String command = String.join(" ", IBootPathConstant.ibootWindowsBatPath + "ChangeLocalIPAndDHCPRange.bat", dhcpIp, dhcpRangeBegin + "-" + dhcpRangeEnd); - out = executeWinCommand(command); - } - return Objects.nonNull(out) && out.containsKey(0) ? new ResultBean(true, Languages.getString("cosmos.iboot.device.network.manage.success"), null) : new ResultBean(false, Languages.getString("cosmos.iboot.device.network.manage.failed"), null); - } - - private Map> executeCommand(String command) { - ProcessBuilder builder = new ProcessBuilder("/bin/sh", "-c", command); - builder.redirectErrorStream(true); - Map> out = null; - try { - Process process = builder.start(); - int exitValue = process.waitFor(); - LinkedList result = new LinkedList<>(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - String line = null; - while ((line = reader.readLine()) != null) { - result.add(line); - } - log.info(result.toString()); - } - out = Map.of(exitValue, result); - } catch (IOException | InterruptedException e) { - log.error(e.getMessage()); - out = Map.of(-1, Collections.singletonList(e.getMessage())); - } - return out; - } - - private Map> executeWinCommand(String command) { - ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command); - builder.directory(new File("C:\\")); - Map> out = null; - try { - Process process = builder.start(); - int exitValue = process.waitFor(); - LinkedList result = new LinkedList<>(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - String line = null; - while ((line = reader.readLine()) != null) { - result.add(line); - } - log.info(result.toString()); - } - out = Map.of(exitValue, result); - } catch (IOException | InterruptedException e) { - log.error(e.getMessage()); - out = Map.of(-1, Collections.singletonList(e.getMessage())); + result = CommonUtil.executeWindowsCommand(command); } - return out; + return result.getCode() == 0 ? new ResultBean(true, Languages.getString("cosmos.iboot.device.network.manage.success"), null) : new ResultBean(false, Languages.getString("cosmos.iboot.device.network.manage.failed"), null); } /** diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/IBootTemplateServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/IBootTemplateServiceImpl.java index d53b824..92e2911 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/IBootTemplateServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/IBootTemplateServiceImpl.java @@ -1903,6 +1903,9 @@ public class IBootTemplateServiceImpl implements IBootTemplateService { ExecCommand exec = new ExecCommand(); // 镜像挂载 String mountPath = IBootPathConstant.MountImageFile + File.separator + imageEntity.getId(); + if (imageEntity.getImageType().equalsIgnoreCase("Windows")) { + mountPath = IBootPathConstant.MountImageFileSamba + File.separator + imageEntity.getId(); + } File filePath = new File(FileUtil.normalize(mountPath)); if (!filePath.exists()) { filePath.mkdir(); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/InnerServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/InnerServiceImpl.java index 165f6c2..117dfea 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/InnerServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/InnerServiceImpl.java @@ -31,11 +31,6 @@ public class InnerServiceImpl implements InnerService { this.iBootTemplateService = iBootTemplateService; } - @Override - public ApiResult getAll() { - return ApiResult.success(deviceService.getAll()); - } - @Override public void acceptStatusChangeBean(IBootTaskHostEntity iBootTaskHostEntity) { taskService.acceptStatusChangeBean(iBootTaskHostEntity); diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/OuterServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/OuterServiceImpl.java index 0404b2d..358c918 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/OuterServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/OuterServiceImpl.java @@ -7,6 +7,7 @@ import com.inspur.cdc.commons.lang.web.Page; import com.inspur.ispim.cosmos.iboot.base.api.bean.IBootTemplateQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.ResultBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceDiskCloneBean; +import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DevicePowerEnum; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.DeviceQueryBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.device.ServerManageNetworkBean; import com.inspur.ispim.cosmos.iboot.base.api.bean.image.*; @@ -45,11 +46,6 @@ public class OuterServiceImpl implements OuterService { this.iBootTemplateService = iBootTemplateService; } - @Override - public ApiResult getAllDevices() { - return ApiResult.success(deviceService.getAll()); - } - @Override public ResultBean deviceList(DeviceQueryBean queryBean) { return new ResultBean(true, null, deviceService.deviceList(queryBean)); @@ -76,7 +72,7 @@ public class OuterServiceImpl implements OuterService { } @Override - public ResultBean devicePowerManage(DeviceQueryBean queryBean, String mode) { + public ResultBean devicePowerManage(DeviceQueryBean queryBean, DevicePowerEnum mode) { return deviceService.devicePowerManage(queryBean, mode); } diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/OsExplorerTemplateCreateServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/OsExplorerTemplateCreateServiceImpl.java index 8c069af..f6d3eb4 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/OsExplorerTemplateCreateServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/OsExplorerTemplateCreateServiceImpl.java @@ -11,6 +11,7 @@ import com.inspur.ispim.cosmos.iboot.base.api.bean.device.IpmiStatusEnum; import com.inspur.ispim.cosmos.iboot.base.api.entity.DeviceEntity; import com.inspur.ispim.cosmos.iboot.base.api.entity.IBootTaskHostEntity; import com.inspur.ispim.cosmos.iboot.base.api.util.CommonUtil; +import com.inspur.ispim.cosmos.iboot.base.api.util.RSAEncryptDecrypt; import com.inspur.ispim.cosmos.iboot.base.core.mapper.DeviceMapper; import com.inspur.ispim.cosmos.iboot.base.core.mapper.IBootTaskHostMapper; import lombok.extern.slf4j.Slf4j; @@ -70,7 +71,7 @@ public class OsExplorerTemplateCreateServiceImpl extends CommonTemplateCreateSer String password = ""; if (deviceEntity.getIpmiFail() == IpmiFailEnum.NORMAL) { userName = deviceEntity.getManageUser(); - password = deviceEntity.getManagePassword(); + password = RSAEncryptDecrypt.maxResultDecrypt(deviceEntity.getManagePassword()); } else if (deviceEntity.getIpmiFail() == IpmiFailEnum.NORMAL_IBOOT) { userName = IBOOT_USERNAME; password = IBOOT_PW; diff --git a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/RaidTemplateCreateServiceImpl.java b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/RaidTemplateCreateServiceImpl.java index 7e254ed..f4b224c 100644 --- a/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/RaidTemplateCreateServiceImpl.java +++ b/InManageBoot-iboot/cosmos-biz/cosmos-biz-iboot/cosmos-biz-iboot-base/cosmos-biz-iboot-base-core/src/main/java/com/inspur/ispim/cosmos/iboot/base/core/impl/templatecreate/RaidTemplateCreateServiceImpl.java @@ -232,8 +232,17 @@ public class RaidTemplateCreateServiceImpl extends CommonTemplateCreateServiceIm //raid创建 配置区分标志 cliScript.append(RaidConfigGrapgicConstant.create_flag).append(" "); //slotID拼接处理 + String eid=""; for (PhysicalDisk physicalDisk : logicalDisk.getPhysicalDiskList()) { - slotS.append(physicalDisk.getEid() + ":" + physicalDisk.getSlot()).append(","); + if(raidType.equalsIgnoreCase(RaidTypeEnum.PMC.getValue())){ + if(StringUtils.isEmpty(eid)){//pmc卡只处理一块背板,格式为eid:slot1,slot2 + eid=physicalDisk.getEid(); + slotS.append(eid+":"); + } + slotS.append(physicalDisk.getSlot()).append(","); + }else{ + slotS.append(physicalDisk.getEid() + ":" + physicalDisk.getSlot()).append(","); + } } String raidLevel = logicalDisk.getRaidLevel().name(); cliScript.append(raidLevel.replace("RAID", "").toLowerCase()).append(" ");//raid level -- Gitee