From 6f42aedd61ee6c4fcecc31a298534eccf9c2b236 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sat, 16 Sep 2023 14:13:40 +0800 Subject: [PATCH] update: enhance assets module --- next/assets/assets.go | 124 ++++++++++++++++++++++++++---------------- next/main.go | 39 ++++++------- 2 files changed, 97 insertions(+), 66 deletions(-) diff --git a/next/assets/assets.go b/next/assets/assets.go index 0b5eee2..1b71b3d 100644 --- a/next/assets/assets.go +++ b/next/assets/assets.go @@ -4,8 +4,11 @@ import ( "XProxy/next/logger" "github.com/robfig/cron" urlpkg "net/url" + "os" + "os/signal" "strings" "sync" + "syscall" ) var buildinAssets = map[string]string{ @@ -13,6 +16,10 @@ var buildinAssets = map[string]string{ "geosite.dat": "/geosite.dat.xz", } +func LoadBuildin() { + updateLocalAssets(buildinAssets, true) +} + type updateConfig struct { spec string cron *cron.Cron @@ -24,13 +31,76 @@ type updateConfig struct { 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 -//} +func init() { + updateChan := make(chan os.Signal, 1) + go func() { + for { + <-updateChan + logger.Debugf("Trigger assets update due to receiving SIGALRM") + Update() + } + }() + signal.Notify(updateChan, syscall.SIGALRM) +} + +func mapClone(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 +} + +func Update() { + update.renew.Lock() + proxy := update.proxy + assets := mapClone(update.assets) + update.renew.Unlock() + + if !update.running.TryLock() { + logger.Infof("Another assets update is in progress, skip it") + return + } + logger.Infof("Start remote assets update process") + updateRemoteAssets(assets, proxy, false) + update.running.Unlock() +} + +func GetAssets() map[string]string { + update.renew.Lock() + assets := mapClone(update.assets) + update.renew.Unlock() + return assets +} + +func SetAssets(assets map[string]string) { + update.renew.Lock() + update.assets = mapClone(assets) + update.renew.Unlock() +} + +func GetProxy() string { + update.renew.Lock() + proxy := update.proxy.String() + update.renew.Unlock() + return proxy +} + +func SetProxy(proxy string) error { + var proxyUrl *urlpkg.URL + if proxy != "" { + url, err := urlpkg.Parse(proxy) + if err != nil { + logger.Errorf("Invalid proxy url `%s` -> %v", proxy, err) + return err + } + proxyUrl = url + } + update.renew.Lock() + update.proxy = proxyUrl + update.renew.Unlock() + return nil +} // GetCron is used to obtain cron service specification. func GetCron() string { @@ -80,43 +150,3 @@ func SetCron(spec string) error { 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) -} diff --git a/next/main.go b/next/main.go index 2d53645..c320568 100644 --- a/next/main.go +++ b/next/main.go @@ -1,32 +1,33 @@ package main -import ( - "XProxy/next/assets" - "XProxy/next/logger" - "time" -) +import "XProxy/next/assets" func main() { + remoteAssets := map[string]string{ + "geoip.dat": "https://cdn.dnomd343.top/v2ray-rules-dat/geoip.dat.xz", + "geosite.dat": "https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat.xz", + } + assets.SetAssets(remoteAssets) - logger.Warnf("cron -> `%s`", assets.GetCron()) - assets.SetCron("@every 1s") - logger.Warnf("cron -> `%s`", assets.GetCron()) + //assets.Update() - time.Sleep(5 * time.Second) - assets.SetCron("@every 2s") - logger.Warnf("cron -> `%s`", assets.GetCron()) - - time.Sleep(8 * time.Second) - assets.SetCron("") - logger.Warnf("cron -> `%s`", assets.GetCron()) select {} + //logger.Warnf("cron -> `%s`", assets.GetCron()) + //assets.SetCron("@every 1s") + //logger.Warnf("cron -> `%s`", assets.GetCron()) + // + //time.Sleep(5 * time.Second) + //assets.SetCron("@every 2s") + //logger.Warnf("cron -> `%s`", assets.GetCron()) + // + //time.Sleep(8 * time.Second) + //assets.SetCron("") + //logger.Warnf("cron -> `%s`", assets.GetCron()) + //select {} + //assets.LoadBuildin() - //remoteAssets := map[string]string{ - // "geoip.dat": "https://cdn.dnomd343.top/v2ray-rules-dat/geoip.dat.xz", - // "geosite.dat": "https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat.xz", - //} //assets.Update(false) //assets.SetUpdateConfig(assets.UpdateSettings{ // cron: "",