LogManagementController.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  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.IPWeatherObject import IPQuery
  8. from Object.ResponseObject import ResponseObject
  9. from Object.TokenObject import TokenObject
  10. from Service.CommonService import CommonService
  11. from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
  12. AppLogModel, AppScannedSerial, StsFrequency, DeviceDomainRegionModel, IPAddr, CountryModel
  13. from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
  14. class LogManagementView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation')
  18. return self.validation(request.GET, request, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.POST, request, operation)
  23. def validation(self, request_dict, request, operation):
  24. language = request_dict.get('language', 'en')
  25. response = ResponseObject(language, 'pc')
  26. if operation == '??':
  27. return 0
  28. else:
  29. tko = TokenObject(
  30. request.META.get('HTTP_AUTHORIZATION'),
  31. returntpye='pc')
  32. # if tko.code != 0:
  33. # return response.json(tko.code)
  34. response.lang = tko.lang
  35. userID = tko.userID
  36. if operation == 'getRequestList':
  37. return self.getRequestList(request_dict, response)
  38. elif operation == 'getDeviceIotInfoList':
  39. return self.getDeviceIotInfoList(request_dict, response)
  40. elif operation == 'requestPublishMqtt':
  41. return self.requestPublishMqtt(request_dict, response)
  42. elif operation == 'getAccessLogList':
  43. return self.getAccessLogList(request_dict, response)
  44. elif operation == 'getDeviceLogList':
  45. return self.getDeviceLogList(request_dict, response)
  46. # 操作日志
  47. elif operation == 'getOperationLogList':
  48. return self.getOperationLogList(request_dict, response)
  49. elif operation == 'getAppLogList': # 获取app日志
  50. return self.getAppLogList(request_dict, response)
  51. elif operation == 'getScanLog': # 获取扫码日志
  52. return self.getScanLog(request_dict, response)
  53. elif operation == 'getAlarmLog': # 获取警报日志
  54. return self.getAlarmLog(request_dict, response)
  55. elif operation == 'getDomainLog': # 获取域名日志
  56. return self.getDomainLog(request_dict, response)
  57. else:
  58. return response.json(404)
  59. def getRequestList(self, request_dict, response):
  60. pageNo = request_dict.get('pageNo', None)
  61. pageSize = request_dict.get('pageSize', None)
  62. method = request_dict.get('method', None)
  63. url = request_dict.get('url', None)
  64. parameter = request_dict.get('parameter', None)
  65. status_code = request_dict.get('status_code', None)
  66. reason_phrase = request_dict.get('reason_phrase', None)
  67. if not all([pageNo, pageSize]):
  68. return response.json(444)
  69. page = int(pageNo)
  70. line = int(pageSize)
  71. try:
  72. request_qs = RequestRecordModel.objects.all()
  73. if method:
  74. request_qs = request_qs.filter(method=method)
  75. if url:
  76. request_qs = request_qs.filter(url__contains=url)
  77. if parameter:
  78. request_qs = request_qs.filter(parameter__contains=parameter)
  79. if status_code:
  80. request_qs = request_qs.filter(status_code=status_code)
  81. if reason_phrase:
  82. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  83. count = request_qs.count()
  84. request_qs = request_qs[(page - 1) * line:page * line]
  85. qs_list = []
  86. for requsetobj in request_qs:
  87. qs_list.append({
  88. 'id': requsetobj.id,
  89. 'method': requsetobj.method,
  90. 'url': requsetobj.url,
  91. 'parameter': requsetobj.parameter,
  92. # 时间保留小数点后两位
  93. 'execute_time': round(requsetobj.execute_time, 2),
  94. 'status_code': requsetobj.status_code,
  95. 'reason_phrase': requsetobj.reason_phrase,
  96. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  97. })
  98. return response.json(
  99. 0, {'list': qs_list, 'total': count})
  100. except Exception as e:
  101. print(e)
  102. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  103. def getDeviceIotInfoList(self, request_dict, response):
  104. serial_number = request_dict.get('serial_number', None)
  105. uid = request_dict.get('uid', None)
  106. pageNo = request_dict.get('pageNo', None)
  107. pageSize = request_dict.get('pageSize', None)
  108. if not all([pageNo, pageSize]):
  109. return response.json(444)
  110. page = int(pageNo)
  111. line = int(pageSize)
  112. try:
  113. if serial_number or uid:
  114. if serial_number:
  115. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  116. serial_number__contains=serial_number)
  117. if uid:
  118. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  119. uid__contains=uid)
  120. if not iot_device_info_qs.exists():
  121. return response.json(0)
  122. total = len(iot_device_info_qs)
  123. iot_device_info_qs = iot_device_info_qs.values(
  124. 'serial_number',
  125. 'uid',
  126. 'thing_name',
  127. 'thing_groups',
  128. 'add_time',
  129. 'update_time')[(page - 1) * line:page * line]
  130. else:
  131. total = iotdeviceInfoModel.objects.filter().count()
  132. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  133. 'serial_number',
  134. 'uid',
  135. 'thing_name',
  136. 'thing_groups',
  137. 'add_time',
  138. 'update_time')[(page - 1) * line:page * line]
  139. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  140. # 获取序列号的uid
  141. for iot_device_info in iot_device_info_list:
  142. if not iot_device_info['uid']:
  143. device_info_qs = Device_Info.objects.filter(
  144. serial_number__contains=iot_device_info['serial_number']).values('UID')
  145. if device_info_qs.exists():
  146. iot_device_info['uid'] = device_info_qs[0]['UID']
  147. return response.json(
  148. 0, {'list': iot_device_info_list, 'total': total})
  149. except Exception as e:
  150. print(e)
  151. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  152. # 通用发布MQTT通知
  153. @staticmethod
  154. def requestPublishMqtt(request_dict, response):
  155. msg = request_dict.get('msg', None)
  156. thing_name = request_dict.get('thing_name', None)
  157. topic_name = request_dict.get('topic_name', None)
  158. if not all([msg, thing_name, topic_name]):
  159. return response.json(444)
  160. try:
  161. msg = eval(msg)
  162. identification_code = thing_name[thing_name.rindex('_') + 1:]
  163. if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
  164. return response.json(10044)
  165. return response.json(0)
  166. except Exception as e:
  167. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  168. def getAccessLogList(self, request_dict, response):
  169. user = request_dict.get('user', None)
  170. operation = request_dict.get('operation', None)
  171. status = request_dict.get('status', None)
  172. pageNo = request_dict.get('pageNo', None)
  173. pageSize = request_dict.get('pageSize', None)
  174. if not all([pageNo, pageSize]):
  175. return response.json(444)
  176. page = int(pageNo)
  177. line = int(pageSize)
  178. try:
  179. if user or operation or status:
  180. if user:
  181. access_log_qs = Access_Log.objects.filter(
  182. user__contains=user)
  183. if operation:
  184. access_log_qs = Access_Log.objects.filter(
  185. operation__contains=operation)
  186. if status:
  187. access_log_qs = Access_Log.objects.filter(status=status)
  188. if not access_log_qs.exists():
  189. return response.json(0)
  190. total = access_log_qs.count()
  191. access_log_qs = access_log_qs.order_by('-time').values(
  192. 'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  193. else:
  194. total = Access_Log.objects.count()
  195. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  196. 'operation', 'ip', 'status',
  197. 'content', 'time')[
  198. (page - 1) * line:page * line]
  199. access_log_list = CommonService.qs_to_list(access_log_qs)
  200. return response.json(0, {'list': access_log_list, 'total': total})
  201. except Exception as e:
  202. print(e)
  203. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  204. def getDeviceLogList(self, request_dict, response):
  205. uid = request_dict.get('uid', None)
  206. serial_number = request_dict.get('serial_number', None)
  207. pageNo = request_dict.get('pageNo', None)
  208. pageSize = request_dict.get('pageSize', None)
  209. if not all([pageNo, pageSize]):
  210. return response.json(444)
  211. page = int(pageNo)
  212. line = int(pageSize)
  213. try:
  214. if uid or serial_number:
  215. if uid:
  216. device_log_qs = DeviceLogModel.objects.filter(
  217. uid=uid)
  218. if serial_number:
  219. device_log_qs = DeviceLogModel.objects.filter(
  220. serial_number=serial_number)
  221. if not device_log_qs.exists():
  222. return response.json(0)
  223. total = device_log_qs.count()
  224. device_log_qs = device_log_qs.order_by(
  225. '-add_time').values()[(page - 1) * line:page * line]
  226. else:
  227. total = DeviceLogModel.objects.count()
  228. device_log_qs = DeviceLogModel.objects.filter().order_by(
  229. '-add_time').values()[(page - 1) * line:page * line]
  230. device_log_list = CommonService.qs_to_list(device_log_qs)
  231. # 添加下载链接
  232. aws_s3_client = boto3.client(
  233. 's3',
  234. region_name=REGION_NAME,
  235. aws_access_key_id=ACCESS_KEY_ID,
  236. aws_secret_access_key=SECRET_ACCESS_KEY,
  237. config=botocore.client.Config(signature_version='s3v4'),
  238. )
  239. for device_log in device_log_list:
  240. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  241. obj = 'device_log/' + obj + \
  242. '/{}'.format(device_log['filename'])
  243. download_url = aws_s3_client.generate_presigned_url(
  244. ClientMethod='get_object',
  245. Params={
  246. 'Bucket': LOG_BUCKET,
  247. 'Key': obj
  248. },
  249. ExpiresIn=3600
  250. )
  251. device_log['download_url'] = download_url
  252. return response.json(0, {'list': device_log_list, 'total': total})
  253. except Exception as e:
  254. print(e)
  255. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  256. def getOperationLogList(self, request_dict, response):
  257. operation = request_dict.get('operation', None)
  258. url = request_dict.get('url', None)
  259. pageNo = request_dict.get('pageNo', None)
  260. pageSize = request_dict.get('pageSize', None)
  261. if not all([pageNo, pageSize]):
  262. return response.json(444)
  263. page = int(pageNo)
  264. line = int(pageSize)
  265. try:
  266. log_qs = LogModel.objects.all()
  267. if operation:
  268. log_qs = log_qs.filter(operation__contains=operation)
  269. if url:
  270. log_qs = log_qs.filter(url__contains=url)
  271. count = log_qs.count()
  272. log_qs = log_qs.values(
  273. 'operation', 'url', 'content', 'ip', 'time')[
  274. (page - 1) * line:page * line]
  275. log_list = list(log_qs)
  276. return response.json(
  277. 0, {'list': log_list, 'total': count})
  278. except Exception as e:
  279. print(e)
  280. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  281. def getAppLogList(self, request_dict, response):
  282. """
  283. 获取App日志信息
  284. @param request_dict:请求参数
  285. @param response:响应对象
  286. @request_dict userID:用户ID
  287. @request_dict uid:uid
  288. @return:
  289. """
  290. userName = request_dict.get('userName', None)
  291. uid = request_dict.get('uid', None)
  292. pageNo = request_dict.get('pageNo', None)
  293. pageSize = request_dict.get('pageSize', None)
  294. if not all([pageNo, pageSize]):
  295. return response.json(444)
  296. page = int(pageNo)
  297. line = int(pageSize)
  298. try:
  299. app_log_qs = AppLogModel.objects.all()
  300. if userName:
  301. app_log_qs = app_log_qs.filter(user__username=userName)
  302. elif uid:
  303. app_log_qs = app_log_qs.filter(uid=uid)
  304. count = app_log_qs.count()
  305. log_qs = app_log_qs.values(
  306. 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
  307. '-add_time')[(page - 1) * line:page * line]
  308. app_log_list = CommonService.qs_to_list(log_qs)
  309. # 添加下载链接
  310. aws_s3_client = boto3.client(
  311. 's3',
  312. region_name=REGION_NAME,
  313. aws_access_key_id=ACCESS_KEY_ID,
  314. aws_secret_access_key=SECRET_ACCESS_KEY,
  315. config=botocore.client.Config(signature_version='s3v4'),
  316. )
  317. for app_log in app_log_list:
  318. filename = app_log['filename']
  319. if not filename.endswith('.txt'):
  320. filename += ".txt"
  321. obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
  322. appLog_url = aws_s3_client.generate_presigned_url(
  323. ClientMethod='get_object',
  324. Params={
  325. 'Bucket': LOG_BUCKET,
  326. 'Key': obj
  327. },
  328. ExpiresIn=3600
  329. )
  330. app_log['appLog_url'] = appLog_url
  331. return response.json(0, {'list': app_log_list, 'total': count})
  332. except Exception as e:
  333. print(e)
  334. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  335. def getScanLog(self, request_dict, response):
  336. serial = request_dict.get('serial', None)
  337. ip = request_dict.get('ip', None)
  338. pageNo = request_dict.get('pageNo', None)
  339. pageSize = request_dict.get('pageSize', None)
  340. if not all([pageNo, pageSize]):
  341. return response.json(444)
  342. page = int(pageNo)
  343. line = int(pageSize)
  344. try:
  345. scan_log_qs = AppScannedSerial.objects.all()
  346. if serial:
  347. scan_log_qs = scan_log_qs.filter(serial__contains=serial)
  348. if ip:
  349. scan_log_qs = scan_log_qs.filter(ip__contains=ip)
  350. count = scan_log_qs.count()
  351. scan_log_qs = scan_log_qs.order_by('-add_time').values(
  352. 'serial', 'ip', 'add_time', 'update_time')[
  353. (page - 1) * line:page * line]
  354. scan_log_list = list(scan_log_qs)
  355. return response.json(
  356. 0, {'list': scan_log_list, 'total': count})
  357. except Exception as e:
  358. print(e)
  359. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  360. def getAlarmLog(self, request_dict, response):
  361. page_no = request_dict.get('pageNo', None)
  362. page_size = request_dict.get('pageSize', None)
  363. uid = request_dict.get('uid', None)
  364. if not all([page_no, page_size]):
  365. return response.json(444)
  366. page = int(page_no)
  367. line = int(page_size)
  368. try:
  369. alarm_log_qs = StsFrequency.objects.all()
  370. if uid:
  371. alarm_log_qs = alarm_log_qs.filter(uid=uid)
  372. count = alarm_log_qs.count()
  373. alarm_log_qs = alarm_log_qs.order_by('-updateTime').values('id', 'uid', 'frequency', 'updateTime',
  374. 'addTime')[(page - 1) * line:page * line]
  375. return response.json(0, {'list': list(alarm_log_qs), 'total': count})
  376. except Exception as e:
  377. print(e)
  378. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  379. @staticmethod
  380. def getDomainLog(request_dict, response):
  381. page_no = request_dict.get('pageNo', None)
  382. page_size = request_dict.get('pageSize', None)
  383. serial_number = request_dict.get('serialNumber', None)
  384. if not all([page_no, page_size]):
  385. return response.json(444)
  386. page = int(page_no)
  387. line = int(page_size)
  388. try:
  389. device_domain_qs = DeviceDomainRegionModel.objects.all()
  390. if serial_number:
  391. device_domain_qs = device_domain_qs.filter(serial_number__contains=serial_number)
  392. count = device_domain_qs.count()
  393. device_domain_qs = device_domain_qs.order_by('-update_time').values()[(page - 1) * line:page * line]
  394. device_domain_list = []
  395. for device_domain in device_domain_qs:
  396. ip = device_domain['ip']
  397. country_code = device_domain['country_code']
  398. ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region')
  399. if ip_addr_qs.exists():
  400. region = ip_addr_qs[0]['region']
  401. else:
  402. ip_qs = IPQuery(ip)
  403. region = ip_qs.region
  404. # 港澳台返回美洲域名
  405. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  406. country_code = 'NA'
  407. country_qs = CountryModel.objects.filter(country_code=country_code).\
  408. values('region__name', 'region__api')
  409. api = ''
  410. region_name = ''
  411. if country_qs.exists():
  412. api = country_qs[0]['region__api']
  413. region_name = country_qs[0]['region__name']
  414. api_region = region_name + '域名'
  415. device_domain_list.append({
  416. 'id': device_domain['id'],
  417. 'serial_number': device_domain['serial_number'],
  418. 'ip': ip,
  419. 'region_id': device_domain['region_id'],
  420. 'country_code': country_code,
  421. 'api': api,
  422. 'api_region': api_region,
  423. 'add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  424. 'update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  425. })
  426. return response.json(0, {'list': device_domain_list, 'total': count})
  427. except Exception as e:
  428. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))