#!/usr/bin/python # -*- coding: utf-8 -*- import CommFunc import ConfigParser import mylog import logging import json cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") ServerPath = cfg.get("ServerInfo", "ServerPath") # 需要处理的流向名及顺序列表 DRNameList = ["LogInOut"] def queryAccountLoginoutInfo(argvDict): logging.info("queryAccountLoginoutInfo %s" % str(argvDict)) startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryCenterBak(startDate, endDate, argvDict) return loginoutDateAccIDInfo = {} # {"日期":{"AccID":[loginTime, logoutTime, IP], ...}, ...} needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, loginoutDateAccIDInfo, drNameList=DRNameList) logging.info("needQueryCenterbak %s" % needQueryCenterbak) if needQueryCenterbak: bakDataInfo = CommFunc.queryBackupCenterDR(cfg, argvDict) logging.info("queryBackupCenterDR OK") if bakDataInfo == None: return loginoutDateAccIDInfoBak = bakDataInfo[0] # 合并数据 for bakDate, accIDDictBak in loginoutDateAccIDInfoBak.items(): if bakDate not in loginoutDateAccIDInfo: loginoutDateAccIDInfo[bakDate] = accIDDictBak continue accIDDict = loginoutDateAccIDInfo[bakDate] for accID, loginoutListBak in accIDDictBak.items(): if accID not in accIDDict: accIDDict[accID] = loginoutListBak continue # 备份的数据一定是较旧的,如果没有数据再用备份数据替换 loginoutList = accIDDict[accID] if not loginoutList[0]: loginoutList[0] = loginoutListBak[0] if not loginoutList[1]: loginoutList[1] = loginoutListBak[1] if not loginoutList[2]: loginoutList[2] = loginoutListBak[2] logging.info("query all data OK") ret = {"OK": 1, "loginoutDateAccIDInfo": loginoutDateAccIDInfo} print json.dumps(ret, ensure_ascii=False, default=lambda obj: obj.__dict__) return def queryCenterBak(startDate, endDate, argvDict): loginoutDateAccIDInfoBak = {} if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, loginoutDateAccIDInfoBak, drNameList=DRNameList): return return CommFunc.queryBackupCenterOK([loginoutDateAccIDInfoBak]) def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): ''' 检查流向是否需要处理 @param drFileName: 流向文件名 xxx_日期.txt @param *parseArgs: 自定义参数 @return: isNeed, checkNeedParseRetInfo ''' return True, None def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv): ''' 解析流向行内容 @param drName: 流向名 @param dateStr: 对应日期字符串 @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容 @param line: 本行内容 @param *parseArgs: 自定义参数 ''' loginoutDateAccIDInfo = parseArgs[0] # 统计登录 if drName == "LogInOut": if "127.0.0.1" in line: #logging.info(" 脱机登录,不处理") return drDict = eval(line) accID = drDict["AccID"] if dateStr not in loginoutDateAccIDInfo: loginoutDateAccIDInfo[dateStr] = {} accIDDict = loginoutDateAccIDInfo[dateStr] if accID not in accIDDict: accIDDict[accID] = ["", "", ""] loginoutList = accIDDict[accID] if drDict["Type"] == "login": loginoutList[0] = drDict["LoginTime"] else: loginoutList[1] = drDict["LogoutTime"] loginoutList[2] = drDict["IP"] return def main(): CommFunc.setdefaultencoding() argvDict = CommFunc.parse_args() mylog.InitMyLog(argvDict.get("eventType", "")) queryAccountLoginoutInfo(argvDict) return if __name__ == "__main__": try: main() except: CommFunc.printExceptionError()