From 0e8f633166e6b5cd5b3c454f27dca0e0da308c44 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Tue, 17 Oct 2023 16:17:12 +0800 Subject: [PATCH] =?UTF-8?q?[=20Agent=20]=20[=20Executor=20]=20-=20?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90Executor=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent-go/AgentInitialization.go | 2 +- agent-go/executor/BaseFunction.go | 284 +++++++++++++++--- agent-go/executor/BasicFunction.go | 2 + agent-go/logger/logger.go | 4 + .../java/io/wdd/source/shell/agent-bootup.sh | 4 +- 5 files changed, 250 insertions(+), 46 deletions(-) diff --git a/agent-go/AgentInitialization.go b/agent-go/AgentInitialization.go index e4f281a..1854795 100644 --- a/agent-go/AgentInitialization.go +++ b/agent-go/AgentInitialization.go @@ -127,7 +127,7 @@ func handleInitMsgFromServer(initFromServerQueue *rabbitmq.RabbitQueue, initToSe serverName := serverInfo.ServerName // 处理OM信息 - if initOctopusMsg != nil && strings.HasPrefix(initOctopusMsg.Type, g.InitOmType) && strings.HasPrefix(serverName, agentServerInfo.ServerName) { + if initOctopusMsg != nil && strings.HasPrefix(initOctopusMsg.OctopusMessageType, g.InitOmType) && strings.HasPrefix(serverName, agentServerInfo.ServerName) { // 是本机的注册回复信息 log.InfoF("OctopusMessage INIT from server is this agent !") diff --git a/agent-go/executor/BaseFunction.go b/agent-go/executor/BaseFunction.go index 9932edc..16f9c0b 100644 --- a/agent-go/executor/BaseFunction.go +++ b/agent-go/executor/BaseFunction.go @@ -34,7 +34,7 @@ type AgentOsOperator struct { AgentServerInfo *register.AgentServerInfo `json:"agent_server_info"` // 离线下载URL地址 - OssOfflinePrefix string + OssOfflinePrefix string `comment:"必须要用 / 结尾"` } func (op *AgentOsOperator) Exec(baseFuncName string, funcArgs ...string) (bool, []string) { @@ -409,13 +409,13 @@ func (op *AgentOsOperator) installDocker(args []string) [][]string { { "curl", "-o", - "/usr/share/keyrings/docker-utsc.gpg", + "/etc/apt/keyrings/docker-utsc.gpg", "https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg", }, { "apt-key", "add", - "/usr/share/keyrings/docker-utsc.gpg", + "/etc/apt/keyrings/docker-utsc.gpg", }, { "add-apt-repository", @@ -429,13 +429,13 @@ func (op *AgentOsOperator) installDocker(args []string) [][]string { { "curl", "-o", - "/usr/share/keyrings/docker.gpg", + "/etc/apt/keyrings/docker.gpg", "https://download.docker.com/linux/ubuntu/gpg ", }, { "apt-key", "add", - "/usr/share/keyrings/docker.gpg", + "/etc/apt/keyrings/docker.gpg", }, { "add-apt-repository", @@ -501,8 +501,6 @@ func (op *AgentOsOperator) installDocker(args []string) [][]string { } func (op *AgentOsOperator) installDockerExec(args []string) (bool, []string) { - var resultLog []string - resultOk = true if op.IsOsTypeUbuntu { @@ -520,51 +518,86 @@ func (op *AgentOsOperator) installDockerExec(args []string) (bool, []string) { return false, l } - // add dependency + dockerGPGFilePath := "/etc/apt/keyrings/docker.gpg" + + // 安装镜像的证书 if op.IsAgentInnerWall { - // inner gfw - installDockerFunc = append(installDockerFunc, [][]string{ - installFirstLine, + // 国内 使用 UTSC 的源 + ok, l2 := AllCommandExecutor([]string{ + "curl", + "-o", + dockerGPGFilePath, + "https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg", + }) + if !ok { + return false, l2 + } + if !BasicFileExistAndNotNull(dockerGPGFilePath) { + return false, []string{"添加gpg失败!"} + } + + resultOk, log2 := AllCompleteExecutor([][]string{ { - "curl", + "gpg", + "--dearmor", "-o", - "/usr/share/keyrings/docker-utsc.gpg", - "https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg", + dockerGPGFilePath, }, { - "apt-key", - "add", - "/usr/share/keyrings/docker-utsc.gpg", + "chmod", + "a+r", + dockerGPGFilePath, }, { "add-apt-repository", "deb [arch=" + op.AgentArch + "] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu " + op.AgentOSReleaseCode + " stable", }, - }...) + }) + if !resultOk { + return false, log2 + } } else { // outside world - installDockerFunc = append(installDockerFunc, [][]string{ - installFirstLine, + // 国内 使用 UTSC 的源 + ok, l2 := AllCommandExecutor([]string{ + "curl", + "-o", + dockerGPGFilePath, + "https://download.docker.com/linux/ubuntu/gpg", + }) + if !ok { + return false, l2 + } + if !BasicFileExistAndNotNull(dockerGPGFilePath) { + return false, []string{"添加gpg失败!"} + } + + resultOk, log2 := AllCompleteExecutor([][]string{ { - "curl", + "gpg", + "--dearmor", "-o", - "/usr/share/keyrings/docker.gpg", - "https://download.docker.com/linux/ubuntu/gpg ", + dockerGPGFilePath, }, { - "apt-key", - "add", - "/usr/share/keyrings/docker.gpg", + "chmod", + "a+r", + dockerGPGFilePath, }, { "add-apt-repository", "deb [arch=" + op.AgentArch + "] https://download.docker.com/linux/ubuntu " + op.AgentOSReleaseCode + " stable", }, - }...) + }) + if !resultOk { + return false, log2 + } } // look for specific docker-version to install - installDockerFunc = append(installDockerFunc, []string{"apt-get", "update"}) + AllCommandExecutor([]string{"apt-get", "update"}) + + // ubuntu 内部 var specificDockerVersion string // hard code here 5:20.10.10~3-0~ubuntu-focal @@ -574,19 +607,19 @@ func (op *AgentOsOperator) installDockerExec(args []string) (bool, []string) { specificDockerVersion = "5:20.10.10~3-0~ubuntu-" + op.AgentOSReleaseCode } - installDockerFunc = append(installDockerFunc, - append( - op.InstallCommandPrefix, - "docker-ce="+specificDockerVersion, - "docker-ce-cli="+specificDockerVersion, - "containerd.io", - "docker-compose-plugin", - ), - ) + resultOk, log2 := AllCommandExecutor([]string{ + "docker-ce=" + specificDockerVersion, + "docker-ce-cli=" + specificDockerVersion, + "containerd.io", + "docker-compose-plugin", + }) + if !resultOk { + return false, log2 + } } - return resultOk, resultLog + return true, nil } func (op *AgentOsOperator) removeDockerCompose() [][]string { @@ -602,7 +635,22 @@ func (op *AgentOsOperator) removeDockerCompose() [][]string { } func (op *AgentOsOperator) removeDockerComposeExec() (bool, []string) { - return false, nil + + commandName := "docker-compose" + if !BasicCommandExists(commandName) { + return true, nil + } + possibleDockerComposeFilePath := []string{ + "/usr/local/bin/" + commandName, + "/usr/bin/" + commandName, + } + + for _, s := range possibleDockerComposeFilePath { + removeDockerCommand := append(RemoveForcePrefix, s) + AllCommandExecutor(removeDockerCommand) + } + + return true, nil } func (op *AgentOsOperator) installDockerCompose() [][]string { @@ -618,7 +666,37 @@ func (op *AgentOsOperator) installDockerCompose() [][]string { } func (op *AgentOsOperator) installDockerComposeExec() (bool, []string) { - return false, nil + + // 安装特定版本的 docker-compose 2.18.0 + if op.OssOfflinePrefix == "" { + return false, []string{"离线下载OSS地址不存在! 无法安装 docker-compose"} + } + + DockerComposeFile := op.OssOfflinePrefix + "docker-compose-linux-x86_64-v2.18.0" + + ok, resultLog := AllCommandExecutor([]string{ + "wget", DockerComposeFile, + "-O", + "/usr/local/bin/docker-compose", + }) + if !ok { + return false, resultLog + } + + if !BasicFileExistAndNotNull("/usr/local/bin/docker-compose") { + return false, []string{"docker-compose 下载失败!"} + } + + AllCompleteExecutor([][]string{ + { + "chmod", "+x", "/usr/local/bin/docker-compose", + }, + { + "ln", "-s", "/usr/local/bin/docker-compose", "/usr/bin/docker-compose", + }, + }) + + return true, nil } func (op *AgentOsOperator) installHelm() [][]string { installHelmFunc := [][]string{ @@ -670,13 +748,13 @@ func (op *AgentOsOperator) installHelm() [][]string { { "curl", "-o", - "/usr/share/keyrings/helm.gpg", + "/etc/apt/keyrings/helm.gpg", "https://baltocdn.com/helm/signing.asc", }, { "apt-key", "add", - "/usr/share/keyrings/helm.gpg", + "/etc/apt/keyrings/helm.gpg", }, { "add-apt-repository", @@ -1061,7 +1139,125 @@ func (op *AgentOsOperator) installZSH() [][]string { } func (op *AgentOsOperator) installZSHExec() (bool, []string) { - return false, nil + + ok, resultLog := AllCompleteExecutor([][]string{ + { + "mkdir", + "-p", + "/root/wdd/", + }, + append( + op.InstallCommandPrefix, + "zsh", + "git", + ), + }) + if !ok { + return false, resultLog + } + + var zshRemoteGitUrl string + if op.IsAgentInnerWall { + zshRemoteGitUrl = "https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh" + } else { + zshRemoteGitUrl = "https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh" + } + + resultOk, l := AllCommandExecutor([]string{ + "wget", + zshRemoteGitUrl, + "-O", + "/root/wdd/zsh-install.sh", + }, + ) + if !resultOk { + l = append(l, "zsh-install.sh 下载失败! 安装终止") + return false, l + } + + executor, log2 := AllCompleteExecutor([][]string{ + { + "chomd", + "+x", + "/root/wdd/zsh-install.sh", + }, + { + "/bin/bash", + "/root/wdd/zsh-install.sh", + "REMOTE=https://gitee.com/mirrors/oh-my-zsh.git", + }, + }, + ) + if !executor { + return false, log2 + } + + modifyZSHOK, log3 := AllCompleteExecutor( + [][]string{ + { + "git", + "clone", + "https://github.com.cnpmjs.org/zsh-users/zsh-autosuggestions", + "~/.oh-my-zsh/plugins/zsh-autosuggestions", + }, + { + "git", + "clone", + "https://github.com.cnpmjs.org/zsh-users/zsh-syntax-highlighting.git", + "~/.oh-my-zsh/plugins/zsh-syntax-highlighting", + }, + { + "wget", + op.OssOfflinePrefix + "oh-my-zsh-plugins-list.txt", + "-O", + "oh-my-zsh-plugins-list.txt", + }, + { + "wget", + "-c", + "-i", + "./oh-my-zsh-plugins-list.txt", + "-P", + "~/.oh-my-zsh/plugins/", + }, + { + "sed", + "-i", + "s/robbyrussell/agnoster/g", + "~/.zshrc", + }, + { + "sed", + "-i", + "s/^# DISABLE_AUTO_UPDATE=\"true\"/DISABLE_AUTO_UPDATE=\"true\"/g", + "~/.zshrc", + }, + { + "sed", + "-i", + "s/plugins=(git)/plugins=(git zsh-autosuggestions zsh-syntax-highlighting command-not-found z themes)/g", + "~/.zshrc", + }, + { + "source", + "~/.zshrc", + }, + { + "chsh", + "-s", + "/bin/zsh", + }, + { + "zsh", + }, + }) + + if !modifyZSHOK { + log.Warn("ZSH 安装成功,但是配置修改失败!") + return true, log3 + } + + return true, nil } func (op *AgentOsOperator) modifySshPort(args []string) [][]string { @@ -1090,5 +1286,5 @@ func (op *AgentOsOperator) ok(args []string) [][]string { } func (op *AgentOsOperator) okExec(args []string) (bool, []string) { - return false, nil + return true, nil } diff --git a/agent-go/executor/BasicFunction.go b/agent-go/executor/BasicFunction.go index 9db730a..ecc35d9 100644 --- a/agent-go/executor/BasicFunction.go +++ b/agent-go/executor/BasicFunction.go @@ -2,6 +2,8 @@ package executor import "os/exec" +var RemoveForcePrefix = []string{"rm", "-rf"} + // BasicCommandExists 判定命令是否存在 func BasicCommandExists(commandName string) bool { diff --git a/agent-go/logger/logger.go b/agent-go/logger/logger.go index 2c3ecb9..37faba0 100644 --- a/agent-go/logger/logger.go +++ b/agent-go/logger/logger.go @@ -66,6 +66,10 @@ func (l *Logger) Warn(msg string, fields ...zap.Field) { l.Logger.Warn(msg, fields...) } +func (l *Logger) WarnF(msg string, args ...interface{}) { + l.Logger.Warn(fmt.Sprintf(msg, args...)) +} + // Error logs an error message. func (l *Logger) ErrorF(msg string, args ...interface{}) { diff --git a/source/src/main/java/io/wdd/source/shell/agent-bootup.sh b/source/src/main/java/io/wdd/source/shell/agent-bootup.sh index d2dcfba..e302c6c 100644 --- a/source/src/main/java/io/wdd/source/shell/agent-bootup.sh +++ b/source/src/main/java/io/wdd/source/shell/agent-bootup.sh @@ -2,7 +2,9 @@ ##### environment variables ###### -JAVA_OPTS="-Xms128m -Xmx512m -Ddebug=false -Dfile.encoding=utf-8 --spring.profiles.active=k3s --spring.cloud.nacos.config.group=k3s --spring.cloud.nacos.config.server-addr=150.230.198.103:21060 --spring.cloud.nacos.config.extension-configs[0].dataId=common-k3s.yaml --spring.cloud.nacos.config.extension-configs[0].group=k3s"DependLibFiles=( +JAVA_OPTS="-Xms128m -Xmx512m -Ddebug=false -Dfile.encoding=utf-8 --spring.profiles.active=k3s --spring.cloud.nacos.config.group=k3s --spring.cloud.nacos.config.server-addr=150.230.198.103:21060 --spring.cloud.nacos.config.extension-configs[0].dataId=common-k3s.yaml --spring.cloud.nacos.config.extension-configs[0].group=k3s" + +DependLibFiles=( wdd-lib-file.sh wdd-lib-log.sh wdd-lib-env.sh