From 8f32e6a60fff79b9a5ecdda00c891ce7f4260a21 Mon Sep 17 00:00:00 2001 From: Dreamacro <305009791@qq.com> Date: Sun, 7 Jun 2020 00:35:32 +0800 Subject: [PATCH] Improve: safe write provider file --- adapters/provider/fetcher.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/adapters/provider/fetcher.go b/adapters/provider/fetcher.go index 1ee170f5..2256ff2a 100644 --- a/adapters/provider/fetcher.go +++ b/adapters/provider/fetcher.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "io/ioutil" "os" + "path/filepath" "time" "github.com/Dreamacro/clash/log" @@ -12,6 +13,7 @@ import ( var ( fileMode os.FileMode = 0666 + dirMode os.FileMode = 0755 ) type parser = func([]byte) (interface{}, error) @@ -71,7 +73,7 @@ func (f *fetcher) Initial() (interface{}, error) { } } - if err := ioutil.WriteFile(f.vehicle.Path(), buf, fileMode); err != nil { + if err := safeWrite(f.vehicle.Path(), buf); err != nil { return nil, err } @@ -103,7 +105,7 @@ func (f *fetcher) Update() (interface{}, bool, error) { return nil, false, err } - if err := ioutil.WriteFile(f.vehicle.Path(), buf, fileMode); err != nil { + if err := safeWrite(f.vehicle.Path(), buf); err != nil { return nil, false, err } @@ -140,6 +142,18 @@ func (f *fetcher) pullLoop() { } } +func safeWrite(path string, buf []byte) error { + dir := filepath.Dir(path) + + if _, err := os.Stat(dir); os.IsNotExist(err) { + if err := os.MkdirAll(dir, dirMode); err != nil { + return err + } + } + + return ioutil.WriteFile(path, buf, fileMode) +} + func newFetcher(name string, interval time.Duration, vehicle Vehicle, parser parser, onUpdate func(interface{})) *fetcher { var ticker *time.Ticker if interval != 0 {