2020-07-22 22:19:39 +08:00
|
|
|
package configs
|
|
|
|
|
|
|
|
|
|
import (
|
2021-01-17 20:12:21 +08:00
|
|
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
2020-07-22 22:19:39 +08:00
|
|
|
"github.com/iwind/TeaGo/Tea"
|
2022-03-04 12:35:28 +08:00
|
|
|
"gopkg.in/yaml.v3"
|
2021-01-17 20:12:21 +08:00
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
2020-07-22 22:19:39 +08:00
|
|
|
)
|
|
|
|
|
|
2021-04-18 15:41:47 +08:00
|
|
|
// APIConfig API配置
|
2020-07-22 22:19:39 +08:00
|
|
|
type APIConfig struct {
|
|
|
|
|
RPC struct {
|
2022-07-21 14:13:23 +08:00
|
|
|
Endpoints []string `yaml:"endpoints"`
|
|
|
|
|
DisableUpdate bool `yaml:"disableUpdate"`
|
2020-07-22 22:19:39 +08:00
|
|
|
} `yaml:"rpc"`
|
|
|
|
|
NodeId string `yaml:"nodeId"`
|
|
|
|
|
Secret string `yaml:"secret"`
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 15:41:47 +08:00
|
|
|
// LoadAPIConfig 加载API配置
|
2020-07-22 22:19:39 +08:00
|
|
|
func LoadAPIConfig() (*APIConfig, error) {
|
2021-01-17 20:12:21 +08:00
|
|
|
// 候选文件
|
|
|
|
|
localFile := Tea.ConfigFile("api.yaml")
|
|
|
|
|
isFromLocal := false
|
|
|
|
|
paths := []string{localFile}
|
2021-02-01 09:25:57 +08:00
|
|
|
homeDir, homeErr := os.UserHomeDir()
|
|
|
|
|
if homeErr == nil {
|
2021-01-17 20:12:21 +08:00
|
|
|
paths = append(paths, homeDir+"/."+teaconst.ProcessName+"/api.yaml")
|
|
|
|
|
}
|
|
|
|
|
paths = append(paths, "/etc/"+teaconst.ProcessName+"/api.yaml")
|
|
|
|
|
|
|
|
|
|
var data []byte
|
2021-02-01 09:25:57 +08:00
|
|
|
var err error
|
2021-01-17 20:12:21 +08:00
|
|
|
for _, path := range paths {
|
2022-08-04 11:51:34 +08:00
|
|
|
data, err = os.ReadFile(path)
|
2021-01-17 20:12:21 +08:00
|
|
|
if err == nil {
|
|
|
|
|
if path == localFile {
|
|
|
|
|
isFromLocal = true
|
|
|
|
|
}
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-07-22 22:19:39 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config := &APIConfig{}
|
|
|
|
|
err = yaml.Unmarshal(data, config)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-17 20:12:21 +08:00
|
|
|
if !isFromLocal {
|
|
|
|
|
// 恢复文件
|
2022-08-04 11:51:34 +08:00
|
|
|
_ = os.WriteFile(localFile, data, 0666)
|
2021-01-17 20:12:21 +08:00
|
|
|
}
|
|
|
|
|
|
2020-07-22 22:19:39 +08:00
|
|
|
return config, nil
|
|
|
|
|
}
|
2020-10-13 20:05:29 +08:00
|
|
|
|
2021-05-13 14:27:17 +08:00
|
|
|
// ResetAPIConfig 重置配置
|
|
|
|
|
func ResetAPIConfig() error {
|
2022-10-30 20:06:59 +08:00
|
|
|
var filename = "api.yaml"
|
2021-05-13 14:27:17 +08:00
|
|
|
|
2022-10-30 20:06:59 +08:00
|
|
|
// 重置 configs/api.yaml
|
2021-05-13 14:27:17 +08:00
|
|
|
{
|
2022-10-30 20:06:59 +08:00
|
|
|
var configFile = Tea.ConfigFile(filename)
|
2021-05-13 14:27:17 +08:00
|
|
|
stat, err := os.Stat(configFile)
|
|
|
|
|
if err == nil && !stat.IsDir() {
|
|
|
|
|
err = os.Remove(configFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重置 ~/.edge-admin/api.yaml
|
|
|
|
|
homeDir, homeErr := os.UserHomeDir()
|
|
|
|
|
if homeErr == nil {
|
2022-10-30 20:06:59 +08:00
|
|
|
var configFile = homeDir + "/." + teaconst.ProcessName + "/" + filename
|
2021-05-13 14:27:17 +08:00
|
|
|
stat, err := os.Stat(configFile)
|
|
|
|
|
if err == nil && !stat.IsDir() {
|
|
|
|
|
err = os.Remove(configFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重置 /etc/edge-admin/api.yaml
|
|
|
|
|
{
|
2022-10-30 20:06:59 +08:00
|
|
|
var configFile = "/etc/" + teaconst.ProcessName + "/" + filename
|
2021-05-13 14:27:17 +08:00
|
|
|
stat, err := os.Stat(configFile)
|
|
|
|
|
if err == nil && !stat.IsDir() {
|
|
|
|
|
err = os.Remove(configFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-18 15:41:47 +08:00
|
|
|
// WriteFile 写入API配置
|
2020-10-13 20:05:29 +08:00
|
|
|
func (this *APIConfig) WriteFile(path string) error {
|
|
|
|
|
data, err := yaml.Marshal(this)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2021-01-17 20:12:21 +08:00
|
|
|
|
2022-08-11 15:54:09 +08:00
|
|
|
err = os.WriteFile(path, data, 0666)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-17 20:12:21 +08:00
|
|
|
// 写入 ~/ 和 /etc/ 目录,因为是备份需要,所以不需要提示错误信息
|
|
|
|
|
// 写入 ~/.edge-admin/
|
2022-08-11 15:54:09 +08:00
|
|
|
// 这个用来判断用户是否为重装,所以比较重要
|
|
|
|
|
var filename = filepath.Base(path)
|
2021-02-01 09:25:57 +08:00
|
|
|
homeDir, homeErr := os.UserHomeDir()
|
|
|
|
|
if homeErr == nil {
|
2021-01-17 20:12:21 +08:00
|
|
|
dir := homeDir + "/." + teaconst.ProcessName
|
|
|
|
|
stat, err := os.Stat(dir)
|
|
|
|
|
if err == nil && stat.IsDir() {
|
2022-08-11 15:54:09 +08:00
|
|
|
err = os.WriteFile(dir+"/"+filename, data, 0666)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2021-01-17 20:12:21 +08:00
|
|
|
} else if err != nil && os.IsNotExist(err) {
|
|
|
|
|
err = os.Mkdir(dir, 0777)
|
|
|
|
|
if err == nil {
|
2022-08-11 15:54:09 +08:00
|
|
|
err = os.WriteFile(dir+"/"+filename, data, 0666)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2021-01-17 20:12:21 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-13 14:27:17 +08:00
|
|
|
// 写入 /etc/edge-admin
|
2021-01-17 20:12:21 +08:00
|
|
|
{
|
2022-08-11 15:54:09 +08:00
|
|
|
var dir = "/etc/" + teaconst.ProcessName
|
2021-01-17 20:12:21 +08:00
|
|
|
stat, err := os.Stat(dir)
|
|
|
|
|
if err == nil && stat.IsDir() {
|
2022-08-04 11:51:34 +08:00
|
|
|
_ = os.WriteFile(dir+"/"+filename, data, 0666)
|
2021-01-17 20:12:21 +08:00
|
|
|
} else if err != nil && os.IsNotExist(err) {
|
|
|
|
|
err = os.Mkdir(dir, 0777)
|
|
|
|
|
if err == nil {
|
2022-08-04 11:51:34 +08:00
|
|
|
_ = os.WriteFile(dir+"/"+filename, data, 0666)
|
2021-01-17 20:12:21 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-20 17:15:17 +08:00
|
|
|
return nil
|
2020-10-13 20:05:29 +08:00
|
|
|
}
|
2023-03-04 21:04:30 +08:00
|
|
|
|
|
|
|
|
// Clone 克隆当前配置
|
|
|
|
|
func (this *APIConfig) Clone() *APIConfig {
|
|
|
|
|
return &APIConfig{
|
|
|
|
|
RPC: struct {
|
|
|
|
|
Endpoints []string `yaml:"endpoints"`
|
|
|
|
|
DisableUpdate bool `yaml:"disableUpdate"`
|
|
|
|
|
}{},
|
|
|
|
|
NodeId: this.NodeId,
|
|
|
|
|
Secret: this.Secret,
|
|
|
|
|
}
|
|
|
|
|
}
|