diff --git a/agent-go/a_executor/AppFunction.go b/agent-go/a_executor/AppFunction.go index 1277067..9ee7107 100644 --- a/agent-go/a_executor/AppFunction.go +++ b/agent-go/a_executor/AppFunction.go @@ -119,15 +119,15 @@ func (op *AgentOsOperator) deployRke(funcArgs []string) (bool, []string) { // download rke // download kubectl // download rke-cluster.yml - ok, resultLog = BasicDownloadFile(op.OssOfflinePrefix+"rke", "/usr/local/bin/rke") + ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke", "/usr/local/bin/rke") if !ok { return false, resultLog } - ok, resultLog = BasicDownloadFile(op.OssOfflinePrefix+"kubectl", "/usr/local/bin/kubectl") + ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"kubectl", "/usr/local/bin/kubectl") if !ok { return false, resultLog } - ok, resultLog = BasicDownloadFile(op.OssOfflinePrefix+"rke-cluster-template.yaml", "/root/wdd/cluster.yml") + ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"rke-cluster-template.yaml", "/root/wdd/cluster.yml") if !ok { return false, resultLog } @@ -182,7 +182,7 @@ func (op *AgentOsOperator) deployK8sDashboard(funcArgs []string) (bool, []string // download template file k8sDashBoardYamlFile := "/root/wdd/install/k8s-dashboard.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"k8s-dashboard-template.yaml", k8sDashBoardYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"k8s-dashboard-template.yaml", k8sDashBoardYamlFile) if !ok { return false, resultLog } @@ -302,7 +302,7 @@ func (op *AgentOsOperator) deployNFS(funcArgs []string) (bool, []string) { // 下载模板文件 k8sNFSYamlFile := "/root/wdd/install/k8s-nfs.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) if !ok { return false, resultLog } @@ -354,7 +354,7 @@ func (op *AgentOsOperator) deployTestNFS(funcArgs []string) (bool, []string) { // 下载模板文件 k8sNFSYamlFile := "/root/wdd/install/k8s-nfs-test.json" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+nfsTemplateFile, k8sNFSYamlFile) if !ok { return false, resultLog } @@ -411,7 +411,7 @@ func (op *AgentOsOperator) deployPVC(funcArgs []string) (bool, []string) { // 下载模板文件 k8sPvcYamlFile := "/root/wdd/install/k8s-pvc.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+pvcTemplateFile, k8sPvcYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+pvcTemplateFile, k8sPvcYamlFile) if !ok { return false, resultLog } @@ -468,7 +468,7 @@ func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) { // 下载模板文件 k8sMysqlYamlFile := "/root/wdd/install/k8s-mysql.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+mysqlTemplate, k8sMysqlYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+mysqlTemplate, k8sMysqlYamlFile) if !ok { return false, resultLog } @@ -539,7 +539,7 @@ func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) { // BasicCreateFolder(jackeyLoveLocalPrefix) // // jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0] -// ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) +// ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove) // if !ok { // return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!") // } @@ -639,7 +639,7 @@ func (op *AgentOsOperator) deployMiddlewares(funcArgs []string) (bool, []string) // 下载模板文件 k8sMiddlewaresYamlFile := "/root/wdd/install/k8s-middlewares.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+middlewaresTemplate, k8sMiddlewaresYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+middlewaresTemplate, k8sMiddlewaresYamlFile) if !ok { return false, resultLog } @@ -710,7 +710,7 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) { // 下载模板文件 k8sRedisYamlFile := "/root/wdd/install/k8s-redis.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+redisTemplate, k8sRedisYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+redisTemplate, k8sRedisYamlFile) if !ok { return false, resultLog } @@ -776,7 +776,7 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) { // 下载模板文件 k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile) if !ok { return false, resultLog } @@ -840,7 +840,7 @@ func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) { // 下载模板文件 k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath) if !ok { return false, resultLog } @@ -962,7 +962,7 @@ func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) { // 下载模板文件 k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath) if !ok { return false, resultLog } @@ -1075,7 +1075,7 @@ func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) { // 下载模板文件 k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml" - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath) if !ok { return false, resultLog } diff --git a/agent-go/a_executor/BaseFunction.go b/agent-go/a_executor/BaseFunction.go index 4e8b9c1..1549791 100644 --- a/agent-go/a_executor/BaseFunction.go +++ b/agent-go/a_executor/BaseFunction.go @@ -367,11 +367,11 @@ func (op *AgentOsOperator) installDefaultSSHKeyExec(funcArgs []string) (bool, [] } // download standard private and public key - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"id_ed25519_private_key", "/root/.ssh/id_ed25519") + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"id_ed25519_private_key", "/root/.ssh/id_ed25519") if !ok { return false, resultLog } - ok, resultLog = BasicDownloadFile(op.OssOfflinePrefix+"id_ed25519_public_key.pub", "/root/.ssh/id_ed25519.pub") + ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"id_ed25519_public_key.pub", "/root/.ssh/id_ed25519.pub") if !ok { return false, resultLog } @@ -841,7 +841,7 @@ func (op *AgentOsOperator) installDockerOfflineExec(args []string) (bool, []stri dockerOfflineFileName = "docker-arm64-20.10.15.tgz" } - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+dockerOfflineFileName, "/root/wdd/"+dockerOfflineFileName) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+dockerOfflineFileName, "/root/wdd/"+dockerOfflineFileName) if !ok { return false, resultLog } @@ -864,17 +864,17 @@ func (op *AgentOsOperator) installDockerOfflineExec(args []string) (bool, []stri } // systemd daemonize docker - downloadOk, log2 := BasicDownloadFile(op.OssOfflinePrefix+"docker-containerd-daemon.service", "/lib/systemd/system/containerd.service") + downloadOk, log2 := BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-containerd-daemon.service", "/lib/systemd/system/containerd.service") if !downloadOk { return false, append(log2, "[installDockerOfflineExec] - daemon file download error !") } - downloadOk, log2 = BasicDownloadFile(op.OssOfflinePrefix+"docker-socket-daemon.service", "/lib/systemd/system/docker.socket") + downloadOk, log2 = BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-socket-daemon.service", "/lib/systemd/system/docker.socket") if !downloadOk { return false, append(log2, "[installDockerOfflineExec] - daemon file download error !") } - downloadOk, log2 = BasicDownloadFile(op.OssOfflinePrefix+"docker-daemon.service", "/lib/systemd/system/docker.service") + downloadOk, log2 = BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-daemon.service", "/lib/systemd/system/docker.service") if !downloadOk { return false, append(log2, "[installDockerOfflineExec] - daemon file download error !") } @@ -1006,7 +1006,7 @@ func (op *AgentOsOperator) installDockerComposeExec() (bool, []string) { log.InfoF("需要安装的docker版本为 => %s", DockerComposeFile) - ok, resultLog := BasicDownloadFile(DockerComposeFile, "/usr/local/bin/docker-compose") + ok, resultLog := BasicDownloadFileByCurl(DockerComposeFile, "/usr/local/bin/docker-compose") if !ok { return false, resultLog } @@ -1160,7 +1160,7 @@ func (op *AgentOsOperator) modifyDockerConfigExec(args []string) (bool, []string } // download new - ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"docker-daemon-template.json", dockerDaemonFile) + ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-daemon-template.json", dockerDaemonFile) if !ok { return false, append(resultLog, "[modifyDockerConfigExec] - error download docker-daemon-template.json !") } @@ -1247,7 +1247,7 @@ func (op *AgentOsOperator) installNFSOfflineExec() (bool, []string) { nfsClientOfflinePackageOSSUrl := op.OssOfflinePrefix + nfsClientOfflinePackageName log.InfoF("[installNFSOfflineExec]- start to download nfs-client offline package from => %s", nfsClientOfflinePackageOSSUrl) - ok, resultLog := BasicDownloadFile(nfsClientOfflinePackageOSSUrl, "/root/wdd/"+nfsClientOfflinePackageName) + ok, resultLog := BasicDownloadFileByCurl(nfsClientOfflinePackageOSSUrl, "/root/wdd/"+nfsClientOfflinePackageName) if !ok { return false, append(resultLog, "[installNFSOfflineExec]- download nfs-client offline package error !", nfsClientOfflinePackageOSSUrl) } @@ -1377,7 +1377,7 @@ func (op *AgentOsOperator) installNFSServerOfflineExec() (bool, []string) { // download from oss nfsServerOfflinePackageOSSUrl := op.OssOfflinePrefix + nfsServerOfflinePackageName log.InfoF("[installNFSServerOfflineExec]- start to download nfs-server offline package from => %s", nfsServerOfflinePackageOSSUrl) - ok, resultLog := BasicDownloadFile(nfsServerOfflinePackageOSSUrl, "/root/wdd/"+nfsServerOfflinePackageName) + ok, resultLog := BasicDownloadFileByCurl(nfsServerOfflinePackageOSSUrl, "/root/wdd/"+nfsServerOfflinePackageName) if !ok { return false, append(resultLog, "[installNFSServerOfflineExec]- download nfs-server offline package error !", nfsServerOfflinePackageOSSUrl) } @@ -1584,7 +1584,7 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) { BasicRemoveFolderComplete("/root/wdd/harbor-offline-installer-v2.9.0.tgz") BasicRemoveFolderComplete("/root/wdd/harbor") - downloadOk, l := BasicDownloadFile(harborOfflineFileURL, "/root/wdd/harbor-offline-installer-v2.9.0.tgz") + downloadOk, l := BasicDownloadFileByCurl(harborOfflineFileURL, "/root/wdd/harbor-offline-installer-v2.9.0.tgz") if !downloadOk { return false, append(l, "download harbor offline installer failed!") } @@ -2291,7 +2291,7 @@ func (op *AgentOsOperator) installZSHExec() (bool, []string) { } log.InfoF("开始下载zsh的安装脚本 => %s", zshRemoteGitUrl) - resultOk, l := BasicDownloadFile(zshRemoteGitUrl, "/root/wdd/zsh-install.sh") + resultOk, l := BasicDownloadFileByCurl(zshRemoteGitUrl, "/root/wdd/zsh-install.sh") if !resultOk { l = append(l, "zsh-install.sh 下载失败! 安装终止") return false, l diff --git a/agent-go/a_executor/BasicFunction.go b/agent-go/a_executor/BasicFunction.go index 81d786a..e321692 100644 --- a/agent-go/a_executor/BasicFunction.go +++ b/agent-go/a_executor/BasicFunction.go @@ -4,7 +4,10 @@ import ( "bufio" "bytes" "fmt" + "golang.org/x/net/proxy" "io" + "net/http" + "net/url" "os" "os/exec" "strings" @@ -511,8 +514,75 @@ func BasicConvertBufferToSlice(outputBuffer bytes.Buffer) (resultLog []string) { } -// BasicDownloadFile 从目标地址下载文件到目的地,并检测文件是否下载成功 -func BasicDownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog []string) { +func BasicDownloadFile(downloadUrl string, socksProxyUrl string, proxyUser string, proxyPass string, desFile string) (downloadOk bool, resultLog []string) { + // 解析下载URL + _, err := url.Parse(downloadUrl) + if err != nil { + resultLog = append(resultLog, "Error parsing download URL: "+err.Error()) + return false, resultLog + } + + // 创建文件 + out, err := os.Create(desFile) + if err != nil { + resultLog = append(resultLog, "Error creating file: "+err.Error()) + return false, resultLog + } + defer out.Close() + + // 创建HTTP客户端 + client := &http.Client{} + + // 如果提供了代理URL + if socksProxyUrl != "" { + // 解析代理URL + parsedProxyUrl, err := url.Parse(socksProxyUrl) + if err != nil { + resultLog = append(resultLog, "Error parsing proxy URL: "+err.Error()) + return false, resultLog + } + + // 使用SOCKS5代理 + auth := &proxy.Auth{User: proxyUser, Password: proxyPass} + dialer, err := proxy.SOCKS5("tcp", parsedProxyUrl.Host, auth, proxy.Direct) + if err != nil { + resultLog = append(resultLog, "Error creating SOCKS5 dialer: "+err.Error()) + return false, resultLog + } + + // 设置HTTP和HTTPS代理 + httpTransport := &http.Transport{ + Dial: dialer.Dial, + } + client.Transport = httpTransport + } + + // 发送HTTP GET请求 + resp, err := client.Get(downloadUrl) + if err != nil { + resultLog = append(resultLog, "Error making GET request: "+err.Error()) + return false, resultLog + } + defer resp.Body.Close() + + // 检查HTTP响应状态码 + if resp.StatusCode != http.StatusOK { + resultLog = append(resultLog, "Server returned HTTP status "+resp.Status) + return false, resultLog + } + + // 将HTTP响应内容写入文件 + _, err = io.Copy(out, resp.Body) + if err != nil { + resultLog = append(resultLog, "Error writing to file: "+err.Error()) + return false, resultLog + } + + return true, resultLog +} + +// BasicDownloadFileByCurl 从目标地址下载文件到目的地,并检测文件是否下载成功 +func BasicDownloadFileByCurl(downloadUrl, desFile string) (downloadOk bool, resultLog []string) { // wget or curl download var ok bool @@ -539,14 +609,14 @@ func BasicDownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog }) } else { - sprintf := fmt.Sprintf("[BasicDownloadFile] - neither wget or curl exists ! can't download file [ %s ] from [ %s ]", desFile, downloadUrl) + sprintf := fmt.Sprintf("[BasicDownloadFileByCurl] - neither wget or curl exists ! can't download file [ %s ] from [ %s ]", desFile, downloadUrl) log.Error(sprintf) return false, []string{ sprintf, } } - errLog := fmt.Sprintf("[BasicDownloadFile] - download file [ %s ] from [ %s ] failed !", desFile, downloadUrl) + errLog := fmt.Sprintf("[BasicDownloadFileByCurl] - download file [ %s ] from [ %s ] failed !", desFile, downloadUrl) if !ok { log.Error(errLog) return false, []string{ @@ -558,7 +628,7 @@ func BasicDownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog if !existAndNotNull { return false, []string{ errLog, - "[BasicDownloadFile] - file not exist !", + "[BasicDownloadFileByCurl] - file not exist !", } } @@ -598,7 +668,7 @@ func BasicDownloadFileWithProxy(downloadUrl, proxyUrl, desFile string) (download if !existAndNotNull { return false, []string{ errLog, - "[BasicDownloadFile] - file not exist !", + "[BasicDownloadFileByCurl] - file not exist !", } } diff --git a/agent-go/a_executor/ImageFunction.go b/agent-go/a_executor/ImageFunction.go index 0a34325..e074efa 100644 --- a/agent-go/a_executor/ImageFunction.go +++ b/agent-go/a_executor/ImageFunction.go @@ -6,6 +6,8 @@ import ( ) var LocalGzipImageFolderPrefix = "/var/lib/docker/image_sync/" +var DefaultSocks5ProxyUser = "zeaslity" +var DefaultSocks5ProxyPass = "password" func (op *AgentOsOperator) Sync(baseFuncName string, funcArgs ...string) (bool, []string) { resultOk := false @@ -185,14 +187,15 @@ func (op *AgentOsOperator) downloadGzipImageFile(funcArgs []string) (bool, []str } } - var download bool - var downloadLog []string - if proxyUrl == "" { - download, downloadLog = BasicDownloadFile(ossUrlPrefix+gzipImageFromFullName, desFile) - } else { - download, downloadLog = BasicDownloadFileWithProxy(ossUrlPrefix+gzipImageFromFullName, proxyUrl, desFile) - } + //var download bool + //var downloadLog []string + //if proxyUrl == "" { + // download, downloadLog = BasicDownloadFileByCurl(ossUrlPrefix+gzipImageFromFullName, desFile) + //} else { + // = BasicDownloadFileWithProxy(ossUrlPrefix+gzipImageFromFullName, proxyUrl, desFile) + //} + download, downloadLog := BasicDownloadFile(ossUrlPrefix+gzipImageFromFullName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, desFile) if !download { return false, downloadLog } @@ -269,7 +272,7 @@ func (op *AgentOsOperator) pushImageToTargetHarbor(funcArgs []string) (bool, []s } func (op *AgentOsOperator) updateImageTag(funcArgs []string) (bool, []string) { namespace := funcArgs[6] - targetImageFullName := funcArgs[7] + //targetImageFullName := funcArgs[7] proxyUrl := funcArgs[4] if !BasicCommandExistByPath("kubectl") { return false, []string{ @@ -291,28 +294,26 @@ func (op *AgentOsOperator) updateImageTag(funcArgs []string) (bool, []string) { updateFileName := "update-app-tag.sh" if !BasicFileExistAndNotNull(folderPrefix + updateFileName) { // kubectl update tag file not exits! - var download bool - var downloadLog []string - if proxyUrl == "" { - download, downloadLog = BasicDownloadFile(AgentOsOperatorCache.OssOfflinePrefix+updateFileName, folderPrefix+updateFileName) - } else { - download, downloadLog = BasicDownloadFileWithProxy(AgentOsOperatorCache.OssOfflinePrefix+updateFileName, proxyUrl, folderPrefix+updateFileName) - } + download, downloadLog := BasicDownloadFile(AgentOsOperatorCache.OssOfflinePrefix+updateFileName, proxyUrl, DefaultSocks5ProxyUser, DefaultSocks5ProxyPass, folderPrefix+updateFileName) if !download { return false, downloadLog } } - updateCommand := "kubectl -n " + namespace + " patch deployment " + appName + "-p \"{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\": " + appName + ",\"image\": " + targetImageFullName + "}]}}}}" + PureResultSingleExecute([]string{ + "chomd", + "+x", + folderPrefix + updateFileName, + }) + + newTag := image.ImageFullNameToImageTag(imageFullName) + log.InfoF("start do update %s %s to %s", namespace, appName, newTag) + updateCommand := "bash " + folderPrefix + updateFileName + namespace + appName + newTag executor, i := HardCodeCommandExecutor(updateCommand) if !executor { return false, i } - return true, nil + return true, i } - -//func BuildGzipImageFromFullName(imageFullName string) string { -// -//} diff --git a/agent-go/a_init/AgentInitialization.go b/agent-go/a_init/AgentInitialization.go index 316ffde..75ae8ad 100644 --- a/agent-go/a_init/AgentInitialization.go +++ b/agent-go/a_init/AgentInitialization.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/viper" "gopkg.in/yaml.v3" "io/ioutil" + "math/rand" "reflect" "strings" "time" @@ -66,11 +67,13 @@ func INIT(octopusAgentConfigFileName string, agentServerInfoConf string) chan bo case initFromServerMsg := <-initFromServerQueue.ReceiveChan.InitRChan: if handleInitMsgFromServer(initFromServerMsg, initToServerQueue, agentServerInfo) { log.InfoF("[INIT] - agent has registered !") + // 手动关闭 注册队列的连接 + shutdownRegisterQueueConnection(initFromServerQueue, initToServerQueue) break } default: log.Debug("agent init not received from server ! start to waiting !") - time.Sleep(time.Second * 10) + time.Sleep(time.Millisecond * 500) } } @@ -192,7 +195,11 @@ func buildAndSendInitMsgToServer(agentServerInfo *a_agent.AgentServerInfo, initT _ = P.Submit( func() { agentRegisterCount := 0 - for g.G.AgentHasRegister == false && agentRegisterCount < g.AgentRegisterFailedCount { + for g.G.AgentHasRegister == false { + if agentRegisterCount > g.AgentRegisterFailedCount { + log.ErrorF("Agent Register Failed after %d times tryings !", g.AgentRegisterFailedCount) + return + } log.InfoF("[INIT] - Send init message to server! ==> %s", octopusMsg) @@ -263,9 +270,6 @@ func handleInitMsgFromServer(initFromServerMsg *rabbitmq.OctopusMessage, initToS // 保存真实的AgentTopicName a_agent.AgentServerInfoCache.TopicName = serverInfo.TopicName - // 手动关闭 注册队列的连接 - //shutdownRegisterQueueConnection(initFromServerQueue, initToServerQueue) - } else { // 不是自身的 注册回复信息 -- 拒绝 2023年6月19日 此处存在错误! 会死循环Nack 导致异常 log.WarnF("OctopusMessage INIT from server not this agent ! => %v ", &initFromServerMsg) @@ -273,9 +277,13 @@ func handleInitMsgFromServer(initFromServerMsg *rabbitmq.OctopusMessage, initToS // 需要休眠等待不再获取相应的信息 _ = P.Submit(func() { - time.Sleep(time.Second * 5) + // 生成一个1到5之间的随机整数 + seconds := rand.Intn(5) + 1 initToServerQueue.SendOMsg(initFromServerMsg) + + // 谦让型 多并发模型 等待其他Agent注册成功 + time.Sleep(time.Duration(seconds) * time.Second) }) } @@ -286,10 +294,10 @@ func handleInitMsgFromServer(initFromServerMsg *rabbitmq.OctopusMessage, initToS // shutdownRegisterQueueConnection 关闭初始化连接的两个队列 func shutdownRegisterQueueConnection(initFromServerQueue *rabbitmq.RabbitQueue, initToServerQueue *rabbitmq.RabbitQueue) { - initFromServerQueue.Close() - initToServerQueue.Close() + _ = initFromServerQueue.Close() + _ = initToServerQueue.Close() - log.InfoF("Pretend to Shutdown register queue connection !") + log.InfoF("Octopus Agent Init Queue has disconnected!") } func parseAgentServerInfo(agentServerInfoConf string) *a_agent.AgentServerInfo { diff --git a/agent-go/go.mod b/agent-go/go.mod index ee969db..82c9f05 100644 --- a/agent-go/go.mod +++ b/agent-go/go.mod @@ -8,6 +8,7 @@ require ( github.com/shirou/gopsutil/v3 v3.23.3 github.com/spf13/viper v1.15.0 github.com/streadway/amqp v1.1.0 + golang.org/x/net v0.24.0 gopkg.in/yaml.v3 v3.0.1 wdd.io/agent-common v0.0.0 ) @@ -58,7 +59,7 @@ require ( go.opentelemetry.io/otel/trace v1.14.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/agent-go/go.sum b/agent-go/go.sum index 2b3bb3a..e565ced 100644 --- a/agent-go/go.sum +++ b/agent-go/go.sum @@ -438,6 +438,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -510,8 +512,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/agent-go/shell/base-minio-sync.sh b/agent-go/shell/base-minio-sync.sh new file mode 100644 index 0000000..670b1f4 --- /dev/null +++ b/agent-go/shell/base-minio-sync.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# 设置local和tc-sh的别名 +set_minio_endpoint_alias() { + mc alias set local http://localhost:9000 cmii B#923fC7mk + mc alias set tc-sh http://42.192.52.227:9000/ cmii B#923fC7mk +} + +create_bucket_in_tc_sh() { + mc mb tc-sh/octopus + mc anonymous set public tc-sh/octopus +} + +delete_prune_tc_sh_bucket() { + mc rm --recursive --force tc-sh/octopus/ +} + +set_minio_endpoint_alias + +mc cp -r local/octopus/ tc-sh/octopus/ diff --git a/agent-go/shell/update-app-tag.sh b/agent-go/shell/update-app-tag.sh index fd88f09..41cd0cd 100644 --- a/agent-go/shell/update-app-tag.sh +++ b/agent-go/shell/update-app-tag.sh @@ -1,5 +1,7 @@ #!/bin/bash +# should upload to Octopus OSS + # Check if the correct number of arguments are provided if [ "$#" -ne 3 ]; then echo "Usage: $0 " @@ -23,9 +25,7 @@ old_tag=${old_tag#*:} # echo "old_tag is ${old_tag}" # echo "image prefix is => ${image_prefix}" - -kubectl -n "${name_space}" patch deployment "${deployment_name}" -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"${deployment_name}\",\"image\": \"${image_prefix}:${new_tag}\"}]}}}}" >> /dev/null - +kubectl -n "${name_space}" patch deployment "${deployment_name}" -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"${deployment_name}\",\"image\": \"${image_prefix}:${new_tag}\"}]}}}}" >>/dev/null real_new_tag=$(kubectl -n "${name_space}" get deployment "${deployment_name}" -o=jsonpath='{.spec.template.spec.containers[*].image}' | grep -oE ':[0-9]+\.[0-9]+\.[0-9]+.*') real_new_tag=${real_new_tag#*:} diff --git a/agent-go/tmp/test.go b/agent-go/tmp/test.go index 06ab7d0..bedefdb 100644 --- a/agent-go/tmp/test.go +++ b/agent-go/tmp/test.go @@ -1 +1,90 @@ package main + +import ( + "io" + "net/http" + "net/url" + "os" +) + +func BasicDownloadFileHTTP(downloadUrl string, proxyUrl string, proxyUser string, proxyPass string, desFile string) (downloadOk bool, resultLog []string) { + // 解析下载URL + _, err := url.Parse(downloadUrl) + if err != nil { + resultLog = append(resultLog, "Error parsing download URL: "+err.Error()) + return false, resultLog + } + + // 创建文件 + out, err := os.Create(desFile) + if err != nil { + resultLog = append(resultLog, "Error creating file: "+err.Error()) + return false, resultLog + } + defer out.Close() + + // 创建HTTP客户端 + client := &http.Client{} + + // 如果提供了代理URL + if proxyUrl != "" { + // 解析代理URL + proxyURL, err := url.Parse(proxyUrl) + if err != nil { + resultLog = append(resultLog, "Error parsing proxy URL: "+err.Error()) + return false, resultLog + } + + // 设置HTTP代理 + transport := &http.Transport{ + Proxy: func(req *http.Request) (*url.URL, error) { + req.SetBasicAuth(proxyUser, proxyPass) + return proxyURL, nil + }, + } + client.Transport = transport + } + + // 发送HTTP GET请求 + resp, err := client.Get(downloadUrl) + if err != nil { + resultLog = append(resultLog, "Error making GET request: "+err.Error()) + return false, resultLog + } + defer resp.Body.Close() + + // 检查HTTP响应状态码 + if resp.StatusCode != http.StatusOK { + resultLog = append(resultLog, "Server returned HTTP status "+resp.Status) + return false, resultLog + } + + // 将HTTP响应内容写入文件 + _, err = io.Copy(out, resp.Body) + if err != nil { + resultLog = append(resultLog, "Error writing to file: "+err.Error()) + return false, resultLog + } + + return true, resultLog +} + +func main() { + + //socksProxyUrl := "socks5://192.168.35.71:22888" + httpProxyUrl := "http://192.168.35.71:22808" + downloadOk, resultLog := BasicDownloadFileHTTP( + "https://happybirthday.107421.xyz/octopus-agent/octopus-agent_linux_amd64_2024-03-29-17-47-14", + httpProxyUrl, + "zeaslity", + "password", + "octopus-agent_linux_1232", + ) + if downloadOk { + println("File downloaded successfully") + } else { + for _, log := range resultLog { + println(log) + } + } +} diff --git a/server/src/main/java/io/wdd/rpc/init/AcceptAgentInitInfo.java b/server/src/main/java/io/wdd/rpc/init/AcceptAgentInitInfo.java index 09cb690..8d4d240 100644 --- a/server/src/main/java/io/wdd/rpc/init/AcceptAgentInitInfo.java +++ b/server/src/main/java/io/wdd/rpc/init/AcceptAgentInitInfo.java @@ -62,6 +62,8 @@ public class AcceptAgentInitInfo { ; put("Ziyang", 11); + put("JiLin", + 12); }}; diff --git a/server/src/main/java/io/wdd/rpc/message/sender/OMessageToAgentSender.java b/server/src/main/java/io/wdd/rpc/message/sender/OMessageToAgentSender.java index 1f660f9..4a7ea35 100644 --- a/server/src/main/java/io/wdd/rpc/message/sender/OMessageToAgentSender.java +++ b/server/src/main/java/io/wdd/rpc/message/sender/OMessageToAgentSender.java @@ -61,7 +61,7 @@ public class OMessageToAgentSender { public void send(OctopusMessage octopusMessage) { log.info( - "OM Sender to {} Time {} \n OctopusMessageType为 {}\nFunctionContent为 {}", + "OM Sender to {} Time {} OctopusMessageType为 {} FunctionContent为 {}", octopusMessage.getUuid(), octopusMessage.getInit_time(), octopusMessage.getOctopusMessageType(), diff --git a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java index 2fe953f..52e8967 100644 --- a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java +++ b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java @@ -48,7 +48,7 @@ public class TestBaseFuncScheduler { // Long projectServerId = 1722453318596550657L;// lappro // Long projectServerId = 1752602668144975873L;// cqlyj // Long projectServerId = 1764575895186030593L;// 上海雷视联动 -// Long projectServerId = 1765290465066692610L;// 吉林移动 +// Long projectServerId = 1777152043483353089L;// 吉林移动 // Long projectServerId = 1765654823726669826L;// 资阳公安 Long projectServerId = 1773619219367120898L; // 内网35-71项目 @@ -58,7 +58,7 @@ public class TestBaseFuncScheduler { // String masterNodeServerName = "Shanghai-amd64-09"; // cgga // String masterNodeServerName = "Chengdu-amd64-51"; // 吉林移动 - String masterNodeServerName = "Chengdu-amd64-71"; // 吉林移动 + String masterNodeServerName = "JiLin-amd64-01"; // 吉林移动 // String masterNodeServerName = "Ziyang-amd64-61"; // 资阳公安 ProjectServerVO projectServerVO = coreProjectServerService.projectServerOne(projectServerId); diff --git a/server/src/test/java/io/wdd/server/func/TestImageSyncScheduler.java b/server/src/test/java/io/wdd/server/func/TestImageSyncScheduler.java index 6bce544..38942d8 100644 --- a/server/src/test/java/io/wdd/server/func/TestImageSyncScheduler.java +++ b/server/src/test/java/io/wdd/server/func/TestImageSyncScheduler.java @@ -38,17 +38,19 @@ public class TestImageSyncScheduler { public void runImageSync() { ArrayList CmiiAppNameList = new ArrayList<>(List.of( - "cmii-uav-process:5.4.0-040701" +// "cmii-uav-process:5.4.0-040701" )); ArrayList ImageFullNameList = new ArrayList<>(List.of( -// "harbor.cdcyy.com.cn/cmii/cmii-uav-industrial-portfolio:5.4.0-cqly-032802" + "harbor.cdcyy.com.cn/cmii/cmii-live-operator:5.2.0", + "harbor.cdcyy.com.cn/cmii/cmii-srs-oss-adaptor:2023-SA" )); Boolean downloadAndCompressOnly = false; // String projectNamespace = "wdd"; // wdd - String projectNamespace = "cqlyj"; // cqlyj +// String projectNamespace = "cqlyj"; // cqlyj + String projectNamespace = "jlyd"; // jlyd // String innerWorkerAgentName = "Chengdu-amd64-65-lapwdd"; //wdd String innerWorkerAgentName = "Chengdu-amd64-71-3571gd"; //prod