LogManagementController.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import boto3
  4. import botocore
  5. import requests
  6. from django.views.generic.base import View
  7. from Object.ResponseObject import ResponseObject
  8. from Object.TokenObject import TokenObject
  9. from Service.CommonService import CommonService
  10. from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
  11. AppLogModel
  12. from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
  13. class LogManagementView(View):
  14. def get(self, request, *args, **kwargs):
  15. request.encoding = 'utf-8'
  16. operation = kwargs.get('operation')
  17. return self.validation(request.GET, request, operation)
  18. def post(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.POST, request, operation)
  22. def validation(self, request_dict, request, operation):
  23. language = request_dict.get('language', 'en')
  24. response = ResponseObject(language, 'pc')
  25. if operation == '??':
  26. return 0
  27. else:
  28. tko = TokenObject(
  29. request.META.get('HTTP_AUTHORIZATION'),
  30. returntpye='pc')
  31. # if tko.code != 0:
  32. # return response.json(tko.code)
  33. response.lang = tko.lang
  34. userID = tko.userID
  35. if operation == 'getRequestList':
  36. return self.getRequestList(request_dict, response)
  37. elif operation == 'getDeviceIotInfoList':
  38. return self.getDeviceIotInfoList(request_dict, response)
  39. elif operation == 'requestPublishMqtt':
  40. return self.requestPublishMqtt(request_dict, response)
  41. elif operation == 'getAccessLogList':
  42. return self.getAccessLogList(request_dict, response)
  43. elif operation == 'getDeviceLogList':
  44. return self.getDeviceLogList(request_dict, response)
  45. # 操作日志
  46. elif operation == 'getOperationLogList':
  47. return self.getOperationLogList(request_dict, response)
  48. elif operation == 'getAppLogList': # 获取app日志
  49. return self.getAppLogList(request_dict, response)
  50. else:
  51. return response.json(404)
  52. def getRequestList(self, request_dict, response):
  53. pageNo = request_dict.get('pageNo', None)
  54. pageSize = request_dict.get('pageSize', None)
  55. method = request_dict.get('method', None)
  56. url = request_dict.get('url', None)
  57. parameter = request_dict.get('parameter', None)
  58. status_code = request_dict.get('status_code', None)
  59. reason_phrase = request_dict.get('reason_phrase', None)
  60. if not all([pageNo, pageSize]):
  61. return response.json(444)
  62. page = int(pageNo)
  63. line = int(pageSize)
  64. try:
  65. request_qs = RequestRecordModel.objects.all()
  66. if method:
  67. request_qs = request_qs.filter(method=method)
  68. if url:
  69. request_qs = request_qs.filter(url__contains=url)
  70. if parameter:
  71. request_qs = request_qs.filter(parameter__contains=parameter)
  72. if status_code:
  73. request_qs = request_qs.filter(status_code=status_code)
  74. if reason_phrase:
  75. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  76. count = request_qs.count()
  77. request_qs = request_qs[(page - 1) * line:page * line]
  78. qs_list = []
  79. for requsetobj in request_qs:
  80. qs_list.append({
  81. 'id': requsetobj.id,
  82. 'method': requsetobj.method,
  83. 'url': requsetobj.url,
  84. 'parameter': requsetobj.parameter,
  85. # 时间保留小数点后两位
  86. 'execute_time': round(requsetobj.execute_time, 2),
  87. 'status_code': requsetobj.status_code,
  88. 'reason_phrase': requsetobj.reason_phrase,
  89. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  90. })
  91. return response.json(
  92. 0, {'list': qs_list, 'total': count})
  93. except Exception as e:
  94. print(e)
  95. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  96. def getDeviceIotInfoList(self, request_dict, response):
  97. serial_number = request_dict.get('serial_number', None)
  98. uid = request_dict.get('uid', None)
  99. pageNo = request_dict.get('pageNo', None)
  100. pageSize = request_dict.get('pageSize', None)
  101. if not all([pageNo, pageSize]):
  102. return response.json(444)
  103. page = int(pageNo)
  104. line = int(pageSize)
  105. try:
  106. if serial_number or uid:
  107. if serial_number:
  108. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  109. serial_number__contains=serial_number)
  110. if uid:
  111. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  112. uid__contains=uid)
  113. if not iot_device_info_qs.exists():
  114. return response.json(0)
  115. total = len(iot_device_info_qs)
  116. iot_device_info_qs = iot_device_info_qs.values(
  117. 'serial_number',
  118. 'uid',
  119. 'thing_name',
  120. 'thing_groups',
  121. 'add_time',
  122. 'update_time')[(page - 1) * line:page * line]
  123. else:
  124. total = iotdeviceInfoModel.objects.filter().count()
  125. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  126. 'serial_number',
  127. 'uid',
  128. 'thing_name',
  129. 'thing_groups',
  130. 'add_time',
  131. 'update_time')[(page - 1) * line:page * line]
  132. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  133. # 获取序列号的uid
  134. for iot_device_info in iot_device_info_list:
  135. if not iot_device_info['uid']:
  136. device_info_qs = Device_Info.objects.filter(
  137. serial_number__contains=iot_device_info['serial_number']).values('UID')
  138. if device_info_qs.exists():
  139. iot_device_info['uid'] = device_info_qs[0]['UID']
  140. return response.json(
  141. 0, {'list': iot_device_info_list, 'total': total})
  142. except Exception as e:
  143. print(e)
  144. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  145. # 通用发布MQTT通知
  146. @staticmethod
  147. def requestPublishMqtt(request_dict, response):
  148. msg = request_dict.get('msg', None)
  149. thing_name = request_dict.get('thing_name', None)
  150. topic_name = request_dict.get('topic_name', None)
  151. if not all([msg, thing_name, topic_name]):
  152. return response.json(444)
  153. try:
  154. msg = eval(msg)
  155. identification_code = thing_name[thing_name.rindex('_') + 1:]
  156. if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
  157. return response.json(10044)
  158. return response.json(0)
  159. except Exception as e:
  160. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  161. def getAccessLogList(self, request_dict, response):
  162. user = request_dict.get('user', None)
  163. operation = request_dict.get('operation', None)
  164. status = request_dict.get('status', None)
  165. pageNo = request_dict.get('pageNo', None)
  166. pageSize = request_dict.get('pageSize', None)
  167. if not all([pageNo, pageSize]):
  168. return response.json(444)
  169. page = int(pageNo)
  170. line = int(pageSize)
  171. try:
  172. if user or operation or status:
  173. if user:
  174. access_log_qs = Access_Log.objects.filter(
  175. user__contains=user)
  176. if operation:
  177. access_log_qs = Access_Log.objects.filter(
  178. operation__contains=operation)
  179. if status:
  180. access_log_qs = Access_Log.objects.filter(status=status)
  181. if not access_log_qs.exists():
  182. return response.json(0)
  183. total = access_log_qs.count()
  184. access_log_qs = access_log_qs.order_by('-time').values(
  185. 'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  186. else:
  187. total = Access_Log.objects.count()
  188. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  189. 'operation', 'ip', 'status',
  190. 'content', 'time')[
  191. (page - 1) * line:page * line]
  192. access_log_list = CommonService.qs_to_list(access_log_qs)
  193. return response.json(0, {'list': access_log_list, 'total': total})
  194. except Exception as e:
  195. print(e)
  196. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  197. def getDeviceLogList(self, request_dict, response):
  198. uid = request_dict.get('uid', None)
  199. serial_number = request_dict.get('serial_number', None)
  200. pageNo = request_dict.get('pageNo', None)
  201. pageSize = request_dict.get('pageSize', None)
  202. if not all([pageNo, pageSize]):
  203. return response.json(444)
  204. page = int(pageNo)
  205. line = int(pageSize)
  206. try:
  207. if uid or serial_number:
  208. if uid:
  209. device_log_qs = DeviceLogModel.objects.filter(
  210. uid__contains=uid)
  211. if serial_number:
  212. device_log_qs = DeviceLogModel.objects.filter(
  213. serial_number__contains=serial_number)
  214. if not device_log_qs.exists():
  215. return response.json(0)
  216. total = device_log_qs.count()
  217. device_log_qs = device_log_qs.order_by(
  218. '-add_time').values()[(page - 1) * line:page * line]
  219. else:
  220. total = DeviceLogModel.objects.count()
  221. device_log_qs = DeviceLogModel.objects.filter().order_by(
  222. '-add_time').values()[(page - 1) * line:page * line]
  223. device_log_list = CommonService.qs_to_list(device_log_qs)
  224. # 添加下载链接
  225. aws_s3_client = boto3.client(
  226. 's3',
  227. region_name=REGION_NAME,
  228. aws_access_key_id=ACCESS_KEY_ID,
  229. aws_secret_access_key=SECRET_ACCESS_KEY,
  230. config=botocore.client.Config(signature_version='s3v4'),
  231. )
  232. for device_log in device_log_list:
  233. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  234. obj = 'device_log/' + obj + \
  235. '/{}'.format(device_log['filename'])
  236. download_url = aws_s3_client.generate_presigned_url(
  237. ClientMethod='get_object',
  238. Params={
  239. 'Bucket': LOG_BUCKET,
  240. 'Key': obj
  241. },
  242. ExpiresIn=3600
  243. )
  244. device_log['download_url'] = download_url
  245. return response.json(0, {'list': device_log_list, 'total': total})
  246. except Exception as e:
  247. print(e)
  248. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  249. def getOperationLogList(self, request_dict, response):
  250. operation = request_dict.get('operation', None)
  251. url = request_dict.get('url', None)
  252. pageNo = request_dict.get('pageNo', None)
  253. pageSize = request_dict.get('pageSize', None)
  254. if not all([pageNo, pageSize]):
  255. return response.json(444)
  256. page = int(pageNo)
  257. line = int(pageSize)
  258. try:
  259. log_qs = LogModel.objects.all()
  260. if operation:
  261. log_qs = log_qs.filter(operation__contains=operation)
  262. if url:
  263. log_qs = log_qs.filter(url__contains=url)
  264. count = log_qs.count()
  265. log_qs = log_qs.values(
  266. 'operation', 'url', 'content', 'ip', 'time')[
  267. (page - 1) * line:page * line]
  268. log_list = list(log_qs)
  269. return response.json(
  270. 0, {'list': log_list, 'total': count})
  271. except Exception as e:
  272. print(e)
  273. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  274. def getAppLogList(self, request_dict, response):
  275. """
  276. 获取App日志信息
  277. @param request_dict:请求参数
  278. @param response:响应对象
  279. @request_dict userID:用户ID
  280. @request_dict uid:uid
  281. @return:
  282. """
  283. userName = request_dict.get('userName', None)
  284. uid = request_dict.get('uid', None)
  285. pageNo = request_dict.get('pageNo', None)
  286. pageSize = request_dict.get('pageSize', None)
  287. if not all([pageNo, pageSize]):
  288. return response.json(444)
  289. page = int(pageNo)
  290. line = int(pageSize)
  291. try:
  292. app_log_qs = AppLogModel.objects.all()
  293. if userName:
  294. app_log_qs = app_log_qs.filter(user__username=userName)
  295. elif uid:
  296. app_log_qs = app_log_qs.filter(uid=uid)
  297. count = app_log_qs.count()
  298. log_qs = app_log_qs.values(
  299. 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
  300. '-add_time')[(page - 1) * line:page * line]
  301. app_log_list = CommonService.qs_to_list(log_qs)
  302. # 添加下载链接
  303. aws_s3_client = boto3.client(
  304. 's3',
  305. region_name=REGION_NAME,
  306. aws_access_key_id=ACCESS_KEY_ID,
  307. aws_secret_access_key=SECRET_ACCESS_KEY,
  308. config=botocore.client.Config(signature_version='s3v4'),
  309. )
  310. for app_log in app_log_list:
  311. filename = app_log['filename']
  312. if not filename.endswith('.txt'):
  313. filename += ".txt"
  314. obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
  315. appLog_url = aws_s3_client.generate_presigned_url(
  316. ClientMethod='get_object',
  317. Params={
  318. 'Bucket': LOG_BUCKET,
  319. 'Key': obj
  320. },
  321. ExpiresIn=3600
  322. )
  323. app_log['appLog_url'] = appLog_url
  324. return response.json(0, {'list': app_log_list, 'total': count})
  325. except Exception as e:
  326. print(e)
  327. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))