SSH认证支持sudo

This commit is contained in:
GoEdgeLab
2021-12-06 19:27:11 +08:00
parent 97b34024c1
commit 48f7fc03cb
14 changed files with 382 additions and 130 deletions

View File

@@ -133,24 +133,6 @@ func (this *NodeQueue) InstallNode(nodeId int64, installStatus *models.NodeInsta
return errors.New("can not find user grant with id '" + numberutils.FormatInt64(loginParams.GrantId) + "'")
}
// 安装目录
installDir := node.InstallDir
if len(installDir) == 0 {
clusterId := node.ClusterId
cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(nil, int64(clusterId))
if err != nil {
return err
}
if cluster == nil {
return errors.New("can not find cluster, ID'" + fmt.Sprintf("%d", clusterId) + "'")
}
installDir = cluster.InstallDir
if len(installDir) == 0 {
// 默认是 $登录用户/edge-node
installDir = "/" + grant.Username + "/edge-node"
}
}
// API终端
apiNodes, err := models.SharedAPINodeDAO.FindAllEnabledAndOnAPINodes(nil)
if err != nil {
@@ -187,6 +169,7 @@ func (this *NodeQueue) InstallNode(nodeId int64, installStatus *models.NodeInsta
PrivateKey: grant.PrivateKey,
Passphrase: grant.Passphrase,
Method: grant.Method,
Sudo: grant.Su == 1,
})
if err != nil {
installStatus.ErrorCode = "SSH_LOGIN_FAILED"
@@ -196,6 +179,24 @@ func (this *NodeQueue) InstallNode(nodeId int64, installStatus *models.NodeInsta
_ = installer.Close()
}()
// 安装目录
installDir := node.InstallDir
if len(installDir) == 0 {
clusterId := node.ClusterId
cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(nil, int64(clusterId))
if err != nil {
return err
}
if cluster == nil {
return errors.New("can not find cluster, ID'" + fmt.Sprintf("%d", clusterId) + "'")
}
installDir = cluster.InstallDir
if len(installDir) == 0 {
// 默认是 $登录用户/edge-node
installDir = installer.client.UserHome() + "/edge-node"
}
}
err = installer.Install(installDir, params, installStatus)
return err
}
@@ -250,24 +251,6 @@ func (this *NodeQueue) StartNode(nodeId int64) error {
return errors.New("can not find user grant with id '" + numberutils.FormatInt64(loginParams.GrantId) + "'")
}
// 安装目录
installDir := node.InstallDir
if len(installDir) == 0 {
clusterId := node.ClusterId
cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(nil, int64(clusterId))
if err != nil {
return err
}
if cluster == nil {
return errors.New("can not find cluster, ID'" + fmt.Sprintf("%d", clusterId) + "'")
}
installDir = cluster.InstallDir
if len(installDir) == 0 {
// 默认是 $登录用户/edge-node
installDir = "/" + grant.Username + "/edge-node"
}
}
installer := &NodeInstaller{}
err = installer.Login(&Credentials{
Host: loginParams.Host,
@@ -277,6 +260,7 @@ func (this *NodeQueue) StartNode(nodeId int64) error {
PrivateKey: grant.PrivateKey,
Passphrase: grant.Passphrase,
Method: grant.Method,
Sudo: grant.Su == 1,
})
if err != nil {
return err
@@ -286,16 +270,16 @@ func (this *NodeQueue) StartNode(nodeId int64) error {
}()
// 检查命令是否存在
exeFile := installDir + "/edge-node/bin/edge-node"
_, err = installer.client.Stat(exeFile)
exe, err := this.lookupNodeExe(node, installer.client)
if err != nil {
return errors.New("edge node is not installed correctly, can not find executable file: " + exeFile)
return errors.New("edge node was not installed correctly, can not find executable file")
}
// 我们先尝试Systemd启动
_, _, _ = installer.client.Exec("systemctl start edge-node")
_, stderr, err := installer.client.Exec(exeFile + " start")
// 执行start
_, stderr, err := installer.client.Exec("sudo " + exe + " start")
if err != nil {
return errors.New("start failed: " + err.Error())
}
@@ -356,24 +340,6 @@ func (this *NodeQueue) StopNode(nodeId int64) error {
return errors.New("can not find user grant with id '" + numberutils.FormatInt64(loginParams.GrantId) + "'")
}
// 安装目录
installDir := node.InstallDir
if len(installDir) == 0 {
clusterId := node.ClusterId
cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(nil, int64(clusterId))
if err != nil {
return err
}
if cluster == nil {
return errors.New("can not find cluster, ID'" + fmt.Sprintf("%d", clusterId) + "'")
}
installDir = cluster.InstallDir
if len(installDir) == 0 {
// 默认是 $登录用户/edge-node
installDir = "/" + grant.Username + "/edge-node"
}
}
installer := &NodeInstaller{}
err = installer.Login(&Credentials{
Host: loginParams.Host,
@@ -383,6 +349,7 @@ func (this *NodeQueue) StopNode(nodeId int64) error {
PrivateKey: grant.PrivateKey,
Passphrase: grant.Passphrase,
Method: grant.Method,
Sudo: grant.Su == 1,
})
if err != nil {
return err
@@ -392,16 +359,16 @@ func (this *NodeQueue) StopNode(nodeId int64) error {
}()
// 检查命令是否存在
exeFile := installDir + "/edge-node/bin/edge-node"
_, err = installer.client.Stat(exeFile)
exe, err := this.lookupNodeExe(node, installer.client)
if err != nil {
return errors.New("edge node is not installed correctly, can not find executable file: " + exeFile)
return errors.New("edge node was not installed correctly, can not find executable file")
}
// 我们先尝试Systemd停止
_, _, _ = installer.client.Exec("systemctl stop edge-node")
_, stderr, err := installer.client.Exec(exeFile + " stop")
// 执行stop
_, stderr, err := installer.client.Exec(exe + " stop")
if err != nil {
return errors.New("stop failed: " + err.Error())
}
@@ -411,3 +378,38 @@ func (this *NodeQueue) StopNode(nodeId int64) error {
return nil
}
func (this *NodeQueue) lookupNodeExe(node *models.Node, client *SSHClient) (string, error) {
// 安装目录
var nodeDirs = []string{}
if len(node.InstallDir) > 0 {
nodeDirs = append(nodeDirs, node.InstallDir)
}
clusterId := node.ClusterId
cluster, err := models.SharedNodeClusterDAO.FindEnabledNodeCluster(nil, int64(clusterId))
if err != nil {
return "", err
}
if cluster == nil {
return "", errors.New("can not find cluster, ID'" + fmt.Sprintf("%d", clusterId) + "'")
}
if len(cluster.InstallDir) > 0 {
nodeDirs = append(nodeDirs, cluster.InstallDir)
}
// 默认是 $登录用户/edge-node
nodeDirs = append(nodeDirs, client.UserHome()+"/edge-node")
// edge-boot安装目录
nodeDirs = append(nodeDirs, "/usr/local/goedge")
for _, dir := range nodeDirs {
var path = dir + "/edge-node/bin/edge-node"
_, err := client.sftp.Stat(path)
if err == nil {
return path, nil
}
}
return "", nil
}