Logs.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const API = require('../../../../lib/API.js')
  2. const { BaseStdResponse } = require('../../../../BaseStdResponse.js')
  3. const AccessControl = require('../../../../lib/AccessControl.js')
  4. const db = require('../../../../plugin/DataBase/db.js')
  5. const { summarizeLogRow, extractEgressIp } = require('../../../../lib/Lepao/lepaoProxyLogDisplay')
  6. const { lookupIpv4Region } = require('../../../../lib/Lepao/ipRegionLookup')
  7. class AdminLepaoProxyLogs extends API {
  8. constructor() {
  9. super()
  10. this.setPath('/Admin/Lepao/Proxy/Logs')
  11. this.setMethod('GET')
  12. }
  13. async onRequest(req, res) {
  14. const { uuid, session, pagesize, current } = req.query
  15. if ([uuid, session, pagesize, current].some(v => v === '' || v == null))
  16. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  17. if (isNaN(pagesize) || Number(pagesize) <= 0 || isNaN(current) || Number(current) <= 0)
  18. return res.json({ ...BaseStdResponse.ERR, msg: '参数错误' })
  19. if (!await AccessControl.checkSession(uuid, session))
  20. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  21. const permission = await AccessControl.getPermission(uuid)
  22. if (!permission.includes('admin') && !permission.includes('service'))
  23. return res.json({ ...BaseStdResponse.PERMISSION_DENIED })
  24. const lim = Math.min(200, Math.max(1, Math.floor(Number(pagesize))))
  25. const off = Math.max(0, (Math.floor(Number(current)) - 1) * lim)
  26. try {
  27. const countRows = await db.query(`SELECT COUNT(*) AS total FROM lepao_proxy_log`)
  28. const rows = await db.query(
  29. `SELECT id, created_at, event, server, deadline, detail FROM lepao_proxy_log ORDER BY id DESC LIMIT ${lim} OFFSET ${off}`
  30. )
  31. const total = Number(countRows?.[0]?.total || 0)
  32. const regionCache = {}
  33. async function regionForEgress(ip) {
  34. if (!ip) return null
  35. if (!regionCache[ip]) regionCache[ip] = await lookupIpv4Region(ip)
  36. return regionCache[ip]
  37. }
  38. const data = []
  39. for (const r of rows || []) {
  40. const display = summarizeLogRow(r)
  41. const egressIp = extractEgressIp(r)
  42. const egressRegion = await regionForEgress(egressIp)
  43. data.push({
  44. id: r.id,
  45. created_at: r.created_at,
  46. event: r.event,
  47. server: r.server,
  48. deadline: r.deadline,
  49. egress_ip: egressIp,
  50. egress_region: egressRegion,
  51. event_label: display.event_label,
  52. event_color: display.event_color,
  53. summary: display.summary,
  54. detail_lines: display.detail_lines
  55. })
  56. }
  57. return res.json({
  58. ...BaseStdResponse.OK,
  59. data,
  60. pagination: {
  61. current: Number(current),
  62. pagesize: lim,
  63. total
  64. }
  65. })
  66. } catch (e) {
  67. this.logger?.error?.(`AdminLepaoProxyLogs: ${e.stack || e}`)
  68. return res.json({ ...BaseStdResponse.ERR, msg: '查询日志失败' })
  69. }
  70. }
  71. }
  72. module.exports.AdminLepaoProxyLogs = AdminLepaoProxyLogs