package assets import ( "XProxy/next/logger" "github.com/robfig/cron" urlpkg "net/url" "strings" "sync" ) var buildinAssets = map[string]string{ "geoip.dat": "/geoip.dat.xz", "geosite.dat": "/geosite.dat.xz", } type updateConfig struct { spec string cron *cron.Cron renew sync.Mutex running sync.Mutex proxy *urlpkg.URL assets map[string]string } var update updateConfig //func assetsClone(raw map[string]string) map[string]string { // assets := make(map[string]string, len(raw)) // for file, url := range raw { // assets[file] = strings.Clone(url) // } // return assets //} // GetCron is used to obtain cron service specification. func GetCron() string { update.renew.Lock() spec := strings.Clone(update.spec) update.renew.Unlock() return spec } // SetCron is used to update cron service specification. func SetCron(spec string) error { if spec == update.spec { return nil // cron spec without renew } var cs *cron.Cron if spec != "" { // update cron service cs = cron.New() err := cs.AddFunc(spec, func() { var entry *cron.Entry if entries := update.cron.Entries(); len(entries) != 0 && entries[0] != nil { entry = entries[0] } logger.Debugf("hello from cron") if entry != nil { logger.Debugf("Assets cron service next trigger -> `%s`", entry.Next) } }) if err != nil { logger.Errorf("Invalid cron spec `%s` -> %v", spec, err) return err } cs.Start() } update.renew.Lock() if update.cron != nil { update.cron.Stop() // stop old cron service } update.cron = cs update.spec = spec if cs == nil { logger.Infof("Assets cron service has been terminated") } else { logger.Infof("Assets cron service has been updated -> `%s`", spec) } update.renew.Unlock() return nil } //func GetProxy() string { // update.mutex.Lock() // proxy := update.proxy.String() // update.mutex.Unlock() // return proxy //} // //func SetProxy(proxy string) error { // var proxyUrl *urlpkg.URL // clear proxy by empty string // if proxy != "" { // url, err := urlpkg.Parse(proxy) // if err != nil { // logger.Errorf("Invalid proxy url `%s` -> %v", proxy, err) // return err // } // proxyUrl = url // } // update.mutex.Lock() // update.proxy = proxyUrl // update.mutex.Unlock() // return nil //} // //func SetAssets(assets map[string]string) { // update.mutex.Lock() // update.assets = assetsClone(assets) // update.mutex.Unlock() //} // //func GetAssets() map[string]string { // update.mutex.Lock() // assets := assetsClone(update.assets) // update.mutex.Unlock() // return assets //} func LoadBuildin() { updateLocalAssets(buildinAssets, true) }