Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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")