mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-08-29 12:06:49 +08:00
Remove obsolete implementations, centralize background task ownership and terminal-state recovery, consolidate frontend routing and log streaming, and enforce project-wide verification in CI.
99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"backupx/server/internal/agent"
|
|
"backupx/server/internal/config"
|
|
applogger "backupx/server/internal/logger"
|
|
)
|
|
|
|
// runAgent 是 `backupx agent` 子命令入口。
|
|
//
|
|
// 用法:
|
|
//
|
|
// backupx agent --master http://master:8340 --token <token>
|
|
// backupx agent --config /etc/backupx-agent.yaml
|
|
//
|
|
// 配置优先级:CLI 参数 > 配置文件 > 环境变量
|
|
func runAgent(args []string) {
|
|
fs := flag.NewFlagSet("agent", flag.ExitOnError)
|
|
configPath := fs.String("config", "", "path to agent config YAML (optional)")
|
|
master := fs.String("master", "", "master URL, e.g. http://master.example.com:8340")
|
|
token := fs.String("token", "", "agent authentication token")
|
|
tokenFile := fs.String("token-file", "", "read the agent authentication token from a file")
|
|
tempDir := fs.String("temp-dir", "", "local temp directory for backup artifacts")
|
|
proxyURL := fs.String("proxy-url", "", "HTTP(S) or SOCKS5 proxy used to reach the master")
|
|
caCertFile := fs.String("ca-cert", "", "PEM CA certificate used to verify the master")
|
|
insecureTLS := fs.Bool("insecure-tls", false, "skip TLS verification (testing only)")
|
|
|
|
if err := fs.Parse(args); err != nil {
|
|
os.Exit(2)
|
|
}
|
|
|
|
cfg, err := loadAgentConfig(*configPath)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: load config: %v\n", err)
|
|
os.Exit(2)
|
|
}
|
|
cfg.ApplyOverrides(agent.Overrides{
|
|
Master: *master,
|
|
Token: *token,
|
|
TokenFile: *tokenFile,
|
|
TempDir: *tempDir,
|
|
ProxyURL: *proxyURL,
|
|
CACertFile: *caCertFile,
|
|
})
|
|
if *insecureTLS {
|
|
cfg.InsecureSkipTLSVerify = true
|
|
}
|
|
if err := cfg.ResolveToken(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: %v\n", err)
|
|
os.Exit(2)
|
|
}
|
|
if err := cfg.Validate(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: %v\n", err)
|
|
os.Exit(2)
|
|
}
|
|
|
|
agentLogger, err := applogger.New(config.LogConfig{Level: "info"})
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: init logger: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
defer func() {
|
|
if syncErr := agentLogger.Sync(); syncErr != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: flush logger: %v\n", syncErr)
|
|
}
|
|
}()
|
|
|
|
a, err := agent.New(cfg, version)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "agent: init: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
a.SetLogger(agentLogger)
|
|
|
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
fmt.Fprintf(os.Stderr, "backupx agent %s starting (master=%s)\n", version, cfg.Master)
|
|
if err := a.Run(ctx); err != nil && err != context.Canceled {
|
|
fmt.Fprintf(os.Stderr, "agent: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// loadAgentConfig 按优先级加载配置:如果提供了 --config 就用文件,否则走环境变量。
|
|
func loadAgentConfig(configPath string) (*agent.Config, error) {
|
|
if configPath != "" {
|
|
return agent.LoadConfigFile(configPath)
|
|
}
|
|
return agent.LoadConfigFromEnv()
|
|
}
|