# -*- coding: utf-8 -*-
import json
import logging
import os
import sys
import time
import datetime
import numpy as np
import struct
import binascii
from ssat_sdk.utils.string_util import pathToWindowsPath
from ssat_sdk.sat_environment import getSATTmpDIR, writeIsSendKeyTakePicture
from ssat_sdk.sat_environment import getRunnerTcpPort
import socket
_IsLoggerCreated = None
# log tcp 客户端;
class logClient:
def __init__(self):
self.sock = None
self.port = getRunnerTcpPort()
self.constate = False
def __del__(self):
self.disconnect()
# 连接服务器;
def connect(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.port = getRunnerTcpPort() # 再读取一次端口号;
self.sock.connect(('127.0.0.1', self.port)) #没有返回值;
self.constate = True
except Exception, e:
print "LoggingUtil:client=> socket connect error:", e, self.port
self.constate = False
return self.constate
# 发送消息;
def sendmsg(self, msg, type = 'printLog'):
if self.constate is False:
if self.connect() is False:
return
msg_json = ""
msg_dict = {'ReportType': type, 'prinMsg': msg}
try:
msg_json = json.dumps(msg_dict)
except Exception:
print "LoggingUtil:client=> to json error:", msg
return
try:
self.sock.settimeout(1)
self.sock.sendall(msg_json)
self.sock.settimeout(None)
except Exception, e:
print "LoggingUtil:client=>无Runner接收结果。Error:", e, 'runner_sender_port:', self.port
self.disconnect()
self.connect()
# 断开连接;
def disconnect(self):
if self.sock is None:
return
try:
self.sock.shutdown(2)
self.sock.close()
except Exception, e:
print "LoggingUtil:client=> socket disconnect error:", e
# 定义:
DataHeader = np.dtype({'names': ['protocol', 'len', 'cmd'], 'formats': ['u1', 'u4', 'u1']}, align=False)
# 通知SATService正常关机、重启;
NoticeResp = np.dtype({'names': ['TimeStamp', 'NoticeType'], 'formats': ['u8', 'u4']}, align=False)
class noticeClient:
def __init__(self):
'''通信sock'''
self.sock = None
'''通信端口号'''
self.port = getRunnerTcpPort()
'''通信状态'''
self.constate = False
def __def__(self):
self.disconnect()
'''连接服务器'''
def connect(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(('127.0.0.1', self.port)) # 没有返回值;
self.sock.sendall("2222")
self.constate = True
except Exception, e:
print "noticeClient=> socket connect error:", e, self.port
self.constate = False
return self.constate
# 发送通知,不接收返回;
def sendnotice(self, type):
'''是否连接'''
if self.constate is False:
if self.connect() is False:
print u'连接服务器失败'
return False
'''拼装要发送的数据包'''
notice = np.array([(time.time(), type)], dtype=NoticeResp)
'''发送请求数据'''
try:
self.sock.settimeout(5)
phead = np.array([(0xAA, notice.itemsize + np.array([(0xAA, 0, 0x01)], dtype=DataHeader).itemsize, 0x06)], dtype=DataHeader)
'''一次性发送完整包'''
self.sock.sendall(bytearray(phead.tobytes() + notice.tobytes()))
self.sock.settimeout(None)
except Exception, e:
print "noticeClient=> send Error:", e
self.disconnect()
self.connect()
return False
print u'成功发送'
return True
'''断开连接'''
def disconnect(self):
try:
self.sock.shutdown(2)
self.sock.close()
except Exception, e:
print "noticeClient=> socket disconnect error:", e
# 单例模块;
logClient_singleton = logClient()
noticeClient_singleton = noticeClient()
def sendKey(keyname, keyExit):
if keyExit:
msg = currentTime() + '执行sendKey:' + keyname
else:
msg = currentTime() + 'sendKey:' + keyname + '不存在'
print msg
def takePicpure(result, picpath):
# msg = {'ReportType': "takePicpure", 'data': {'result': result, 'picpath': picpath}}
msg = currentTime() + 'takePicture:' + '截图结果:' + \
str(result) + '截图路径:' + picpath
print msg
def printLog(tag='', logmsg=''):
# msg = {'ReportType': "printLog", 'data': {'logmsg': logmsg}}
if logmsg == '':
msg = currentTime() + 'printLog:%s' % str(tag)
tcpMsg = str(tag)
else:
msg = currentTime() + 'printLog:%s:%s' % (str(tag), str(logmsg))
tcpMsg = str(tag) + str(logmsg)
print msg
# logClient_singleton.sendmsg(tcpMsg)
def NotifyShutdown():
# 参数0表示正常关机;
noticeClient_singleton.sendnotice(0)
def NotifyReboot():
# 参数1表示正常重启;
noticeClient_singleton.sendnotice(1)
def caseResult(caseresult):
# msg = {'ReportType': "printLog", 'data': {'logmsg': logmsg}}
# 改用TCP方式发送结果给Runner端
msg = currentTime() + u'TcpClient发送的信息caseResult:' + caseresult
print msg
def currentTime():
return time.strftime('%Y-%m-%d %H:%M:%S ', time.localtime(time.time()))
# log标签
createdlogTab = 'default'
# 记录当前保存的log的文件夹路径
caseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
# 记录关闭之前保存的log的文件夹路径
debugCaseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
# 自定义DebugLogger对象
debugLogger = None
Tag_pyFileName = os.path.split(__file__)[-1]
class DebugLogger():
def info(self, pyFileName, className, funName, msg):
# 打印Log信息
logtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
logMsg = "%s %s %s.%s INFO %s \n" % (logtime, pyFileName, className, funName, msg)
print "调试信息=>",logMsg
# 往文件里面写log信息
mkCasedir(caseRunLogDirPath)
filePath = os.path.join(caseRunLogDirPath, 'case_run.log')
fp = open(filePath, 'a')
fp.write(logMsg)
fp.close()
# writeDeviceMsgLine(fp,logMsg)
def getDebugLogger():
global debugLogger
if not debugLogger:
debugLogger = DebugLogger()
return debugLogger
def closeFileHandler(logTab='default'):
global createdlogTab, caseRunLogDirPath
# 如果传进来的创建log文件来源和关闭来源相等,则关闭该文件流
print 'createdlogTab:', createdlogTab, 'logTab:', logTab
# 关闭log打印流时候,把按键打印截图开关 关闭
closeSendKeyTakePicture()
if logTab != 'default' and logTab == createdlogTab:
debugLogPath = os.path.join(caseRunLogDirPath, 'case_run.log')
getDebugLogger().info('Loggger.py', 'NoClass', 'closeFileHandler',
u'关闭Tab:%s的case_run.log文件保存路径:%s' % (logTab, pathToWindowsPath(debugLogPath)))
caseRunLogDirPath = os.path.join(getSATTmpDIR(), 'case_run_no_created')
createdlogTab = 'default'
def createFileHandler(logTab='default'):
global createdlogTab, caseRunLogDirPath, debugCaseRunLogDirPath
# closeFileHandler()
print 'createFileHandler createdlogTab:', createdlogTab
# 创建log文件夹时,把按键打印截图开关打开
startSendKeyTakePicture()
if createdlogTab == 'default':
print '创建文件'
caseRunLogDir = 'case_run_' + \
'{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now())
caseRunLogDirPath = os.path.join(getSATTmpDIR(), caseRunLogDir)
# 在调试的时候,记录调试信息路径
debugCaseRunLogDirPath = caseRunLogDirPath
mkCasedir(caseRunLogDirPath)
debugLogPath = os.path.join(caseRunLogDirPath, 'case_run.log')
getDebugLogger().info('Loggger.py', 'NoClass', 'closeFileHandler',
u'创建Tab:%s的case_run.log文件保存路径:%s' % (logTab, pathToWindowsPath(debugLogPath)))
# 用于编辑该log文件创建的来源
createdlogTab = logTab
def startSendKeyTakePicture():
writeIsSendKeyTakePicture("True")
def closeSendKeyTakePicture():
writeIsSendKeyTakePicture("False")
def getCaseRunLogDirPath():
global caseRunLogDirPath
mkCasedir(caseRunLogDirPath)
return caseRunLogDirPath
def getDebugCaseRunLogDirPath():
global debugCaseRunLogDirPath
return debugCaseRunLogDirPath
def mkCasedir(dir):
if (not os.path.exists(dir)):
os.mkdir(dir)
if __name__ == "__main__":
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面000")
# createFileHandler('scrpt')
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面")
# createFileHandler('toDestUI')
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面222")
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面333")
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面444")
# closeFileHandler('toDestUI')
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面555")
# closeFileHandler('scrpt')
# createFileHandler('toDestUI')
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面666")
# time.sleep(15)
# getDebugLogger().info(Tag_pyFileName, 'NoClass', '__main__', u"当前界面即为目标界面222")
# deleteDebugLofFile()
# getDebugLogger().info('')
# deleteDebugLofFile()
# print os.times()
# now_time = datetime.datetime.now()
# print now_time
# print '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.now())
# createFileHandler('script')
# getDebugLogger().info(u"当前界面即为目标界面")
# getDebugLogger().info(u"当前界面即为目标界面22")
# getDebugLogger().info(u"当前界面即为目标界面33")
# print 'getCaseRunLogDirPath:', getCaseRunLogDirPath()
# closeFileHandler('script')
# # time.sleep(5)
# createFileHandler('toDestUI')
# getDebugLogger().info(u"当前界面即为目标界面")
# print 'getCaseRunLogDirPath:', getCaseRunLogDirPath()
# closeFileHandler('toDestUI')
NotifyReboot()