| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- const API = require('../../../../lib/API.js')
- const { BaseStdResponse } = require('../../../../BaseStdResponse.js')
- const AccessControl = require('../../../../lib/AccessControl.js')
- const db = require('../../../../plugin/DataBase/db.js')
- const { summarizeLogRow, extractEgressIp } = require('../../../../lib/Lepao/lepaoProxyLogDisplay')
- const { lookupIpv4Region } = require('../../../../lib/Lepao/ipRegionLookup')
- class AdminLepaoProxyLogs extends API {
- constructor() {
- super()
- this.setPath('/Admin/Lepao/Proxy/Logs')
- this.setMethod('GET')
- }
- async onRequest(req, res) {
- const { uuid, session, pagesize, current } = req.query
- if ([uuid, session, pagesize, current].some(v => v === '' || v == null))
- return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
- if (isNaN(pagesize) || Number(pagesize) <= 0 || isNaN(current) || Number(current) <= 0)
- return res.json({ ...BaseStdResponse.ERR, msg: '参数错误' })
- if (!await AccessControl.checkSession(uuid, session))
- return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
- const permission = await AccessControl.getPermission(uuid)
- if (!permission.includes('admin') && !permission.includes('service'))
- return res.json({ ...BaseStdResponse.PERMISSION_DENIED })
- const lim = Math.min(200, Math.max(1, Math.floor(Number(pagesize))))
- const off = Math.max(0, (Math.floor(Number(current)) - 1) * lim)
- try {
- const countRows = await db.query(`SELECT COUNT(*) AS total FROM lepao_proxy_log`)
- const rows = await db.query(
- `SELECT id, created_at, event, server, deadline, detail FROM lepao_proxy_log ORDER BY id DESC LIMIT ${lim} OFFSET ${off}`
- )
- const total = Number(countRows?.[0]?.total || 0)
- const regionCache = {}
- async function regionForEgress(ip) {
- if (!ip) return null
- if (!regionCache[ip]) regionCache[ip] = await lookupIpv4Region(ip)
- return regionCache[ip]
- }
- const data = []
- for (const r of rows || []) {
- const display = summarizeLogRow(r)
- const egressIp = extractEgressIp(r)
- const egressRegion = await regionForEgress(egressIp)
- data.push({
- id: r.id,
- created_at: r.created_at,
- event: r.event,
- server: r.server,
- deadline: r.deadline,
- egress_ip: egressIp,
- egress_region: egressRegion,
- event_label: display.event_label,
- event_color: display.event_color,
- summary: display.summary,
- detail_lines: display.detail_lines
- })
- }
- return res.json({
- ...BaseStdResponse.OK,
- data,
- pagination: {
- current: Number(current),
- pagesize: lim,
- total
- }
- })
- } catch (e) {
- this.logger?.error?.(`AdminLepaoProxyLogs: ${e.stack || e}`)
- return res.json({ ...BaseStdResponse.ERR, msg: '查询日志失败' })
- }
- }
- }
- module.exports.AdminLepaoProxyLogs = AdminLepaoProxyLogs
|