mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	SSH认证支持sudo
This commit is contained in:
		@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user