mirror of
https://github.com/wavetermdev/backup.git
synced 2026-08-05 13:57:07 -07:00
remove lock around connecting remote
This commit is contained in:
+35
-19
@@ -294,10 +294,13 @@ func convertSSHOpts(opts *sstore.SSHOpts) shexec.SSHOpts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) error {
|
func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) (*os.File, error) {
|
||||||
|
msh.Lock.Lock()
|
||||||
|
defer msh.Lock.Unlock()
|
||||||
|
|
||||||
cmdPty, cmdTty, err := pty.Open()
|
cmdPty, cmdTty, err := pty.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
msh.ControllingPty = cmdPty
|
msh.ControllingPty = cmdPty
|
||||||
ecmd.ExtraFiles = append(ecmd.ExtraFiles, cmdTty)
|
ecmd.ExtraFiles = append(ecmd.ExtraFiles, cmdTty)
|
||||||
@@ -307,18 +310,28 @@ func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) error {
|
|||||||
ecmd.SysProcAttr.Setsid = true
|
ecmd.SysProcAttr.Setsid = true
|
||||||
ecmd.SysProcAttr.Setctty = true
|
ecmd.SysProcAttr.Setctty = true
|
||||||
ecmd.SysProcAttr.Ctty = len(ecmd.ExtraFiles) + 3 - 1
|
ecmd.SysProcAttr.Ctty = len(ecmd.ExtraFiles) + 3 - 1
|
||||||
return nil
|
return cmdPty, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msh *MShellProc) setErrorStatus(err error) {
|
||||||
|
msh.Lock.Lock()
|
||||||
|
defer msh.Lock.Unlock()
|
||||||
|
msh.Status = StatusError
|
||||||
|
msh.Err = err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (msh *MShellProc) getRemoteCopy() sstore.RemoteType {
|
||||||
|
msh.Lock.Lock()
|
||||||
|
defer msh.Lock.Unlock()
|
||||||
|
return *msh.Remote
|
||||||
}
|
}
|
||||||
|
|
||||||
func (msh *MShellProc) Launch() {
|
func (msh *MShellProc) Launch() {
|
||||||
msh.Lock.Lock()
|
remote := msh.getRemoteCopy()
|
||||||
defer msh.Lock.Unlock()
|
ecmd := convertSSHOpts(remote.SSHOpts).MakeSSHExecCmd(MShellServerCommand)
|
||||||
|
cmdPty, err := msh.addControllingTty(ecmd)
|
||||||
ecmd := convertSSHOpts(msh.Remote.SSHOpts).MakeSSHExecCmd(MShellServerCommand)
|
|
||||||
err := msh.addControllingTty(ecmd)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msh.Status = StatusError
|
msh.setErrorStatus(fmt.Errorf("cannot attach controlling tty to mshell command: %w", err))
|
||||||
msh.Err = fmt.Errorf("cannot attach controlling tty to mshell command: %w", err)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -326,12 +339,12 @@ func (msh *MShellProc) Launch() {
|
|||||||
ecmd.ExtraFiles[len(ecmd.ExtraFiles)-1].Close()
|
ecmd.ExtraFiles[len(ecmd.ExtraFiles)-1].Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
remoteName := msh.Remote.GetName()
|
remoteName := remote.GetName()
|
||||||
go func() {
|
go func() {
|
||||||
fmt.Printf("[c-pty %s] starting...\n", msh.Remote.GetName())
|
fmt.Printf("[c-pty %s] starting...\n", remote.GetName())
|
||||||
buf := make([]byte, 100)
|
buf := make([]byte, 100)
|
||||||
for {
|
for {
|
||||||
n, readErr := msh.ControllingPty.Read(buf)
|
n, readErr := cmdPty.Read(buf)
|
||||||
if readErr == io.EOF {
|
if readErr == io.EOF {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -348,21 +361,24 @@ func (msh *MShellProc) Launch() {
|
|||||||
if remoteName == "test2" {
|
if remoteName == "test2" {
|
||||||
go func() {
|
go func() {
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
msh.ControllingPty.Write([]byte(Test2Pw))
|
cmdPty.Write([]byte(Test2Pw))
|
||||||
fmt.Printf("[c-pty %s] wrote password!\n", remoteName)
|
fmt.Printf("[c-pty %s] wrote password!\n", remoteName)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
cproc, uname, err := shexec.MakeClientProc(ecmd)
|
cproc, uname, err := shexec.MakeClientProc(ecmd)
|
||||||
msh.UName = uname
|
msh.WithLock(func() {
|
||||||
|
msh.UName = uname
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msh.Status = StatusError
|
msh.setErrorStatus(err)
|
||||||
msh.Err = err
|
|
||||||
fmt.Printf("[error] connecting remote %s (%s): %v\n", msh.Remote.GetName(), msh.UName, err)
|
fmt.Printf("[error] connecting remote %s (%s): %v\n", msh.Remote.GetName(), msh.UName, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Printf("connected remote %s\n", msh.Remote.GetName())
|
fmt.Printf("connected remote %s\n", msh.Remote.GetName())
|
||||||
msh.ServerProc = cproc
|
msh.WithLock(func() {
|
||||||
msh.Status = StatusConnected
|
msh.ServerProc = cproc
|
||||||
|
msh.Status = StatusConnected
|
||||||
|
})
|
||||||
go func() {
|
go func() {
|
||||||
exitErr := cproc.Cmd.Wait()
|
exitErr := cproc.Cmd.Wait()
|
||||||
exitCode := shexec.GetExitCode(exitErr)
|
exitCode := shexec.GetExitCode(exitErr)
|
||||||
|
|||||||
Reference in New Issue
Block a user