diff --git a/.run/agent-go bastion.run.xml b/.run/agent-go bastion.run.xml
new file mode 100644
index 0000000..683e01e
--- /dev/null
+++ b/.run/agent-go bastion.run.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/agent-go main.run.xml b/.run/agent-go main.run.xml
new file mode 100644
index 0000000..6c14cc7
--- /dev/null
+++ b/.run/agent-go main.run.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agent-go/a_executor/BaseFunction.go b/agent-go/a_executor/BaseFunction.go
index 6fc4169..b1b42d0 100644
--- a/agent-go/a_executor/BaseFunction.go
+++ b/agent-go/a_executor/BaseFunction.go
@@ -3,10 +3,14 @@ package a_executor
import (
"fmt"
"net"
+ "os"
"strings"
"wdd.io/agent-go/a_agent"
+ "wdd.io/agent-go/a_executor/beans"
)
+var OctopusAgentInstallPrefix = "/root/wdd/"
+
type BaseFunc interface {
// Command 返回基础函数的命令行
@@ -384,11 +388,11 @@ func (op *AgentOsOperator) installDefaultSSHKeyExec(funcArgs []string) (bool, []
}
// download standard private and public key
- ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"id_ed25519_private_key", "/root/.ssh/id_ed25519")
+ ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"id_ed25519_private_key", "", "", "", "/root/.ssh/id_ed25519")
if !ok {
return false, resultLog
}
- ok, resultLog = BasicDownloadFileByCurl(op.OssOfflinePrefix+"id_ed25519_public_key.pub", "/root/.ssh/id_ed25519.pub")
+ ok, resultLog = BasicDownloadFile(op.OssOfflinePrefix+"id_ed25519_public_key.pub", "", "", "", "/root/.ssh/id_ed25519.pub")
if !ok {
return false, resultLog
}
@@ -445,7 +449,6 @@ func (op *AgentOsOperator) removeDocker() [][]string {
}
func (op *AgentOsOperator) removeDockerExec() (bool, []string) {
- var resultLog []string
dockerServiceStopCommand := [][]string{
{
@@ -467,7 +470,8 @@ func (op *AgentOsOperator) removeDockerExec() (bool, []string) {
ok, l := AllCompleteExecutor(dockerServiceStopCommand)
if !ok {
- resultLog = append(resultLog, l...)
+ log.Error("[removeDockerExec] - 停止docker服务失败!")
+ return false, l
}
dockerStaff := []string{
@@ -491,14 +495,25 @@ func (op *AgentOsOperator) removeDockerExec() (bool, []string) {
for _, staff := range dockerStaff {
removeCommand := append(op.RemoveCommandPrefix, staff)
-
- ok, result := AllCommandExecutor(removeCommand)
- if !ok {
- resultLog = append(resultLog, result...)
- }
+ AllCommandExecutor(removeCommand)
}
- return true, resultLog
+ _ = os.Remove(beans.DockerServiceFile)
+ _ = os.Remove(beans.DockerDaemonService)
+ _ = os.Remove(beans.DockerSocketFile)
+
+ AllCommandExecutor([]string{
+ "systemctl",
+ "daemon-reload",
+ })
+
+ return true, []string{
+ "[removeDockerExec] - docker remove success !",
+ }
+}
+
+func (op *AgentOsOperator) RemoveDockerBastion() (bool, []string) {
+ return op.removeDockerExec()
}
func (op *AgentOsOperator) installDocker(args []string) [][]string {
@@ -616,7 +631,7 @@ func (op *AgentOsOperator) installDocker(args []string) [][]string {
func (op *AgentOsOperator) installDockerExec(args []string) (bool, []string) {
- BasicCreateFolder("/root/wdd/")
+ BasicCreateFolder(OctopusAgentInstallPrefix)
op.removeDockerExec()
@@ -855,7 +870,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 := BasicDownloadFile(op.OssOfflinePrefix+dockerOfflineFileName, "", "", "", OctopusAgentInstallPrefix+dockerOfflineFileName)
if !ok {
return false, resultLog
}
@@ -865,7 +880,7 @@ func (op *AgentOsOperator) installDockerOfflineExec(args []string) (bool, []stri
PureResultSingleExecute([]string{
"tar",
"-vxf",
- "/root/wdd/" + dockerOfflineFileName,
+ OctopusAgentInstallPrefix + dockerOfflineFileName,
"-C",
"/root/wdd",
})
@@ -878,17 +893,17 @@ func (op *AgentOsOperator) installDockerOfflineExec(args []string) (bool, []stri
}
// systemd daemonize docker
- downloadOk, log2 := BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-containerd-daemon.service", "/lib/systemd/system/containerd.service")
+ downloadOk, log2 := BasicDownloadFile(op.OssOfflinePrefix+"docker-containerd-daemon.service", "", "", "", beans.ContainerdServiceFile)
if !downloadOk {
return false, append(log2, "[installDockerOfflineExec] - daemon file download error !")
}
- downloadOk, log2 = BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-socket-daemon.service", "/lib/systemd/system/docker.socket")
+ downloadOk, log2 = BasicDownloadFile(op.OssOfflinePrefix+"docker-socket-daemon.service", "", "", "", beans.DockerSocketDaemonService)
if !downloadOk {
return false, append(log2, "[installDockerOfflineExec] - daemon file download error !")
}
- downloadOk, log2 = BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-daemon.service", "/lib/systemd/system/docker.service")
+ downloadOk, log2 = BasicDownloadFile(op.OssOfflinePrefix+"docker-daemon.service", "", "", "", beans.DockerServiceFile)
if !downloadOk {
return false, append(log2, "[installDockerOfflineExec] - daemon file download error !")
}
@@ -965,7 +980,7 @@ func (op *AgentOsOperator) InstallDockerBastion() (bool, []string) {
BasicRemoveFolderComplete("/root/wdd/docker")
- dockerLocalFile := "/root/wdd/" + dockerOfflineFileName
+ dockerLocalFile := OctopusAgentInstallPrefix + dockerOfflineFileName
if !BasicFileExistAndNotNull(dockerLocalFile) {
sprintf := fmt.Sprintf("docker offline file not exists ! => %s", dockerLocalFile)
log.Error(sprintf)
@@ -989,6 +1004,91 @@ func (op *AgentOsOperator) InstallDockerBastion() (bool, []string) {
// daemon docker
+ // systemd daemonize docker
+ BasicAppendOverwriteContentToFile(beans.ContainerdDaemonService, beans.ContainerdServiceFile)
+ if !BasicFileExistAndNotNull(beans.ContainerdServiceFile) {
+ return false, []string{"docker deamon file not exists !"}
+ }
+ BasicAppendOverwriteContentToFile(beans.DockerSocketDaemonService, beans.DockerSocketFile)
+ if !BasicFileExistAndNotNull(beans.DockerSocketFile) {
+ return false, []string{"docker deamon file not exists !"}
+ }
+ BasicAppendOverwriteContentToFile(beans.DockerDaemonService, beans.DockerServiceFile)
+ if !BasicFileExistAndNotNull(beans.DockerServiceFile) {
+ return false, []string{"docker deamon file not exists !"}
+ }
+ log.InfoF("[InstallDockerBastion] - docker dameon file append success !")
+
+ // run the docker
+ executor, log3 := AllCommandExecutor([]string{
+ "systemctl",
+ "daemon-reload",
+ })
+ if !executor {
+ return false, append(log3, "[InstallDockerBastion] - daemon reload error !")
+ }
+
+ AllCompleteExecutor([][]string{
+ {
+ "systemctl",
+ "unmask",
+ "containerd",
+ },
+ {
+ "systemctl",
+ "unmask",
+ "docker.socket",
+ },
+ {
+ "systemctl",
+ "unmask",
+ "docker",
+ },
+ })
+
+ AllCompleteExecutor([][]string{
+ {
+ "groupadd",
+ "docker",
+ },
+ {
+ "usermod",
+ "-aG",
+ "docker",
+ "root",
+ },
+ {
+ "newgrp",
+ "docker",
+ },
+ })
+
+ systemdUp, _ := BasicSystemdUp("containerd")
+ if !systemdUp {
+ log.Warn("[InstallDockerBastion] - start containerd service error !")
+ }
+
+ commandExecutor, _ := AllCompleteExecutor([][]string{
+ {
+ "systemctl",
+ "start",
+ "docker.socket",
+ },
+ {
+ "systemctl",
+ "enable",
+ "docker.socket",
+ },
+ })
+ if !commandExecutor {
+ log.Warn("[InstallDockerBastion] - start docker.socket error !")
+ }
+
+ up, log4 := BasicSystemdUp("docker")
+ if !up {
+ return false, append(log4, "[InstallDockerBastion] - start docker service error !")
+ }
+
return true, []string{
"[InstallDockerBastion] - docker offline installation from local success!",
}
@@ -1058,7 +1158,7 @@ func (op *AgentOsOperator) installDockerComposeExec() (bool, []string) {
log.InfoF("需要安装的docker版本为 => %s", DockerComposeFile)
- ok, resultLog := BasicDownloadFileByCurl(DockerComposeFile, "/usr/local/bin/docker-compose")
+ ok, resultLog := BasicDownloadFile(DockerComposeFile, "", "", "", "/usr/local/bin/docker-compose")
if !ok {
return false, resultLog
}
@@ -1091,7 +1191,7 @@ func (op *AgentOsOperator) installHelm() [][]string {
{
"mkdir",
"-p",
- "/root/wdd/",
+ OctopusAgentInstallPrefix,
},
{
"rm",
@@ -1212,7 +1312,7 @@ func (op *AgentOsOperator) modifyDockerConfigExec(args []string) (bool, []string
}
// download new
- ok, resultLog := BasicDownloadFileByCurl(op.OssOfflinePrefix+"docker-daemon-template.json", dockerDaemonFile)
+ ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"docker-daemon-template.json", "", "", "", dockerDaemonFile)
if !ok {
return false, append(resultLog, "[modifyDockerConfigExec] - error download docker-daemon-template.json !")
}
@@ -1299,7 +1399,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 := BasicDownloadFileByCurl(nfsClientOfflinePackageOSSUrl, "/root/wdd/"+nfsClientOfflinePackageName)
+ ok, resultLog := BasicDownloadFile(nfsClientOfflinePackageOSSUrl, "", "", "", OctopusAgentInstallPrefix+nfsClientOfflinePackageName)
if !ok {
return false, append(resultLog, "[installNFSOfflineExec]- download nfs-client offline package error !", nfsClientOfflinePackageOSSUrl)
}
@@ -1310,7 +1410,7 @@ func (op *AgentOsOperator) installNFSOfflineExec() (bool, []string) {
AllCommandExecutor([]string{
"tar",
"-zvxf",
- "/root/wdd/" + nfsClientOfflinePackageName,
+ OctopusAgentInstallPrefix + nfsClientOfflinePackageName,
"-C",
"/root/wdd",
})
@@ -1429,7 +1529,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 := BasicDownloadFileByCurl(nfsServerOfflinePackageOSSUrl, "/root/wdd/"+nfsServerOfflinePackageName)
+ ok, resultLog := BasicDownloadFileByCurl(nfsServerOfflinePackageOSSUrl, OctopusAgentInstallPrefix+nfsServerOfflinePackageName)
if !ok {
return false, append(resultLog, "[installNFSServerOfflineExec]- download nfs-server offline package error !", nfsServerOfflinePackageOSSUrl)
}
@@ -1440,7 +1540,7 @@ func (op *AgentOsOperator) installNFSServerOfflineExec() (bool, []string) {
AllCommandExecutor([]string{
"tar",
"-zvxf",
- "/root/wdd/" + nfsServerOfflinePackageName,
+ OctopusAgentInstallPrefix + nfsServerOfflinePackageName,
"-C",
"/root/wdd",
})
@@ -1516,7 +1616,7 @@ func (op *AgentOsOperator) installHarbor() [][]string {
//{
// "mkdir",
// "-p",
- // "/root/wdd/",
+ // OctopusAgentInstallPrefix,
//},
//{
// "rm",
@@ -1535,7 +1635,7 @@ func (op *AgentOsOperator) installHarbor() [][]string {
"-zvxf",
"/root/wdd/harbor-offline-installer-v2.9.0.tgz",
"-C",
- "/root/wdd/",
+ OctopusAgentInstallPrefix,
},
{
"rm",
@@ -1575,12 +1675,9 @@ func (op *AgentOsOperator) installHarbor() [][]string {
return installHarborFunc
}
-
-// installHarborExec install harbor offline
-func (op *AgentOsOperator) installHarborExec() (bool, []string) {
-
+func (op *AgentOsOperator) checkHarborInstallExec() (bool, []string) {
// check docker-compose
- if !BasicFileExistAndNotNull("/usr/local/bin/docker-compose") {
+ if !BasicCommandExistByPath("/usr/local/bin/docker-compose") {
return false, []string{
"[install harbor] - docker-compose uninstalled ! can't install harbor!",
}
@@ -1626,25 +1723,32 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) {
"[install harbor] - script do not support for aarch64 version of harbor installation !",
}
}
+}
+
+// installHarborExec install harbor offline
+func (op *AgentOsOperator) installHarborExec() (bool, []string) {
+
+ // 抽离
+ checkHarborInstallExec, i := op.checkHarborInstallExec()
+ if !checkHarborInstallExec {
+ return false, i
+ }
// download offline file
harborOfflineFileURL := op.OssOfflinePrefix + "harbor-offline-installer-v2.9.0.tgz"
log.InfoF("[install harbor] - start to download harbor offline installer from => %s !", harborOfflineFileURL)
- BasicCreateFolder("/root/wdd/")
+ BasicCreateFolder(OctopusAgentInstallPrefix)
BasicRemoveFolderComplete("/root/wdd/harbor-offline-installer-v2.9.0.tgz")
BasicRemoveFolderComplete("/root/wdd/harbor")
- downloadOk, l := BasicDownloadFileByCurl(harborOfflineFileURL, "/root/wdd/harbor-offline-installer-v2.9.0.tgz")
+ log.Info("[install harbor] - start to download harbor offline installation file!")
+ downloadOk, l := BasicDownloadFile(harborOfflineFileURL, "", "", "", "/root/wdd/harbor-offline-installer-v2.9.0.tgz")
if !downloadOk {
return false, append(l, "download harbor offline installer failed!")
}
- if !BasicFileExistAndNotNull("/root/wdd/harbor-offline-installer-v2.9.0.tgz") {
- return false, []string{"download harbor offline installer failed!"}
- }
-
// unzip
AllCompleteExecutor([][]string{
{
@@ -1652,7 +1756,7 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) {
"-zvxf",
"/root/wdd/harbor-offline-installer-v2.9.0.tgz",
"-C",
- "/root/wdd/",
+ OctopusAgentInstallPrefix,
},
{
"rm",
@@ -1663,17 +1767,25 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) {
// configuration
log.Info("[install harbor] - start to download harbor config file!")
- AllCommandExecutor([]string{
- "wget",
- "--no-check-certificate",
- op.OssOfflinePrefix + "harbor-config-template.yml",
- "-qO",
- "/root/wdd/harbor/harbor.yml",
- })
- if !BasicFileExistAndNotNull("/root/wdd/harbor/harbor.yml") {
- return false, []string{"harbor config template file download error !"}
+ ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+"harbor-config-template.yml", "", "", "", "/root/wdd/harbor/harbor.yml")
+ if !ok {
+ return false, resultLog
}
+ // install and config
+ installHarborAndConfig, i2 := op.installHarborAndConfig()
+ if !installHarborAndConfig {
+ return false, i2
+ }
+
+ msg := "[install harbor] - harbor start complete !"
+ log.Info(msg)
+
+ return true, []string{msg}
+}
+
+func (op *AgentOsOperator) installHarborAndConfig() (bool, []string) {
+
log.Info("[install harbor] - start to modify harbor config file!")
AllCommandExecutor([]string{
@@ -1686,7 +1798,8 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) {
BasicReplace("/root/wdd/harbor/harbor.yml", "HarborHostPort", "8033")
BasicReplace("/root/wdd/harbor/harbor.yml", "HarborAdminPas", "V2ryStr@ngPss")
- log.InfoF("[install harbor] - harbor config changed success to => %s!", op.AgentServerInfo.ServerIPInV4)
+ log.InfoF("[install harbor] - harbor config file changed to => %s %s %s !\n", op.AgentServerInfo.ServerIPInV4, "8033", "V2ryStr@ngPss")
+
// install
log.Info("[install harbor] - going to start harbor !")
executor := ReadTimeCommandExecutor([]string{
@@ -1700,7 +1813,51 @@ func (op *AgentOsOperator) installHarborExec() (bool, []string) {
}
}
- msg := "[install harbor] - harbor start complete !"
+ return true, nil
+}
+
+func (op *AgentOsOperator) InstallHarborBastion() (bool, []string) {
+ // 抽离
+ checkHarborInstallExec, i := op.checkHarborInstallExec()
+ if !checkHarborInstallExec {
+ return false, i
+ }
+
+ // local file check exists
+ if !BasicFileExistAndNotNull("/root/wdd/harbor-offline-installer-v2.9.0.tgz") {
+ return false, []string{"[InstallHarborBastion] - harbor offline installer not exists !"}
+ }
+
+ // unzip
+ AllCompleteExecutor([][]string{
+ {
+ "tar",
+ "-zvxf",
+ "/root/wdd/harbor-offline-installer-v2.9.0.tgz",
+ "-C",
+ OctopusAgentInstallPrefix,
+ },
+ {
+ "rm",
+ "-rf",
+ "/root/wdd/harbor/harbor.yml",
+ },
+ })
+
+ // configuration
+ if !BasicAppendOverwriteContentToFile(beans.HarborTemplateFile, "/root/wdd/harbor/harbor.yml") {
+ return false, []string{
+ "[InstallHarborBastion] - harbor config file append failed !",
+ }
+ }
+
+ // install and config
+ installHarborAndConfig, i2 := op.installHarborAndConfig()
+ if !installHarborAndConfig {
+ return false, i2
+ }
+
+ msg := "[InstallHarborBastion] - harbor install SUCCESSES !"
log.Info(msg)
return true, []string{msg}
@@ -2197,7 +2354,7 @@ func (op *AgentOsOperator) installZSH() [][]string {
{
"mkdir",
"-p",
- "/root/wdd/",
+ OctopusAgentInstallPrefix,
},
append(
op.InstallCommandPrefix,
@@ -2331,7 +2488,7 @@ func (op *AgentOsOperator) installZSHExec() (bool, []string) {
BasicRemoveFolderComplete("/root/.oh-my-zsh")
BasicRemoveFolderComplete("/root/wdd/zsh-install.sh")
BasicRemoveFolderComplete("/root/wdd/oh-my-zsh-plugins-list.txt")
- BasicCreateFolder("/root/wdd/")
+ BasicCreateFolder(OctopusAgentInstallPrefix)
ok, resultLog := AllCommandExecutor(
append(op.InstallCommandPrefix, "zsh", "git"))
@@ -2348,7 +2505,7 @@ func (op *AgentOsOperator) installZSHExec() (bool, []string) {
}
log.InfoF("开始下载zsh的安装脚本 => %s", zshRemoteGitUrl)
- resultOk, l := BasicDownloadFileByCurl(zshRemoteGitUrl, "/root/wdd/zsh-install.sh")
+ resultOk, l := BasicDownloadFile(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 e321692..bd5b75e 100644
--- a/agent-go/a_executor/BasicFunction.go
+++ b/agent-go/a_executor/BasicFunction.go
@@ -578,6 +578,14 @@ func BasicDownloadFile(downloadUrl string, socksProxyUrl string, proxyUser strin
return false, resultLog
}
+ // check file exists
+ existAndNotNull := BasicFileExistAndNotNull(desFile)
+ if !existAndNotNull {
+ return false, []string{
+ "[BasicDownloadFile] - file not exist download error!",
+ }
+ }
+
return true, resultLog
}
@@ -724,6 +732,17 @@ func BasicAppendContentToFile(content string, targetFile string) bool {
return true
}
+// BasicAppendOverwriteContentToFile 向目标文件中写入一些内容,覆盖源文件
+func BasicAppendOverwriteContentToFile(content string, targetFile string) bool {
+
+ err := os.Remove(targetFile)
+ if err != nil {
+ log.WarnF("[BasicAppendOverwriteContentToFile] - Error removing file: %s , error is %s", targetFile, err.Error())
+ }
+
+ return BasicAppendContentToFile(content, targetFile)
+}
+
// BasicAppendNullToFile 清空一个文件
func BasicAppendNullToFile(targetFile string) bool {
diff --git a/agent-go/a_executor/beans/DockerDaemonConfig.go b/agent-go/a_executor/beans/DockerDaemonConfig.go
new file mode 100644
index 0000000..b8d78eb
--- /dev/null
+++ b/agent-go/a_executor/beans/DockerDaemonConfig.go
@@ -0,0 +1,112 @@
+package beans
+
+var ContainerdServiceFile = "/lib/systemd/system/containerd.service"
+var DockerSocketFile = "/lib/systemd/system/docker.socket"
+var DockerServiceFile = "/lib/systemd/system/docker.service"
+
+var ContainerdDaemonService = `
+# Copyright The containerd Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+[Unit]
+Description=containerd container runtime
+Documentation=https://containerd.io
+After=network.target local-fs.target
+
+[Service]
+ExecStartPre=-/sbin/modprobe overlay
+ExecStart=/usr/bin/containerd
+
+Type=notify
+Delegate=yes
+KillMode=process
+Restart=always
+RestartSec=5
+# Having non-zero Limit*s causes performance problems due to accounting overhead
+# in the kernel. We recommend using cgroups to do container-local accounting.
+LimitNPROC=infinity
+LimitCORE=infinity
+LimitNOFILE=infinity
+# Comment TasksMax if your systemd version does not supports it.
+# Only systemd 226 and above support this version.
+TasksMax=infinity
+OOMScoreAdjust=-999
+
+[Install]
+WantedBy=multi-user.target
+`
+
+var DockerSocketDaemonService = `
+[Unit]
+Description=Docker Socket for the API
+
+[Socket]
+ListenStream=/var/run/docker.sock
+SocketMode=0660
+SocketUser=root
+SocketGroup=docker
+
+[Install]
+WantedBy=sockets.target
+`
+
+var DockerDaemonService = `
+[Unit]
+Description=Docker Application Container Engine
+Documentation=https://docs.docker.com
+After=network-online.target docker.socket firewalld.service containerd.service
+Wants=network-online.target
+Requires=docker.socket containerd.service
+
+[Service]
+Type=notify
+# the default is not to use systemd for cgroups because the delegate issues still
+# exists and systemd currently does not support the cgroup feature set required
+# for containers run by docker
+ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
+ExecReload=/bin/kill -s HUP $MAINPID
+TimeoutSec=0
+RestartSec=2
+Restart=always
+
+# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
+# Both the old, and new location are accepted by systemd 229 and up, so using the old location
+# to make them work for either version of systemd.
+StartLimitBurst=3
+
+# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
+# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
+# this option work for either version of systemd.
+StartLimitInterval=60s
+
+# Having non-zero Limit*s causes performance problems due to accounting overhead
+# in the kernel. We recommend using cgroups to do container-local accounting.
+LimitNOFILE=infinity
+LimitNPROC=infinity
+LimitCORE=infinity
+
+# Comment TasksMax if your systemd version does not support it.
+# Only systemd 226 and above support this option.
+TasksMax=infinity
+
+# set delegate yes so that systemd does not reset the cgroups of docker containers
+Delegate=yes
+
+# kill only the docker process, not all processes in the cgroup
+KillMode=process
+OOMScoreAdjust=-500
+
+[Install]
+WantedBy=multi-user.target
+`
diff --git a/agent-go/a_executor/beans/HarborTemplateConfig.go b/agent-go/a_executor/beans/HarborTemplateConfig.go
new file mode 100644
index 0000000..29324bf
--- /dev/null
+++ b/agent-go/a_executor/beans/HarborTemplateConfig.go
@@ -0,0 +1,53 @@
+package beans
+
+var HarborTemplateFile = `
+hostname: HarborHostName
+
+http:
+ port: HarborHostPort
+
+harbor_admin_password: HarborAdminPas
+
+database:
+ password: HarborAdminPas
+ max_idle_conns: 50
+ max_open_conns: 1000
+ conn_max_lifetime: 3600
+ conn_max_idle_time: 3600
+
+data_volume: /var/lib/docker/harbor-data
+
+jobservice:
+ max_job_workers: 10
+ job_loggers:
+ - STD_OUTPUT
+ - FILE
+ logger_sweeper_duration: 3
+
+notification:
+ webhook_job_max_retry: 10
+ webhook_job_http_client_timeout: 10
+
+
+log:
+ level: warning
+ local:
+ rotate_count: 50
+ rotate_size: 200M
+ location: /var/log/harbor
+
+cache:
+ enabled: false
+ expire_hours: 24
+
+_version: 2.9.0
+
+proxy:
+ http_proxy:
+ https_proxy:
+ no_proxy:
+ components:
+ - core
+ - jobservice
+ - trivy
+`
diff --git a/agent-go/a_init/BastionInitializaion.go b/agent-go/a_init/BastionInitializaion.go
index d061f4c..f52db90 100644
--- a/agent-go/a_init/BastionInitializaion.go
+++ b/agent-go/a_init/BastionInitializaion.go
@@ -32,8 +32,9 @@ var AllFunctionCache = &bastion_init.Trie{}
const (
InstallDocker = "docker"
InstallDockerCompose = "dockercompose"
+ InstallHarbor = "harbor"
InstallMinio = "minio"
- InstallRabbitmq = "rabbitmq"
+ RemoveDocker = "removedocker"
Exit = "exit"
Help = "help"
)
@@ -102,15 +103,20 @@ func BastionModeInit() {
text = strings.TrimSpace(text)
inputCommand := uniformInputCommand(text)
fmt.Println("inputCommand: ", inputCommand)
+ fmt.Println()
// execute the function
switch inputCommand {
case InstallDocker:
- agentOperator.InstallDockerBastion()
+ beautifulPrintExeResult(agentOperator.InstallDockerBastion())
case InstallDockerCompose:
agentOperator.InstallDockerComposeBastion()
case InstallMinio:
agentOperator.InstallMinioBastion()
+ case InstallHarbor:
+ a_executor.InstallHarborBastion()
+ case RemoveDocker:
+ beautifulPrintExeResult(agentOperator.RemoveDockerBastion())
case Exit:
os.Exit(0)
case Help:
@@ -122,6 +128,19 @@ func BastionModeInit() {
}
+func beautifulPrintExeResult(resultOk bool, result []string) {
+ fmt.Println()
+ if resultOk {
+ fmt.Println("execute SUCCESS")
+ } else {
+ fmt.Println("execute FAIL")
+ }
+ for _, s := range result {
+ fmt.Println(s)
+ }
+ fmt.Println()
+}
+
func buildBastionModeFunction() {
// build the tree search node
log.Info("build the tree search node")
@@ -130,7 +149,8 @@ func buildBastionModeFunction() {
tcc.Insert(InstallDocker)
tcc.Insert(InstallDockerCompose)
tcc.Insert(InstallMinio)
- tcc.Insert(InstallRabbitmq)
+ tcc.Insert(InstallHarbor)
+ tcc.Insert(RemoveDocker)
tcc.Insert(Help)
tcc.Insert(Exit)
diff --git a/agent-go/a_init/bastion_init/DPSearch.go b/agent-go/a_init/bastion_init/DPSearch.go
new file mode 100644
index 0000000..4ab6b47
--- /dev/null
+++ b/agent-go/a_init/bastion_init/DPSearch.go
@@ -0,0 +1,98 @@
+package bastion_init
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+)
+
+type WordC struct {
+ Word string
+ Rank int
+}
+
+func normalize(s string) string {
+ // Convert to lowercase and replace hyphens with underscores for consistent comparison.
+ return strings.Map(func(r rune) rune {
+ if 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' {
+ return r
+ }
+ return '_'
+ }, s)
+}
+
+func levDpDist(s1, s2 string) int {
+ m, n := len(s1), len(s2)
+ if m == 0 {
+ return n
+ }
+ if n == 0 {
+ return m
+ }
+
+ dp := make([][]int, m+1)
+ for i := range dp {
+ dp[i] = make([]int, n+1)
+ }
+
+ for i := 1; i <= m; i++ {
+ for j := 1; j <= n; j++ {
+ cost := 0
+ if s1[i-1] != s2[j-1] {
+ cost = 1
+ }
+ dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + cost
+ }
+ }
+ return dp[m][n]
+}
+
+func min(a, b, c int) int {
+ minVal := a
+ if b < minVal {
+ minVal = b
+ }
+ if c < minVal {
+ minVal = c
+ }
+ return minVal
+}
+
+func FindClosestWordDp(words []string, prefix string) (string, error) {
+ normalizedPrefix := normalize(prefix)
+ normalizedWords := make([]string, len(words))
+ for i, word := range words {
+ normalizedWords[i] = normalize(word)
+ }
+
+ sort.Slice(normalizedWords, func(i, j int) bool {
+ return normalizedWords[i] < normalizedWords[j]
+ })
+
+ minDistance := levDpDist(normalizedPrefix, normalizedWords[0])
+ closestWord := normalizedWords[0]
+
+ for _, word := range normalizedWords {
+ distance := levDpDist(normalizedPrefix, word)
+ if distance < minDistance {
+ minDistance = distance
+ closestWord = word
+ }
+ }
+
+ // Replace underscores with hyphens and convert back to original case.
+ closestWord = strings.ReplaceAll(strings.ReplaceAll(strings.ToUpper(closestWord), "_", "-"), "\"", "")
+ return closestWord, nil
+}
+
+func main() {
+ words := []string{"Apple", "Apricot", "Apprentice", "Application"}
+ prefix := "AP"
+
+ closest, err := FindClosestWordDp(words, prefix)
+ if err != nil {
+ fmt.Println(err)
+ } else {
+ fmt.Printf("The closest word to '%s' is '%s'\n", prefix, closest)
+ }
+}
diff --git a/agent-go/a_init/bastion_init/TrieSearch_test.go b/agent-go/a_init/bastion_init/TrieSearch_test.go
index 4b6aa08..4162e56 100644
--- a/agent-go/a_init/bastion_init/TrieSearch_test.go
+++ b/agent-go/a_init/bastion_init/TrieSearch_test.go
@@ -19,3 +19,15 @@ func TestNewTrie(t *testing.T) {
fmt.Printf("The closest word to '%s' is '%s'\n", prefix, closest)
}
}
+
+func TestDp(t *testing.T) {
+ words := []string{"Apple", "Apricot", "Apprentice", "Application", "Docker-Compose", "Docker-Compose-File", "Docker-Compose-File-V2", "Docker-Compose-File-V3", "Docker-Compose-File-V4", "Docker-Compose-File-V5", "Docker-Compose-File-V6", "Docker-Co", "Install-Docker"}
+ prefix := "Install"
+
+ closest, err := FindClosestWordDp(words, prefix)
+ if err != nil {
+ fmt.Println(err)
+ } else {
+ fmt.Printf("The closest word to '%s' is '%s'\n", prefix, closest)
+ }
+}
diff --git a/cmii_operator/log/cmii-update-log.txt b/cmii_operator/log/cmii-update-log.txt
deleted file mode 100644
index fd4c69c..0000000
--- a/cmii_operator/log/cmii-update-log.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-2024-03-20-11-53-54 uavcloud-test cmii-uav-platform 5.4.0-staging 5.4.0-032001
-2024-03-20-11-55-04 uavcloud-test cmii-uav-device 5.5.0-integration 5.4.0-032001
-2024-03-20-11-56-42 uavcloud-test cmii-uav-surveillance 5.4.0-staging 5.4.0-032001
-2024-03-20-11-57-50 uavcloud-test cmii-uav-mission 5.4.0-staging 5.4.0-032001
-2024-03-20-13-47-06 uavcloud-demo cmii-uav-platform 5.4.0-031901 5.4.0-25263-ai-032001
-2024-03-20-14-18-39 uavcloud-test cmii-uav-platform 5.4.0-032001 5.4.0-032002
-2024-03-20-17-20-29 uavcloud-demo cmii-uav-industrial-portfolio 5.4.0-27348-032001 5.4.0-26714-032001
-2024-03-20-17-35-34 uavcloud-demo cmii-uav-platform 5.4.0-25263-ai-032001 5.4.0-26807-25263-emerg-ai-0320
-2024-03-20-17-46-10 uavcloud-demo cmii-uav-platform 5.4.0-26807-25263-emerg-ai-03205.4.0-26807-25263-emerg-ai-032002
-2024-03-21-10-00-49 uavcloud-demo cmii-uav-industrial-portfolio 5.4.0-27348-032001 5.4.0-27348-032101
-2024-03-21-14-32-38 uavcloud-demo cmii-uav-device 5.4.0-25916 5.4.0-0321
-2024-03-21-14-36-48 uavcloud-demo cmii-uav-alarm 5.4.0 5.4.0-0321
-2024-03-21-17-47-31 uavcloud-demo cmii-uav-industrial-portfolio 5.4.0-27348-032101 5.4.0-27348-0321
-2024-03-22-09-17-06 uavcloud-demo cmii-uav-industrial-portfolio 5.4.0-27348-0321 5.4.0-032201
-2024-03-22-14-02-05 uavcloud-demo cmii-uav-platform 5.4.0-25263-032011 5.4.0-25263-emerg-ai-032201
-2024-03-22-17-14-43 uavcloud-demo cmii-uav-platform-armypeople 5.4.0 5.4.0-26860-032201
-2024-03-22-17-17-15 uavcloud-demo cmii-uav-process 5.4.0 5.4.0-032201
-2024-03-26-16-27-58 uavcloud-demo cmii-uav-multilink 5.4.0 5.4.0-032602
-2024-03-26-17-11-29 uavcloud-test cmii-uav-platform 5.4.0-032002 5.4.0-032601
-2024-03-29-20-00-00 uavcloud-demo cmii-uav-waypoint 5.4.0-26768 5.4.0-032901
-2024-03-29-20-01-31 uavcloud-demo cmii-uav-mqtthandler 5.4.0-25916-032001 5.4.0-032901
-2024-03-29-20-02-58 uavcloud-demo cmii-uav-airspace 5.4.0-0319 5.4.0-032501
-2024-03-29-20-04-44 uavcloud-demo cmii-uav-platform-armypeople 5.4.0-032704 5.4.0-032901
-2024-03-29-20-04-48 uavcloud-demo cmii-uav-platform-open 5.4.0 5.4.0-032901
-2024-03-29-20-04-52 uavcloud-demo cmii-admin-data 5.4.0 5.4.0-032901
-2024-03-29-20-06-26 uavcloud-demo cmii-uav-industrial-portfolio 5.4.0-27348-032401 5.4.0-032901
-2024-03-29-20-09-25 uavcloud-demo cmii-uav-alarm 5.4.0-0321 5.4.0-032501
-2024-03-29-20-10-45 uavcloud-demo cmii-uav-device 5.4.0-0321 5.4.0-032501
-2024-03-29-20-12-18 uavcloud-demo cmii-suav-supervision 5.2.0 5.4.0-032501
-2024-04-08-14-28-00 uavcloud-devflightcmii-uav-industrial-portfolio 5.5.0-snapshot 5.4.0-040801
-2024-04-08-15-02-00 uavcloud-devflightcmii-uav-industrial-portfolio 5.4.0-040801 5.4.0-040802
-2024-04-08-17-30-00 uavcloud-devflightcmii-uav-industrial-portfolio 5.4.0-040802 5.4.0-040803
-2024-04-10-16-12-00 uavcloud-devflightcmii-uav-industrial-portfolio 5.5.0-snapshot 5.4.0-041001
-2024-04-12-17-30-30 uavcloud-devflightcmii-uav-threedsimulation 5.2.0-snapshot 5.4.0-041201
-2024-04-14-11-34-00 uavcloud-demo cmii-uav-surveillance 5.4.0-28028-0409 5.4.0-28028-041401
-2024-04-15-10-37-51 uavcloud-demo cmii-uav-platform-media 5.4.0 5.4.0-041401
-2024-04-15-17-35-00 uavcloud-demo cmii-uav-airspace 5.4.0-0402 5.4.0-041501
-2024-04-15-17-41-00 uavcloud-demo cmii-uav-platform 5.4.0-25263-041102 5.4.0-041501
-2024-04-16-10-24-00 uavcloud-demo cmii-uav-multilink 5.4.0-032701 5.4.0-041601
-2024-04-16-16-24-00 uavcloud-demo cmii-uav-airspace 5.4.0-041501 5.4.0-041601
-2024-04-16-16-25-20 uavcloud-demo cmii-admin-data 5.4.0-0403 5.4.0-041601
-2024-04-16-16-25-35 uavcloud-demo cmii-uav-platform-oms 5.4.0 5.4.0-041601
-2024-04-16-17-38-00 uavcloud-demo cmii-uav-platform-armypeople 5.4.0-041201 5.4.0-28028-041601
-2024-04-16-17-57-00 uavcloud-demo cmii-uav-platform-media 5.4.0-041401 5.4.0