hxp
2025-06-04 f4a514d5ac952110da846636ecbb9de951eaf3d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/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()