Improve: safe write provider file

This commit is contained in:
Dreamacro 2020-06-07 00:35:32 +08:00
parent 98614a1f3f
commit 8f32e6a60f

View File

@ -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 {