<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>io.github.hengyunabc</groupId>
<artifactId>zabbix-api</artifactId>
<version>0.0.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
2.2项目整体结构
然后我们项目的整体结构如下:
其中InsertDataToMysql这个文件是我们没有用到的,这里就不删啦,大家自行忽略。测试类是我们所需要的,后续会详细说明,大家不要忽略。
2.3 ZabbixConfig配置文件
ok,我们继续展示代码,按照项目结构顺序来,首先,config包下ZabbixConfig这个文件:
@Component
@ConfigurationProperties(prefix = "zabbix.config")
@Data
public class ZabbixConfig {
private String url;
private String username;
private String password;
}
以上的配置类代码用于读取以 zabbix.config
前缀开头的配置属性。我们在appliocation.yaml文件中进行了相关配置,读取配置文件中以 zabbix.config
为前缀的属性,并将其映射到对应的变量上。appliocation.yaml文件中代码如下:
2.4 application.yaml文件
zabbix:
config:
url: http://xx.xx.xx.xx/zabbix/api_jsonrpc.php
username: Admin
password: zabbix
这里的url是如我第一篇配置zabbix的那个url,username以及password都是zabbix默认的,如果大家配置时有修改则要对应修改,“/api_jsonrpc.php”这个后缀是我阅读了zabbix API官方文档后加上的,加上才能正确连接。zabbix API官方文档链接给大家附上:https://www.zabbix.com/documentation/5.0/zh/manual/ap(这个文档很重要,大家可以仔细阅读,后续,函数参数的选择等,也会用到这个文档)
2.5AbstractZabbixService 抽象类
接下来:AbstractZabbixService这个抽象类,其中包含了使用Zabbix API进行请求的方法和处理错误的方法。代码如下:
public abstract class AbstractZabbixService {
protected JSONObject zabbixRequest(ZabbixApi zabbixApi,Request request) throws Exception {
JSONObject response = zabbixApi.call(request); // 使用ZabbixApi对象调用call方法发起请求,并将响应存储在JSONObject对象中
return response; // 返回响应结果
}
protected void zabbixError(JSONObject response) throws Exception {
if (!isBlank(response.getString("error")))
throw new Exception("向Zabbix请求出错了!" + JSON.parseObject(response.getString("error")).getString("data"));
}
}
该抽象类封装了与Zabbix API的交互逻辑。zabbixRequest
方法用于发送Zabbix API请求并返回响应结果。它接受一个ZabbixApi对象和一个Request对象作为参数,通过调用ZabbixApi对象的call
方法发送请求,并将响应结果存储在JSONObject对象中,最后返回该对象。
zabbixError
方法用于处理Zabbix API的错误响应。它接受一个JSONObject对象作为参数,通过判断响应中是否存在"error"字段且不为空,如果存在错误,则抛出一个Exception异常,错误信息为 “向Zabbix请求出错了!” 加上从错误响应中解析出的"data"字段的值。
2.6 ZabbixService
接下来,就是我们的重中之重了(我们先跳过InsertDataService),这个Service层包含了我们对zabbix所要做的所有操作,代码如下:
@Service
public class ZabbixService extends AbstractZabbixService{
@Autowired
private ZabbixUtil zabbixUtil;
//获取主机列表
public String getHostList() throws Exception {
ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
Request request = RequestBuilder.newBuilder().method("host.get")
.paramEntry("output", new String[]{"host", "name", "description", "hostid"})
.paramEntry("selectGroups", "extend")
.build();
JSONObject response = zabbixRequest(zabbixApi,request);
zabbixError(response);
JSONArray result = response.getJSONArray("result");
return result.toJSONString();
}
//获取监控项
public String getMonitorItems(String hostId) throws Exception {
ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
Request request = RequestBuilder.newBuilder().method("item.get")
.paramEntry("output", new String[]{"extend", "name"})
.paramEntry("hostids", hostId)
.build();
JSONObject response = zabbixRequest(zabbixApi, request);
zabbixError(response);
JSONArray result = response.getJSONArray("result");
List<String> desiredItems = Arrays.asList("Interface eth0(): Bits received");
JSONArray filteredResult = new JSONArray();
for (int i = 0; i < result.size(); i++) {
JSONObject item = result.getJSONObject(i);
String name = item.getString("name");
if (desiredItems.contains(name)) {
filteredResult.add(item);
}
}
return filteredResult.toJSONString();
}
//获取监控项历史数据,paramEntry根据zabbixAPI设置,limit==481设定获取从timeform开始的为时一天的历史数据
public String getHistory(String itemId, long timeform) throws Exception {
ZabbixApi zabbixApi = zabbixUtil.getZabbixApi();
Request request = RequestBuilder.newBuilder().method("history.get")
.paramEntry("output", "extend")
.paramEntry("itemids", itemId)
.paramEntry("time_from", timeform)
// .paramEntry("time_till", 1675424400)
.paramEntry("sortfield","clock")
.paramEntry("sortorder","ASC")
.paramEntry("limit",481)
.build();
JSONObject response = zabbixRequest(zabbixApi, request);
zabbixError(response);
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/f77e8816395ec40ce4a1cf0c4de7c7cc.png)
![img](https://img-blog.csdnimg.cn/img_convert/ecd7607e0760d74c8caf11e5e4bf3736.png)
![img](https://img-blog.csdnimg.cn/img_convert/41a37284a11f578dc44b5dfeb727d482.png)
![img](https://img-blog.csdnimg.cn/img_convert/a55046a0342e7ea260e7690709b3b344.png)
![img](https://img-blog.csdnimg.cn/img_convert/6e0270cbef69a35b2c976133f2f43dbb.png)
![img](https://img-blog.csdnimg.cn/img_convert/696e1cebd9cdf54cc6e3ebfbbcdc7215.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)**
![img](https://img-blog.csdnimg.cn/img_convert/ffb68dbed82a188756a3ccf4cb032f5b.png)
年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)**
[外链图片转存中...(img-nruXBJK2-1712870532718)]