每日一题_Python.纯Python实现Low-Level discovery动态服务发现?

具体需求:
1. 由于自主开发的XmZoomEye-Agent目前被动监控为主,为了实现Zabbix Low-Level Discovery服务自主发现,需要根据进程名自动获取占用端口列表,并根据端口分析上报数据

实现思路:

1. 利用psutil模块通过进程名获取进程id列表
2. 遍历/proc/net/tcp文件获取rem_address为00000000:0000的列,将第九列的socket_id和它以集合形式的字典存储去重
3. 利用获取到的pid列表和socket_id集合字典生成端口集合
4. 尝试连接端口获取动态数据上报

具体代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://xmdevops.blog.51cto.com/
# Purpose:
#
"""
# 说明: 导入公共模块
import os
import re
import psutil
# 说明: 导入其它模块

# 说明: 获取进程
def pidof_processname(srvname):
    pids = []
    for pid in psutil.process_iter():
        if pid.name() == srvname:
            pids.append(str(pid.pid))
    return pids

# 说明: 套接端口
def socks_with_ports():
    sockets = {}
    with open(‘/proc/net/tcp‘, ‘r+b‘) as fd:
        for curline in fd:
            sepline = curline.split()
            if sepline[2] != ‘00000000:0000‘:
                continue
            key = sepline[9]
            addr, port = sepline[1].split(‘:‘)
            if key not in sockets:
                sockets[key] = set()
            sockets[key].add(int(port, 16))
    return sockets

# 说明: 获取端口
def analysis_sockports(pids, socks):
    sock_ports = set()
    for pid in pids:
        fd_path = os.path.join(os.path.join(‘/proc‘, pid), ‘fd‘)
        for rlink in os.listdir(fd_path):
            rpath = os.path.join(fd_path, rlink)
            if not os.path.exists(rpath):
                continue
            vlink = os.readlink(rpath)
            if not vlink.startswith(‘socket:‘):
                continue
            match = re.search(r‘(?<=socket:\[)([0-9]+)(?=\])‘, vlink)
            if not match:
                continue
            addr = match.group(1)
            if addr in socks:
                sock_ports.update(socks[addr])
    return sock_ports

def service_redis_running_status(add_data=None):
    srv_name = ‘redis-server‘
    pids = pidof_processname(srv_name)
    socks = socks_with_ports()
    ports = analysis_sockports(pids, socks)
    return ‘service: %s -> port: ‘ % srv_name, ports

if __name__ == ‘__main__‘:
    import pprint
    pprint.pprint(service_redis_running_status())

有图有相:

时间: 2024-08-03 09:29:20

每日一题_Python.纯Python实现Low-Level discovery动态服务发现?的相关文章

zabbix 自定义自动发现的key! low level discovery

1 意义和目的,在这里不讨论,只讨论是实现方法 2 学习的前提,你会编写常规的key! 和理解模板,item知识 系统环境 master端: [[email protected] zabbix_agentd.conf.d]# ifconfig  eth0| sed -n 's#.*inet addr:\(.*\) B.*#\1#gp' 192.168.100.10 client端 [[email protected] zabbix]# ifconfig  eth0| sed -n 's#.*in

Zabbix监控redis多实例(low level discovery)

对于多实例部署的tomcat.redis等应用,可以利用zabbix的low level discovery功能来实现监控,减少重复操作. 注:Zabbix版本: Zabbix 3.0.2 一.服务端配置 1.创建模板 模板名称: Template_Redis_Monitor 2.创建自动发现规则 给已创建好的模板Template_Redis_Monitor添加自动发现规则. 3.添加监控项原型 从上面截图可以看到,我已经创建了4个,具体如下: 看看其中一个: 再来看看主机关联模板后的监控项:

Zabbix自动化之low level discovery遇到的问题

前言: 话说很久都没有写Zabbix相关的文章,今天来写写Zabbix LLD使用中遇到的问题. 广而告之: 在这里告诉大家一个好消息,本人所写的<Zabbix企业级分布式监控系统>将在8月上旬发布,关注此书的朋友可以加Q群[zabbix企业级分布式监控 271659981 (可申请加入,验证码:Zabbix监控)] 原文链接为新书<Zabbix企业级分布式监控系统>所带的附件部分,托管在github上面,不定期更新更多新内容,欢迎关注,下面正文开始. {        "

Zabbix监控Low level discovery实时监控网站URL状态

今天我们来聊一聊Low level discovery这个功能,我们为什么要用到loe level discovery这个功能呢? 很多时候,在使用zabbix监控一些东西,需要对类似于Itens进行添加,这些items具有一些共同特性, 如果说某些特定的参数是变量,而其他设置都一样,例如:一个程序有多个端口,需要多端口进行监控并配置Itmes,还有磁盘分区,·网卡名称等等, 都是具有不确定性,如果我们配置固定的Items的话,会出现无法通用的问题,所以呢,我们需要来了解一下low level 

每日一题_Python.利用yield生成器实现协程下的tps透明传输CS测试

具体需求:1. 模拟Device首先发送注册包注册到TPS服务器,然后Client发送私有数据包到TPS,测试Device可以接收到私有数据包则返回成功或标志位(0, '')或(1, 'errormsg')2. 由于此插件是用于自己写的插件式监控系统,所以入口函数名必须和文件名保持一致,这里暂定为server_tps_status.py 实现思路: 具体代码: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Auth

每日一题_Python.利用gevent和pipeline快速导出近千万Redis字段值?

事情缘由: 昨日下午工信部前来,几个看似很专业搞安全的非要让现场写脚本导出几百万条Redis记录中的IP字段,由于之间确实没想过如何快速导出这么多数据,只能尴尬认怂~但下来仔细想想我们可以做到~办法总比困难多~ 具体需求: 1. 快速导出Redis中只包含[0-9a-z]组成的16序列号下的WlanIP字段 实现思路: 1. 必然先想到多线程/多进程/多协程,最终选择gevent协程池的原因的是涉及到Redis读和文件写操作,相对于多进程/多线程更容易控制且时间不会浪费在阻塞上,异步来回切换更适

Zabbix 的自动监控项目监控Nginx各hostname配置 - Low Level Discovery

Zabbix演示版本:2.4.4 涉及到的脚本语言:PHP low-level discovery的意思是"低层次的自动发现",检查lld. lld并不似因为功能简单或者不重要而被称为"低层次的",而是因为相对于服务器的自动发现,low-level discovery是针对服务器上设备的自动发现. Zabbix 原生支持针对三种(文件系统.网卡.SNMP OIDs)自动发现来配套自动添加Items.Triggers 和 Graphs等.在lld中它们被称为Item原

【8】、Low Level Discovery发现实现实时监控

环境:Centos 6.6 Zabbix自动发现WEB站点: [[email protected] ~]# tail -3 /etc/zabbix/zabbix_agentd.conf UserParameter=web.site_discovery,/etc/zabbix/scripts/discovery_web_site.sh web_site_discovery UserParameter=web.site_code[*],/etc/zabbix/scripts/discovery_we

Orabbix 监控oracle表空间 Low Level Discovery

在被监控端创建脚本,此脚本用于获取表空间及空间使用信息,此脚本由oracle用户下创建 vim mornitor_tbs.sh #!/bin/bash source /home/oracle/.bash_profile sqlplus -s zabbix/zabbix > /tmp/tablespace.log<<EOF set linesize 140 pagesize 10000 col "Status" for a10 col "Name"