Files
EdgeAdmin/internal/web/actions/default/setup/validateDb.go

130 lines
3.9 KiB
Go
Raw Normal View History

2020-10-13 20:05:29 +08:00
package setup
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
2021-07-20 17:15:17 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
2020-10-13 20:05:29 +08:00
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/maps"
2020-11-24 08:38:19 +08:00
stringutil "github.com/iwind/TeaGo/utils/string"
2021-07-20 17:15:17 +08:00
"net"
"regexp"
2020-10-13 20:05:29 +08:00
"strings"
)
type ValidateDbAction struct {
actionutils.ParentAction
}
func (this *ValidateDbAction) RunPost(params struct {
Host string
Port string
Database string
Username string
Password string
AccessLogKeepDays int
2020-10-13 20:05:29 +08:00
Must *actions.Must
}) {
params.Must.
Field("host", params.Host).
Require("请输入主机地址").
2021-07-20 17:15:17 +08:00
Expect(func() (message string, success bool) {
// 是否为IP
if net.ParseIP(params.Host) != nil {
success = true
return
}
if !regexp.MustCompile(`^[\w.-]+$`).MatchString(params.Host) {
message = "主机地址中不能包含特殊字符"
success = false
return
}
success = true
return
}).
2020-10-13 20:05:29 +08:00
Field("port", params.Port).
Require("请输入端口").
Match(`^\d+$`, "端口中只能包含数字").
Field("database", params.Database).
Require("请输入数据库名称").
Match(`^[\w\.-]+$`, "数据库名称中不能包含特殊字符").
Field("username", params.Username).
Require("请输入连接数据库的用户名").
Match(`^[\w\.-]+$`, "用户名中不能包含特殊字符")
// 测试连接
db, err := dbs.NewInstanceFromConfig(&dbs.DBConfig{
Driver: "mysql",
2021-07-20 17:15:17 +08:00
Dsn: params.Username + ":" + params.Password + "@tcp(" + configutils.QuoteIP(params.Host) + ":" + params.Port + ")/" + params.Database,
2020-10-13 20:05:29 +08:00
Prefix: "",
})
if err != nil {
this.Fail("数据库信息错误:" + err.Error())
}
2021-06-11 12:00:11 +08:00
defer func() {
_ = db.Close()
}()
2020-10-13 20:05:29 +08:00
err = db.Raw().Ping()
if err != nil {
// 是否是数据库不存在
if strings.Contains(err.Error(), "Error 1049") {
db, err := dbs.NewInstanceFromConfig(&dbs.DBConfig{
Driver: "mysql",
2021-07-20 17:15:17 +08:00
Dsn: params.Username + ":" + params.Password + "@tcp(" + configutils.QuoteIP(params.Host) + ":" + params.Port + ")/",
2020-10-13 20:05:29 +08:00
Prefix: "",
})
_, err = db.Exec("CREATE DATABASE `" + params.Database + "`")
if err != nil {
this.Fail("尝试创建数据库失败:" + err.Error())
}
} else {
2021-06-11 12:00:11 +08:00
if strings.Contains(err.Error(), "Error 1044:") {
this.Fail("无法连接到数据库,权限检查失败:" + err.Error())
}
2020-10-13 20:05:29 +08:00
this.Fail("无法连接到数据库,请检查配置:" + err.Error())
}
}
2021-06-11 12:00:11 +08:00
// 检查权限
// edgeTest表名需要根据表结构的变更而变更防止升级时冲突
_, err = db.Exec("CREATE TABLE IF NOT EXISTS `edgeTest1` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;")
2021-06-11 12:00:11 +08:00
if err != nil {
this.Fail("当前连接的用户无法创建新表请检查CREATE权限设置" + err.Error())
}
_, err = db.Exec("ALTER TABLE `edgeTest1` CHANGE `id` `id` int(11) NOT NULL AUTO_INCREMENT")
2021-06-11 12:00:11 +08:00
if err != nil {
this.Fail("当前连接的用户无法修改表结构请检查ALTER权限设置" + err.Error())
}
2020-11-24 08:38:19 +08:00
// 检查数据库版本
one, err := db.FindOne("SELECT VERSION() AS v")
if err != nil {
this.Fail("检查数据库版本时出错:" + err.Error())
}
if one == nil {
this.Fail("检查数据库版本时出错:无法获取数据库版本")
}
version := one.GetString("v")
if stringutil.VersionCompare(version, "5.7.8") < 0 {
this.Fail("数据库版本至少在v5.7.8以上你现在使用的是v" + version)
}
2020-10-13 20:05:29 +08:00
this.Data["db"] = maps.Map{
"host": params.Host,
"port": params.Port,
"database": params.Database,
"username": params.Username,
"password": params.Password,
"passwordMask": strings.Repeat("*", len(params.Password)),
"accessLogKeepDays": params.AccessLogKeepDays,
2020-10-13 20:05:29 +08:00
}
this.Success()
}