LogManagementController.py 20 KB

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