package config import ( "os" "path/filepath" "time" "gopkg.in/yaml.v3" ) // 常量 const ( // 版本号 APP_VERSION = 26 //BASE_URL = "https://ai.ronsunny.cn:8090" BASE_URL = "http://127.0.0.1:13011" LOG_FILE_DIC = "./logs" LOG_CHECK_INTERVAL_HOURS = 10 // 文件轮询检查间隔(秒) MQTT_BROKER = "tls://ai.ronsunny.cn:8093" PASSWORD = "123456" DOCKER_REGISTRY = "ai.ronsunny.cn:13011" DOCKER_USERNAME = "iot_device" DOCKER_PASSWORD = "Bbit000000" DOCKER_IMAGE = "ai.ronsunny.cn:13011/bbit_iot/ce_sentinel" DOCKER_CONTAINER_NAME = "BBIT_Project" DOCKER_TIME_OUT = 30 * time.Second DAEMON_UPDATE_CHECK_INTERVAL_SECONDS = 5 // 文件轮询检查间隔(秒) DAEMON_ALIVE_GAP_SECONDS = 30 ) var ( DOCKER_CONTAINER_BINDS = []string{ "/opt/sentinel/logs:/app/logs:rw", } ) type AppConfig struct { VersionCode int `yaml:"version_code"` PID int `yaml:"pid"` NeedUpdate bool `yaml:"need_update"` /** 状态 语义 CONNECTED MQTT 已连,设备可控 DEGRADED MQTT 短暂失联,容忍期 CONTROL_LOST MQTT 长期失联,不应继续运行 */ ControlState string `yaml:"control_state"` // CONNECTED / DEGRADED / CONTROL_LOST LastAliveAt int64 `yaml:"last_alive_at"` // Unix 秒 } func LoadConfig() *AppConfig { cfg := &AppConfig{} if err := loadLocalConfig(cfg); err != nil { print("[daemon] 加载配置失败,当作新状态处理:", err) } return cfg } func loadLocalConfig[T any](cfg *T) error { exePath, err := os.Executable() if err != nil { return err } dir := filepath.Dir(exePath) cfgPath := filepath.Join(dir, "config.yaml") // 不存在就创建一个默认的 if _, err := os.Stat(cfgPath); os.IsNotExist(err) { cfg := &AppConfig{ VersionCode: -1, PID: -1, NeedUpdate: false, } return WriteLocalConfig(cfg) } data, err := os.ReadFile(cfgPath) if err != nil { return err } if err := yaml.Unmarshal(data, cfg); err != nil { return err } return nil } func WriteLocalConfig(cfg any) error { exePath, err := os.Executable() if err != nil { return err } dir := filepath.Dir(exePath) cfgPath := filepath.Join(dir, "config.yaml") data, err := yaml.Marshal(cfg) if err != nil { return err } return os.WriteFile(cfgPath, data, 0644) }