summaryrefslogtreecommitdiff
path: root/src/com/nis/nmsclient/config/DetecConfReqHandle.java
blob: 22ef96762a4a072b740b180da4e75db27fd01caa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
package com.nis.nmsclient.config;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import com.nis.nmsclient.common.Common;
import com.nis.nmsclient.common.Contants;
import com.nis.nmsclient.model.AlarmInfo;
import com.nis.nmsclient.model.SetInfo;
import com.nis.nmsclient.thread.alarm.AlarmUtil;
import com.nis.nmsclient.util.FileUtil;
import com.nis.nmsclient.util.FileWrUtil;
import com.nis.nmsclient.util.ProcessUtil;
import com.nis.nmsclient.util.Utils;

public class DetecConfReqHandle {
	Logger logger = Logger.getLogger(DetecConfReqHandle.class);
	
	/**
	 * 初始化监测配置
	 *   处理接收到监测配置信息:解析成自定义的对象
	 * @param str JSONObject串
	 */
	public void handlerConfigByInit(String str, List<SetInfo> setInfos, Map<Long, List<AlarmInfo>> alarmInfos) {
		// -- 参数处理
		if (str == null || str.trim().length() <= 0) {
			return;
		}
		if(setInfos==null || alarmInfos == null){
			return;
		}
		setInfos.clear();
		alarmInfos.clear();
		
		// -- 初始化配置环境处理
		File file = new File(Contants.localDetecConfPath);
		if (!file.exists()) {// 判断存放目录是否存在,不存创建
			file.mkdirs();
		}
		File[] cfgFiles = file.listFiles();
		for (int i = 0; i < cfgFiles.length; i++) {//清空所有配置文件
			// 使用删除文件公共方法
			FileUtil.delDir(cfgFiles[i]);
			logger.debug("handlerConfigByInit()--delete file=" + cfgFiles[i].getAbsolutePath());
		}
		
		// -- 监测配置解析
		JSONObject jsonObj = JSONObject.fromObject(str);
		
		List<SetInfo> setList = null;
		if (str.toLowerCase().contains("setinfo")) {
			JSONArray jsonArr = jsonObj.getJSONArray("setInfo");
			setList = handerSetInfo(jsonArr);
		}
		if (setList == null || setList.size() == 0) {
			return;
		}
		Map<Long, List<AlarmInfo>> alarmMap = null;
		if (str.toLowerCase().contains("alarminfo")) {
			JSONArray jsonArr = jsonObj.getJSONArray("alarmInfo");
			alarmMap = handerAlarmInfo(jsonArr, setList);
		}
		// 20170413 zbc 缓存AlarmInfo信息(cfg文件中无报警单位字段)
		if(alarmMap != null) {
			Common.putAllDetecAlarmInfo(alarmMap);
		}

		for (SetInfo setInfo : setList) {
			if ("1".equals(setInfo.getCheckState())
					&& "1".equals(setInfo.getCheckWay())) {// 有效,被动方式获取
				setInfos.add(setInfo);
				Common.addOrUpdateAlarmPO(AlarmUtil.getAlarmPO(setInfo));
			}
		}
		if (alarmMap != null && alarmMap.size()>0) {
			alarmInfos.putAll(alarmMap);
		}
		
		if (str.toLowerCase().contains("showautoalarm")) {
			Object obj = jsonObj.get("showAutoAlarm");
			if (obj != null) {
				Contants.ACTIIVE_ALARM_START = (Boolean) obj;
			}
		}
	}
	
	/**
	 * 更新监测配置:先解析成自定义的对象,再根据对象信息添加、更新、停用监测
	 *    注:三方监测停用时Agent根据指定的PID杀掉进程 
	 * @param str JSONObject串
	 */
	public void handlerConfigByUpdate(String str) {
		if (str == null || str.trim().length() <= 0) {
			return;
		}
		
		File file = new File(Contants.localDetecConfPath);
		if (!file.exists()) {// 判断存放目录是否存在,不存创建
			file.mkdirs();
		}
		
		JSONObject jsonObj = JSONObject.fromObject(str);
		/*long flag = -1;
		if (str.toLowerCase().contains("number")) {
			flag = jsonObj.getLong("number");
		}*/
		List<SetInfo> setList = null;
		if (str.toLowerCase().contains("setinfo")) {
			JSONArray jsonArr = jsonObj.getJSONArray("setInfo");
			setList = handerSetInfo(jsonArr);
		}
		if (setList == null || setList.size() == 0) {
			return;
		}
		Map<Long, List<AlarmInfo>> alarmMap = null;
		if (str.toLowerCase().contains("alarminfo")) {
			JSONArray jsonArr = jsonObj.getJSONArray("alarmInfo");
			alarmMap = handerAlarmInfo(jsonArr, setList);
		}

		for (SetInfo setInfo : setList) {
			if ("0".equals(setInfo.getCheckState())
					|| "0".equals(setInfo.getCheckWay())) {// 将有效置为无效,或者将被动设为主动,停止线程
				Common.removeAlarmPO(setInfo.getId());
				if ("0".equals(setInfo.getIsSchedule())) {
					Common.stopSysDetec(setInfo);
				} else {
					Common.stopPluginDetec(setInfo);
				}
			} else {
				Common.addOrUpdateAlarmPO(AlarmUtil.getAlarmPO(setInfo));
				if ("0".equals(setInfo.getIsSchedule())) {// 如果是系统预设监测类型,则修改相应的监控线程
					List<AlarmInfo> alarmList = null;
					if (alarmMap != null) {
						alarmList = alarmMap.get(setInfo.getId());
					}
					Common.addOrUpdateSysDetec(setInfo, alarmList);
				} else { // 第三方监测
					// 缓存三方监测配置信息,用于合并临时结果文件
					Common.putPluginDetecSetInfo(setInfo.getId(), setInfo);
					
					if(!Common.COMMON_SYS_SETINFO.equals(setInfo.getIsSchedule())) { // 由Agent启动的第三方插件
						Common.startPluginDetec(setInfo);
					}
				}
			}
		}// for end
	}
	
	/**
	 * 解析监测设置基本信息
	 * 	1、相应类型的监测数据目录不存在,创建,若是Linux并赋读写权限
	 *  2、监测配置文件存在,先删除再重写,停用监测不再重写
	 */
	private List<SetInfo> handerSetInfo(JSONArray jsonArr) {
		// 文件路径
		List<SetInfo> setList = new ArrayList<SetInfo>();
		for (int i = 0; i < jsonArr.size(); i++) {
			Object obj = JSONObject.toBean(JSONObject
					.fromObject(jsonArr.get(i)), SetInfo.class);
			if (obj == null) {
				continue;
			}
			SetInfo setInfo = (SetInfo) obj;
			// 创建建相应类型的数据文件夹
			File dataDir = new File(Contants.localDataFilePath
					+ File.separator
					+ DetecConfOper.getFileName(setInfo.getCheckTypeName(),
							setInfo.getProcessIden(), null));
			if (!dataDir.exists()) {
				dataDir.mkdirs();
				logger.debug("handerSetInfo()--create dataDir=" +dataDir.getAbsolutePath());
			}
			// 文件名
			String fileName = DetecConfOper.getFileName(
					setInfo.getCheckTypeName(), setInfo.getProcessIden(),
					Contants.localDetecConfSuffix);

			// 判断文件是否存在,如果存在删除
			File cfgfile = new File(Contants.localDetecConfPath + File.separator
					+ fileName);
			if (cfgfile.exists()){
				//cfgfile.delete_bak();
				//使用删除文件公共方法
				FileUtil.delDir(cfgfile);
				logger.debug("handerSetInfo()--delete cfgfile=" + cfgfile.getAbsolutePath());
				//FileUtil.checkParentDirExist(cfgfile);
			}
			
			if ("1".equals(setInfo.getCheckState())
					&& "1".equals(setInfo.getCheckWay())) {//有效且被动方式获取的写入配置文件
				String dataDirStr = null;
				try {// 为了去除路径中的"." 和 ".."
					dataDirStr = dataDir.getCanonicalPath();
				} catch (IOException e) {
					dataDirStr = dataDir.getAbsolutePath();
				}
				try {
					FileWrUtil.cfgFilePrinter(cfgfile, Contants.charset,
							setInfo.getValArr(Contants.AGENT_HOST_UUID, dataDirStr));
					logger.debug("handerSetInfo()--write cfgfile=" + cfgfile.getAbsolutePath());
				} catch (Exception e) {
					logger.error("Write the document“" + cfgfile.getAbsolutePath() + "”error: " + Utils.printExceptionStack(e));
					continue;
				}
			}
			setList.add(setInfo);

		}// for end
		//修改数据目录的权限
		ProcessUtil.permit(777, new File(Contants.localDataFilePath));
		
		return setList;
	}
	
	/**
	 * 解析监测设置的告警信息
	 *   1、将同一监测的所有告警信息整理放到一个列表
	 *   2、根据监测设置类型和设置名称找配置文件,找到了将告警信息追加到配置文件
	 *   3、只要有监测设置,不管有没有设置告警信息,都要将相应字段追加到配置文件,只是无告警信息时,配置字段为空
	 */
	private Map<Long, List<AlarmInfo>> handerAlarmInfo(JSONArray jsonArr, List<SetInfo> setList) {
		if(setList==null || setList.size()==0){
			logger.info("无监测设置信息,无需处理报警设置");
			return null;
		}
		File dir = new File(Contants.localDetecConfPath);
		if (!dir.exists()) {// 判断存放目录是否存在, 不存在返回
			logger.error("Please check whether the alarm settings information is consistent with the monitoring settings information!");
			return null;
		}
		Map<Long, List<AlarmInfo>> alarmMap = new HashMap<Long, List<AlarmInfo>>();
		if(jsonArr!=null){
			for (int i = 0; i < jsonArr.size(); i++) {
				Object obj = JSONObject.toBean(JSONObject
						.fromObject(jsonArr.get(i)), AlarmInfo.class);
				if (obj != null) {
					AlarmInfo alarmInfo = (AlarmInfo) obj;
					if (alarmMap.containsKey(alarmInfo.getSetInfoId())) {// 如果报警信息中已经存在相应类型的报警则追加
						List<AlarmInfo> aList = alarmMap.get(alarmInfo.getSetInfoId());
						aList.add(alarmInfo);
						alarmMap.put(alarmInfo.getSetInfoId(), aList);
					} else {
						List<AlarmInfo> aList = new ArrayList<AlarmInfo>();
						aList.add(alarmInfo);
						alarmMap.put(alarmInfo.getSetInfoId(), aList);
					}
				}
			}
		}
		Map<Long, List<AlarmInfo>> alarmMapNew = new HashMap<Long, List<AlarmInfo>>();
		// 依次查看监测设置信息,不管有没有设置告警信息,都要写配置police=,若无告警信息,配置字段值为空
		for(SetInfo setInfo : setList){
			Long key = setInfo.getId();
			List<AlarmInfo> alarmList = alarmMap.get(key);
			// 配置信息保存对应的文件名
			String fileName = DetecConfOper.getFileName(
					setInfo.getCheckTypeName(), setInfo.getProcessIden(),
					Contants.localDetecConfSuffix);
			File f = DetecConfOper.getConfigFile(dir, fileName);
			{// 追加报警设置到相应的监测配置文件
			if (f != null && f.exists()) 
				try {
					FileWrUtil.cfgFileAppender(f,
							Contants.charset, new String[]{getAlarmArr(alarmList)});
					if(alarmList!=null){// 只有成功保存了文件并且设置为告警信息的,才返回给上一方法
						alarmMapNew.put(key, alarmList);
					}
				} catch (Exception e) {
					logger.error("Write the document“" + f.getAbsolutePath() + "”error: " + Utils.printExceptionStack(e));
				}
			}
		}
		return alarmMapNew;
	}
	
	private static String getAlarmArr(List<AlarmInfo> alarmList) {
		StringBuffer sb = new StringBuffer();
		sb.append("police=");
		if (alarmList != null && alarmList.size() > 0) {
			for (AlarmInfo alarmInfo : alarmList) {
				sb.append(alarmInfo.toStringVal() + ",");
			}
			sb.delete(sb.toString().length() - 1, sb.toString().length());
		}
		return sb.toString();
	}
}