LogManagementController.py 12 KB

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