Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/bootstrap/config.go
1560 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
// convert abs path
74
if !filepath.IsAbs(conf.Conf.TempDir) {
75
absPath, err := filepath.Abs(conf.Conf.TempDir)
76
if err != nil {
77
log.Fatalf("get abs path error: %+v", err)
78
}
79
conf.Conf.TempDir = absPath
80
}
81
err := os.MkdirAll(conf.Conf.TempDir, 0o777)
82
if err != nil {
83
log.Fatalf("create temp dir error: %+v", err)
84
}
85
log.Debugf("config: %+v", conf.Conf)
86
base.InitClient()
87
initURL()
88
}
89
90
func confFromEnv() {
91
prefix := "ALIST_"
92
if flags.NoPrefix {
93
prefix = ""
94
}
95
log.Infof("load config from env with prefix: %s", prefix)
96
if err := env.ParseWithOptions(conf.Conf, env.Options{
97
Prefix: prefix,
98
}); err != nil {
99
log.Fatalf("load config from env error: %+v", err)
100
}
101
}
102
103
func initURL() {
104
if !strings.Contains(conf.Conf.SiteURL, "://") {
105
conf.Conf.SiteURL = utils.FixAndCleanPath(conf.Conf.SiteURL)
106
}
107
u, err := url.Parse(conf.Conf.SiteURL)
108
if err != nil {
109
utils.Log.Fatalf("can't parse site_url: %+v", err)
110
}
111
conf.URL = u
112
}
113
114
func CleanTempDir() {
115
files, err := os.ReadDir(conf.Conf.TempDir)
116
if err != nil {
117
log.Errorln("failed list temp file: ", err)
118
}
119
for _, file := range files {
120
if err := os.RemoveAll(filepath.Join(conf.Conf.TempDir, file.Name())); err != nil {
121
log.Errorln("failed delete temp file: ", err)
122
}
123
}
124
}
125
126