63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
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(后续可去掉该环境变量,改用库中令牌)。")
|
||
}
|