python版本的zabbix_sender:

使用方法:
    1、导入 : from zbx_send import info
    
    2、实例化: test=info()
 
    3、支持方法:
        添加信息: add_data("主机名",'Key_',"报警内容"),可以添加多次
               例:  test.add_data("cluster",'cluster.core.waring',"alert content")
                    test.add_data("cluster",'cluster.core.waring',"alert content")
        
        查看已有信息:
               例: print(test.echo_data()) 返回字典
                   {'host': 'cluster', 'value': 'alert content', 'key': 'cluster.core.waring', 'clock': 1533880388}
                   {'host': 'cluster', 'value': 'alert content', 'key': 'cluster.core.waring', 'clock': 1533880388}
                   
                   
                   print test  返回列表
                   [{'host': 'cluster', 'value': 'alert content', 'key': 'cluster.core.waring', 'clock': 1533880444}, {'host': 'cluster', 'value': 'alert content', 'key': 'cluster.core.waring', 'clock': 1533880444}]

删除内容:  print test.delete_element(test[-1])  返回Boolen

清空内容: print test.clear_data() 返回Boolen            
                 
        修改内容: test[0] == test[1]
        
    4、发送数据:data=test.send_format()
                         print test.send_data(data)
                
                成功返回值: {"response":"success","info":"processed: 2; failed: 0; total: 2; seconds spent: 0.000036"}
                失败返回值: {"response":"success","info":"processed: 0; failed: 2; total: 2; seconds spent: 0.000036"}

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re, socket, struct, json, time
from python_sender_log import sender_log PROXY_IP = ['*.*.*.*', '*.*.*.*'] def get_server_ip():
"""
:rtype: str
:function : return zabbix_server ip
"""
with open('zabbix_agentd.conf', 'r') as f:
for i in f:
if i.startswith('Server') or i.startswith('ServerActive'):
ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', i)
if ip:
return ip[0]
return False def get_destination_hostname():
"""
:rtype: str
:function : return zabbix_agentd hostname
"""
with open('zabbix_agentd.conf', 'r') as f:
for i in f:
if i.startswith('Hostname'):
return i.split('=')[1].strip('\n')
return False class info(object):
"""
:function: connect zabbix_server and then sender value
""" def __init__(self):
self.server = get_server_ip()
if self.server in PROXY_IP:
self.server = '*.*.*.*'
self.port = 31351
self.header = '''ZBXD\1{0}{1}'''
self.data = [] def __len__(self):
return len(self.data) def __repr__(self):
return "{0}".format(self.data) def __getitem__(self, index):
return self.data[index] def __clock(self):
"""
:rtype:int
:functrion: return current timestamp
"""
return int(time.time()) def create_obj(self, host, key, value, clock):
"""
:type host : str
:type key : str
:type value:str or int
:type clock: int
:rtype dict
:function : create item value and return to self.add_data
"""
obj = {
"host": host,
"key": key,
"value": value
}
if clock:
obj["clock"] = clock
else:
obj["clock"] = self.__clock()
return obj def add_data(self, host, key, title, value, clock=None):
"""
:rtype:list
:function : add send value to self.data
"""
obj = self.create_obj(host, key, title.strip() + ' ' + value, clock)
self.data.append(obj) def echo_data(self):
"""
:rtype list
:function : print self.data
"""
for elem in self.data:
print
str(elem) @property
def get_data(self):
"""
:funtion : return self.data copy
"""
return self.data[:] def delete_element(self, element):
"""
:rtype:bool
:function : delete element from self.data
"""
if element in self.data:
self.data.remove(element)
return True def clear_data(self):
"""
:function : clear self.data
"""
self.data = []
return True def send_format(self):
"""
:rtype:json
:function : return json data
"""
sender_data = {
"request": "sender data",
"data": self.data,
}
return json.dumps(sender_data) @sender_log(log_path='zabbix', log_name='zbx_send')
def send_data(self, data):
"""
:rtype:dict
:funtion: send value to zabbix_server
"""
data_length = len(data)
data_header = struct.pack('i', data_length) + '\0\0\0\0'
data_to_send = self.header.format(data_header, data)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.server, self.port))
sock.send(data_to_send)
response_header = sock.recv(5)
if not response_header == 'ZBXD\1':
raise ValueError('无效的响应数据')
response_data_header = sock.recv(8)
response_data_header = response_data_header[:4]
response_len = struct.unpack('i', response_data_header)[0]
response_raw = sock.recv(response_len)
sock.close()
response = response_raw
return response

python 版本zabbix_sender的更多相关文章

  1. 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)

    稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...

  2. Centos7下安装python,查看python版本

    安装Centos的时候,一般会自带默认安装python2.x 一般用python -V可以查看python版本. 我当时安装的时候,运行了那个语句,但是却显示了一大堆出来,虽然里面也带有版本信息,但是 ...

  3. LInux升级Python版本2.7.11所遇问题汇总

    首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上 ...

  4. Sublime Text 2 增加python版本

    当系统中装有多个python版本时,Sublime Text 2  使用哪个版本需要手动添加 键入一下内容,path输入python的安转路径 保存至Python27.sublime-build文件 ...

  5. linux 多个python版本的切换

    源码安装新的python版本,我的安装路径: /usr/self/Python3.5.2 修改软链接到你所安装的python版本中: 默认python命令是在/usr/bin/目录下 1 sudo m ...

  6. liunx CentOS 升级Python版本

    CentOS python版本是V2.6.6,升级3.4.3. 1.下载 安装包:wget http://www.python.org/ftp/python/3.4.3/Python-3.4.3.tg ...

  7. Linux安装多个Python版本

    服务器上的Python版本太老了,需要安装一个新的Python版本,才能跑我的代码.因为环境的需要,但是又不能卸载老的版本,所以安装一个新的,使用软链来进行升级. 使用系统自带的yum,apt-get ...

  8. CentOS下更新python版本

    执行#Python或#python -V或#python --version,看到版本号是2.7.5,到官网https://www.python.org/ftp/python/查看了下最新版本都到了2 ...

  9. Debian中如何切换默认Python版本

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件,你可以按照以下方法使用 ls 命令来查看你的系 ...

随机推荐

  1. Scrum 项目 5.0

    5.0--------------------------------------------------- 1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理 ...

  2. PAT 甲级 1144 The Missing Number

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343463260160 Given N integers, you ...

  3. 【Linux笔记】CentOS&RHEL YUM基础知识

    以下内容收集自网络,以作参考. 一.YUM是什么 YUM = Yellow dog Updater, Modified. 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...

  4. 在Linux上编译使用tcmalloc

    项目需要使用tcmalloc,比较简单的方法是安装tcmalloc相关包(gpertools)后,将tcmalloc的静态库提取出来,在编译项目内核(执行makefile)时,链接上静态库即可. 这里 ...

  5. C++解析(31):自定义内存管理(完)

    0.目录 1.遗失的关键字mutable 2.new / delete 3.new[] / delete[] 4.小结 5.C++语言学习总结 1.遗失的关键字mutable 笔试题: 统计对象中某个 ...

  6. debug - vue中通过ajax获取数据时,如何避免绑定的数据中出现property of undefined错误

    因为获取服务器是异步的,所以 vue 先绑定数据. 如果 ??? 是通过 ajax 异步获取的,在获取之前,???是未定义的.此时在外面的标签上添加一个 v-if="???" 可以 ...

  7. NOI2018前的每日记录

    NOI2018前的每日记录 开头 今天是\(2018.7.2\),不知不觉已经这么久了.本来还是高一的小蒟蒻,过不了多久就要成为高二的老年选手了. 再过半个月我也要去\(NOI\)打酱油了.我这种D类 ...

  8. 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...

  9. 【莫队】【P3834】 【模板】可持久化线段树 1(主席树)

    大家好,我是个毒瘤,我非常喜欢暴力数据结构,于是我就用莫队+分块过了这个题 Solution 发现这个题静态查询资瓷离线,于是考虑莫队. 在这里简单介绍一下莫队: 将所有询问离线后,对原序列分块.按照 ...

  10. vs2003一查找就卡死了

    Visual Studio 2003一查找就卡死了.解决办法如下: win7 32位下 解决方法:找到VS2003的安装目录,修改"...\Microsoft Visual Studio . ...