refactor: extract path logic to path.go and run go fmt on codebase
This commit is contained in:
@@ -12,8 +12,8 @@ import (
|
||||
|
||||
"github.com/engigu/baihu-panel/internal/constant"
|
||||
"github.com/engigu/baihu-panel/internal/database"
|
||||
"github.com/engigu/baihu-panel/internal/logger"
|
||||
"github.com/engigu/baihu-panel/internal/executor"
|
||||
"github.com/engigu/baihu-panel/internal/logger"
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
"github.com/engigu/baihu-panel/internal/services/tasks"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
@@ -324,7 +324,7 @@ func (s *AgentService) GetTasks(agentID string) []models.AgentTask {
|
||||
for i, task := range tasksList {
|
||||
// 加载环境配置
|
||||
var envVars []string
|
||||
|
||||
|
||||
// 检查全量注入模式
|
||||
allEnvs := false
|
||||
if task.Config != "" {
|
||||
@@ -344,7 +344,7 @@ func (s *AgentService) GetTasks(agentID string) []models.AgentTask {
|
||||
}
|
||||
|
||||
envVarsStr := executor.FormatEnvVars(envVars)
|
||||
|
||||
|
||||
command := string(task.Command)
|
||||
preCommand := string(task.PreCommand)
|
||||
postCommand := string(task.PostCommand)
|
||||
@@ -378,7 +378,6 @@ func (s *AgentService) GetTasks(agentID string) []models.AgentTask {
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
// ReportResult Agent 上报执行结果
|
||||
func (s *AgentService) ReportResult(result *models.AgentTaskResult) error {
|
||||
// 获取依赖的服务
|
||||
|
||||
@@ -16,9 +16,9 @@ import (
|
||||
// AgentWSManager WebSocket 连接管理器
|
||||
type AgentWSManager struct {
|
||||
connections map[string]*AgentConnection // Agent ID -> 连接对象
|
||||
ipConnections map[string]int // IP -> 连接数
|
||||
ipLastAttempt map[string]time.Time // IP -> 最后连接尝试时间
|
||||
ipFailCount map[string]int // IP -> 连续失败次数
|
||||
ipConnections map[string]int // IP -> 连接数
|
||||
ipLastAttempt map[string]time.Time // IP -> 最后连接尝试时间
|
||||
ipFailCount map[string]int // IP -> 连续失败次数
|
||||
remoteWaiters map[string]chan *models.AgentTaskResult // 日志 ID -> 结果通道
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
@@ -372,7 +372,6 @@ func (s *BackupService) restoreScriptsDir(r *zip.ReadCloser) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (s *BackupService) addDirToZip(zipWriter *zip.Writer, srcDir, prefix string) error {
|
||||
return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
|
||||
@@ -160,8 +160,6 @@ func LoadConfig(path string) (*AppConfig, error) {
|
||||
return Config, nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
// applyEnvOverrides 从环境变量加载配置
|
||||
func applyEnvOverrides() {
|
||||
// Server
|
||||
|
||||
@@ -25,7 +25,7 @@ func ParseRequirements(content string) []models.Dependency {
|
||||
var deps []models.Dependency
|
||||
// 使用正则表达式按行分割,兼容 Windows 和 Linux 的换行符
|
||||
lines := regexp.MustCompile(`\r?\n`).Split(content, -1)
|
||||
|
||||
|
||||
// 用于分割包名和版本的正则 (支持 ==, >=, <=, ~=, >, <, @)
|
||||
versionRegex := regexp.MustCompile(`[=><~@]+`)
|
||||
|
||||
@@ -43,7 +43,7 @@ func ParseRequirements(content string) []models.Dependency {
|
||||
if len(parts) > 1 {
|
||||
// 清除可能存在的后续参数,比如 requests==2.31.0 --hash=sha256:...
|
||||
versionPart := strings.TrimSpace(parts[1])
|
||||
|
||||
|
||||
// 如果有逗号分隔的多个范围限制,比如 >=1.20,<2.0,只取第一个范围作为参考版本号
|
||||
if idx := strings.Index(versionPart, ","); idx != -1 {
|
||||
versionPart = versionPart[:idx]
|
||||
|
||||
@@ -29,7 +29,7 @@ func (s *InitService) Initialize() *UserService {
|
||||
|
||||
// 创建管理员账号
|
||||
s.initializeAdmin(userService)
|
||||
|
||||
|
||||
// 初始化语言环境
|
||||
s.initializeLanguages()
|
||||
|
||||
|
||||
@@ -109,7 +109,6 @@ func (s *MiseService) fetchLiveLanguages() ([]MiseLanguage, error) {
|
||||
return s.listFallback()
|
||||
}
|
||||
|
||||
|
||||
func (s *MiseService) listFallback() ([]MiseLanguage, error) {
|
||||
cmd := exec.Command("mise", "ls")
|
||||
cmd.Env = os.Environ()
|
||||
@@ -286,7 +285,7 @@ func (s *MiseService) syncToDB(languages []MiseLanguage) {
|
||||
}
|
||||
|
||||
if queryErr == nil && rowsAffected == 0 {
|
||||
// 如果不存在,则创建
|
||||
// 如果不存在,则创建
|
||||
newLang := models.Language{
|
||||
ID: utils.GenerateID(),
|
||||
Plugin: lang.Plugin,
|
||||
@@ -329,6 +328,7 @@ func (s *MiseService) GetVerifyCommand(plugin, version string) (string, error) {
|
||||
}
|
||||
return m.GetVerifyCommand(version)
|
||||
}
|
||||
|
||||
// UseGlobal 设置全局默认版本
|
||||
func (s *MiseService) UseGlobal(plugin, version string) error {
|
||||
cmd := exec.Command("mise", "use", "-g", fmt.Sprintf("%s@%s", plugin, version))
|
||||
@@ -355,6 +355,7 @@ func (s *MiseService) UnsetGlobal(plugin, version string) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Envs 获取全局环境变量
|
||||
func (s *MiseService) Envs() (map[string]string, error) {
|
||||
cmd := exec.Command("mise", "set")
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package repo
|
||||
|
||||
import (
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
"regexp"
|
||||
"strings"
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
)
|
||||
|
||||
// QinglongStrategy 实现与青龙兼容的解析逻辑
|
||||
|
||||
@@ -3,17 +3,17 @@ package repo
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
"github.com/robfig/cron/v3"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
"github.com/robfig/cron/v3"
|
||||
)
|
||||
|
||||
var (
|
||||
// envRegex 匹配脚本中的环境名称设置,如 Env("名称")
|
||||
envRegex = regexp.MustCompile(`(?i)(?:new[ \t]+)?Env\(['"]?([^'"]+)['"]?\)`)
|
||||
envRegex = regexp.MustCompile(`(?i)(?:new[ \t]+)?Env\(['"]?([^'"]+)['"]?\)`)
|
||||
// cronRegex 匹配脚本中的 cron 表达式设置
|
||||
cronRegex = regexp.MustCompile(`(?i)(?:cron[ \t]*[:=][ \t]*['"]?([^'"\r\n]+))|(?:(?:^|[ \t\*\/])(([0-9\*\/\-,L?#]+[ \t]+){4,5}[0-9\*\/\-,L?#]+))`)
|
||||
// cronFormatRegex 用于校验提取出的字符串是否符合 Cron 表达式格式 (5位或6位)
|
||||
|
||||
@@ -101,7 +101,7 @@ func (m *SystemWSManager) SubscribeEvents(bus *eventbus.EventBus) {
|
||||
constant.EventTaskRunning,
|
||||
constant.EventTaskQueued,
|
||||
}
|
||||
|
||||
|
||||
for _, evt := range taskEvents {
|
||||
bus.Subscribe(evt, func(e eventbus.Event) {
|
||||
m.Broadcast(e.Type, e.Payload)
|
||||
|
||||
@@ -486,7 +486,7 @@ func (es *ExecutorService) ExecuteDispatcher(ctx context.Context, req *executor.
|
||||
|
||||
// 组合指令逻辑已移至 executor.ExecuteWithHooks 中,此处不再处理
|
||||
// 以避免指令被重复组合。
|
||||
|
||||
|
||||
// 远程任务
|
||||
if task.AgentID != nil && *task.AgentID != "" {
|
||||
// 将请求中已包含的环境变量(已合并)传递给 Agent
|
||||
@@ -806,7 +806,7 @@ func (es *ExecutorService) StopTaskExecution(logID string) error {
|
||||
taskLog.Status = constant.TaskStatusFailed
|
||||
errorMessage := "任务执行实例已丢失(可能由于系统重启导致),已自动同步状态为失败"
|
||||
taskLog.Error = models.BigText(errorMessage)
|
||||
|
||||
|
||||
// 更新数据库状态
|
||||
database.DB.Model(&taskLog).Updates(map[string]interface{}{
|
||||
"status": taskLog.Status,
|
||||
|
||||
@@ -4,11 +4,11 @@ import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/engigu/baihu-panel/internal/constant"
|
||||
"github.com/engigu/baihu-panel/internal/database"
|
||||
"github.com/engigu/baihu-panel/internal/logger"
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
"github.com/engigu/baihu-panel/internal/systime"
|
||||
"github.com/engigu/baihu-panel/internal/constant"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
)
|
||||
|
||||
|
||||
@@ -92,7 +92,6 @@ func (ts *TaskService) CreateTask(p *TaskParam) *models.Task {
|
||||
}
|
||||
database.DB.Select("*").Create(task)
|
||||
|
||||
|
||||
return task
|
||||
}
|
||||
|
||||
@@ -111,7 +110,7 @@ func (ts *TaskService) GetTasksWithPagination(page, pageSize int, name string, a
|
||||
if name != "" {
|
||||
query = query.Where("name LIKE ? OR remark LIKE ?", "%"+name+"%", "%"+name+"%")
|
||||
}
|
||||
|
||||
|
||||
// 标签筛选 (并集)
|
||||
if tags != "" {
|
||||
tagList := strings.Split(tags, ",")
|
||||
@@ -200,7 +199,7 @@ func (ts *TaskService) UpdateTask(id string, p *TaskParam) *models.Task {
|
||||
func (ts *TaskService) DeleteTask(id string) bool {
|
||||
// 同时删除关联的通知推送设置
|
||||
database.DB.Where("type = ? AND data_id = ?", constant.BindingTypeTask, id).Delete(&models.NotifyBinding{})
|
||||
|
||||
|
||||
result := database.DB.Where("id = ?", id).Delete(&models.Task{})
|
||||
return result.RowsAffected > 0
|
||||
}
|
||||
@@ -208,7 +207,7 @@ func (ts *TaskService) DeleteTask(id string) bool {
|
||||
func (ts *TaskService) BatchDeleteTasks(ids []string) int64 {
|
||||
// 同时删除关联的通知推送设置
|
||||
database.DB.Where("type = ? AND data_id IN ?", constant.BindingTypeTask, ids).Delete(&models.NotifyBinding{})
|
||||
|
||||
|
||||
result := database.DB.Where("id IN ?", ids).Delete(&models.Task{})
|
||||
return result.RowsAffected
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ type TinyLog struct {
|
||||
path string
|
||||
writer *bufio.Writer
|
||||
subscribers []chan []byte
|
||||
remainder []byte // Leftover bytes from previous write (partial lines)
|
||||
remainder []byte // Leftover bytes from previous write (partial lines)
|
||||
masks []string // Secrets to mask
|
||||
closed bool
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ func TestTinyLog_UTF8Splitting(t *testing.T) {
|
||||
}
|
||||
|
||||
_, _ = tl.Write(part2)
|
||||
// Currently it should collect both parts but still no newline,
|
||||
// Currently it should collect both parts but still no newline,
|
||||
// so remainder should be 5 bytes.
|
||||
if len(tl.remainder) != 5 {
|
||||
t.Errorf("Expected remainder len 5, got %d", len(tl.remainder))
|
||||
@@ -58,7 +58,7 @@ func TestTinyLog_CarriageReturn(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("ReadLastLines failed: %v", err)
|
||||
}
|
||||
|
||||
|
||||
// Should contain both progress lines (or at least be split correctly)
|
||||
if !bytes.Contains(data, []byte("progress: 50%")) {
|
||||
t.Errorf("Expected output to contain 'progress: 50%%', got %q", data)
|
||||
@@ -94,7 +94,7 @@ func TestTinyLog_LongLineCut(t *testing.T) {
|
||||
// Our logic finds the last safe boundary before maxLogBufferLen.
|
||||
// RuneStart(E4) at maxLogBufferLen-1 is true. FullRune(E4 at maxLogBufferLen-1 in payload[:maxLogBufferLen]) is false.
|
||||
// So lastSafe should be maxLogBufferLen-1.
|
||||
|
||||
|
||||
// The first maxLogBufferLen-1 bytes (all 'A') should be processed.
|
||||
// The "你" should be in remainder.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user