服务器监控客户端系统状态4.0

新增功能:决定客户端发送周期,然而不能很好地与前端接口。

server

#! /usr/bin/env python
#coding=utf-8
‘‘‘
fileName: server.py
新增功能:决定客户端发送周期
‘‘‘
from tornado.tcpserver import TCPServer
from tornado.ioloop  import IOLoop
import pymongo
import json

from Queue import Queue
import threading
import time

# 处理队列
processdata=Queue()

# ChatServer类与客户端通信,并获取客户端发来的data
class ChatServer(TCPServer):
    def handle_stream(self, stream, address):
        print "New connection :", address, stream
        Connection(stream, address)
        print "connection num is:", len(Connection.clients)

class Connection(object):
    clients = set()
    def __init__(self, stream, address):
        Connection.clients.add(self)
        self._stream = stream
        self._address = address
        self._stream.set_close_callback(self.on_close)
        self.read_message()  

    # 读取客户端发来的信息
    def read_message(self):
        self._stream.read_until(‘\n‘, self.broadcast_messages)  

    # 处理信息
    def broadcast_messages(self, data):
        # print ‘client said‘,data[:-1]
        if data[:-1] == ‘cycle‘:    # 客户端请求周期
            cycle = ‘60‘            # 自定义客户端发送周期
            for conn in Connection.clients:
                conn.send_message(cycle)
            self.read_message()
        else:       # 正常接收监控数据
            for conn in Connection.clients:
                conn.send_message(‘Server have received the data successfully!‘)
            self.read_message()
            #存储到mongodb数据库
            if data[0] == ‘{‘:
                self.handleData(data)

    def handleData(self,data):
        conn = pymongo.Connection("localhost", 27017)
        db = conn[‘networkSecurity‘]
        systemInfo = db[‘systemInfo‘]
        info = json.loads(data[:-1])
        # 构造dict数据
        message = {‘IP‘:info[u‘IP‘],‘CPUstate‘:info[u‘CPUstate‘],‘Memorystate‘:info[u‘Memorystate‘],
            ‘PortState‘:info[u‘PortState‘],‘ProcessName‘:info[u‘ProcessName‘]}
        print ‘Client said :\nIP:%s\nCPUstate:%s\nMemorystate:%s\nPortState:%s\nProcessName:%s‘%(message[‘IP‘],message[‘CPUstate‘],message[‘Memorystate‘],message[‘PortState‘],message[‘ProcessName‘])
        # 将数据放入队列
        processdata.put(message)
        # 将数据存入数据库
        systemInfo.insert(message)
        print ‘success to store the data!‘

    def send_message(self, data):
        self._stream.write(data)
        # self._stream.write(‘yessssssssssssss‘) 

    def on_close(self):
        print "A user has left the chat room.", self._address
        Connection.clients.remove(self)  

#消费者
class Consumer(threading.Thread):
    def __init__(self, t_name):
        threading.Thread.__init__(self, name=t_name)
    def run(self):
        print "%s: %s is consuming in the queue!/n" %(time.ctime(), self.getName())
        message = processdata.get()
        # print ‘the message in the queue is :   ‘,message
        # print type(message)
        monitorSystem(message)

# 黑白名单匹配,info为字典
def monitorSystem(info):
    warning = 0
    whiteList = [‘cmd.exe‘]
    blackList = [‘sublime_text.exe‘]
    # for info in systemInfo.find():
    #     print info
    IP = info[‘IP‘]
    processName = info[‘ProcessName‘]
    for process in processName:
        if process in blackList:
            warning = 1
            print ‘Process  %s in black list is running in IP %s ! ‘%(process,IP)
    for process in whiteList:
        if process not in processName:
            warning = 1
            print ‘Process %s in white list is not running in IP %s ! ‘%(process,IP)
    if warning == 0:
        print ‘Host %s is running legally ! ‘%IP

def main():
    # 启动服务器
    # 生产进程:接受数据
    print "Server start ......"
    server = ChatServer()
    server.listen(8000)
    # 消费进程:处理数据,黑白名单匹配
    consumer = Consumer(‘Con.‘)
    consumer.start()

    IOLoop.instance().start()

if __name__ == ‘__main__‘:
    main()
 

client

#! /usr/bin/env python
#coding=utf-8
‘‘‘
fileName:client.py
监控windows信息:CPU占有率,内存占有率,端口开放情况,当前进程名称
数据格式:    {‘IP‘:getIp(),‘CPUstate‘:getCPUState(),‘Memorystate‘:getMemoryState(),
            ‘PortState‘:getPortState(),‘ProcessName‘:getProcessName()}
新增功能:    接收服务器定义的数据发送周期
‘‘‘
import socket
import time
import psutil
import json
import thread

# 启动服务器
def runServer(s,HOST,PORT):
    s.connect((HOST, PORT))
    print ‘connect success!‘

# 关闭服务器
def closeServer(s):
    time.sleep(1)
    s.close()

# 向服务器发送数据
def sendMessage(s,portState):
    s.send(json.dumps(packMessage(portState)))
    time.sleep(1)
    s.sendall(‘\n‘)

# 从服务器接收数据
def recvMessage(s):
    data = s.recv(1024)
    print ‘Received‘, repr(data)

# 构造数据包
def packMessage(portState):
    message =     {‘IP‘:getIp(),‘CPUstate‘:getCPUState(),‘Memorystate‘:getMemoryState(),
                ‘PortState‘:portState,‘ProcessName‘:getProcessName()}
    print ‘My message is :\nIP:%s\nCPUstate:%s\nMemorystate:%s\nPortState:%s\nProcessName:%s‘%(message[‘IP‘],message[‘CPUstate‘],message[‘Memorystate‘],message[‘PortState‘],message[‘ProcessName‘])
    return message

# 获取本机IP
def getIp():
    myname = socket.getfqdn(socket.gethostname())
    myaddr = socket.gethostbyname(myname)
    return myaddr

# 获取CPU使用率 
def getCPUState(interval=1):
    return (str(psutil.cpu_percent(interval)) + "%")

# 获取内存使用率  
def getMemoryState():
    mem_rate = 0
    for pnum in psutil.pids():
        p = psutil.Process(pnum)
        mem_rate = mem_rate + p.memory_percent()
    return "%.2f%%"%mem_rate

# 输入IP和端口号,扫描判断端口是否开放
def socket_port(ip,port,portList):
    try:
        if port >= 65535:
            print u‘端口扫描结束‘
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = s.connect_ex((ip,port))
        if result == 0:
            lock.acquire()
            portList.append(port)
            lock.release()
        s.close()
    except:
        print u‘端口扫描异常‘

# 输入IP,扫描IP的0-65534端口情况
def ip_scan(ip):
    portList = []
    socket.setdefaulttimeout(3)
    try:
        for i in range(0,65534):
            thread.start_new_thread(socket_port,(ip,int(i),portList))
        # 返回所有开放的端口号
        return portList
    except:
        print u‘扫描ip出错‘

# 获取正在运行的进程名称
def getProcessName():
    ProcessNameList = []
    for pnum in psutil.pids():
        p = psutil.Process(pnum)
        ProcessNameList.append(p.name())
    return ProcessNameList

if __name__ == "__main__" :
    HOST = ‘192.168.111.130‘    # 服务器IP
    PORT = 8000                    # 端口号
    myIP = getIp()

    # 接收服务器定义的数据发送周期
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.sendall(‘cycle\n‘)
    data = s.recv(1024)
    print ‘my cycle is‘, data
    cycle=int(data)

    while True:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        runServer(s,HOST,PORT)
        lock = thread.allocate_lock()
        portState = ip_scan(myIP)
        sendMessage(s,portState)
        closeServer(s)
        time.sleep(cycle)
    
时间: 2024-10-03 15:01:14

服务器监控客户端系统状态4.0的相关文章

服务器监控客户端系统状态5.0

终于改成zmq通信,但是一个循环两对send,recv,开多个客户端时会混乱. server #! /usr/bin/env python #coding=utf-8 ''' fileName: server.py 数据发送方式:zmq ''' import zmq import time import json from Queue import Queue import threading import pymongo class Producer(threading.Thread): de

web 服务器监控状态模块权限控制不严格,导致信息泄露

Apache  服务器状态监控模块开启默认是禁止外网访问,如果更改了权限,可能导致信息泄露 ExtendedStatus On <Location /server-status> SetHandler server-status Order deny,allow #   Deny from all Allow from .example.com </Location> 默认访问地址 http://site/server-status nginx  服务器状态监控模块开启需要配置lo

监控linux系统状态

监控linux系统状态 监控介绍 安装zabbix4.0 监控客户机 解决中文名称不能写数据库的问题 解决图形中乱码 zabbix邮件告警 zabbix监控Nginx zabbix监控Tomcat zabbix监控MySQL shell 1. 监控Linux系统状态 1. w [[email protected] ~]# w 08:14:42 up 2:30, 1 user, load average: 0.00, 0.01, 0.04 USER TTY FROM [email protecte

几个常用网络/服务器监控开源软件

想要更清晰的了解你的网络吗?没有比这几个免费的工具更好用的了. 网络和系统监控是一个很宽的范畴.有监控服务器.网络设备.应用正常工作的方案,也有跟踪这些系统和设备性能,提供趋势性能分析的解决方案.有些工具像个闹钟一样,当发现问题的时候就会报警,而另外的一些工具甚至可以在警报响起的时候触发一些动作.这里,收集了一些开源的工具,旨在解决上述的一些甚至大部分问题. Cacti Cacti是一个性能广泛的图表和趋势分析工具,可以用来跟踪并几乎可以绘制出任何可监测指标,描绘出图表.从硬盘的利用率到风扇的转

如何使用mysql(lamp)分离环境搭建dedecms织梦网站及apache服务器常见的403http状态码及其解决方法

一.实验环境 centos6.5+mysql5.5.32+php5.3.27 软件:DedeCMS-V5.7-GBK-SP1 本实验是使用lamp环境搭建,但mysql数据库与之分离,本实验成功的关键在于防火墙及其selinux关闭的前提下实现. 二.实验步骤 1)下载产品,并解压至www目录内 wget -O /home/chen/tools/  http://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7-GBK-SP1.tar.gz

如何用Java编写一个简单的服务器和客户机

今天我要向大家介绍的是自己编写的一个比较简单的服务器和客户机程序,注意一下哦,比较简单.好了,闲话休提,砸门直入主题. 小编先从客户机和服务器的模型开始讲解.简单来说,我们实现的这种模型呢,我们每一个用户称为一个客户机,用户之间的通信之间需要一个中转,所有客户机的通信都依托于这个中转,很明显,这个中转,就是砸门的服务器了.整个模型比较简单明了,那么,接下来我们就直接进入实现阶段. 我们从实现服务器开始.Java提供了这样的一个类,ServerSocket.我们通过实例化它的方式来创建一个服务器.

服务器监控项目

序号 设备类型 内容/参数 参数类型 1 服务器(通用) 全局参数  设备掉电或重启事件 状态  设备板卡或模块的主要告警 状态  设备CPU占用率 性能参数  总进程数 性能参数  内存占用率 性能参数  硬盘/卷占用率 性能参数 网络  网络通断 状态  网络丢包率 性能参数 应用  关键进程运行状态 状态  登录用户数 性能参数  典型操作响应时间 性能参数 I/0  交换内存占用数 性能参数  磁盘IO次数/s 性能参数  磁盘IO字节/s 性能参数  页面调入次数/s 性能参数  页面

Zabbix监控(七):手动监控windows端口状态

1.监控端口的几个主要Keys: net.tcp.listen[port] Checks if this port is in LISTEN state. 0 - it is not, 1 - it is in LISTEN state. 监控TCP端口是否监听 net.tcp.port[<ip>,port] Check, if it is possible to make TCP connection to the port number. 0 - cannot connect, 1 - c

服务器监控(包括性能指标与web应用程序)

服务器监控 ?? 在搭建服务器时,除了部署webapp之外,还需要服务的异常信息与服务器性能指标进行监控,一旦有异常则通知管理员. ?? 服务器使用Linux+Nginx-1.9.15+Tomcat7+Java搭建的. ?? 编写脚本检测错误日志和服务器性能指标,一旦新生错误日志或者性能降低到设定的阈值时,则使用云监控将报警上传到云账号. 服务运行监控 ?? 错误日志包含以下三个方面: nginx 错误信息监控(nginx.conf配置) ${NGINX_HOME}/logs/error.log