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"}

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import re, socket, struct, json, time
  4. from python_sender_log import sender_log
  5.  
  6. PROXY_IP = ['*.*.*.*', '*.*.*.*']
  7.  
  8. def get_server_ip():
  9. """
  10. :rtype: str
  11. :function : return zabbix_server ip
  12. """
  13. with open('zabbix_agentd.conf', 'r') as f:
  14. for i in f:
  15. if i.startswith('Server') or i.startswith('ServerActive'):
  16. ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', i)
  17. if ip:
  18. return ip[0]
  19. return False
  20.  
  21. def get_destination_hostname():
  22. """
  23. :rtype: str
  24. :function : return zabbix_agentd hostname
  25. """
  26. with open('zabbix_agentd.conf', 'r') as f:
  27. for i in f:
  28. if i.startswith('Hostname'):
  29. return i.split('=')[1].strip('\n')
  30. return False
  31.  
  32. class info(object):
  33. """
  34. :function: connect zabbix_server and then sender value
  35. """
  36.  
  37. def __init__(self):
  38. self.server = get_server_ip()
  39. if self.server in PROXY_IP:
  40. self.server = '*.*.*.*'
  41. self.port = 31351
  42. self.header = '''ZBXD\1{0}{1}'''
  43. self.data = []
  44.  
  45. def __len__(self):
  46. return len(self.data)
  47.  
  48. def __repr__(self):
  49. return "{0}".format(self.data)
  50.  
  51. def __getitem__(self, index):
  52. return self.data[index]
  53.  
  54. def __clock(self):
  55. """
  56. :rtype:int
  57. :functrion: return current timestamp
  58. """
  59. return int(time.time())
  60.  
  61. def create_obj(self, host, key, value, clock):
  62. """
  63. :type host : str
  64. :type key : str
  65. :type value:str or int
  66. :type clock: int
  67. :rtype dict
  68. :function : create item value and return to self.add_data
  69. """
  70. obj = {
  71. "host": host,
  72. "key": key,
  73. "value": value
  74. }
  75. if clock:
  76. obj["clock"] = clock
  77. else:
  78. obj["clock"] = self.__clock()
  79. return obj
  80.  
  81. def add_data(self, host, key, title, value, clock=None):
  82. """
  83. :rtype:list
  84. :function : add send value to self.data
  85. """
  86. obj = self.create_obj(host, key, title.strip() + ' ' + value, clock)
  87. self.data.append(obj)
  88.  
  89. def echo_data(self):
  90. """
  91. :rtype list
  92. :function : print self.data
  93. """
  94. for elem in self.data:
  95. print
  96. str(elem)
  97.  
  98. @property
  99. def get_data(self):
  100. """
  101. :funtion : return self.data copy
  102. """
  103. return self.data[:]
  104.  
  105. def delete_element(self, element):
  106. """
  107. :rtype:bool
  108. :function : delete element from self.data
  109. """
  110. if element in self.data:
  111. self.data.remove(element)
  112. return True
  113.  
  114. def clear_data(self):
  115. """
  116. :function : clear self.data
  117. """
  118. self.data = []
  119. return True
  120.  
  121. def send_format(self):
  122. """
  123. :rtype:json
  124. :function : return json data
  125. """
  126. sender_data = {
  127. "request": "sender data",
  128. "data": self.data,
  129. }
  130. return json.dumps(sender_data)
  131.  
  132. @sender_log(log_path='zabbix', log_name='zbx_send')
  133. def send_data(self, data):
  134. """
  135. :rtype:dict
  136. :funtion: send value to zabbix_server
  137. """
  138. data_length = len(data)
  139. data_header = struct.pack('i', data_length) + '\0\0\0\0'
  140. data_to_send = self.header.format(data_header, data)
  141. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  142. sock.connect((self.server, self.port))
  143. sock.send(data_to_send)
  144. response_header = sock.recv(5)
  145. if not response_header == 'ZBXD\1':
  146. raise ValueError('无效的响应数据')
  147. response_data_header = sock.recv(8)
  148. response_data_header = response_data_header[:4]
  149. response_len = struct.unpack('i', response_data_header)[0]
  150. response_raw = sock.recv(response_len)
  151. sock.close()
  152. response = response_raw
  153. 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. PAT 甲级 1077 Kuchiguse

    https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096 The Japanese language ...

  2. 使用TestNG 和 CSV文件进行数据驱动

    package testNGPractice; import java.io.BufferedReader; import java.io.FileInputStream; import java.i ...

  3. linux 下svn忽略文件

    假设想忽略文件temp 1. cd到temp所在的目录下: 2. svn propedit svn:ignore . 注意:请别漏掉最后的点(.表示当前目录),如果报错请看下面 3. 打开的文件就是忽 ...

  4. 【Linux】- 简明Vim练习攻略

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...

  5. laya3d 文件格式

    先认识下laya3d的一些文件 导出文件说明:               ls        ---    场景文件: Json文件,包含场景中所有节点的数据信息,包含光照贴图信息          ...

  6. 洛谷P2894[USACO08FEB]酒店Hotel(线段树)

    问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...

  7. 【开发工具IDE】eclipse的web项目的tomcat安装部署问题

    一.发现问题 在eclipse中新建Dynamic Web Project,配置好本地的tomcat并写好代码后选择Run on Server,但运行后发现在tomcat的安装目录下的webapps并 ...

  8. BZOJ3747 POI2015Kinoman(线段树)

    考虑固定左端点,求出该情况下能获得的最大值.于是每次可以在某数第一次出现的位置加上其价值,第二次出现的位置减掉其价值,查询前缀最大值就可以了.每次移动左端点在线段树上更新即可. #include< ...

  9. Docker学习笔记五:Docker生成jenkins容器,支持Java Web项目持续集成、持续部署

    一.创建jenkins容器: 1.拉取jeknin镜像 sudo docker pull jenkins 2.创建一个jenkins目录 sudo mkdir /jenkins 3.在jenkins目 ...

  10. 【BZOJ2727】双十字(动态规划,树状数组)

    [BZOJ2727]双十字(动态规划,树状数组) 题面 BZOJ 洛谷 题解 我们去年暑假的时候考试考过. 我当时写了个大暴力混了\(70\)分.... 大暴力是这么写的: 预处理每个位置向左右/上/ ...