1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-14 01:34:47 +08:00

feat: 远程数据库增加默认数据

This commit is contained in:
ssongliu 2023-07-24 11:24:38 +08:00 committed by ssongliu
parent 7f79f5f031
commit cd742b0933
4 changed files with 67 additions and 51 deletions

View File

@ -15,6 +15,7 @@ type IRemoteDBRepo interface {
Update(id uint, vars map[string]interface{}) error Update(id uint, vars map[string]interface{}) error
Delete(opts ...DBOption) error Delete(opts ...DBOption) error
Get(opts ...DBOption) (model.RemoteDB, error) Get(opts ...DBOption) (model.RemoteDB, error)
WithByFrom(from string) DBOption
WithoutByFrom(from string) DBOption WithoutByFrom(from string) DBOption
} }
@ -54,6 +55,12 @@ func (u *RemoteDBRepo) GetList(opts ...DBOption) ([]model.RemoteDB, error) {
return databases, err return databases, err
} }
func (c *RemoteDBRepo) WithByFrom(from string) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("`from` != ?", from)
}
}
func (c *RemoteDBRepo) WithoutByFrom(from string) DBOption { func (c *RemoteDBRepo) WithoutByFrom(from string) DBOption {
return func(g *gorm.DB) *gorm.DB { return func(g *gorm.DB) *gorm.DB {
return g.Where("`from` != ?", from) return g.Where("`from` != ?", from)

View File

@ -82,46 +82,31 @@ func (u *MysqlService) Create(ctx context.Context, req dto.MysqlDBCreate) (*mode
return nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) return nil, errors.WithMessage(constant.ErrStructTransform, err.Error())
} }
if req.Username == "root" { if req.From == "local" && req.Username == "root" {
return nil, errors.New("Cannot set root as user name") return nil, errors.New("Cannot set root as user name")
} }
if req.From == "127.0.0.1" {
dbInfo := client.DBInfo{ return nil, errors.New("Cannot set 127.0.0.1 as address")
From: req.From,
Timeout: 300,
} }
version := ""
cli, version, err := loadClientByFrom(req.From)
if err != nil {
return nil, err
}
if req.From == "local" { if req.From == "local" {
app, err := appInstallRepo.LoadBaseInfo("mysql", "") app, err := appInstallRepo.LoadBaseInfo("mysql", "")
if err != nil { if err != nil {
return nil, err return nil, err
} }
mysqlData, _ := mysqlRepo.Get(commonRepo.WithByName(req.Name))
if mysqlData.ID != 0 {
return nil, constant.ErrRecordExist
}
dbInfo.Address = app.ContainerName
dbInfo.Username = "root"
dbInfo.Password = app.Password
version = app.Version
createItem.MysqlName = app.Name createItem.MysqlName = app.Name
} else { } else {
mysqlData, err := remoteDBRepo.Get(commonRepo.WithByName(req.From)) mysqlData, err := remoteDBRepo.Get(remoteDBRepo.WithByFrom(req.From))
if err != nil { if err != nil {
return nil, err return nil, err
} }
dbInfo.Address = mysqlData.Address
dbInfo.Port = mysqlData.Port
dbInfo.Username = mysqlData.Username
dbInfo.Password = mysqlData.Password
version = mysqlData.Version
createItem.MysqlName = mysqlData.Name createItem.MysqlName = mysqlData.Name
} }
cli, err := mysql.NewMysqlClient(dbInfo)
if err != nil {
return nil, err
}
defer cli.Close() defer cli.Close()
if err := cli.Create(client.CreateInfo{ if err := cli.Create(client.CreateInfo{
Name: req.Name, Name: req.Name,
@ -169,15 +154,15 @@ func (u *MysqlService) DeleteCheck(id uint) ([]string, error) {
} }
func (u *MysqlService) Delete(ctx context.Context, req dto.MysqlDBDelete) error { func (u *MysqlService) Delete(ctx context.Context, req dto.MysqlDBDelete) error {
cli, version, err := loadClientByID(req.ID)
if err != nil {
return err
}
defer cli.Close()
db, err := mysqlRepo.Get(commonRepo.WithByID(req.ID)) db, err := mysqlRepo.Get(commonRepo.WithByID(req.ID))
if err != nil && !req.ForceDelete { if err != nil && !req.ForceDelete {
return err return err
} }
cli, version, err := loadClientByFrom(db.From)
if err != nil {
return err
}
defer cli.Close()
if err := cli.Delete(client.DeleteInfo{ if err := cli.Delete(client.DeleteInfo{
Name: db.Name, Name: db.Name,
Version: version, Version: version,
@ -218,7 +203,7 @@ func (u *MysqlService) ChangePassword(info dto.ChangeDBInfo) error {
if cmd.CheckIllegal(info.Value) { if cmd.CheckIllegal(info.Value) {
return buserr.New(constant.ErrCmdIllegal) return buserr.New(constant.ErrCmdIllegal)
} }
cli, version, err := loadClientByID(info.ID) cli, version, err := loadClientByFrom(info.From)
if err != nil { if err != nil {
return err return err
} }
@ -281,7 +266,7 @@ func (u *MysqlService) ChangeAccess(info dto.ChangeDBInfo) error {
if cmd.CheckIllegal(info.Value) { if cmd.CheckIllegal(info.Value) {
return buserr.New(constant.ErrCmdIllegal) return buserr.New(constant.ErrCmdIllegal)
} }
cli, version, err := loadClientByID(info.ID) cli, version, err := loadClientByFrom(info.From)
if err != nil { if err != nil {
return err return err
} }
@ -546,25 +531,15 @@ func updateMyCnf(oldFiles []string, group string, param string, value interface{
return newFiles return newFiles
} }
func loadClientByID(id uint) (mysql.MysqlClient, string, error) { func loadClientByFrom(from string) (mysql.MysqlClient, string, error) {
var ( var (
mysqlData model.DatabaseMysql dbInfo client.DBInfo
dbInfo client.DBInfo version string
version string err error
err error
) )
dbInfo.From = "local" if from != "local" {
if id != 0 { databaseItem, err := remoteDBRepo.Get(remoteDBRepo.WithByFrom(from))
mysqlData, err = mysqlRepo.Get(commonRepo.WithByID(id))
if err != nil {
return nil, "", err
}
dbInfo.From = mysqlData.From
}
if dbInfo.From != "local" {
databaseItem, err := remoteDBRepo.Get(commonRepo.WithByName(mysqlData.From))
if err != nil { if err != nil {
return nil, "", err return nil, "", err
} }

View File

@ -1,6 +1,8 @@
package migrations package migrations
import ( import (
"encoding/json"
"errors"
"fmt" "fmt"
"strings" "strings"
"time" "time"
@ -481,9 +483,41 @@ var EncryptHostPassword = &gormigrate.Migration{
} }
var AddRemoteDB = &gormigrate.Migration{ var AddRemoteDB = &gormigrate.Migration{
ID: "20230720-add-remote-db", ID: "20230724-add-remote-db",
Migrate: func(tx *gorm.DB) error { Migrate: func(tx *gorm.DB) error {
if err := tx.AutoMigrate(&model.RemoteDB{}); err != nil { if err := tx.AutoMigrate(&model.RemoteDB{}, &model.DatabaseMysql{}); err != nil {
return err
}
var (
app model.App
appInstall model.AppInstall
)
if err := global.DB.Where("key = ?", "mysql").First(&app).Error; err != nil {
return err
}
if err := global.DB.Where("app_id = ?", app.ID).First(&appInstall).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil
}
return err
}
envMap := make(map[string]interface{})
if err := json.Unmarshal([]byte(appInstall.Env), &envMap); err != nil {
return err
}
password, ok := envMap["PANEL_DB_ROOT_PASSWORD"].(string)
if !ok {
return errors.New("error password in app env")
}
if err := tx.Create(&model.RemoteDB{
Name: "local",
Type: "mysql",
Version: appInstall.Version,
From: "local",
Address: "127.0.0.1",
Username: "root",
Password: password,
}).Error; err != nil {
return err return err
} }
return nil return nil

View File

@ -109,7 +109,7 @@ const acceptParams = (params: DialogProps): void => {
? i18n.global.t('database.changePassword') ? i18n.global.t('database.changePassword')
: i18n.global.t('database.permission'); : i18n.global.t('database.permission');
changeForm.id = params.id; changeForm.id = params.id;
changeForm.from = params.from === 'local' ? 'local' : 'remote'; changeForm.from = params.from;
changeForm.mysqlName = params.mysqlName; changeForm.mysqlName = params.mysqlName;
changeForm.userName = params.username; changeForm.userName = params.username;
changeForm.password = params.password; changeForm.password = params.password;