From 24f129dbdaa8379f21d00da0fa24e8e5d5e13c51 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Sat, 9 Mar 2024 17:54:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BD=91=E5=85=83?= =?UTF-8?q?=E4=B8=BB=E6=9C=BASSH=E6=96=B9=E5=BC=8F=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=8E=AF=E5=A2=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_element/controller/ne_host.go | 83 +++++++++++++++++++ .../network_element/network_element.go | 5 ++ 2 files changed, 88 insertions(+) diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index c34996e1..7bf39555 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -271,3 +271,86 @@ func (s *NeHostController) Cmd(c *gin.Context) { return } } + +// 网元主机SSH方式检查服务器环境 +// +// POST /checkBySSH +func (s *NeHostController) CheckBySSH(c *gin.Context) { + language := ctx.AcceptLanguage(c) + var body model.NeHost + err := c.ShouldBindBodyWith(&body, binding.JSON) + if err != nil { + c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) + return + } + + var connSSH ssh.ConnSSH + body.CopyTo(&connSSH) + + // 创建链接SSH客户端 + client, err := connSSH.NewClient() + if err != nil { + // 连接主机失败,请检查连接参数后重试 + c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) + return + } + defer client.Close() + + // 结果信息数据 + data := map[string]any{ + "addr": body.Addr, // 服务器地址 + "kernelName": "-", // 内核名称 -s + "nodename": "-", // 网络节点主机名 -n + "kernelRelease": "-", // 内核发布版本 -r + "machine": "-", // 机器硬件名称 -m + "prettyName": "-", // 系统发行版本 + "sudo": false, // 可提权 + "sshLink": false, // 可直连 + } + + // 执行命令 检查系统环境 + output, err := client.RunCMD("uname -snrm && cat /etc/os-release | grep PRETTY_NAME") + if err != nil { + c.JSON(200, result.OkData(data)) + return + } + output = strings.TrimSuffix(output, "\n") + sysInfoArr := strings.SplitN(output, "\n", 2) + if len(sysInfoArr) == 2 { + // uname -snrm + baseInfoArr := strings.SplitN(sysInfoArr[0], " ", 4) + data["kernelName"] = baseInfoArr[0] + data["nodename"] = baseInfoArr[1] + data["kernelRelease"] = baseInfoArr[2] + data["machine"] = baseInfoArr[3] + // cat /etc/os-release | grep PRETTY_NAME + prettyName := sysInfoArr[1] + index := strings.Index(prettyName, `"`) + if index != -1 { + data["prettyName"] = prettyName[index+1 : len(prettyName)-1] + } + } + // 执行命令 检查sudo权限 + _, err = client.RunCMD("sudo -n uname") + if err == nil { + data["sudo"] = true + } else { + data["sudo"] = false + } + + // 本地免密创建链接直连 + lcoalConnSSH := ssh.ConnSSH{ + User: body.User, + Addr: body.Addr, + Port: body.Port, + } + lcoalClient, err := lcoalConnSSH.NewClientByLocalPrivate() + if err == nil { + data["sshLink"] = true + } else { + data["sshLink"] = false + } + defer lcoalClient.Close() + + c.JSON(200, result.OkData(data)) +} diff --git a/src/modules/network_element/network_element.go b/src/modules/network_element/network_element.go index 1d797040..9f4dd393 100644 --- a/src/modules/network_element/network_element.go +++ b/src/modules/network_element/network_element.go @@ -114,6 +114,11 @@ func Setup(router *gin.Engine) { collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)), controller.NewNeHost.Cmd, ) + neHostGroup.POST("/checkBySSH", + middleware.PreAuthorize(nil), + collectlogs.OperateLog(collectlogs.OptionNew("log.operate.title.neHost", collectlogs.BUSINESS_TYPE_OTHER)), + controller.NewNeHost.CheckBySSH, + ) } // 网元主机命令