package storage import ( "errors" "log" "os" "strings" ) var errEmptyAdminToken = errors.New("admin_token 不能为空") // EffectiveAdminToken 管理员令牌:环境变量 ADMIN_TOKEN 优先,否则读 MySQL monitor_kv func (s *Storage) EffectiveAdminToken() string { if v := strings.TrimSpace(os.Getenv("ADMIN_TOKEN")); v != "" { return v } return strings.TrimSpace(s.adminTokenFromDB()) } func (s *Storage) adminTokenFromDB() string { var row MonitorKV if err := s.db.Where("cfg_key = ?", kvKeyAdminToken).Limit(1).Find(&row).Error; err != nil { return "" } if row.CfgKey == "" { return "" } return row.CfgValue } // SetAdminToken 更新数据库中的管理员令牌(需已能通过 AdminAuth) func (s *Storage) SetAdminToken(token string) error { token = strings.TrimSpace(token) if token == "" { return errEmptyAdminToken } var row MonitorKV s.db.Where("cfg_key = ?", kvKeyAdminToken).Limit(1).Find(&row) if row.CfgKey == "" { return s.db.Create(&MonitorKV{CfgKey: kvKeyAdminToken, CfgValue: token}).Error } row.CfgValue = token return s.db.Save(&row).Error } func (s *Storage) seedAdminTokenKV() { var n int64 s.db.Model(&MonitorKV{}).Where("cfg_key = ?", kvKeyAdminToken).Count(&n) if n > 0 { return } val := strings.TrimSpace(os.Getenv("ADMIN_TOKEN")) if val == "" { log.Println("提示: 数据库 monitor_kv 中尚无 admin_token。可设置环境变量 ADMIN_TOKEN 后重启以自动写入,或对 monitor_kv 执行 INSERT。") return } if err := s.db.Create(&MonitorKV{CfgKey: kvKeyAdminToken, CfgValue: val}).Error; err != nil { log.Printf("写入初始 admin_token 失败: %v", err) return } log.Println("已从环境变量 ADMIN_TOKEN 写入数据库 monitor_kv(后续可去掉该环境变量,改用库中令牌)。") }