diff --git a/agent-go/executor/AppFunction.go b/agent-go/executor/AppFunction.go index 8f710a1..2f1f5ce 100644 --- a/agent-go/executor/AppFunction.go +++ b/agent-go/executor/AppFunction.go @@ -3,12 +3,9 @@ package executor import ( "fmt" "net" - "os" - "path/filepath" "regexp" "sort" "strconv" - "strings" "time" ) @@ -59,9 +56,9 @@ func (op *AgentOsOperator) Deploy(appFuncName string, funcArgs ...string) (bool, case "DEPLOY_K8S_MYSQL": resultOK, result = op.deployMySQL(funcArgs) break - case "LOAD_MYSQL_INIT_SCRIPT": - resultOK, result = op.loadMysqlInitScript(funcArgs) - break + //case "LOAD_MYSQL_INIT_SCRIPT": + // resultOK, result = op.loadMysqlInitScript(funcArgs) + // break case "checkMySQL": resultOK, result = op.checkMySQL(funcArgs) break @@ -499,95 +496,95 @@ func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) { } } -func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) { - - folder, i := CheckAppInstallFolder() - if !folder { - return false, i - } - - // download offline sql list - if len(funcArgs) <= 7 { - return false, []string{ - "[loadMysqlInitScript]- MySQL初始化参数有误! 无法进行初始化", - } - } - - jackeyLove := funcArgs[7] - if !strings.HasSuffix(jackeyLove, "tar") { - return false, []string{ - "[loadMysqlInitScript]- jackeyLove 有误!", - } - } - log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove) - - jackeyLoveLocalPrefix := "/root/wdd/jackeylove/" - PureResultSingleExecute([]string{ - "rm", - "-f", - jackeyLoveLocalPrefix, - }) - BasicCreateFolder(jackeyLoveLocalPrefix) - - jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) - if !ok { - return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") - } - - // unzip - if !PureResultSingleExecute([]string{ - "tar", - "-vxf", - jackeyLoveLocalPrefix + jackeyLove, - "-C", - jackeyLoveLocalPrefix, - }) { - return false, []string{ - "[loadMysqlInitScript]- jackeyLove unzip error !", - } - } - - // list all sql file and sort and convert to []string - files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder) - if err != nil { - return false, []string{ - "[loadMysqlInitScript]- read unzipped jackeylove error !", - } - } - - var jackeyLoveFileList []string - for _, file := range files { - if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" { - jackeyLoveFileList = append(jackeyLoveFileList, file.Name()) - } - } - - // sort for numeric order - sortFileNames(jackeyLoveFileList) - var jackeyLoveFileAbsolutePath []string - for _, jackeyLoveFile := range jackeyLoveFileList { - jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile) - } - - log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath) - - // dispatch mysql execution command - jackeyLoveIP := funcArgs[0] - parseIP := net.ParseIP(jackeyLoveIP) - if parseIP == nil { - return false, []string{ - "[loadMysqlInitScript]- ip config error !", - } - } - load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath) - if !load { - return false, result - } - - return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !") - -} +//func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) { +// +// folder, i := CheckAppInstallFolder() +// if !folder { +// return false, i +// } +// +// // download offline sql list +// if len(funcArgs) <= 7 { +// return false, []string{ +// "[loadMysqlInitScript]- MySQL初始化参数有误! 无法进行初始化", +// } +// } +// +// jackeyLove := funcArgs[7] +// if !strings.HasSuffix(jackeyLove, "tar") { +// return false, []string{ +// "[loadMysqlInitScript]- jackeyLove 有误!", +// } +// } +// log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove) +// +// jackeyLoveLocalPrefix := "/root/wdd/jackeylove/" +// PureResultSingleExecute([]string{ +// "rm", +// "-f", +// jackeyLoveLocalPrefix, +// }) +// BasicCreateFolder(jackeyLoveLocalPrefix) +// +// jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] +// ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) +// if !ok { +// return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") +// } +// +// // unzip +// if !PureResultSingleExecute([]string{ +// "tar", +// "-vxf", +// jackeyLoveLocalPrefix + jackeyLove, +// "-C", +// jackeyLoveLocalPrefix, +// }) { +// return false, []string{ +// "[loadMysqlInitScript]- jackeyLove unzip error !", +// } +// } +// +// // list all sql file and sort and convert to []string +// files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder) +// if err != nil { +// return false, []string{ +// "[loadMysqlInitScript]- read unzipped jackeylove error !", +// } +// } +// +// var jackeyLoveFileList []string +// for _, file := range files { +// if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" { +// jackeyLoveFileList = append(jackeyLoveFileList, file.Name()) +// } +// } +// +// // sort for numeric order +// sortFileNames(jackeyLoveFileList) +// var jackeyLoveFileAbsolutePath []string +// for _, jackeyLoveFile := range jackeyLoveFileList { +// jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile) +// } +// +// log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath) +// +// // dispatch mysql execution command +// jackeyLoveIP := funcArgs[0] +// parseIP := net.ParseIP(jackeyLoveIP) +// if parseIP == nil { +// return false, []string{ +// "[loadMysqlInitScript]- ip config error !", +// } +// } +// load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath) +// if !load { +// return false, result +// } +// +// return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !") +// +//} func sortFileNames(fileNames []string) { re := regexp.MustCompile(`(\d+)_`) @@ -741,6 +738,8 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) { } } + // todo should I check ingress exists ? + // 成功启动 return true, []string{ "Redis 部署成功!", @@ -750,15 +749,12 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { - ingressTemplate := "ingress-template.yaml" + ingressTemplate := "k8s-ingress-template.yaml" result := append(AppExecuteErrorLogPrefix, "部署 Ingress !") // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "kubectl", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) + if !BasicCommandExistByPath("kubectl") { + result = append(result, "命令不存在", "kubectl") return false, result } folder, i := CheckAppInstallFolder() @@ -767,37 +763,38 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { } // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + ingressTemplate, - }) { - result = append(result, "下载模板文件") - return false, result + k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml" + ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile) + if !ok { + return false, resultLog } + // 根据参数 A1C2IP 替换 - if !BasicReplace(ingressTemplate, "SUPREME", funcArgs[0]) { - result = append(result, "替换SUPREME信息") - return false, result + parseIP := net.ParseIP(funcArgs[0]) + if parseIP == nil { + return false, append(result, "ip args error !") } - if !BasicReplace(ingressTemplate, "A1C2IP", funcArgs[1]) { + if !BasicReplace(k8sIngressYamlFile, "A1C2IP", funcArgs[0]) { result = append(result, "替换A1C2IP信息") return false, result } - if !BasicReplace(ingressTemplate, "A1C1JS", funcArgs[1]) { + if !BasicReplace(k8sIngressYamlFile, "SUPREME", funcArgs[1]) { + result = append(result, "替换SUPREME信息") + return false, result + } + if !BasicReplace(k8sIngressYamlFile, "A1C1JS", funcArgs[4]) { result = append(result, "替换A1C1JS信息") return false, result } + if !BasicReplace(k8sIngressYamlFile, "KIMMY", funcArgs[6]) { + result = append(result, "替换KIMMY信息") + return false, result + } // 启动服务 - if !PureResultSingleExecute([]string{ - "kubectl", - "apply", - "-f", - ingressTemplate, - }) { - result = append(result, "创建 Ingress 失败!") - return false, result + exec, strings := KubectlApplyExec(k8sIngressYamlFile) + if !exec { + return false, append(result, strings...) } // 成功启动 @@ -808,15 +805,12 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { - fontTemplate := "front-template.yaml" + fontTemplate := "k8s-front-template.yaml" result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !") // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "kubectl", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) + if !BasicCommandExistByPath("kubectl") { + result = append(result, "命令不存在", "kubectl") return false, result } folder, i := CheckAppInstallFolder() @@ -825,35 +819,38 @@ func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { } // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + fontTemplate, - }) { - result = append(result, "下载模板文件") + k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml" + ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath) + if !ok { + return false, resultLog + } + + // 根据参数 A1C2IP 替换 + parseIP := net.ParseIP(funcArgs[0]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(k8sFrontYamlFilePath, "A1C2IP", funcArgs[0]) { + result = append(result, "替换A1C2IP信息") return false, result } - // 根据参数 A1C2IP 替换 - if !BasicReplace(fontTemplate, "SUPREME", funcArgs[0]) { + if !BasicReplace(k8sFrontYamlFilePath, "SUPREME", funcArgs[1]) { result = append(result, "替换SUPREME信息") return false, result } - if !BasicReplace(fontTemplate, "A1C2IP", funcArgs[1]) { - result = append(result, "替换A1C2IP信息") + if !BasicReplace(k8sFrontYamlFilePath, "KIMMY", funcArgs[6]) { + result = append(result, "替换KIMMY信息") return false, result } // 启动服务 - if !PureResultSingleExecute([]string{ - "kubectl", - "apply", - "-f", - fontTemplate, - }) { - result = append(result, "创建 前端服务 失败!") - return false, result + exec, strings := KubectlApplyExec(k8sFrontYamlFilePath) + if !exec { + return false, append(result, strings...) } + // check all front end pod exits! + // 成功启动 return true, []string{ "前端服务 部署成功!", @@ -893,12 +890,20 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) { result = append(result, "替换SUPREME信息") return false, result } - if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[1]) { + parseIP := net.ParseIP(funcArgs[0]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[0]) { result = append(result, "替换A1C2IP信息") return false, result } - if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[1]) { - result = append(result, "替换A1C2IP信息") + parseIP = net.ParseIP(funcArgs[5]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[5]) { + result = append(result, "替换M2D2IP信息") return false, result } @@ -922,15 +927,12 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { - srsTemplate := "srs-template.yaml" + srsTemplate := "k8s-srs-template.yaml" result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务!") // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "kubectl", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) + if !BasicCommandExistByPath("kubectl") { + result = append(result, "命令不存在", "kubectl") return false, result } folder, i := CheckAppInstallFolder() @@ -939,43 +941,51 @@ func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { } // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + srsTemplate, - }) { - result = append(result, "下载模板文件") - return false, result + k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml" + ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath) + if !ok { + return false, resultLog } + // 根据参数 A1C2IP 替换 - if !BasicReplace(srsTemplate, "SUPREME", funcArgs[0]) { + if !BasicReplace(k8sSRSYamlFilePath, "SUPREME", funcArgs[1]) { result = append(result, "替换SUPREME信息") return false, result } - if !BasicReplace(srsTemplate, "A1C2IP", funcArgs[1]) { + parseIP := net.ParseIP(funcArgs[0]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(k8sSRSYamlFilePath, "A1C2IP", funcArgs[0]) { result = append(result, "替换A1C2IP信息") return false, result } - if !BasicReplace(srsTemplate, "A1C1JS", funcArgs[1]) { + if !BasicReplace(k8sSRSYamlFilePath, "A1C1JS", funcArgs[4]) { result = append(result, "替换A1C1JS信息") return false, result } - if !BasicReplace(srsTemplate, "M2D2IP", funcArgs[1]) { + parseIP = net.ParseIP(funcArgs[5]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(k8sSRSYamlFilePath, "M2D2IP", funcArgs[5]) { result = append(result, "替换M2D2IP信息") return false, result } - // 启动服务 - if !PureResultSingleExecute([]string{ - "kubectl", - "apply", - "-f", - srsTemplate, - }) { - result = append(result, "部署 SRS 失败!") + if !BasicReplace(k8sSRSYamlFilePath, "KIMMY", funcArgs[6]) { + result = append(result, "替换KIMMY信息") return false, result } + // 启动服务 + exec, strings := KubectlApplyExec(k8sSRSYamlFilePath) + if !exec { + return false, append(result, strings...) + } + + // check pod ok + // 成功启动 return true, []string{ "部署 SRS 成功!", @@ -1008,48 +1018,52 @@ func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) { func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) { - backendTemplate := "backend-template.yaml" + backendTemplate := "k8s-backend-template.yaml" result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !") // 环境判定 - commandExist, commandName := BasicCommandExistsBatch([]string{ - "kubectl", - }) - if !commandExist { - result = append(result, "命令不存在", commandName) + if !BasicCommandExistByPath("kubectl") { + result = append(result, "命令不存在", "kubectl") return false, result } + folder, i := CheckAppInstallFolder() + if !folder { + return false, i + } // 下载模板文件 - if !PureResultSingleExecute([]string{ - "wget", - "-q", - op.OssOfflinePrefix + "/" + backendTemplate, - }) { - result = append(result, "下载模板文件") + k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml" + ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath) + if !ok { + return false, resultLog + } + + // 根据参数 A1C2IP 替换 + parseIP := net.ParseIP(funcArgs[0]) + if parseIP == nil { + return false, append(result, "ip args error !") + } + if !BasicReplace(k8sBackendYamlFilePath, "A1C2IP", funcArgs[0]) { + result = append(result, "替换A1C2IP信息") return false, result } - // 根据参数 A1C2IP 替换 - if !BasicReplace(backendTemplate, "SUPREME", funcArgs[0]) { + if !BasicReplace(k8sBackendYamlFilePath, "SUPREME", funcArgs[1]) { result = append(result, "替换SUPREME信息") return false, result } - if !BasicReplace(backendTemplate, "A1C2IP", funcArgs[1]) { - result = append(result, "替换A1C2IP信息") + if !BasicReplace(k8sBackendYamlFilePath, "KIMMY", funcArgs[6]) { + result = append(result, "替换KIMMY信息") return false, result } // 启动服务 - if !PureResultSingleExecute([]string{ - "kubectl", - "apply", - "-f", - backendTemplate, - }) { - result = append(result, "创建 后端服务 失败!") - return false, result + exec, strings := KubectlApplyExec(k8sBackendYamlFilePath) + if !exec { + return false, append(result, strings...) } + // check all front end pod exits! + // 成功启动 return true, []string{ "后端服务 部署成功!", diff --git a/agent-go/executor/BasicFunction.go b/agent-go/executor/BasicFunction.go index 0bec954..399c3cf 100644 --- a/agent-go/executor/BasicFunction.go +++ b/agent-go/executor/BasicFunction.go @@ -222,6 +222,7 @@ func BasicPrettyPrint(resultOk bool, resultLog []string) { } for _, s := range resultLog { fmt.Println(s) + fmt.Println() } } diff --git a/agent-go/executor/MySqlFunction.go b/agent-go/executor/MySqlFunction.go index 1f917a2..3c9a6b7 100644 --- a/agent-go/executor/MySqlFunction.go +++ b/agent-go/executor/MySqlFunction.go @@ -1,127 +1,183 @@ package executor -import ( - "bufio" - "database/sql" - "fmt" - _ "github.com/go-sql-driver/mysql" - "os" - "strings" -) +//import ( +// _ "github.com/go-sql-driver/mysql" +//) -func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) { +//func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) { +// +// dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/" +// db, err := sql.Open("mysql", dsn) +// if err != nil { +// errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error()) +// log.Error(errConnect) +// return false, []string{ +// errConnect, +// } +// } +// defer db.Close() +// +// // 确保数据库连接是有效的 +// if err := db.Ping(); err != nil { +// errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !" +// log.Error(errConnect) +// return false, []string{ +// errConnect, +// } +// } +// +// for _, jackeyLoveFile := range jackeyLoveFileList { +// +// // 打开 SQL 文件 +// jackeyLove, err := os.Open(jackeyLoveFile) +// if err != nil { +// log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name()) +// } +// defer jackeyLove.Close() +// +// // 逐行读取 SQL 文件并执行 +// query := "" +// delimiterSwitched := false +// scanner := bufio.NewScanner(jackeyLove) +// for scanner.Scan() { +// sqlStatement := scanner.Text() +// +// if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") { +// delimiterSwitched = true +// continue +// } +// if delimiterSwitched { +// if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" { +// delimiterSwitched = false +// // 替换自定义分隔符为 ; +// sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";") +// } else { +// // 忽略自定义分隔符行 +// continue +// } +// } +// +// // 这里可以添加逻辑来忽略空行或注释行 +// if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" { +// continue +// } +// +// query += sqlStatement +// +// if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") { +// +// fmt.Printf("%s -> %s", jackeyLoveFile, query) +// +// _, err := db.Exec(query) +// if err != nil { +// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error()) +// log.Error(executeError) +// return false, []string{ +// executeError, +// } +// } +// query = "" +// } else { +// query += " " // 添加空格以便连接多行语句 +// } +// } +// +// // 检查扫描过程中是否有错误 +// if err := scanner.Err(); err != nil { +// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error()) +// log.Error(executeError) +// return false, []string{ +// executeError, +// } +// } +// log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name()) +// } +// +// return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !") +//} - dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/" - db, err := sql.Open("mysql", dsn) - if err != nil { - errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error()) - log.Error(errConnect) - return false, []string{ - errConnect, - } - } - defer db.Close() - - // 确保数据库连接是有效的 - if err := db.Ping(); err != nil { - errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !" - log.Error(errConnect) - return false, []string{ - errConnect, - } - } - - for _, jackeyLoveFile := range jackeyLoveFileList { - - // 打开 SQL 文件 - jackeyLove, err := os.Open(jackeyLoveFile) - if err != nil { - log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name()) - } - defer jackeyLove.Close() - - // 逐行读取 SQL 文件并执行 - query := "" - delimiterSwitched := false - scanner := bufio.NewScanner(jackeyLove) - for scanner.Scan() { - sqlStatement := scanner.Text() - - if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") { - delimiterSwitched = true - continue - } - if delimiterSwitched { - if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" { - delimiterSwitched = false - // 替换自定义分隔符为 ; - sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";") - } else { - // 忽略自定义分隔符行 - continue - } - } - - // 这里可以添加逻辑来忽略空行或注释行 - if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" { - continue - } - - query += sqlStatement - - if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") { - - fmt.Printf("%s -> %s", jackeyLoveFile, query) - - _, err := db.Exec(query) - if err != nil { - executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error()) - log.Error(executeError) - return false, []string{ - executeError, - } - } - query = "" - } else { - query += " " // 添加空格以便连接多行语句 - } - } - - // 检查扫描过程中是否有错误 - if err := scanner.Err(); err != nil { - executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error()) - log.Error(executeError) - return false, []string{ - executeError, - } - } - log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name()) - } - - return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !") -} - -func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) { - - dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/" - db, err := sql.Open("mysql", dsn) - if err != nil { - errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error()) - log.Error(errConnect) - return false, []string{ - errConnect, - } - } - defer db.Close() - - // 确保数据库连接是有效的 - if err := db.Ping(); err != nil { - errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !" - log.Error(errConnect) - return false, []string{ - errConnect, - } - } - - return true, nil -} +//func MySqlParseSQLFile(sqlFilePath string) []string { +// +// var result []string +// +// // 打开 SQL 文件 +// jackeyLove, err := os.Open(sqlFilePath) +// if err != nil { +// log.ErrorF("[MySqlParseSQLFile] - failed to load jackeyLoveFile => %s", jackeyLove.Name()) +// } +// defer jackeyLove.Close() +// +// // 逐行读取 SQL 文件并执行 +// query := "" +// delimiterSwitched := false +// scanner := bufio.NewScanner(jackeyLove) +// for scanner.Scan() { +// sqlStatement := scanner.Text() +// +// if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") { +// delimiterSwitched = true +// continue +// } +// if delimiterSwitched { +// if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" { +// delimiterSwitched = false +// // 替换自定义分隔符为 ; +// sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";") +// } else { +// // 忽略自定义分隔符行 +// continue +// } +// } +// +// // 这里可以添加逻辑来忽略空行或注释行 +// if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" { +// continue +// } +// +// query += sqlStatement +// +// if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") { +// +// result = append(result, query) +// +// query = "" +// } else { +// query += "" // 添加空格以便连接多行语句 +// } +// } +// +// // 检查扫描过程中是否有错误 +// if err := scanner.Err(); err != nil { +// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error()) +// log.Error(executeError) +// +// +// } +// +// return result +//} +// +//func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) { +// +// dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/" +// db, err := sql.Open("mysql", dsn) +// if err != nil { +// errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error()) +// log.Error(errConnect) +// return false, []string{ +// errConnect, +// } +// } +// defer db.Close() +// +// // 确保数据库连接是有效的 +// if err := db.Ping(); err != nil { +// errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !" +// log.Error(errConnect) +// return false, []string{ +// errConnect, +// } +// } +// +// return true, nil +//} diff --git a/agent-go/executor/MySqlFunction_test.go b/agent-go/executor/MySqlFunction_test.go index 2cbedf2..3bc3639 100644 --- a/agent-go/executor/MySqlFunction_test.go +++ b/agent-go/executor/MySqlFunction_test.go @@ -1,13 +1,18 @@ package executor -import "testing" - -func TestMySqlConnection(t *testing.T) { - - connection, strings := MySqlConnection("10.250.0.126", "33306") - if !connection { - t.Error(strings) - } - - println("success!") -} +//func TestMySqlConnection(t *testing.T) { +// +// connection, strings := MySqlConnection("10.250.0.126", "33306") +// if !connection { +// t.Error(strings) +// } +// +// println("success!") +//} +// +//func TestMySqlParseSQLFile(t *testing.T) { +// +// parseSQLFile := MySqlParseSQLFile("C:\\Users\\wdd\\Documents\\4.1.6-部署\\init_5.1.0\\1_all_tables_demo_5.1.0.sql") +// +// BasicPrettyPrint(true, parseSQLFile) +//} diff --git a/agent-go/go.mod b/agent-go/go.mod index 4716417..2b6cbbb 100644 --- a/agent-go/go.mod +++ b/agent-go/go.mod @@ -3,7 +3,6 @@ module agent-go go 1.18 require ( - github.com/go-sql-driver/mysql v1.7.1 github.com/magiconair/properties v1.8.7 github.com/mittwald/goharbor-client/v5 v5.4.2 github.com/panjf2000/ants/v2 v2.7.2 diff --git a/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java b/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java index b2b3bf5..0f4d713 100644 --- a/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java +++ b/server/src/main/java/io/wdd/func/auto/beans/AppFunctionEnum.java @@ -51,10 +51,10 @@ public enum AppFunctionEnum { "部署k8s mysql, 参数 A1C2IP, SUPREME" ), - LOAD_MYSQL_INIT_SCRIPT( - "LOAD_MYSQL_INIT_SCRIPT", - "加载MySQl的初始化脚本," - ), +// LOAD_MYSQL_INIT_SCRIPT( +// "LOAD_MYSQL_INIT_SCRIPT", +// "加载MySQl的初始化脚本,废弃,手动!" +// ), DEPLOY_K8S_REDIS( "DEPLOY_K8S_REDIS", diff --git a/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java index c553ec4..ffecb38 100644 --- a/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java +++ b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java @@ -103,7 +103,10 @@ public class AppFuncScheduler { // AppFunctionEnum.DEPLOY_K8S_MYSQL // AppFunctionEnum.DEPLOY_K8S_REDIS // AppFunctionEnum.DEPLOY_K8S_PVC - AppFunctionEnum.LOAD_MYSQL_INIT_SCRIPT + AppFunctionEnum.DEPLOY_INGRESS, + AppFunctionEnum.DEPLOY_FRONTEND, + AppFunctionEnum.DEPLOY_BACKEND + );