def getDirList(self): del AllDirList[:] #生成数据库操作类 dir = DBUtil.Dir() #获得所有服务器 _allDirList = dir.getAllDirList() for _allDir in _allDirList: sinDirList = [] for _dir in _allDir: sinDirList.append(_dir) AllDirList.append(sinDirList) return AllDirList
def handle(self): user = "" userIp = "" print str(time.strftime('[%Y-%m-%d_%H:%M:%S]进入IOMS核心模块')).decode('utf-8').encode("gbk") while True: reStr = u"" recvData = None try: recvData = self.request.recv(sockSize) recvData = _3ds.Decrypt(recvData).decode('gbk').encode("utf-8") userIp = str(self.client_address[0]) except: writeLog("IOMServer.recvData Error:"+str(sys.exc_info()[0])+str(sys.exc_info()[1])) writeLog("|"+userIp+"| "+user+"Connection break. 断开连接!") if user in socketMap.keys(): socketMap.pop(user) break if not recvData: #因有时会发生一直读取到空消息的问题,所以先改成让服务休息一会避免CPU占用而卡死 time.sleep(1) continue cmds = MyUtil.splitCmd(recvData) keys = cmds.keys() if not (('parm=checkUser' in recvData) or ('cmd=login' in recvData)): p = str(time.strftime('[%Y-%m-%d_%H:%M:%S]Receviced command.收到命令: ')+recvData) print p.decode('utf-8').encode("gbk") writeLog("|"+userIp+"| "+user+" "+recvData) else: recvData = "login" #continue #try: if 'cmd' in keys and cmds['cmd']=='login': """登录""" if 'user' in keys and 'pwd' in keys: user = str(cmds['user']) re = self.login(self.request, cmds['user'], cmds['pwd']) if re == -1: p = str(time.strftime('[%Y-%m-%d_%H:%M:%S]Receviced command.收到命令'+userIp+"| "+user+"Login failed! 登录失败!连接关闭!")) print p.decode('utf-8').encode("gbk") writeLog("|"+userIp+"| "+user+"Login failed 登录失败!连接关闭!") self.request.close() reStr = "Login failed.登录失败." break elif re == 1: p = str(time.strftime('[%Y-%m-%d_%H:%M:%S]Receviced command.收到命令'+userIp+"| "+user+" : Login sucess! 连接!")) print p.decode('utf-8').encode("gbk") writeLog("|"+userIp+"| "+user+" 连接!") reStr = "Login sucess.登录成功." elif 'cmd' in keys and 'uploads' == cmds['cmd'] and 'file' in keys: """上传文件,把客户端接收到的数据直接转发到AutoUpdateServer上去""" writeLog("|"+userIp+"| "+user+" 请求上传文件!"+cmds['file']) sock = getSock(UpdateServerIP, int(UpdateServerPort)) sock.sendall("au,"+recvData) self.request.sendall(sock.recv(sockSize)) print "Begin updaload...开始上传。。。".decode('utf-8').encode("gbk") i = 0 while True: data = self.request.recv(10485760) print "Receviced files...接受文件中。。。。".decode('utf-8').encode("gbk"),' ',i i+=1 if not data: reStr = "Receviced complete.上传完成." print "All File Receviced complete.文件全部接受完成".decode('utf-8').encode("gbk") break if str(data).endswith('4423718C61C4E8A4362D955BBC7B9711'): data = data[:len(data)-len('4423718C61C4E8A4362D955BBC7B9711')] reStr = "Receviced complete.上传完成." print "All File Receviced complete.文件全部接受完成".decode('utf-8').encode("gbk") break while len(data) > 0: intSent = sock.send(data) data = data[intSent:] print "Sending...发送文件中。。。".decode('utf-8').encode("gbk"),' ',intSent print "File Receviced complete.接受文件完成".decode('utf-8').encode("gbk") #time.sleep(1) reStr = "Receviced complete.上传完成." sock.close() writeLog("|"+userIp+"| "+user+" 上传文件完成") if reStr=="": reStr = "Receviced failed.上传失败." elif 'cmd' in keys and 'dir' == cmds['cmd']: """查看可以下载的文件""" sock = getSock(UpdateServerIP, int(UpdateServerPort)) sock.sendall('au,'+recvData) self.response = sock.recv(sockSize) if self.response=='-1': self.request.sendall('Not files can be download.没有可以下载的文件.') else: self.request.sendall('Download files list:可下载文件列表:\n'+self.response) sock.close() elif 'cmd' in keys and 'remove' == cmds['cmd']: """删除文件""" if not 'file' in cmds.keys(): print "Lost file name.参数不完整,缺少文件名".decode('utf-8').encode("gbk") else: sock = getSock(UpdateServerIP, int(UpdateServerPort)) sock.sendall('au,'+recvData) self.response = sock.recv(sockSize) if self.response=='1': self.request.sendall('Delete complete.删除完成。') #reStr = '删除完成。' else: self.request.sendall("File not found.文件不存在。") #reStr = "文件不存在。" sock.close() elif 'cmd' in keys and 'genmd5' == cmds['cmd']: """重新生成Md5码""" sock = getSock(UpdateServerIP, int(UpdateServerPort)) sock.sendall('au,'+recvData) self.response = sock.recv(sockSize) if self.response=='1': self.request.sendall('Rebuilding MD5 sucess.重新生成成功。') #reStr = "重新生成成功。" elif self.response=='-1': self.request.sendall('Rebuilding MD5 failed.生成失败。') #reStr = '生成失败。' sock.close() elif 'cmd' in keys and 'dbutil' == cmds['cmd']: """进行数据库操作""" if cmds['parm'] != None: parm = str(cmds['parm']).split(';') if 'checkUser' == parm[0]: if len(parm) == 3: db_user = DBUtil.User() checkRow = db_user.Check(parm[1], parm[2]) if not checkRow: self.request.sendall("-2") else: self.request.sendall("1") elif 'actionLog' == parm[0]: if len(parm) == 5: db_user = DBUtil.User() db_user.actionLog(parm[1], parm[2], parm[3], parm[4]) #self.request.sendall(flag) elif 'getAllServerList' == parm[0]: db_server = DBUtil.Server() _allServerList = db_server.getAllServerList() serverListStr = "" for _allServer in _allServerList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) elif 'getAllActiveServerList' == parm[0]: db_server = DBUtil.Server() _allActiveServerList = db_server.getAllActiveServerList() serverListStr = "" for _allServer in _allActiveServerList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) elif 'updateServerInfo' == parm[0]: if len(parm) == 9: db_server = DBUtil.Server() serverInfo = [None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None] serverInfo[0] = parm[1] serverInfo[13] = parm[2] serverInfo[14] = parm[3] serverInfo[15] = parm[4] serverInfo[16] = parm[5] serverInfo[17] = parm[6] serverInfo[18] = parm[7] serverDistribute = parm[8] flag = db_server.updateServerInfo(serverInfo, serverDistribute) self.request.sendall(str(flag)) elif 'updateServerGC' == parm[0]: if len(parm) > 1: db_server = DBUtil.Server() serverGCList = "" length = len(parm) for i in range(length): if i > 0: serverGCList += "'" serverGCList += parm[i] serverGCList += "'" if i < length - 1: serverGCList += "," else: pass serverDistribute = 2 flag = db_server.updateServerGC(serverGCList, serverDistribute) self.request.sendall(str(flag)) elif 'serverCpuCurve' == parm[0]: if len(parm) == 4: db_server = DBUtil.Server() serverCpuInfoList = db_server.getServerCpuInfo(parm[1], parm[2], parm[3]) serverListStr = "" for _allServer in serverCpuInfoList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr = serverListStr.decode('gbk').encode("utf-8") if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) elif 'getAllDirList' == parm[0]: db_dir = DBUtil.Dir() _allDirList = db_dir.getDirList() dirListStr = "" for _allDir in _allDirList: for _dir in _allDir: dirListStr += str(_dir) + ",," if dirListStr.endswith(",,"): dirListStr = dirListStr[:len(dirListStr)-2] dirListStr += ";;" if dirListStr.endswith(";;"): dirListStr = dirListStr[:len(dirListStr)-2] if dirListStr == '': dirListStr = 'None' self.request.sendall(dirListStr) elif 'getAllUnassignedServerList' == parm[0]: db_server = DBUtil.Server() _allServerList = db_server.getUnassignedServerList() serverListStr = "" for _allServer in _allServerList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) elif 'getPysicalServerList' == parm[0]: if len(parm) == 2: db_server = DBUtil.Server() pysicalServerList = db_server.getPysicalServerList(parm[1]) serverListStr = "" for _allServer in pysicalServerList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr = serverListStr.decode('gbk').encode("utf-8") if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) elif 'getMonitorServerList' == parm[0]: db_server = DBUtil.Server() if len(parm) == 3: _allServerList = db_server.getMonitorServerList(parm[1],parm[2]) else: #保持参数一致,方法比较低端 _allServerList = db_server.getMonitorServerList("None","None") serverListStr = "" for _allServer in _allServerList: for _server in _allServer: serverListStr += str(_server) + ",," if serverListStr.endswith(",,"): serverListStr = serverListStr[:len(serverListStr)-2] serverListStr += ";;" if serverListStr.endswith(";;"): serverListStr = serverListStr[:len(serverListStr)-2] if serverListStr == '': serverListStr = 'None' self.request.sendall(serverListStr) else: self.request.sendall("-1") elif 'cmd' in keys and 'help' == cmds['cmd']: self.request.sendall(HELP.__doc__) elif 'cmd' in keys and 'showversion' == cmds['cmd']: self.request.sendall(version.__doc__) elif 'cmd' in keys and cmds['cmd'] in agentCmds: #获取当前服务器完整列表 initServerMap() param = "" db = DBUtil.DBUtil('ioms_monitor') if 'servertype' in keys: param = cmds['servertype'] #取出指定服务器类型服务器的所有内网IP IPList=changeTemplateToIP(db,param) if not IPList: output = "%s: servertype not found!服务器类型未找到或命令错误!"%(param) self.request.sendall(output) print output.decode('utf-8').encode("gbk") continue elif 'serverip' in keys: param = cmds['serverip'] IPList = param.split(';') else: output = "Fill servertype or serverip parameter.参数不完整,请填写服务器类型或服务器ip" print output.decode('utf-8').encode("gbk") self.request.sendall(output) continue reStr = "" if 'command' in keys: initCommandList("1") commandRunFlag = False #该命令是否可以执行的标识 for commandName in commandList: if cmds['command'].startswith(commandName): commandRunFlag = True break if commandRunFlag: pass else : output = "Command not executive.不能执行该命令." print output.decode('utf-8').encode("gbk") self.request.sendall(output) continue #对发送的命令recvData做去IP处理,减少命令广播 print "recvData=",recvData tmpcmds = MyUtil.splitCmd(recvData) tmpkeys = tmpcmds.keys() if 'serverip' in tmpkeys: t=tmpcmds.pop('serverip') if 'servertype' in tmpkeys: t=tmpcmds.pop('servertype') s='' for dkey in tmpcmds: s+=dkey+"="+tmpcmds[dkey]+"," recvData=s[:len(s)-1] recvData = _3ds.Encrypt(recvData) #初始化命令返回结果集,这个global好象会有问题,也许会导致多个客户端同时返回结果时的异常,待后期分析 global receiveData receiveData={} #对发出数据库中有心跳的服务器发送命令 result = isOnline(db) #对比当前所有活动的服务器和需要操作的服务器IP,并把结果放在ActiveIPList中 ActiveIPList = [] if result: for r in result: for j in IPList: if r[0] in j: ActiveIPList.append(r[0]) #IP排重 ActiveIPList = list(set(ActiveIPList)) #多线程响应命令执行,默认10个线程 wm = WorkerManager(10) i = 0 for IP in ActiveIPList: wm.add_job( CommandRunThread, i,IP,recvData) i += 1 wm.wait_for_complete() db.closeConn() #准备回显数据 output ="" for k in receiveData.keys(): s = receiveData[k] output += s if output: output += "All command run over.全部执行完毕." else: output = "Command run failed.执行不正确." self.request.sendall(output) print output.decode('utf-8').encode("gbk") else: output = "Command not found.没有该命令." self.request.sendall(output) print output.decode('utf-8').encode("gbk")