Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/bootstrap/config.go
2321 views
1
package bootstrap
2
3
import (
4
"net/url"
5
"os"
6
"path/filepath"
7
"strings"
8
9
"github.com/alist-org/alist/v3/cmd/flags"
10
"github.com/alist-org/alist/v3/drivers/base"
11
"github.com/alist-org/alist/v3/internal/conf"
12
"github.com/alist-org/alist/v3/internal/net"
13
"github.com/alist-org/alist/v3/pkg/utils"
14
"github.com/caarlos0/env/v9"
15
log "github.com/sirupsen/logrus"
16
)
17
18
func InitConfig() {
19
if flags.ForceBinDir {
20
if !filepath.IsAbs(flags.DataDir) {
21
ex, err := os.Executable()
22
if err != nil {
23
utils.Log.Fatal(err)
24
}
25
exPath := filepath.Dir(ex)
26
flags.DataDir = filepath.Join(exPath, flags.DataDir)
27
}
28
}
29
configPath := filepath.Join(flags.DataDir, "config.json")
30
log.Infof("reading config file: %s", configPath)
31
if !utils.Exists(configPath) {
32
log.Infof("config file not exists, creating default config file")
33
_, err := utils.CreateNestedFile(configPath)
34
if err != nil {
35
log.Fatalf("failed to create config file: %+v", err)
36
}
37
conf.Conf = conf.DefaultConfig()
38
LastLaunchedVersion = conf.Version
39
conf.Conf.LastLaunchedVersion = conf.Version
40
if !utils.WriteJsonToFile(configPath, conf.Conf) {
41
log.Fatalf("failed to create default config file")
42
}
43
} else {
44
configBytes, err := os.ReadFile(configPath)
45
if err != nil {
46
log.Fatalf("reading config file error: %+v", err)
47
}
48
conf.Conf = conf.DefaultConfig()
49
err = utils.Json.Unmarshal(configBytes, conf.Conf)
50
if err != nil {
51
log.Fatalf("load config error: %+v", err)
52
}
53
LastLaunchedVersion = conf.Conf.LastLaunchedVersion
54
if strings.HasPrefix(conf.Version, "v") || LastLaunchedVersion == "" {
55
conf.Conf.LastLaunchedVersion = conf.Version
56
}
57
// update config.json struct
58
confBody, err := utils.Json.MarshalIndent(conf.Conf, "", " ")
59
if err != nil {
60
log.Fatalf("marshal config error: %+v", err)
61
}
62
err = os.WriteFile(configPath, confBody, 0o777)
63
if err != nil {
64
log.Fatalf("update config struct error: %+v", err)
65
}
66
}
67
if conf.Conf.MaxConcurrency > 0 {
68
net.DefaultConcurrencyLimit = &net.ConcurrencyLimit{Limit: conf.Conf.MaxConcurrency}
69
}
70
if !conf.Conf.Force {
71
confFromEnv()
72
}
73
if conf.Conf.TlsInsecureSkipVerify {
74
log.Warn("SECURITY WARNING / 安全警告:")
75
log.Warn("TLS certificate verification is disabled.")
76
log.Warn("TLS 证书校验已被禁用。")
77
log.Warn("This exposes all storage traffic to MitM attacks and may leak credentials or allow data tampering.")
78
log.Warn("这会使所有存储通信暴露于中间人攻击(MitM),可能导致凭据泄露和数据被篡改。")
79
log.Warn("Only use this setting if you fully understand the risks.")
80
log.Warn("仅在你完全理解风险的情况下使用该配置。")
81
}
82
// convert abs path
83
if !filepath.IsAbs(conf.Conf.TempDir) {
84
absPath, err := filepath.Abs(conf.Conf.TempDir)
85
if err != nil {
86
log.Fatalf("get abs path error: %+v", err)
87
}
88
conf.Conf.TempDir = absPath
89
}
90
err := os.MkdirAll(conf.Conf.TempDir, 0o777)
91
if err != nil {
92
log.Fatalf("create temp dir error: %+v", err)
93
}
94
log.Debugf("config: %+v", conf.Conf)
95
base.InitClient()
96
initURL()
97
}
98
99
func confFromEnv() {
100
prefix := "ALIST_"
101
if flags.NoPrefix {
102
prefix = ""
103
}
104
log.Infof("load config from env with prefix: %s", prefix)
105
if err := env.ParseWithOptions(conf.Conf, env.Options{
106
Prefix: prefix,
107
}); err != nil {
108
log.Fatalf("load config from env error: %+v", err)
109
}
110
}
111
112
func initURL() {
113
if !strings.Contains(conf.Conf.SiteURL, "://") {
114
conf.Conf.SiteURL = utils.FixAndCleanPath(conf.Conf.SiteURL)
115
}
116
u, err := url.Parse(conf.Conf.SiteURL)
117
if err != nil {
118
utils.Log.Fatalf("can't parse site_url: %+v", err)
119
}
120
conf.URL = u
121
}
122
123
func CleanTempDir() {
124
files, err := os.ReadDir(conf.Conf.TempDir)
125
if err != nil {
126
log.Errorln("failed list temp file: ", err)
127
}
128
for _, file := range files {
129
if err := os.RemoveAll(filepath.Join(conf.Conf.TempDir, file.Name())); err != nil {
130
log.Errorln("failed delete temp file: ", err)
131
}
132
}
133
}
134
135