You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

122 lines
2.6 KiB

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)
}