This repository has been archived by the owner on Oct 19, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 82
/
Copy pathinit.go
217 lines (207 loc) · 7.15 KB
/
init.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package main
import (
"encoding/base64"
"lx-source/src/caches"
"lx-source/src/caches/cloudcache"
"lx-source/src/caches/localcache"
"lx-source/src/env"
// "lx-source/src/sources"
// "lx-source/src/sources/builtin"
"net/http"
stdurl "net/url"
"path/filepath"
"github.com/ZxwyWebSite/cr-go-sdk"
"github.com/ZxwyWebSite/ztool"
"github.com/ZxwyWebSite/ztool/logs"
"github.com/ZxwyWebSite/ztool/zcypt"
"github.com/gin-gonic/gin"
)
// 生成连接码
func genAuth() {
ga := env.Loger.NewGroup(`LxM-Auth`)
// 检测Key是否存在, 否则生成并保存
if env.Config.Auth.ApiKey_Value == `` {
pass := zcypt.Base64ToString(base64.StdEncoding, zcypt.RandomBytes(4*4))
env.Config.Auth.ApiKey_Value = pass // env.Config.Apis.LxM_Auth
ga.Info(`已生成默认连接码: %q`, pass)
ga.Info(`可在配置文件 [Auth].ApiKey_Value 中修改`) //可在配置文件 [Apis].LxM_Auth 中修改, 填写 "null" 关闭验证
if err := env.Cfg.Save(``); err != nil {
ga.Error(`写入配置文件失败: %s, 将导致下次启动时连接码发生变化`, err)
}
}
if !env.Config.Auth.ApiKey_Enable {
ga.Warn(`已关闭Key验证, 公开部署可能导致安全隐患`)
} else {
ga.Warn(`已开启Key验证, 记得在脚本中填写 apipass=%q`, env.Config.Auth.ApiKey_Value)
}
ga.Free()
}
// 加载文件日志 (请在初始化配置文件后调用)
func loadFileLoger() {
// 最后加载FileLoger保证必要日志已输出 (Debug模式强制在控制台输出日志)
if env.Config.Main.LogPath != `` {
lg := env.Loger.NewGroup(`FileLoger`)
printout := env.Config.Main.Print // || env.Config.Main.Debug
f, do, err := env.Loger.SetOutFile(ztool.Str_FastConcat(env.RunPath, env.Config.Main.LogPath), printout)
if err == nil {
// env.Defer.Add(do)
env.Defer.Add(func() { do(); f.Close() })
env.Tasker.Add(`flog_flush`, func(loger *logs.Logger, now int64) error {
loger.Debug(`已写入文件并清理日志缓存`)
return do()
}, 3600, false)
gin.DefaultWriter = env.Loger.GetOutput()
gin.ForceConsoleColor()
// lg.Info(`文件日志初始化成功`)
} else {
lg.Error(`文件日志初始化失败:%v`, err)
}
lg.Free()
}
}
// 初始化基础功能
func initMain() {
// 载入内存缓存
storepath := env.RunPath + env.Config.Main.Store
env.Cache.MustRestore(storepath)
env.Defer.Add(func() { env.Cache.MustPersist(storepath) })
env.Tasker.Add(`memo_flush`, func(*logs.Logger, int64) error {
return env.Cache.Persist(storepath)
}, 3600, false)
// 初始化数据库
// idb := env.Loger.NewGroup(`InitDB`)
// switch `sqlite` {
// case `memo`:
// break
// case `sqlite`:
// err := database.InitDB(`data/data.db`)
// if err != nil {
// idb.Error(`数据库载入失败: %s`, err)
// }
// default:
// idb.Error(`未定义的数据库模式,请检查配置 [DataBase].Mode`)
// }
// idb.Free()
// 初始化代理
ipr := env.Loger.NewGroup(`InitProxy`)
switch env.Config.Source.FakeIP_Mode {
case `0`, `off`:
break
case `1`, `req`:
ipr.Fatal(`暂未实现此功能`)
case `2`, `val`:
if env.Config.Source.FakeIP_Value != `` {
ipr.Info(`已开启伪装IP,当前值: %v`, env.Config.Source.FakeIP_Value)
ztool.Net_header[`X-Real-IP`] = env.Config.Source.FakeIP_Value
ztool.Net_header[`X-Forwarded-For`] = env.Config.Source.FakeIP_Value
} else {
ipr.Error(`伪装IP为空,请检查配置 [Source].FakeIP_Value`)
}
default:
ipr.Error(`未定义的代理模式,请检查配置 [Source].FakeIP_Mode,本次启动禁用IP伪装`)
}
if env.Config.Source.Proxy_Enable {
ipr.Debug(`ProxyAddr: %v`, env.Config.Source.Proxy_Address)
addr, err := stdurl.Parse(env.Config.Source.Proxy_Address)
if err != nil {
ipr.Error(`代理Url解析失败: %s, 将禁用代理功能`, err)
} else {
type chkRegion struct {
AmapFlag int `json:"amap_flag"`
IPFlag int `json:"ip_flag"`
AmapAddress string `json:"amap_address"`
Country string `json:"country"`
Flag int `json:"flag"`
Errcode int `json:"errcode"`
Status int `json:"status"`
Error string `json:"error"`
}
var out chkRegion
oldval := ztool.Net_client.Transport
ztool.Net_client.Transport = &http.Transport{Proxy: http.ProxyURL(addr)}
err := ztool.Net_Request(http.MethodGet,
`https://mips.kugou.com/check/iscn?&format=json`, nil,
[]ztool.Net_ReqHandlerFunc{ztool.Net_ReqAddHeader(ztool.Net_header)},
[]ztool.Net_ResHandlerFunc{ztool.Net_ResToStruct(&out)},
)
if err != nil {
ztool.Net_client.Transport = oldval
ipr.Error(`地区验证失败: %s, 已恢复默认配置`, err)
} else {
ipr.Debug(`Resp: %+v`, out)
if out.Flag != 1 {
ipr.Warn(`您正在使用非中国大陆(%v)代理,可能导致部分音乐不可用`, out.Country)
} else {
ipr.Warn(`代理开启成功,请注意潜在的Cookie泄露问题`)
}
}
}
}
ipr.Free()
// 初始化缓存
icl := env.Loger.NewGroup(`InitCache`)
switch env.Config.Cache.Mode {
case `0`, `off`:
// NothingToDo... (已默认禁用缓存)
break
case `1`, `local`:
// 注:由于需要修改LocalCachePath参数,必须在InitRouter之前执行
cache, err := caches.New(&localcache.Cache{
Path: filepath.Join(env.RunPath, env.Config.Cache.Local_Path),
Bind: env.Config.Cache.Local_Bind,
})
if err != nil {
icl.Error(`驱动["local"]初始化失败: %v, 将禁用缓存功能`, err)
}
caches.UseCache = cache
icl.Warn(`本地缓存绑定地址:%q,请确认其与实际访问地址相符`, env.Config.Cache.Local_Bind)
// LocalCachePath = filepath.Join(runPath, env.Config.Cache.Local_Path)
// UseCache = &localcache.Cache{
// Path: LocalCachePath,
// Addr: env.Config.Apis.BindAddr,
// }
// icl.Info(`使用本地缓存,文件路径 %q,绑定地址 %v`, LocalCachePath, env.Config.Apis.BindAddr)
case `2`, `cloudreve`:
icl.Warn(`欢迎使用新版 Cloudreve 驱动, 由 cr-go-sdk 提供强力支持`)
site := &cr.SiteObj{
Addr: env.Config.Cache.Cloud_Site,
ApiVer: cr.ApiV383,
Users: &cr.UserObj{
Mail: env.Config.Cache.Cloud_User,
Pass: env.Config.Cache.Cloud_Pass,
Cookie: cr.ParseCookie(env.Config.Cache.Cloud_Sess),
},
}
cache, err := caches.New(&cloudcache.Cache{
Site: site,
Path: env.Config.Cache.Cloud_Path,
})
if err != nil {
icl.Error(`驱动["cloudreve"]初始化失败: %v, 将禁用缓存功能`, err)
} else {
env.Tasker.Add(`cloud_sess`, func(l *logs.Logger, i int64) error {
if sess := site.Users.Cookie.String(); sess != env.Config.Cache.Cloud_Sess {
env.Config.Cache.Cloud_Sess = sess
}
return env.Cfg.Save(``)
}, 3600, true)
}
caches.UseCache = cache
default:
icl.Error(`未定义的缓存模式,请检查配置 [Cache].Mode,本次启动禁用缓存`)
}
icl.Free()
// 初始化音乐源
// ise := env.Loger.NewGroup(`InitSource`)
// switch env.Config.Source.Mode {
// case `0`, `off`:
// break
// case `1`, `builtin`:
// sources.UseSource = &builtin.Source{}
// case `2`, `custom`:
// ise.Fatal(`暂未实现账号解析源`)
// default:
// ise.Error(`未定义的音乐源,请检查配置 [Source].Mode,本次启动禁用内置源`)
// }
// ise.Free()
}