LogManagementController.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  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. elif operation == 'getDomainScanLog': # 获取域名扫码日志
  59. return self.getDomainScanLog(request_dict, response)
  60. else:
  61. return response.json(404)
  62. def getRequestList(self, request_dict, response):
  63. pageNo = request_dict.get('pageNo', None)
  64. pageSize = request_dict.get('pageSize', None)
  65. method = request_dict.get('method', None)
  66. url = request_dict.get('url', None)
  67. parameter = request_dict.get('parameter', None)
  68. status_code = request_dict.get('status_code', None)
  69. reason_phrase = request_dict.get('reason_phrase', None)
  70. if not all([pageNo, pageSize]):
  71. return response.json(444)
  72. page = int(pageNo)
  73. line = int(pageSize)
  74. try:
  75. request_qs = RequestRecordModel.objects.all()
  76. if method:
  77. request_qs = request_qs.filter(method=method)
  78. if url:
  79. request_qs = request_qs.filter(url__contains=url)
  80. if parameter:
  81. request_qs = request_qs.filter(parameter__contains=parameter)
  82. if status_code:
  83. request_qs = request_qs.filter(status_code=status_code)
  84. if reason_phrase:
  85. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  86. count = request_qs.count()
  87. request_qs = request_qs[(page - 1) * line:page * line]
  88. qs_list = []
  89. for requsetobj in request_qs:
  90. qs_list.append({
  91. 'id': requsetobj.id,
  92. 'method': requsetobj.method,
  93. 'url': requsetobj.url,
  94. 'parameter': requsetobj.parameter,
  95. # 时间保留小数点后两位
  96. 'execute_time': round(requsetobj.execute_time, 2),
  97. 'status_code': requsetobj.status_code,
  98. 'reason_phrase': requsetobj.reason_phrase,
  99. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  100. })
  101. return response.json(
  102. 0, {'list': qs_list, 'total': count})
  103. except Exception as e:
  104. print(e)
  105. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  106. def getDeviceIotInfoList(self, request_dict, response):
  107. serial_number = request_dict.get('serial_number', None)
  108. uid = request_dict.get('uid', None)
  109. pageNo = request_dict.get('pageNo', None)
  110. pageSize = request_dict.get('pageSize', None)
  111. if not all([pageNo, pageSize]):
  112. return response.json(444)
  113. page = int(pageNo)
  114. line = int(pageSize)
  115. try:
  116. if serial_number or uid:
  117. if serial_number:
  118. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  119. serial_number__contains=serial_number)
  120. if uid:
  121. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  122. uid__contains=uid)
  123. if not iot_device_info_qs.exists():
  124. return response.json(0)
  125. total = len(iot_device_info_qs)
  126. iot_device_info_qs = iot_device_info_qs.values(
  127. 'serial_number',
  128. 'uid',
  129. 'thing_name',
  130. 'thing_groups',
  131. 'add_time',
  132. 'update_time')[(page - 1) * line:page * line]
  133. else:
  134. total = iotdeviceInfoModel.objects.filter().count()
  135. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  136. 'serial_number',
  137. 'uid',
  138. 'thing_name',
  139. 'thing_groups',
  140. 'add_time',
  141. 'update_time')[(page - 1) * line:page * line]
  142. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  143. # 获取序列号的uid
  144. for iot_device_info in iot_device_info_list:
  145. if not iot_device_info['uid']:
  146. device_info_qs = Device_Info.objects.filter(
  147. serial_number__contains=iot_device_info['serial_number']).values('UID')
  148. if device_info_qs.exists():
  149. iot_device_info['uid'] = device_info_qs[0]['UID']
  150. return response.json(
  151. 0, {'list': iot_device_info_list, 'total': total})
  152. except Exception as e:
  153. print(e)
  154. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  155. # 通用发布MQTT通知
  156. @staticmethod
  157. def requestPublishMqtt(request_dict, response):
  158. msg = request_dict.get('msg', None)
  159. thing_name = request_dict.get('thing_name', None)
  160. topic_name = request_dict.get('topic_name', None)
  161. if not all([msg, thing_name, topic_name]):
  162. return response.json(444)
  163. try:
  164. msg = eval(msg)
  165. identification_code = thing_name[thing_name.rindex('_') + 1:]
  166. if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
  167. return response.json(10044)
  168. return response.json(0)
  169. except Exception as e:
  170. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  171. def getAccessLogList(self, request_dict, response):
  172. user = request_dict.get('user', None)
  173. operation = request_dict.get('operation', None)
  174. status = request_dict.get('status', None)
  175. pageNo = request_dict.get('pageNo', None)
  176. pageSize = request_dict.get('pageSize', None)
  177. if not all([pageNo, pageSize]):
  178. return response.json(444)
  179. page = int(pageNo)
  180. line = int(pageSize)
  181. try:
  182. if user or operation or status:
  183. if user:
  184. access_log_qs = Access_Log.objects.filter(
  185. user__contains=user)
  186. if operation:
  187. access_log_qs = Access_Log.objects.filter(
  188. operation__contains=operation)
  189. if status:
  190. access_log_qs = Access_Log.objects.filter(status=status)
  191. if not access_log_qs.exists():
  192. return response.json(0)
  193. total = access_log_qs.count()
  194. access_log_qs = access_log_qs.order_by('-time').values(
  195. 'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  196. else:
  197. total = Access_Log.objects.count()
  198. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  199. 'operation', 'ip', 'status',
  200. 'content', 'time')[
  201. (page - 1) * line:page * line]
  202. access_log_list = CommonService.qs_to_list(access_log_qs)
  203. return response.json(0, {'list': access_log_list, 'total': total})
  204. except Exception as e:
  205. print(e)
  206. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  207. def getDeviceLogList(self, request_dict, response):
  208. uid = request_dict.get('uid', None)
  209. serial_number = request_dict.get('serial_number', None)
  210. pageNo = request_dict.get('pageNo', None)
  211. pageSize = request_dict.get('pageSize', None)
  212. if not all([pageNo, pageSize]):
  213. return response.json(444)
  214. page = int(pageNo)
  215. line = int(pageSize)
  216. try:
  217. if uid or serial_number:
  218. if uid:
  219. device_log_qs = DeviceLogModel.objects.filter(
  220. uid=uid)
  221. if serial_number:
  222. device_log_qs = DeviceLogModel.objects.filter(
  223. serial_number=serial_number)
  224. if not device_log_qs.exists():
  225. return response.json(0)
  226. total = device_log_qs.count()
  227. device_log_qs = device_log_qs.order_by(
  228. '-add_time').values()[(page - 1) * line:page * line]
  229. else:
  230. total = DeviceLogModel.objects.count()
  231. device_log_qs = DeviceLogModel.objects.filter().order_by(
  232. '-add_time').values()[(page - 1) * line:page * line]
  233. device_log_list = CommonService.qs_to_list(device_log_qs)
  234. # 添加下载链接
  235. aws_s3_client = boto3.client(
  236. 's3',
  237. region_name=REGION_NAME,
  238. aws_access_key_id=ACCESS_KEY_ID,
  239. aws_secret_access_key=SECRET_ACCESS_KEY,
  240. config=botocore.client.Config(signature_version='s3v4'),
  241. )
  242. for device_log in device_log_list:
  243. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  244. obj = 'device_log/' + obj + \
  245. '/{}'.format(device_log['filename'])
  246. download_url = aws_s3_client.generate_presigned_url(
  247. ClientMethod='get_object',
  248. Params={
  249. 'Bucket': LOG_BUCKET,
  250. 'Key': obj
  251. },
  252. ExpiresIn=3600
  253. )
  254. device_log['download_url'] = download_url
  255. return response.json(0, {'list': device_log_list, 'total': total})
  256. except Exception as e:
  257. print(e)
  258. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  259. def getOperationLogList(self, request_dict, response):
  260. operation = request_dict.get('operation', None)
  261. url = request_dict.get('url', None)
  262. pageNo = request_dict.get('pageNo', None)
  263. pageSize = request_dict.get('pageSize', None)
  264. if not all([pageNo, pageSize]):
  265. return response.json(444)
  266. page = int(pageNo)
  267. line = int(pageSize)
  268. try:
  269. log_qs = LogModel.objects.all()
  270. if operation:
  271. log_qs = log_qs.filter(operation__contains=operation)
  272. if url:
  273. log_qs = log_qs.filter(url__contains=url)
  274. count = log_qs.count()
  275. log_qs = log_qs.values(
  276. 'operation', 'url', 'content', 'ip', 'time')[
  277. (page - 1) * line:page * line]
  278. log_list = list(log_qs)
  279. return response.json(
  280. 0, {'list': log_list, 'total': count})
  281. except Exception as e:
  282. print(e)
  283. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  284. def getAppLogList(self, request_dict, response):
  285. """
  286. 获取App日志信息
  287. @param request_dict:请求参数
  288. @param response:响应对象
  289. @request_dict userID:用户ID
  290. @request_dict uid:uid
  291. @return:
  292. """
  293. userName = request_dict.get('userName', None)
  294. uid = request_dict.get('uid', None)
  295. pageNo = request_dict.get('pageNo', None)
  296. pageSize = request_dict.get('pageSize', None)
  297. if not all([pageNo, pageSize]):
  298. return response.json(444)
  299. page = int(pageNo)
  300. line = int(pageSize)
  301. try:
  302. app_log_qs = AppLogModel.objects.all()
  303. if userName:
  304. app_log_qs = app_log_qs.filter(user__username=userName)
  305. elif uid:
  306. app_log_qs = app_log_qs.filter(uid=uid)
  307. count = app_log_qs.count()
  308. log_qs = app_log_qs.values(
  309. 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
  310. '-add_time')[(page - 1) * line:page * line]
  311. app_log_list = CommonService.qs_to_list(log_qs)
  312. # 添加下载链接
  313. aws_s3_client = boto3.client(
  314. 's3',
  315. region_name=REGION_NAME,
  316. aws_access_key_id=ACCESS_KEY_ID,
  317. aws_secret_access_key=SECRET_ACCESS_KEY,
  318. config=botocore.client.Config(signature_version='s3v4'),
  319. )
  320. for app_log in app_log_list:
  321. filename = app_log['filename']
  322. if not filename.endswith('.txt'):
  323. filename += ".txt"
  324. obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
  325. appLog_url = aws_s3_client.generate_presigned_url(
  326. ClientMethod='get_object',
  327. Params={
  328. 'Bucket': LOG_BUCKET,
  329. 'Key': obj
  330. },
  331. ExpiresIn=3600
  332. )
  333. app_log['appLog_url'] = appLog_url
  334. return response.json(0, {'list': app_log_list, 'total': count})
  335. except Exception as e:
  336. print(e)
  337. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  338. def getScanLog(self, request_dict, response):
  339. serial = request_dict.get('serial', None)
  340. ip = request_dict.get('ip', None)
  341. pageNo = request_dict.get('pageNo', None)
  342. pageSize = request_dict.get('pageSize', None)
  343. if not all([pageNo, pageSize]):
  344. return response.json(444)
  345. page = int(pageNo)
  346. line = int(pageSize)
  347. try:
  348. scan_log_qs = AppScannedSerial.objects.all()
  349. if serial:
  350. scan_log_qs = scan_log_qs.filter(serial__contains=serial)
  351. if ip:
  352. scan_log_qs = scan_log_qs.filter(ip__contains=ip)
  353. count = scan_log_qs.count()
  354. scan_log_qs = scan_log_qs.order_by('-add_time').values(
  355. 'serial', 'ip', 'add_time', 'update_time')[
  356. (page - 1) * line:page * line]
  357. scan_log_list = list(scan_log_qs)
  358. return response.json(
  359. 0, {'list': scan_log_list, 'total': count})
  360. except Exception as e:
  361. print(e)
  362. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  363. def getAlarmLog(self, request_dict, response):
  364. page_no = request_dict.get('pageNo', None)
  365. page_size = request_dict.get('pageSize', None)
  366. uid = request_dict.get('uid', None)
  367. if not all([page_no, page_size]):
  368. return response.json(444)
  369. page = int(page_no)
  370. line = int(page_size)
  371. try:
  372. alarm_log_qs = StsFrequency.objects.all()
  373. if uid:
  374. alarm_log_qs = alarm_log_qs.filter(uid=uid)
  375. count = alarm_log_qs.count()
  376. alarm_log_qs = alarm_log_qs.order_by('-updateTime').values('id', 'uid', 'frequency', 'updateTime',
  377. 'addTime')[(page - 1) * line:page * line]
  378. return response.json(0, {'list': list(alarm_log_qs), 'total': count})
  379. except Exception as e:
  380. print(e)
  381. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  382. @staticmethod
  383. def getDomainLog(request_dict, response):
  384. page_no = request_dict.get('pageNo', None)
  385. page_size = request_dict.get('pageSize', None)
  386. serial_number = request_dict.get('serialNumber', None)
  387. if not all([page_no, page_size]):
  388. return response.json(444)
  389. page = int(page_no)
  390. line = int(page_size)
  391. try:
  392. device_domain_qs = DeviceDomainRegionModel.objects.filter(~Q(country_code=''))
  393. if serial_number:
  394. device_domain_qs = device_domain_qs.filter(serial_number__contains=serial_number)
  395. count = device_domain_qs.count()
  396. device_domain_qs = device_domain_qs.order_by('-update_time').values()[(page - 1) * line:page * line]
  397. device_domain_list = []
  398. for device_domain in device_domain_qs:
  399. ip = device_domain['ip']
  400. region_id = device_domain['region_id']
  401. country_code = device_domain['country_code']
  402. ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region')
  403. if ip_addr_qs.exists():
  404. region = ip_addr_qs[0]['region']
  405. else:
  406. ip_qs = IPQuery(ip)
  407. region = ip_qs.region
  408. # 港澳台返回美洲域名
  409. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  410. country_code = region
  411. # 查询域名数据
  412. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  413. api = 'https://www.dvema.com/'
  414. region_name = '美洲'
  415. if region_qs.exists():
  416. api = region_qs[0]['api']
  417. region_name = region_qs[0]['name']
  418. api_region = region_name + '域名'
  419. device_domain_list.append({
  420. 'id': device_domain['id'],
  421. 'serial_number': device_domain['serial_number'],
  422. 'ip': ip,
  423. 'region_id': region_id,
  424. 'country_code': country_code,
  425. 'api': api,
  426. 'api_region': api_region,
  427. 'add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  428. 'update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  429. })
  430. return response.json(0, {'list': device_domain_list, 'total': count})
  431. except Exception as e:
  432. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  433. @staticmethod
  434. def getDomainScanLog(request_dict, response):
  435. serial_number = request_dict.get('serialNumber', None)
  436. if not all([serial_number]):
  437. return response.json(444)
  438. try:
  439. scan_log_qs = AppScannedSerial.objects.filter(serial__contains=serial_number).values('ip', 'add_time',
  440. 'update_time')
  441. device_domain_qs = DeviceDomainRegionModel.objects.filter(serial_number__contains=serial_number).values()
  442. res = {}
  443. if scan_log_qs.exists() and device_domain_qs.exists():
  444. device_domain = device_domain_qs[0]
  445. domain_ip = device_domain['ip']
  446. region_id = device_domain['region_id']
  447. country_code = device_domain['country_code']
  448. ip_addr_qs = IPAddr.objects.filter(ip=domain_ip, is_geoip2=False).values('region')
  449. if ip_addr_qs.exists():
  450. region = ip_addr_qs[0]['region']
  451. else:
  452. ip_qs = IPQuery(domain_ip)
  453. region = ip_qs.region
  454. # 港澳台返回美洲域名
  455. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  456. country_code = region
  457. # 查询域名数据
  458. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  459. api = 'https://www.dvema.com/'
  460. region_name = '美洲'
  461. if region_qs.exists():
  462. api = region_qs[0]['api']
  463. region_name = region_qs[0]['name']
  464. api_region = region_name + '域名'
  465. res = {
  466. 'serial_number': device_domain['serial_number'],
  467. 'domain_ip': domain_ip,
  468. 'scan_ip': device_domain_qs[0]['ip'],
  469. 'region_id': region_id,
  470. 'country_code': country_code,
  471. 'api': api,
  472. 'api_region': api_region,
  473. 'domain_add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  474. 'domain_update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  475. 'scan_add_time': device_domain_qs[0]['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  476. 'scan_update_time': device_domain_qs[0]['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  477. }
  478. return response.json(0, res)
  479. except Exception as e:
  480. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))