-
Notifications
You must be signed in to change notification settings - Fork 5
/
config.go
119 lines (105 loc) · 3.06 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package bilicoin
import (
"bytes"
"encoding/json"
"errors"
. "github.com/r3inbowari/zlog"
"github.com/sirupsen/logrus"
"os"
"regexp"
"time"
)
// LocalConfig config
type LocalConfig struct {
Finger string `json:"finger"` // canvas指纹
APIAddr string `json:"api_addr"` // API服务ADDR
CacheTime time.Time `json:"-"` // 缓存时间
LoggerLevel *string `json:"log_level"` // 日志等级
BiU []BiliUser `json:"biu"` // 用户集合
CaKey string `json:"ca_key"` // CA 密钥
CaCert string `json:"ca_crt"` // CA 证书
}
var config = new(LocalConfig)
var configPath = "bili.json"
// GetConfig 返回配置文件
// imm 立即返回
func GetConfig(imm bool) *LocalConfig {
if config.CacheTime.Before(time.Now()) || imm {
if err := LoadConfig(configPath, config); err != nil {
Log.Fatal("loading file failed")
return nil
}
config.CacheTime = time.Now().Add(time.Second * 60)
}
return config
}
// SetConfig set
func (lc *LocalConfig) SetConfig() error {
fp, err := os.Create(configPath)
if err != nil {
Log.WithFields(logrus.Fields{"err": err}).Fatal("loading file failed")
}
defer fp.Close()
data, err := json.Marshal(lc)
if err != nil {
Log.WithFields(logrus.Fields{"err": err}).Fatal("marshal file failed")
}
n, err := fp.Write(data)
if err != nil {
Log.WithFields(logrus.Fields{"err": err}).Fatal("write file failed")
}
Log.WithFields(logrus.Fields{"size": n}).Info("[FILE] update user configuration")
return nil
}
const configFileSizeLimit = 10 << 20
/**
* Load File
* @param path 文件路径
* @param dist 存放目标
*/
func LoadConfig(path string, dist interface{}) error {
configFile, err := os.Open(path)
if err != nil {
Log.WithFields(logrus.Fields{"path": path, "err": err}).Fatal("failed to open config file.")
return err
}
fi, _ := configFile.Stat()
if size := fi.Size(); size > (configFileSizeLimit) {
Log.WithFields(logrus.Fields{"path": path, "size": size}).Fatal("Config file size exceeds reasonable limited")
return errors.New("limited")
}
if fi.Size() == 0 {
Log.WithFields(logrus.Fields{"path": path, "size": 0}).Fatal("Config file is empty, skipping")
return errors.New("empty")
}
buffer := make([]byte, fi.Size())
_, err = configFile.Read(buffer)
buffer, err = StripComments(buffer)
if err != nil {
Log.WithFields(logrus.Fields{"err": err}).Fatal("Failed to strip comments from json")
return err
}
buffer = []byte(os.ExpandEnv(string(buffer)))
err = json.Unmarshal(buffer, &dist)
if err != nil {
Log.WithFields(logrus.Fields{"err": err}).Fatal("Failed unmarshalling json")
return err
}
return nil
}
// StripComments clean comments
func StripComments(data []byte) ([]byte, error) {
data = bytes.Replace(data, []byte("\r"), []byte(""), 0)
lines := bytes.Split(data, []byte("\n"))
filtered := make([][]byte, 0)
for _, line := range lines {
match, err := regexp.Match(`^\s*#`, line)
if err != nil {
return nil, err
}
if !match {
filtered = append(filtered, line)
}
}
return bytes.Join(filtered, []byte("\n")), nil
}