Files
SmsReceiver-go/main.go
OpenClaw Agent d34d1119dd feat: 编译时嵌入版本信息
- 添加版本显示功能 (--version 参数)
- 编译时注入 Version、BuildTime、GitCommit、GoVersion、BuildEnv
- 更新 Makefile 支持自动获取版本信息
- 添加 release-full 命令支持完整发布流程
- 启动时显示构建信息
2026-02-08 19:20:24 +08:00

194 lines
5.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"sms-receiver-go/auth"
"sms-receiver-go/config"
"sms-receiver-go/database"
"sms-receiver-go/handlers"
"github.com/gorilla/mux"
"github.com/robfig/cron/v3"
)
// 编译时注入的版本信息
var (
Version = "dev" // 版本号
BuildTime = "unknown" // 构建时间
GitCommit = "unknown" // Git commit hash
GoVersion = "unknown" // Go 版本
BuildEnv = "dev" // 构建环境dev/prod
)
func printVersion() {
fmt.Printf("SmsReceiver-go %s\n", Version)
fmt.Printf(" Version: %s\n", Version)
fmt.Printf(" Build Env: %s\n", BuildEnv)
fmt.Printf(" Build Time: %s\n", BuildTime)
fmt.Printf(" Git Commit: %s\n", GitCommit)
fmt.Printf(" Go Version: %s\n", GoVersion)
fmt.Printf(" Repository: https://gitea.king.nyc.mn/openclaw/SmsReceiver-go\n")
}
func main() {
// 检查是否请求版本信息(需要在 flag.Parse 之前)
for _, arg := range os.Args[1:] {
if arg == "--version" || arg == "-v" {
printVersion()
os.Exit(0)
} else if arg == "--help" || arg == "-h" {
fmt.Println("SmsReceiver-go - 短信转发接收端 Go 版本")
fmt.Println()
fmt.Println("Usage:")
fmt.Println(" sms-receiver-v2 [options]")
fmt.Println()
fmt.Println("Options:")
flag.PrintDefaults()
fmt.Println()
fmt.Println("Additional Options:")
fmt.Println(" -v, --version 显示版本信息")
fmt.Println(" -h, --help 显示帮助信息")
os.Exit(0)
}
}
// 记录启动时间
startTime := time.Now()
// 打印启动信息
log.Printf("========================================")
log.Printf("SmsReceiver-go v%s (%s)", Version, BuildEnv)
log.Printf("========================================")
log.Printf("Version: %s", Version)
log.Printf("Build Env: %s", BuildEnv)
log.Printf("Build Time: %s", BuildTime)
log.Printf("Git Commit: %s", GitCommit)
log.Printf("Go Version: %s", GoVersion)
log.Printf("========================================")
// 命令行参数
configPath := flag.String("config", "config.yaml", "配置文件路径")
templatesPath := flag.String("templates", "templates", "模板目录路径")
flag.Parse()
// 加载配置
cfg, err := config.Load(*configPath)
if err != nil {
log.Fatalf("加载配置失败: %v", err)
}
log.Printf("配置加载成功: %s v%s", cfg.App.Name, cfg.App.Version)
// 初始化数据库
if err := database.Init(&cfg.Database); err != nil {
log.Fatalf("初始化数据库失败: %v", err)
}
defer database.Close()
// 初始化会话存储
if err := auth.Init(cfg.Security.SecretKey); err != nil {
log.Fatalf("初始化会话存储失败: %v", err)
}
// 初始化模板
if err := handlers.InitTemplates(*templatesPath); err != nil {
log.Fatalf("初始化模板失败: %v", err)
}
// 创建路由器
r := mux.NewRouter()
// 静态文件
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
// 页面路由
r.HandleFunc("/", handlers.Index)
r.HandleFunc("/login", handlers.Login)
r.HandleFunc("/logout", handlers.Logout)
r.HandleFunc("/message/{id}", handlers.MessageDetail)
r.HandleFunc("/logs", handlers.Logs)
r.HandleFunc("/statistics", handlers.Statistics)
// API 路由v1
apiV1 := r.PathPrefix("/api/v1").Subrouter()
apiV1.HandleFunc("/receive", handlers.ReceiveSMS)
apiV1.HandleFunc("/messages", handlers.APIGetMessages)
apiV1.HandleFunc("/statistics", handlers.APIStatistics)
// 兼容旧版 API无版本号
r.HandleFunc("/api/receive", handlers.ReceiveSMS)
r.HandleFunc("/api/messages", handlers.APIGetMessages)
r.HandleFunc("/api/statistics", handlers.APIStatistics)
// 健康检查
r.HandleFunc("/health", handlers.HealthCheck(startTime))
// 配置服务器
server := &http.Server{
Addr: cfg.GetServerAddress(),
Handler: r,
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 60 * time.Second,
}
// 启动后台清理任务
cronInstance := startCleanupTask(cfg)
defer cronInstance.Stop()
// 优雅关闭
go func() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
log.Println("正在关闭服务...")
server.Close()
}()
log.Printf("服务启动: http://%s", cfg.GetServerAddress())
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("服务器启动失败: %v", err)
}
}
// startCleanupTask 启动定期清理任务
func startCleanupTask(cfg *config.Config) *cron.Cron {
if !cfg.SMS.AutoCleanup {
log.Println("自动清理功能未启用")
return cron.New(cron.WithSeconds())
}
// 创建 cron 实例
c := cron.New(cron.WithSeconds())
// 每天凌晨 3 点执行清理任务
_, err := c.AddFunc("0 0 3 * * *", func() {
log.Println("开始执行自动清理任务...")
deleted, err := database.CleanupOldMessages(cfg.SMS.CleanupDays)
if err != nil {
log.Printf("清理旧消息失败: %v", err)
} else {
log.Printf("自动清理旧消息完成: 删除 %d 条记录", deleted)
}
})
if err != nil {
log.Printf("添加清理任务失败: %v", err)
return c
}
// 启动 cron 服务
c.Start()
log.Println("自动清理任务已启动: 每天 03:00 执行")
return c
}