#!/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()
|