mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-09-08 15:44:55 +08:00
149 lines
3.8 KiB
Go
149 lines
3.8 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
|
"github.com/1Panel-dev/1Panel/agent/buserr"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/encrypt"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/ssh"
|
|
"github.com/jinzhu/copier"
|
|
)
|
|
|
|
type SettingService struct{}
|
|
|
|
type ISettingService interface {
|
|
GetSettingInfo() (*dto.SettingInfo, error)
|
|
Update(key, value string) error
|
|
|
|
GetSSHInfo() (string, error)
|
|
TestConnByInfo(req dto.SSHConnData) bool
|
|
SaveConnInfo(req dto.SSHConnData) error
|
|
GetSystemProxy() (*dto.SystemProxy, error)
|
|
GetSettingByKey(key string) string
|
|
}
|
|
|
|
func NewISettingService() ISettingService {
|
|
return &SettingService{}
|
|
}
|
|
|
|
func (u *SettingService) GetSettingInfo() (*dto.SettingInfo, error) {
|
|
setting, err := settingRepo.GetList()
|
|
if err != nil {
|
|
return nil, buserr.New("ErrRecordNotFound")
|
|
}
|
|
settingMap := make(map[string]string)
|
|
for _, set := range setting {
|
|
settingMap[set.Key] = set.Value
|
|
}
|
|
var info dto.SettingInfo
|
|
arr, err := json.Marshal(settingMap)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := json.Unmarshal(arr, &info); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
info.LocalTime = time.Now().Format("2006-01-02 15:04:05 MST -0700")
|
|
return &info, err
|
|
}
|
|
|
|
func (u *SettingService) Update(key, value string) error {
|
|
return settingRepo.UpdateOrCreate(key, value)
|
|
}
|
|
|
|
func (u *SettingService) GetSSHInfo() (string, error) {
|
|
conn, err := settingRepo.GetValueByKey("LocalSSHConn")
|
|
if err != nil || len(conn) == 0 {
|
|
return "", err
|
|
}
|
|
return encrypt.StringDecrypt(conn)
|
|
}
|
|
|
|
func (u *SettingService) TestConnByInfo(req dto.SSHConnData) bool {
|
|
if req.AuthMode == "password" && len(req.Password) != 0 {
|
|
password, err := base64.StdEncoding.DecodeString(req.Password)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
req.Password = string(password)
|
|
}
|
|
if req.AuthMode == "key" && len(req.PrivateKey) != 0 {
|
|
privateKey, err := base64.StdEncoding.DecodeString(req.PrivateKey)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
req.PrivateKey = string(privateKey)
|
|
}
|
|
|
|
var connInfo ssh.ConnInfo
|
|
_ = copier.Copy(&connInfo, &req)
|
|
connInfo.PrivateKey = []byte(req.PrivateKey)
|
|
if len(req.PassPhrase) != 0 {
|
|
connInfo.PassPhrase = []byte(req.PassPhrase)
|
|
}
|
|
client, err := ssh.NewClient(connInfo)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
defer client.Close()
|
|
return true
|
|
}
|
|
|
|
func (u *SettingService) SaveConnInfo(req dto.SSHConnData) error {
|
|
if req.AuthMode == "password" && len(req.Password) != 0 {
|
|
password, err := base64.StdEncoding.DecodeString(req.Password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.Password = string(password)
|
|
}
|
|
if req.AuthMode == "key" && len(req.PrivateKey) != 0 {
|
|
privateKey, err := base64.StdEncoding.DecodeString(req.PrivateKey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.PrivateKey = string(privateKey)
|
|
}
|
|
|
|
var connInfo ssh.ConnInfo
|
|
_ = copier.Copy(&connInfo, &req)
|
|
connInfo.PrivateKey = []byte(req.PrivateKey)
|
|
if len(req.PassPhrase) != 0 {
|
|
connInfo.PassPhrase = []byte(req.PassPhrase)
|
|
}
|
|
client, err := ssh.NewClient(connInfo)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer client.Close()
|
|
|
|
localConn, _ := json.Marshal(&connInfo)
|
|
connAfterEncrypt, _ := encrypt.StringEncrypt(string(localConn))
|
|
_ = settingRepo.Update("LocalSSHConn", connAfterEncrypt)
|
|
return nil
|
|
}
|
|
|
|
func (u *SettingService) GetSystemProxy() (*dto.SystemProxy, error) {
|
|
systemProxy := dto.SystemProxy{}
|
|
systemProxy.Type, _ = settingRepo.GetValueByKey("ProxyType")
|
|
systemProxy.URL, _ = settingRepo.GetValueByKey("ProxyUrl")
|
|
systemProxy.Port, _ = settingRepo.GetValueByKey("ProxyPort")
|
|
systemProxy.User, _ = settingRepo.GetValueByKey("ProxyUser")
|
|
passwd, _ := settingRepo.GetValueByKey("ProxyPasswd")
|
|
systemProxy.Password, _ = encrypt.StringDecrypt(passwd)
|
|
return &systemProxy, nil
|
|
}
|
|
|
|
func (u *SettingService) GetSettingByKey(key string) string {
|
|
switch key {
|
|
case "SystemIP":
|
|
value, _ := settingRepo.GetValueByKey(key)
|
|
return value
|
|
default:
|
|
return ""
|
|
}
|
|
}
|