文件夹挂载逻辑变动2
This commit is contained in:
@@ -4,13 +4,10 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -399,7 +396,7 @@ func getFrpcStatusHandler(c *gin.Context) {
|
|||||||
// ========== 日志 Handler ==========
|
// ========== 日志 Handler ==========
|
||||||
|
|
||||||
func getFrpcLogHandler(c *gin.Context) {
|
func getFrpcLogHandler(c *gin.Context) {
|
||||||
// 从 ./data/frpc.log 读取日志
|
// readTailLog 在 frp.go 中定义,读取 ./data/frpc.log
|
||||||
lines, err := readTailLog("./data/frpc.log", 200)
|
lines, err := readTailLog("./data/frpc.log", 200)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
@@ -421,88 +418,6 @@ func getFrpcLogHandler(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// readTailLog 读取文件末尾 n 行(倒序读取,返回正序)
|
|
||||||
func readTailLog(filePath string, n int) ([]string, error) {
|
|
||||||
file, err := os.Open(filePath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
// 获取文件大小
|
|
||||||
info, err := file.Stat()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
fileSize := info.Size()
|
|
||||||
if fileSize == 0 {
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从末尾开始读
|
|
||||||
const chunkSize = 4096
|
|
||||||
var lines []string
|
|
||||||
var leftover []byte
|
|
||||||
offset := fileSize
|
|
||||||
|
|
||||||
for len(lines) < n && offset > 0 {
|
|
||||||
// 计算读取起点
|
|
||||||
readSize := chunkSize
|
|
||||||
if offset < int64(chunkSize) {
|
|
||||||
readSize = int(offset)
|
|
||||||
}
|
|
||||||
offset -= int64(readSize)
|
|
||||||
|
|
||||||
// 读取这一块
|
|
||||||
buf := make([]byte, readSize)
|
|
||||||
_, err := file.ReadAt(buf, offset)
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将当前块与之前剩下的拼接
|
|
||||||
data := append(buf, leftover...)
|
|
||||||
leftover = nil
|
|
||||||
|
|
||||||
// 按行分割(从后往前)
|
|
||||||
start := 0
|
|
||||||
for i := len(data) - 1; i >= 0; i-- {
|
|
||||||
if data[i] == '\n' {
|
|
||||||
if i+1 < len(data) {
|
|
||||||
line := string(data[i+1:])
|
|
||||||
if line != "" {
|
|
||||||
lines = append([]string{line}, lines...)
|
|
||||||
if len(lines) >= n {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
start = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果还没凑够,把未处理的部分留到下一轮
|
|
||||||
if len(lines) < n && start > 0 {
|
|
||||||
leftover = data[:start]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理最后剩余部分(文件开头)
|
|
||||||
if len(lines) < n && len(leftover) > 0 {
|
|
||||||
parts := strings.Split(string(leftover), "\n")
|
|
||||||
for i := len(parts) - 1; i >= 0; i-- {
|
|
||||||
if parts[i] != "" {
|
|
||||||
lines = append([]string{parts[i]}, lines...)
|
|
||||||
if len(lines) >= n {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ========== Ping Handler ==========
|
// ========== Ping Handler ==========
|
||||||
|
|
||||||
func pingHandler(c *gin.Context) {
|
func pingHandler(c *gin.Context) {
|
||||||
@@ -620,7 +535,6 @@ func ExportTomlHandler(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建与 GenerateFrpcConfig 一致的数据结构
|
|
||||||
data := struct {
|
data := struct {
|
||||||
*GlobalConfig
|
*GlobalConfig
|
||||||
Proxies []Proxy
|
Proxies []Proxy
|
||||||
|
|||||||
Reference in New Issue
Block a user