LogManagementController.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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
  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. else:
  45. return response.json(404)
  46. def getRequestList(self, request_dict, response):
  47. pageNo = request_dict.get('pageNo', None)
  48. pageSize = request_dict.get('pageSize', None)
  49. method = request_dict.get('method', None)
  50. url = request_dict.get('url', None)
  51. parameter = request_dict.get('parameter', None)
  52. status_code = request_dict.get('status_code', None)
  53. reason_phrase = request_dict.get('reason_phrase', None)
  54. if not all([pageNo, pageSize]):
  55. return response.json(444)
  56. page = int(pageNo)
  57. line = int(pageSize)
  58. try:
  59. request_qs = RequestRecordModel.objects.all()
  60. if method:
  61. request_qs = request_qs.filter(method=method)
  62. if url:
  63. request_qs = request_qs.filter(url__contains=url)
  64. if parameter:
  65. request_qs = request_qs.filter(parameter__contains=parameter)
  66. if status_code:
  67. request_qs = request_qs.filter(status_code=status_code)
  68. if reason_phrase:
  69. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  70. count = request_qs.count()
  71. request_qs = request_qs[(page - 1) * line:page * line]
  72. qs_list = []
  73. for requsetobj in request_qs:
  74. qs_list.append({
  75. 'id': requsetobj.id,
  76. 'method': requsetobj.method,
  77. 'url': requsetobj.url,
  78. 'parameter': requsetobj.parameter,
  79. # 时间保留小数点后两位
  80. 'execute_time': round(requsetobj.execute_time, 2),
  81. 'status_code': requsetobj.status_code,
  82. 'reason_phrase': requsetobj.reason_phrase,
  83. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  84. })
  85. return response.json(
  86. 0, {'list': qs_list, 'total': count})
  87. except Exception as e:
  88. print(e)
  89. return response.json(500, repr(e))
  90. def getDeviceIotInfoList(self, request_dict, response):
  91. serial_number = request_dict.get('serial_number', None)
  92. uid = request_dict.get('uid', None)
  93. pageNo = request_dict.get('pageNo', None)
  94. pageSize = request_dict.get('pageSize', None)
  95. if not all([pageNo, pageSize]):
  96. return response.json(444)
  97. page = int(pageNo)
  98. line = int(pageSize)
  99. try:
  100. if serial_number or uid:
  101. if serial_number:
  102. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  103. serial_number__contains=serial_number)
  104. if uid:
  105. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  106. uid__contains=uid)
  107. if not iot_device_info_qs.exists():
  108. return response.json(0)
  109. total = len(iot_device_info_qs)
  110. iot_device_info_qs = iot_device_info_qs.values(
  111. 'serial_number',
  112. 'uid',
  113. 'thing_name',
  114. 'thing_groups',
  115. 'add_time',
  116. 'update_time')[
  117. (page - 1) * line:page * line]
  118. else:
  119. total = iotdeviceInfoModel.objects.filter().count()
  120. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  121. 'serial_number',
  122. 'uid',
  123. 'thing_name',
  124. 'thing_groups',
  125. 'add_time',
  126. 'update_time')[
  127. (page - 1) * line:page * line]
  128. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  129. # 获取序列号的uid
  130. for iot_device_info in iot_device_info_list:
  131. if not iot_device_info['uid']:
  132. device_info_qs = Device_Info.objects.filter(
  133. serial_number__contains=iot_device_info['serial_number']).values('UID')
  134. if device_info_qs.exists():
  135. iot_device_info['uid'] = device_info_qs[0]['UID']
  136. return response.json(
  137. 0, {'list': iot_device_info_list, 'total': total})
  138. except Exception as e:
  139. print(e)
  140. return response.json(500, repr(e))
  141. def requestPublishMqtt(self, request_dict, response):
  142. # 通用发布MQTT主题通知
  143. msg = request_dict.get('msg', None)
  144. thing_name = request_dict.get('thing_name', None)
  145. topic_name = request_dict.get('topic_name', None)
  146. if not all([msg, thing_name, topic_name]):
  147. return response.json(444)
  148. try:
  149. # 获取数据组织将要请求的url
  150. iot = iotdeviceInfoModel.objects.filter(
  151. thing_name=thing_name).values(
  152. 'endpoint', 'token_iot_number')
  153. if not iot.exists():
  154. return response.json(10043)
  155. endpoint = iot[0]['endpoint']
  156. Token = iot[0]['token_iot_number']
  157. # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
  158. # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
  159. # post请求url发布MQTT消息
  160. url = 'https://{}/topics/{}'.format(endpoint, topic_name)
  161. authorizer_name = 'Ansjer_Iot_Auth'
  162. signature = CommonService.rsa_sign(Token) # Token签名
  163. headers = {
  164. 'x-amz-customauthorizer-name': authorizer_name,
  165. 'Token': Token,
  166. 'x-amz-customauthorizer-signature': signature}
  167. msg = eval(msg)
  168. r = requests.post(url=url, headers=headers, json=msg, timeout=2)
  169. if r.status_code == 200:
  170. res = r.json()
  171. if res['message'] == 'OK':
  172. return response.json(0)
  173. return response.json(10044)
  174. else:
  175. return response.json(10044)
  176. except Exception as e:
  177. return response.json(500, repr(e))
  178. def getAccessLogList(self, request_dict, response):
  179. user = request_dict.get('user', None)
  180. operation = request_dict.get('operation', None)
  181. status = request_dict.get('status', None)
  182. pageNo = request_dict.get('pageNo', None)
  183. pageSize = request_dict.get('pageSize', None)
  184. if not all([pageNo, pageSize]):
  185. return response.json(444)
  186. page = int(pageNo)
  187. line = int(pageSize)
  188. try:
  189. if user or operation or status:
  190. if user:
  191. access_log_qs = Access_Log.objects.filter(
  192. user__contains=user)
  193. if operation:
  194. access_log_qs = Access_Log.objects.filter(
  195. operation__contains=operation)
  196. if status:
  197. access_log_qs = Access_Log.objects.filter(status=status)
  198. if not access_log_qs.exists():
  199. return response.json(0)
  200. total = access_log_qs.count()
  201. access_log_qs = access_log_qs.order_by('-time').values(
  202. 'user', 'operation', 'ip', 'status', 'content', 'time')[
  203. (page - 1) * line:page * line]
  204. else:
  205. total = Access_Log.objects.count()
  206. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  207. 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  208. access_log_list = CommonService.qs_to_list(access_log_qs)
  209. return response.json(0, {'list': access_log_list, 'total': total})
  210. except Exception as e:
  211. print(e)
  212. return response.json(500, repr(e))
  213. def getDeviceLogList(self, request_dict, response):
  214. uid = request_dict.get('uid', None)
  215. serial_number = request_dict.get('serial_number', None)
  216. pageNo = request_dict.get('pageNo', None)
  217. pageSize = request_dict.get('pageSize', None)
  218. if not all([pageNo, pageSize]):
  219. return response.json(444)
  220. page = int(pageNo)
  221. line = int(pageSize)
  222. try:
  223. if uid or serial_number:
  224. if uid:
  225. device_log_qs = DeviceLogModel.objects.filter(
  226. uid__contains=uid)
  227. if serial_number:
  228. device_log_qs = DeviceLogModel.objects.filter(
  229. serial_number__contains=serial_number)
  230. if not device_log_qs.exists():
  231. return response.json(0)
  232. total = device_log_qs.count()
  233. device_log_qs = device_log_qs.order_by(
  234. '-add_time').values()[(page - 1) * line:page * line]
  235. else:
  236. total = DeviceLogModel.objects.count()
  237. device_log_qs = DeviceLogModel.objects.filter().order_by(
  238. '-add_time').values()[(page - 1) * line:page * line]
  239. device_log_list = CommonService.qs_to_list(device_log_qs)
  240. # 添加下载链接
  241. aws_s3_client = boto3.client(
  242. 's3',
  243. region_name=REGION_NAME,
  244. aws_access_key_id=ACCESS_KEY_ID,
  245. aws_secret_access_key=SECRET_ACCESS_KEY,
  246. config=botocore.client.Config(signature_version='s3v4'),
  247. )
  248. for device_log in device_log_list:
  249. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  250. obj = 'device_log/' + obj + '/{}'.format(device_log['filename'])
  251. download_url = aws_s3_client.generate_presigned_url(
  252. ClientMethod='get_object',
  253. Params={
  254. 'Bucket': LOG_BUCKET,
  255. 'Key': obj
  256. },
  257. ExpiresIn=3600
  258. )
  259. device_log['download_url'] = download_url
  260. return response.json(0, {'list': device_log_list, 'total': total})
  261. except Exception as e:
  262. print(e)
  263. return response.json(500, repr(e))