• python 监控主机tcp状态脚本


    脚本如下:

    #!/usr/bin/env python
    # Creator: Nicolas Magliaro  - Version: 0.7
    # date: 16/05/2018
    
    import sys
    import json
    from optparse import OptionParser
    
    def _parse_args():
    
        parser = OptionParser()
    
        parser.add_option(
            "-p", "--proto", dest="proto", default='tcp', action="store", type="string", help="Define protocol TCP||UDP")
        parser.add_option(
            "-s", "--state", dest="state", default=False, action="store", type="string", help="Describe the state of connection")
        parser.add_option(
            "-q", "--queue", dest="queue", default=False, action="store", type="string", help="Define queue trigger SYN||ACCEPTED")
        parser.add_option(
            "-b", "--buffers", dest="buffer", default=False, action="store", type="string", help="Return buffers values. Use with -p for specific proto")
        parser.add_option(
            "-t", dest="trigger", action="store_true", help="Return sysctl values")
        parser.add_option(
            "-l", dest="loss", action="store_true", help="Return UDP packet loss sum")
        parser.add_option(
            "-m", dest="memory", action="store_true", help="Return UDP packet in memory")
        parser.add_option(
            "-u", dest="use", action="store_true", help="Return UDP packet in use")
        parser.add_option(
            "-o", dest="orphans", action="store_true", help="Return TCP orphans packet")
    
        (options, args) = parser.parse_args()
    
        return options
    
    class Queues:
        """
            Args: takes exactly 1 param as a dictionary with the Optparse arguments to create the Obj in memory
        """
        def __init__(self, opt):
    
            self.opt                    = opt
            self.proto                  = self.opt.proto
            self.state                  = self.opt.state
            self.queue                  = self.opt.queue
            self.trigger                = self.opt.trigger
            self.orphans                = self.opt.orphans
            self.buffer                 = self.opt.buffer
            self.cat_proc               = self.__open_queue_conn()
            self.conn_states            = self.__set_conn_by_state()
            self.socket_stats           = self.__get_socket_stats()
            self.tcp_buffer_thresholds  = open("/proc/sys/net/ipv4/tcp_mem", "r").readlines()
            self.udp_buffer_thresholds  = open("/proc/sys/net/ipv4/udp_mem", "r").readlines()
    
            # TCP States
            self.tcp_states  = {
                                'TCP_ESTABLISHED':'01',
                                'TCP_SYN_SENT':'02',
                                'TCP_SYN_RECV':'03',
                                'TCP_FIN_WAIT1':'04',
                                'TCP_FIN_WAIT2':'05',
                                'TCP_TIME_WAIT':'06',
                                'TCP_CLOSE':'07',
                                'TCP_CLOSE_WAIT':'08',
                                'TCP_LAST_ACK':'09',
                                'TCP_LISTEN':'0A',
                                'TCP_CLOSING':'0B'
                                }
        
            # UDP States
            self.udp_states  = {}
    
        # Read Kernel connection list
        def __open_queue_conn( self ):
            procfile = open("/proc/net/"+self.proto, "r").readlines()[1:]
            return procfile
    
        # Return a list of the states for all connections
        def __set_conn_by_state(self):
            conn_list = []
            procfile = self.cat_proc
            for line in procfile:
                line = line.split(': ')[1].split(' ')[2]
                conn_list.append(line)
            return conn_list
        
        # Return a count of the states by connection
        def __filter_count_conn_by_state(self, state):
            if self.conn_states:
                return self.conn_states.count(state)
            return
        def __get_socket_stats(self):
            procfile = open("/proc/net/sockstat", "r").readlines()
            return procfile
    
        # Return total socket created
        def total_sockets(self):
            procfile = self.socket_stats
            return int(procfile[0].split(' ')[-1])
    
        #Return dict obj with all count ordered by conn type
        def get_conn_by_state(self):
            return self.conn_states    
    
        # Return current total connections 
        def get_total_count_conn(self):
            return len(self.cat_proc)
    
        # Return the count of socket with state given
        def get_count_by_state(self, state):
            state = self.tcp_states[state]
            return self.__filter_count_conn_by_state(state)
    
        # Return a json obj with a count of all connection
        def json_conn_list_count(self):
            json_obj = {}
            for k,v in self.tcp_states.iteritems():
                json_obj[k] = self.conn_states.count(v)
            json_obj["TOTAL"] = len(self.conn_states)
            return json.dumps(json_obj,sort_keys=True, indent=4)
    
        # Return the usage of TCP queues
        def tcp_queues_trigger(self):
            queue = self.queue
            if queue.upper() == "SYN":
                queue = "/proc/sys/net/ipv4/tcp_max_syn_backlog"
                procfile = open(queue, "r").readlines()[0]
                return self.__filter_count_conn_by_state( self.tcp_states["TCP_SYN_RECV"] ) * 100 / int( procfile )
            elif queue.upper() == "ACCEPTED":
                queue = "/proc/sys/net/core/somaxconn"
                procfile = open(queue, "r").readlines()[0]
                return self.__filter_count_conn_by_state( self.tcp_states["TCP_ESTABLISHED"] ) * 100 / int( procfile )
            else:
                return
    
        # Return kernel theshold for Network queues
        def get_queue_value(self):
            queue = self.queue
            if queue.upper() == "SYN":
                queue = "/proc/sys/net/ipv4/tcp_max_syn_backlog"
                procfile = open(queue, "r").readlines()[0]
                return procfile
            elif queue.upper() == "ACCEPTED":
                queue = "/proc/sys/net/core/somaxconn"
                procfile = open(queue, "r").readlines()[0]
                return procfile
            return
    
        # Return the sum of pkt lost by UDP sockets
        def get_pkt_loss_sum(self):
            a = []
            process = self.__open_queue_conn()
            for p in process:
                f = list(p.split(' '))
                a.append(int([x for x in f if x != '
    ' and x != ''][-1]))
            return sum(a)
    
        # Return sockets in memory
        def get_used_memory(self):
            process = self.socket_stats
            if self.proto == "udp":
                return int(process[2].split(' ')[-1])
            if self.proto == "tcp":
                return int(process[1].split(' ')[-1])
            return
    
        # Return UDP sockets in use
        def get_sockets_in_use(self):
            process = self.socket_stats
            if self.proto == "udp":
                return int(process[2].split()[2])
            if self.proto == "tcp":
                return int(process[1].split()[2])
            return
    
        # Return TCP orphans
        def get_tcp_orphans(self):
            procfile = self.socket_stats
            return int(procfile[1].split(' ')[4])
    
        def get_buffer_threshold(self,th):
            """
            Param = low_threshold. Return the tcp_mem variable in the kernel for the memory usage by different TCP sockets.
            Param = press_threshold. Return at which point to start pressuring memory usage down. 
            Param = max_threshold. Return how many memory pages it may use maximally in the kernel 
            """
            if self.proto == "udp":
                if th == "low_threshold":
                    return int(self.udp_buffer_thresholds[0].split('	')[0])
                if th == "press_threshold":
                    return int(self.udp_buffer_thresholds[0].split('	')[1])
                if th == "max_threshold":
                    return int(self.udp_buffer_thresholds[0].split('	')[2])
            if self.proto == "tcp":
                if th == "low_threshold":
                    return int(self.tcp_buffer_thresholds[0].split('	')[0])
                if th == "press_threshold":
                    return int(self.tcp_buffer_thresholds[0].split('	')[1])
                if th == "max_threshold":
                    return int(self.tcp_buffer_thresholds[0].split('	')[2])
            return
    
    class Run:
        """
        Args1: List: OptParse()
        Implement the run() method
        """
        def __init__(self, opts = []):
            self.opts = opts
            self.connections = Queues(self.opts)
    
        def run(self):
            if not self.opts.queue and not self.opts.state and not self.opts.buffer and self.opts.loss == None and self.opts.orphans == None and self.opts.memory == None and self.opts.use == None:
                print self.connections.total_sockets()
            elif self.opts.proto.lower() == "tcp" or self.opts.proto == "tcp6":
                if self.opts.state and self.opts.state is not None:
                    print self.connections.get_count_by_state(opts.state)
                    sys.exit()
                if self.opts.queue and self.opts.queue is not None and not self.opts.trigger:
                    print self.connections.tcp_queues_trigger()
                    sys.exit()
                if self.opts.trigger and self.opts.queue:
                    print self.connections.get_queue_value()
                    sys.exit()
                if self.opts.orphans:
                    print self.connections.get_tcp_orphans()
                    sys.exit()
                if self.opts.buffer:
                    print self.connections.get_buffer_threshold(self.opts.buffer)
                    sys.exit()
                if self.opts.memory:
                    print self.connections.get_used_memory()
                    sys.exit()
                if self.opts.use:
                    print self.connections.get_sockets_in_use()
                    sys.exit()
                print self.connections.json_conn_list_count()
            
            elif self.opts.proto.lower() == "udp":
                if self.opts.loss:
                    print self.connections.get_pkt_loss_sum()
                    sys.exit()
                if self.opts.memory:
                    print self.connections.get_used_memory()
                    sys.exit()
                if self.opts.use:
                    print self.connections.get_sockets_in_use()
                    sys.exit()
                if self.opts.buffer:
                    print self.connections.get_buffer_threshold(self.opts.buffer)
                    sys.exit()
            else:
                print None
    if __name__ == "__main__":
        opts = _parse_args()
        run = Run(opts).run
        run()

    zabbix配置文件,包含即可

    cat userparameter_tcp.conf

    UserParameter=queues.sockstat.tcp.acceptqueue[*],/etc/zabbix/scripts/network-sockets.py -t -q ACCEPTED
    UserParameter=queues.sockstat.tcp.close[*],/etc/zabbix/scripts/network-sockets.py -s TCP_CLOSE
    UserParameter=queues.sockstat.tcp.closewait[*],/etc/zabbix/scripts/network-sockets.py -s TCP_CLOSE_WAIT 
    UserParameter=queues.sockstat.tcp.closing[*],/etc/zabbix/scripts/network-sockets.py -s TCP_CLOSING
    UserParameter=queues.sockstat.tcp.tcpestablished[*],/etc/zabbix/scripts/network-sockets.py -s TCP_ESTABLISHED
    UserParameter=queues.sockstat.tcp.finwait1[*],/etc/zabbix/scripts/network-sockets.py -s TCP_FIN_WAIT1
    UserParameter=queues.sockstat.tcp.finwait2[*],/etc/zabbix/scripts/network-sockets.py -s TCP_FIN_WAIT2
    UserParameter=queues.sockstat.tcp.lastack[*],/etc/zabbix/scripts/network-sockets.py -s TCP_LAST_ACK
    UserParameter=queues.sockstat.tcp.listen[*],/etc/zabbix/scripts/network-sockets.py -s TCP_LISTEN
    UserParameter=queues.sockstat.tcp.synrecv[*],/etc/zabbix/scripts/network-sockets.py -s TCP_SYN_RECV
    UserParameter=queues.sockstat.tcp.synsent[*],/etc/zabbix/scripts/network-sockets.py -s TCP_SYN_SENT
    UserParameter=queues.sockstat.tcp.timewait[*],/etc/zabbix/scripts/network-sockets.py -s TCP_TIME_WAIT
    UserParameter=queues.sockstat.tcp6.tcpestablished[*],/etc/zabbix/scripts/network-sockets.py -p tcp6 -s TCP_ESTABLISHED
    UserParameter=queues.sockstat.tcp6.timewait[*],/etc/zabbix/scripts/network-sockets.py -p tcp6 -s TCP_TIME_WAIT
    UserParameter=queues.sockstat.tcp.synqueue[*],/etc/zabbix/scripts/network-sockets.py -t -q SYN
    UserParameter=queues.sockstat.tcp.orphan[*],/etc/zabbix/scripts/network-sockets.py -o
    UserParameter=queues.sockstat.tcp.low[*],/etc/zabbix/scripts/network-sockets.py -p tcp -b "$1"
    UserParameter=queues.sockstat.tcp.press[*],/etc/zabbix/scripts/network-sockets.py -p tcp -b "$1" 
    UserParameter=queues.sockstat.tcp.max[*],/etc/zabbix/scripts/network-sockets.py -p tcp -b "$1"
    UserParameter=queues.sockstat.udp.low[*],/etc/zabbix/scripts/network-sockets.py -p udp -b "$1"
    UserParameter=queues.sockstat.udp.press[*],/etc/zabbix/scripts/network-sockets.py -p udp -b "$1"
    UserParameter=queues.sockstat.udp.max[*],/etc/zabbix/scripts/network-sockets.py -p udp -b "$1"
    UserParameter=queues.sockstat.udp.inuse[*],/etc/zabbix/scripts/network-sockets.py -p udp -u
    UserParameter=queues.sockstat.tcp.inuse[*],/etc/zabbix/scripts/network-sockets.py -p tcp -u
    UserParameter=queues.sockstat.udp.mem[*],/etc/zabbix/scripts/network-sockets.py -p udp -m
    UserParameter=queues.sockstat.tcp.mem[*],/etc/zabbix/scripts/network-sockets.py -p tcp -m
    UserParameter=queues.sockstat.total[*],/etc/zabbix/scripts/network-sockets.py
    UserParameter=queues.sockstat.udp.packetloss[*],/etc/zabbix/scripts/network-sockets.py -p udp -l
  • 相关阅读:
    [Python] socket实现TFTP上传和下载
    [Python] socket发送UDP广播实现聊天室功能
    [C#] 建立UDP连接、发送广播
    [Python] Scrapy爬虫框架入门
    [Python] 常见的排序与搜索算法
    [Python] 数据结构--实现顺序表、链表、栈和队列
    [Python] Django框架入门5——静态文件、中间件、上传图片和分页
    [Python] Django框架入门4——深入模板
    [Python] Django框架入门3——深入视图
    [Python] Django框架入门2——深入模型
  • 原文地址:https://www.cnblogs.com/i1991/p/15432862.html
Copyright © 2020-2023  润新知