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
| #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/3/12 9:29 # @Author : dongjiaxiao # @Email : # @File : tcp_connect_status_monitor.py # @Desc : import sys import os import subprocess
def execute_cmd(cmd): """ 命令执行,并获取返回状态与执行结果 :param cmd: 要执行的命令 :return: 字典包含 执行的状态码和执行的正常和异常输出, 0为正常,1为异常 """ cmd_res = {'status': 1, 'stdout': '', 'stderr': ''} try: res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) res_stdout, res_stderr = res.communicate() cmd_res['status'] = res.returncode cmd_res['stdout'] = res_stdout.replace('\n', '').strip() cmd_res['stderr'] = res_stderr.replace('\n', '').strip() except Exception as e: cmd_res['stderr'] = e finally: return cmd_res
def tcp_connect_status_value(zabbix_conf_path,tcp_conn_status_cmd): """ 发送数据到 zabbix 服务端,监控项类型需为 zabbix 采集器 :param zabbix_conf_path: zabbix conf 路径 :param tcp_connect_status_cmd: 获取tcp连接信息的执行命令 :return: send_data_flg['status'] 发送数据是否成功 ,1为成功,0为失败,send_data_flg['error_info'] 为错误信息。 """ tcp_conn_status_dic = { 'CLOSED': 0, 'CLOSE_WAIT': 0, 'CLOSING': 0, 'ESTABLISHED': 0, 'FIN_WAIT1': 0, 'FIN_WAIT2': 0, 'LAST_ACK': 0, 'LISTEN': 0, 'SYN_RECV': 0, 'SYN_SENT': 0, 'TIME_WAIT': 0, } # tcp 连接状态码 tmp_file = "/tmp/zabbix_sender_tcp_connect_status_file.txt" # 临时文件,用完会删除 send_data_flg = {'status': 0, 'error_info': ''} # 发送数据状态与信息记录 sender_bin_ret = execute_cmd("which zabbix_sender") if sender_bin_ret['status'] == 0: # 判断是否安装 zabbix_sender 是否存在 zabbix_sender_bin = sender_bin_ret['stdout'] else: send_data_flg['error_info'] = "zabbix sender 未安装" + sender_bin_ret['stderr'] return send_data_flg tcp_connect_status_ret = execute_cmd(tcp_conn_status_cmd) # 执行命令获取tcp连接信息 if tcp_connect_status_ret['status'] == 0: tcp_connect_status_data = tcp_connect_status_ret['stdout'].split() front_data = 0 # 记录列表当前数据的前一个数据,因为 tcp 数量的值在状态的前一行。 for tcp_status in list(tcp_conn_status_dic.keys()): # 遍历tcp状态码然后进行对比 for tcp_status_data in tcp_connect_status_data: if tcp_status == tcp_status_data: tcp_conn_status_dic[tcp_status] = front_data front_data = tcp_status_data with open(tmp_file, mode='w') as f_zs: # 将要发送的数据写入临时文件 for status, number in tcp_conn_status_dic.items(): f_zs.write("- custom.tcp.connect.status[{0}] {1} \n".format(status.lower(), number)) #print '{0} -c {1} -i {2}'.format(zabbix_sender_bin, zabbix_conf_path, tmp_file) sender_data_ret = execute_cmd('{0} -c {1} -i {2}'.format(zabbix_sender_bin, zabbix_conf_path, tmp_file)) # 发送到 zabbix server #print sender_data_ret if sender_data_ret['status'] == 0 and sender_data_ret['stdout'].find( "failed: 0") >= 0: # 当命令执行成功,并且找到"failed: 0" send_data_flg['status'] = 1 os.remove(tmp_file) # 删除临时文件 else: send_data_flg['error_info'] = sender_data_ret['stdout'] + " or failed is not eq 0" else: send_data_flg['error_info'] = "{0} 执行失败 ,result:{1}".format(tcp_conn_status_cmd, tcp_connect_status_ret['stderr']) return send_data_flg
if __name__ == '__main__': tcp_conn_status_cmd = "netstat -ant|awk '{print $NF}' |sort |uniq -c" # 获取连接状态的信息 zabbix_conf_path = '/etc/zabbix/zabbix_agentd.conf ' # zabbix 配置文件 if len(sys.argv) == 2 and sys.argv[1] == "sender_data": # 发送监控数据到服务端,单独监控项判断是否发送成功 sender_status = tcp_connect_status_value(zabbix_conf_path, tcp_conn_status_cmd) print(sender_status['status']) # print(sender_status['error_info']) # 打印错误信息,便于调试。 else: print("please use parameter sender_data")
|