LogManagementController.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. def requestPublishMqtt(self, request_dict, response):
  145. # 通用发布MQTT主题通知
  146. msg = request_dict.get('msg', None)
  147. thing_name = request_dict.get('thing_name', None)
  148. topic_name = request_dict.get('topic_name', None)
  149. if not all([msg, thing_name, topic_name]):
  150. return response.json(444)
  151. try:
  152. # 获取数据组织将要请求的url
  153. iot = iotdeviceInfoModel.objects.filter(
  154. thing_name=thing_name).values(
  155. 'endpoint', 'token_iot_number')
  156. if not iot.exists():
  157. return response.json(10043)
  158. endpoint = iot[0]['endpoint']
  159. Token = iot[0]['token_iot_number']
  160. # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
  161. # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
  162. # post请求url发布MQTT消息
  163. url = 'https://{}/topics/{}'.format(endpoint, topic_name)
  164. authorizer_name = 'Ansjer_Iot_Auth'
  165. signature = CommonService.rsa_sign(Token) # Token签名
  166. headers = {
  167. 'x-amz-customauthorizer-name': authorizer_name,
  168. 'Token': Token,
  169. 'x-amz-customauthorizer-signature': signature}
  170. msg = eval(msg)
  171. r = requests.post(url=url, headers=headers, json=msg, timeout=2)
  172. if r.status_code == 200:
  173. res = r.json()
  174. if res['message'] == 'OK':
  175. return response.json(0)
  176. return response.json(10044)
  177. else:
  178. return response.json(10044)
  179. except Exception as e:
  180. return response.json(500, repr(e))
  181. def getAccessLogList(self, request_dict, response):
  182. user = request_dict.get('user', None)
  183. operation = request_dict.get('operation', None)
  184. status = request_dict.get('status', None)
  185. pageNo = request_dict.get('pageNo', None)
  186. pageSize = request_dict.get('pageSize', None)
  187. if not all([pageNo, pageSize]):
  188. return response.json(444)
  189. page = int(pageNo)
  190. line = int(pageSize)
  191. try:
  192. if user or operation or status:
  193. if user:
  194. access_log_qs = Access_Log.objects.filter(
  195. user__contains=user)
  196. if operation:
  197. access_log_qs = Access_Log.objects.filter(
  198. operation__contains=operation)
  199. if status:
  200. access_log_qs = Access_Log.objects.filter(status=status)
  201. if not access_log_qs.exists():
  202. return response.json(0)
  203. total = access_log_qs.count()
  204. access_log_qs = access_log_qs.order_by('-time').values(
  205. 'user', 'operation', 'ip', 'status', 'content', 'time')[
  206. (page - 1) * line:page * line]
  207. else:
  208. total = Access_Log.objects.count()
  209. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  210. 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  211. access_log_list = CommonService.qs_to_list(access_log_qs)
  212. return response.json(0, {'list': access_log_list, 'total': total})
  213. except Exception as e:
  214. print(e)
  215. return response.json(500, repr(e))
  216. def getDeviceLogList(self, request_dict, response):
  217. uid = request_dict.get('uid', None)
  218. serial_number = request_dict.get('serial_number', None)
  219. pageNo = request_dict.get('pageNo', None)
  220. pageSize = request_dict.get('pageSize', None)
  221. if not all([pageNo, pageSize]):
  222. return response.json(444)
  223. page = int(pageNo)
  224. line = int(pageSize)
  225. try:
  226. if uid or serial_number:
  227. if uid:
  228. device_log_qs = DeviceLogModel.objects.filter(
  229. uid__contains=uid)
  230. if serial_number:
  231. device_log_qs = DeviceLogModel.objects.filter(
  232. serial_number__contains=serial_number)
  233. if not device_log_qs.exists():
  234. return response.json(0)
  235. total = device_log_qs.count()
  236. device_log_qs = device_log_qs.order_by(
  237. '-add_time').values()[(page - 1) * line:page * line]
  238. else:
  239. total = DeviceLogModel.objects.count()
  240. device_log_qs = DeviceLogModel.objects.filter().order_by(
  241. '-add_time').values()[(page - 1) * line:page * line]
  242. device_log_list = CommonService.qs_to_list(device_log_qs)
  243. # 添加下载链接
  244. aws_s3_client = boto3.client(
  245. 's3',
  246. region_name=REGION_NAME,
  247. aws_access_key_id=ACCESS_KEY_ID,
  248. aws_secret_access_key=SECRET_ACCESS_KEY,
  249. config=botocore.client.Config(signature_version='s3v4'),
  250. )
  251. for device_log in device_log_list:
  252. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  253. obj = 'device_log/' + obj + \
  254. '/{}'.format(device_log['filename'])
  255. download_url = aws_s3_client.generate_presigned_url(
  256. ClientMethod='get_object',
  257. Params={
  258. 'Bucket': LOG_BUCKET,
  259. 'Key': obj
  260. },
  261. ExpiresIn=3600
  262. )
  263. device_log['download_url'] = download_url
  264. return response.json(0, {'list': device_log_list, 'total': total})
  265. except Exception as e:
  266. print(e)
  267. return response.json(500, repr(e))
  268. def getOperationLogList(self, request_dict, response):
  269. operation = request_dict.get('operation', None)
  270. url = request_dict.get('url', None)
  271. pageNo = request_dict.get('pageNo', None)
  272. pageSize = request_dict.get('pageSize', None)
  273. if not all([pageNo, pageSize]):
  274. return response.json(444)
  275. page = int(pageNo)
  276. line = int(pageSize)
  277. try:
  278. log_qs = LogModel.objects.all()
  279. if operation:
  280. log_qs = log_qs.filter(operation__contains=operation)
  281. if url:
  282. log_qs = log_qs.filter(url__contains=url)
  283. count = log_qs.count()
  284. log_qs = log_qs.values(
  285. 'operation', 'url', 'content', 'ip', 'time')[
  286. (page - 1) * line:page * line]
  287. log_list = list(log_qs)
  288. return response.json(
  289. 0, {'list': log_list, 'total': count})
  290. except Exception as e:
  291. print(e)
  292. return response.json(500, repr(e))