serverpython
#! /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] for conn in Connection.clients: conn.send_message('I have received the data successfully!') self.read_message() #存儲到mongodb數據庫 if data[0] == '{': 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!' monitorSystem(message) 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()
clientmongodb
#! /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 = '172.31.150.230' # 服務器IP PORT = 8000 # 端口號 cycle = 60 # 發送數據的週期,後期可以使用戶自定義 myIP=getIp() 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)