diff --git a/src/main/java/com/tongran/agent/client/netty/enpoint/AgentEndpoint.java b/src/main/java/com/tongran/agent/client/netty/enpoint/AgentEndpoint.java index 087c926..703edff 100644 --- a/src/main/java/com/tongran/agent/client/netty/enpoint/AgentEndpoint.java +++ b/src/main/java/com/tongran/agent/client/netty/enpoint/AgentEndpoint.java @@ -216,10 +216,6 @@ public class AgentEndpoint { String md5 = AgentUtil.getFileMD5(properties.getTempPath()+"/"+fileName); if(StringUtils.isNotBlank(md5) && StringUtils.isNotBlank(versionUpdateEO.getFileMd5()) && StringUtils.equals(md5,versionUpdateEO.getFileMd5())){ - //更改全局变量 - GlobalConfig.isCollect = false; - //调用采集任务 - agentService.cancelCollect(); //所有文件下载完成,执行脚本命令 agentService.command(policy, clientId,MsgEnum.Agent版本更新应答.getValue()); }else{ diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java index d8a49fc..a321d61 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java @@ -94,6 +94,8 @@ public class AppInitializer implements CommandLineRunner { agentService.checkMonitor(); AssertLog.info("检测mtr探测策略配置"); agentService.checkMtrDelect(); + AssertLog.info("检测agent更新配置"); + agentService.checkAgentUpdate(); }else{ //未注册,发送注册 try { diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java index 172a0ad..716f97e 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java @@ -139,6 +139,7 @@ public class BusinessTasks { object.put("clientId", GlobalConfig.CLIENT_ID); object.put("logicalNode", agentService.getLogicalNode()); object.put("sn", GlobalConfig.DEVICE_SN); + object.put("cpucores", Runtime.getRuntime().availableProcessors()); object.put("strength","31"); object.put("name", properties.getName()); object.put("version", properties.getVersion()); @@ -855,6 +856,8 @@ public class BusinessTasks { AssertLog.info("检测mtr探测策略配置"); agentService.checkMtrDelect(); + AssertLog.info("检测agent更新配置"); + agentService.checkAgentUpdate(); }else{ //未注册,发送注册 try { diff --git a/src/main/java/com/tongran/agent/client/scheduler/task/SpecificTimeTaskService.java b/src/main/java/com/tongran/agent/client/scheduler/task/SpecificTimeTaskService.java index cdb6b35..01c5012 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/task/SpecificTimeTaskService.java +++ b/src/main/java/com/tongran/agent/client/scheduler/task/SpecificTimeTaskService.java @@ -2,12 +2,15 @@ package com.tongran.agent.client.scheduler.task; import com.alibaba.fastjson2.JSONObject; import com.tongran.agent.client.core.config.ApplicationProperties; +import com.tongran.agent.client.core.config.GlobalConfig; import com.tongran.agent.client.core.enums.MsgEnum; import com.tongran.agent.client.core.session.SessionManager; import com.tongran.agent.client.netty.model.Message; import com.tongran.agent.client.scheduler.service.AsyncCommandExecutor; +import com.tongran.agent.client.service.AgentService; import com.tongran.agent.client.utils.AgentDataUtil; import com.tongran.agent.client.utils.AgentUtil; +import com.tongran.agent.client.utils.AssertLog; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -30,6 +33,8 @@ public class SpecificTimeTaskService { @Resource private SpecificTimeTaskConfig taskConfig; + @Resource + private AgentService agentService; public SpecificTimeTaskService() { this.sessionManager = SessionManager.getInstance(); @@ -81,6 +86,11 @@ public class SpecificTimeTaskService { String key = request.getTaskName()+"-"+System.currentTimeMillis(); if(StringUtils.equals(request.getDataType(), MsgEnum.Agent版本更新应答.getValue())){ try { + AssertLog.info("定时更新启动...暂停心跳和采集任务"); + //更改全局变量 + GlobalConfig.isCollect = false; + //调用采集任务 + agentService.cancelCollect(); //设置检查回滚任务 String SCRIPT_PATH = properties.getScriptPath()+"/rollback-tragent.sh"; AgentDataUtil.chmod(SCRIPT_PATH,"775"); @@ -113,7 +123,7 @@ public class SpecificTimeTaskService { json.put("resMsg", ""); json.put("result", jsonObject.toJSONString()); json.put("timestamp",timestamps); - Message message = Message.builder().clientId(request.getClientId()).dataType(request.getDataType()).data(jsonObject.toJSONString()).build(); + Message message = Message.builder().clientId(request.getClientId()).dataType(request.getDataType()).data(json.toJSONString()).build(); if (Objects.nonNull(sessionManager.getSessionById(request.getClientId()))) { System.out.println("发送执行结果: " + json.toJSONString()); // 注意:toJSONString() sessionManager.writeAndFlush(sessionManager.getSessionById(request.getClientId()).getChannel(), message); diff --git a/src/main/java/com/tongran/agent/client/service/AgentService.java b/src/main/java/com/tongran/agent/client/service/AgentService.java index eb19c23..10d4f93 100644 --- a/src/main/java/com/tongran/agent/client/service/AgentService.java +++ b/src/main/java/com/tongran/agent/client/service/AgentService.java @@ -32,4 +32,6 @@ public interface AgentService { void checkMonitor(); void checkMtrDelect(); + + void checkAgentUpdate(); } diff --git a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java index b859c0a..c9eeaf9 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java @@ -171,35 +171,25 @@ public class AgentServiceImpl implements AgentService { .clientId(clientId) .dataType(dataType) .build(); - try { - taskService.createSpecificTimeTask(request); - JSONObject json = new JSONObject(); - json.put("resCode",1); - json.put("resMsg", "执行脚本策略定时任务保存成功"); - json.put("timestamp",timestamp); - // 判定客户端与服务端是否连接 - if (Objects.nonNull(sessionManager.getSessionById(GlobalConfig.CLIENT_ID))) { - Message message = Message.builder().clientId(GlobalConfig.CLIENT_ID).dataType(MsgEnum.执行脚本策略应答.getValue()) - .data(json.toString()).build(); - sessionManager.writeAndFlush(sessionManager.getSessionById(GlobalConfig.CLIENT_ID).getChannel(), message); - AssertLog.info("发送执行脚本策略应答={}",JSON.toJSONString(message)); - } - } catch (Exception e) { - JSONObject json = new JSONObject(); - json.put("resCode",0); - json.put("resMsg", "执行脚本策略定时任务保存失败"); - json.put("timestamp",timestamp); - // 判定客户端与服务端是否连接 - if (Objects.nonNull(sessionManager.getSessionById(GlobalConfig.CLIENT_ID))) { - Message message = Message.builder().clientId(GlobalConfig.CLIENT_ID).dataType(MsgEnum.执行脚本策略应答.getValue()) - .data(json.toString()).build(); - sessionManager.writeAndFlush(sessionManager.getSessionById(GlobalConfig.CLIENT_ID).getChannel(), message); - AssertLog.info("发送执行脚本策略应答={}",JSON.toJSONString(message)); + if(StringUtils.equals(dataType, MsgEnum.Agent版本更新应答.getValue())){ + // 将request对象转换为JSON字符串 + String jsonContent = "updateMsg=" + JSONObject.toJSONString(request); + // 检查并创建外置目录 + if (AdvancedAsyncDownloader.createSingleDirectoryIfNotExists(properties.getConfPath())) { + // 将JSON字符串写入文件 + AgentUtil.bufferedWriter(properties.getConfPath() + "/agentupdate.conf", + new String[]{jsonContent}); } } + processCommand(request, timestamp); }else{ if(StringUtils.equals(dataType, MsgEnum.Agent版本更新应答.getValue())){ try { + AssertLog.info("agent更新启动...暂停心跳和采集任务"); + //更改全局变量 + GlobalConfig.isCollect = false; + //调用采集任务 + cancelCollect(); //设置检查回滚任务 String SCRIPT_PATH = properties.getScriptPath()+"/rollback-tragent.sh"; AgentDataUtil.chmod(SCRIPT_PATH,"775"); @@ -269,6 +259,39 @@ public class AgentServiceImpl implements AgentService { } } } + /** + * 辅助方法:持久化定时更新 + * @param request + * @param timestamp + */ + public void processCommand(SpecificTimeRequest request, long timestamp){ + try { + taskService.createSpecificTimeTask(request); + JSONObject json = new JSONObject(); + json.put("resCode",1); + json.put("resMsg", "执行脚本策略定时任务保存成功"); + json.put("timestamp",timestamp); + // 判定客户端与服务端是否连接 + if (Objects.nonNull(sessionManager.getSessionById(GlobalConfig.CLIENT_ID))) { + Message message = Message.builder().clientId(GlobalConfig.CLIENT_ID).dataType(MsgEnum.执行脚本策略应答.getValue()) + .data(json.toString()).build(); + sessionManager.writeAndFlush(sessionManager.getSessionById(GlobalConfig.CLIENT_ID).getChannel(), message); + AssertLog.info("发送执行脚本策略应答={}",JSON.toJSONString(message)); + } + } catch (Exception e) { + JSONObject json = new JSONObject(); + json.put("resCode",0); + json.put("resMsg", "执行脚本策略定时任务保存失败"); + json.put("timestamp",timestamp); + // 判定客户端与服务端是否连接 + if (Objects.nonNull(sessionManager.getSessionById(GlobalConfig.CLIENT_ID))) { + Message message = Message.builder().clientId(GlobalConfig.CLIENT_ID).dataType(MsgEnum.执行脚本策略应答.getValue()) + .data(json.toString()).build(); + sessionManager.writeAndFlush(sessionManager.getSessionById(GlobalConfig.CLIENT_ID).getChannel(), message); + AssertLog.info("发送执行脚本策略应答={}",JSON.toJSONString(message)); + } + } + } @Override public void cancelTask(String taskId) { @@ -290,6 +313,8 @@ public class AgentServiceImpl implements AgentService { checkMonitor(); AssertLog.info("检测mtr探测策略配置"); checkMtrDelect(); + AssertLog.info("检测agent更新配置"); + checkAgentUpdate(); } @Override @@ -742,10 +767,6 @@ public class AgentServiceImpl implements AgentService { String md5 = AgentUtil.getFileMD5(properties.getTempPath()+"/"+fileName); if(StringUtils.isNotBlank(md5) && StringUtils.isNotBlank(versionUpdateEO.getFileMd5()) && StringUtils.equals(md5,versionUpdateEO.getFileMd5())){ - //更改全局变量 - GlobalConfig.isCollect = false; - //关闭采集任务 - cancelCollect(); //所有文件下载完成,执行脚本命令 AssertLog.info("版本策略MD5验证成功"); command(policy, GlobalConfig.CLIENT_ID,MsgEnum.Agent版本更新应答.getValue()); @@ -1563,4 +1584,28 @@ public class AgentServiceImpl implements AgentService { public void caseTypeBySystem(String type, int interval, boolean collect){ } + @Override + public void checkAgentUpdate() { + File agentUpdateFile = new File(properties.getConfPath() + "/agentupdate.conf"); + if (agentUpdateFile.exists()) { + Properties props = new Properties(); + try (InputStream input = Files.newInputStream(agentUpdateFile.toPath())) { + props.load(input); + + String updateMsg = props.getProperty("updateMsg"); + if (StringUtils.isNotBlank(updateMsg)) { + long timestamp = System.currentTimeMillis(); + timestamp = Math.round(timestamp / 1000.0); + SpecificTimeRequest request = JSON.parseObject(updateMsg, SpecificTimeRequest.class); + processCommand(request, timestamp); + AssertLog.info("应用启动时加载agent更新配置成功: {}", updateMsg); + } + + } catch (Exception e) { + AssertLog.error("应用启动时加载agent更新配置异常", e); + } + } else { + AssertLog.debug("agent更新配置文件不存在: {}", agentUpdateFile.getPath()); + } + } }