mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-03-14 01:34:47 +08:00
feat: 远程数据库增加默认数据
This commit is contained in:
parent
7f79f5f031
commit
cd742b0933
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user