diff --git a/src/app/common/modals/viewremoteconndetail.tsx b/src/app/common/modals/viewremoteconndetail.tsx index f3fd3b52..e89d633b 100644 --- a/src/app/common/modals/viewremoteconndetail.tsx +++ b/src/app/common/modals/viewremoteconndetail.tsx @@ -140,12 +140,12 @@ class ViewRemoteConnDetailModal extends React.Component<{}, {}> { renderInstallStatus(remote: RemoteType): any { let statusStr: string = null; if (remote.installstatus == "disconnected") { - if (remote.needsmshellupgrade) { - statusStr = "mshell " + remote.mshellversion + " - needs upgrade"; - } else if (util.isBlank(remote.mshellversion)) { - statusStr = "mshell unknown"; + if (remote.needswaveshellupgrade) { + statusStr = "waveshell " + remote.waveshellversion + " - needs upgrade"; + } else if (util.isBlank(remote.waveshellversion)) { + statusStr = "waveshell unknown"; } else { - statusStr = "mshell " + remote.mshellversion + " - current"; + statusStr = "waveshell " + remote.waveshellversion + " - current"; } } else { statusStr = remote.installstatus; @@ -231,7 +231,7 @@ class ViewRemoteConnDetailModal extends React.Component<{}, {}> { } else if (remote.status == "disconnected") { buttons.push(connectButton); } else if (remote.status == "error") { - if (remote.needsmshellupgrade) { + if (remote.needswaveshellupgrade) { if (remote.installstatus == "connecting") { buttons.push(cancelInstallButton); } else { @@ -270,7 +270,7 @@ class ViewRemoteConnDetailModal extends React.Component<{}, {}> { } else if (remote.status == "error") { if (remote.noinitpk) { message = "Error, could not connect."; - } else if (remote.needsmshellupgrade) { + } else if (remote.needswaveshellupgrade) { if (remote.installstatus == "connecting") { message = "Installing..."; } else { diff --git a/src/types/custom.d.ts b/src/types/custom.d.ts index ea0b2a2e..78ecccc2 100644 --- a/src/types/custom.d.ts +++ b/src/types/custom.d.ts @@ -121,8 +121,8 @@ declare global { sshconfigsrc: string; archived: boolean; uname: string; - mshellversion: string; - needsmshellupgrade: boolean; + waveshellversion: string; + needswaveshellupgrade: boolean; noinitpk: boolean; authtype: string; waitingforpassword: boolean; diff --git a/waveshell/main-waveshell.go b/waveshell/main-waveshell.go index 64a8bf7c..93406fdf 100644 --- a/waveshell/main-waveshell.go +++ b/waveshell/main-waveshell.go @@ -28,7 +28,7 @@ func readFullRunPacket(packetParser *packet.PacketParser) (*packet.RunPacketType return runPacket, nil } if !ok { - return nil, fmt.Errorf("invalid packet '%s' sent to mshell", pk.GetType()) + return nil, fmt.Errorf("invalid packet '%s' sent to waveshell", pk.GetType()) } } return nil, fmt.Errorf("no run packet received") @@ -97,7 +97,7 @@ func handleSingle() { func handleUsage() { usage := ` -mshell is a helper program for wave terminal. it is used to execute commands +waveshell is a helper program for wave terminal. it is used to execute commands Options: --help - prints this message @@ -106,7 +106,7 @@ Options: --single - run a single command (connected to multiplexer) --single --version - return an init packet with version info -mshell does not open any external ports and does not require any additional permissions. +waveshell does not open any external ports and does not require any additional permissions. it communicates exclusively through stdin/stdout with an attached process via a JSON packet format. ` @@ -124,7 +124,7 @@ func main() { handleUsage() return } else if firstArg == "--version" { - fmt.Printf("mshell %s+%s\n", base.MShellVersion, base.BuildTime) + fmt.Printf("waveshell %s+%s\n", base.WaveshellVersion, base.BuildTime) return } else if firstArg == "--single" || firstArg == "--single-from-server" { base.ProcessType = base.ProcessType_WaveShellSingle diff --git a/waveshell/pkg/base/base.go b/waveshell/pkg/base/base.go index 5f85f30b..c28e2d0a 100644 --- a/waveshell/pkg/base/base.go +++ b/waveshell/pkg/base/base.go @@ -20,18 +20,18 @@ import ( ) const HomeVarName = "HOME" -const DefaultMShellHome = "~/.mshell" -const DefaultMShellName = "mshell" -const MShellPathVarName = "MSHELL_PATH" -const MShellHomeVarName = "MSHELL_HOME" -const MShellInstallBinVarName = "MSHELL_INSTALLBIN_PATH" +const DefaultWaveshellHome = "~/.mshell" +const DefaultWaveshellName = "mshell" +const WaveshellPathVarName = "MSHELL_PATH" +const WaveshellHomeVarName = "MSHELL_HOME" +const WaveshellInstallBinVarName = "MSHELL_INSTALLBIN_PATH" const SSHCommandVarName = "SSH_COMMAND" -const MShellDebugVarName = "MSHELL_DEBUG" +const WaveshellDebugVarName = "MSHELL_DEBUG" const SessionsDirBaseName = "sessions" const RcFilesDirBaseName = "rcfiles" -const MShellVersion = "v0.7.0" +const WaveshellVersion = "v0.7.0" const RemoteIdFile = "remoteid" -const DefaultMShellInstallBinDir = "/opt/mshell/bin" +const DefaultWaveshellInstallBinDir = "/opt/mshell/bin" const LogFileName = "mshell.log" const ForceDebugLog = false @@ -90,7 +90,7 @@ func Logf(fmtStr string, args ...interface{}) { } func InitDebugLog(prefix string) { - homeDir := GetMShellHomeDir() + homeDir := GetWaveshellHomeDir() err := os.MkdirAll(homeDir, 0777) if err != nil { return @@ -163,7 +163,7 @@ func (ckey CommandKey) Validate(typeStr string) error { } func HasDebugFlag(envMap map[string]string, flagName string) bool { - msDebug := envMap[MShellDebugVarName] + msDebug := envMap[WaveshellDebugVarName] flags := strings.Split(msDebug, ",") for _, flag := range flags { if strings.TrimSpace(flag) == flagName { @@ -174,13 +174,13 @@ func HasDebugFlag(envMap map[string]string, flagName string) bool { } func GetDebugRcFileName() string { - msHome := GetMShellHomeDir() - return path.Join(msHome, DebugRcFileName) + wsHome := GetWaveshellHomeDir() + return path.Join(wsHome, DebugRcFileName) } func GetDebugReturnStateFileName() string { - msHome := GetMShellHomeDir() - return path.Join(msHome, DebugReturnStateFileName) + wsHome := GetWaveshellHomeDir() + return path.Join(wsHome, DebugReturnStateFileName) } func GetHomeDir() string { @@ -191,16 +191,16 @@ func GetHomeDir() string { return homeVar } -func GetMShellHomeDir() string { - homeVar := os.Getenv(MShellHomeVarName) +func GetWaveshellHomeDir() string { + homeVar := os.Getenv(WaveshellHomeVarName) if homeVar != "" { return homeVar } - return ExpandHomeDir(DefaultMShellHome) + return ExpandHomeDir(DefaultWaveshellHome) } func EnsureRcFilesDir() (string, error) { - mhome := GetMShellHomeDir() + mhome := GetWaveshellHomeDir() dirName := path.Join(mhome, RcFilesDirBaseName) err := CacheEnsureDir(dirName, RcFilesDirBaseName, 0700, "rcfiles dir") if err != nil { @@ -209,18 +209,18 @@ func EnsureRcFilesDir() (string, error) { return dirName, nil } -func GetMShellPath() (string, error) { - msPath := os.Getenv(MShellPathVarName) // use MSHELL_PATH - if msPath != "" { - return exec.LookPath(msPath) +func GetWaveshellPath() (string, error) { + wsPath := os.Getenv(WaveshellPathVarName) // use MSHELL_PATH -- will require rename + if wsPath != "" { + return exec.LookPath(wsPath) } - mhome := GetMShellHomeDir() - userMShellPath := path.Join(mhome, DefaultMShellName) // look in ~/.mshell - msPath, err := exec.LookPath(userMShellPath) + mhome := GetWaveshellHomeDir() + userWaveshellPath := path.Join(mhome, DefaultWaveshellName) // look in ~/.mshell -- will require rename + wsPath, err := exec.LookPath(userWaveshellPath) if err == nil { - return msPath, nil + return wsPath, nil } - return exec.LookPath(DefaultMShellName) // standard path lookup for 'mshell' + return exec.LookPath(DefaultWaveshellName) // standard path lookup for 'mshell'-- will require rename } func ExpandHomeDir(pathStr string) string { @@ -239,9 +239,9 @@ func ValidGoArch(goos string, goarch string) bool { } func GoArchOptFile(version string, goos string, goarch string) string { - installBinDir := os.Getenv(MShellInstallBinVarName) + installBinDir := os.Getenv(WaveshellInstallBinVarName) if installBinDir == "" { - installBinDir = DefaultMShellInstallBinDir + installBinDir = DefaultWaveshellInstallBinDir } versionStr := semver.MajorMinor(version) if versionStr == "" { @@ -252,22 +252,22 @@ func GoArchOptFile(version string, goos string, goarch string) string { } func GetRemoteId() (string, error) { - mhome := GetMShellHomeDir() - homeInfo, err := os.Stat(mhome) + wsHome := GetWaveshellHomeDir() + homeInfo, err := os.Stat(wsHome) if errors.Is(err, fs.ErrNotExist) { - err = os.MkdirAll(mhome, 0777) + err = os.MkdirAll(wsHome, 0777) if err != nil { - return "", fmt.Errorf("cannot make mshell home directory[%s]: %w", mhome, err) + return "", fmt.Errorf("cannot make waveshell home directory[%s]: %w", wsHome, err) } - homeInfo, err = os.Stat(mhome) + homeInfo, err = os.Stat(wsHome) } if err != nil { - return "", fmt.Errorf("cannot stat mshell home directory[%s]: %w", mhome, err) + return "", fmt.Errorf("cannot stat waveshell home directory[%s]: %w", wsHome, err) } if !homeInfo.IsDir() { - return "", fmt.Errorf("mshell home directory[%s] is not a directory", mhome) + return "", fmt.Errorf("waveshell home directory[%s] is not a directory", wsHome) } - remoteIdFile := path.Join(mhome, RemoteIdFile) + remoteIdFile := path.Join(wsHome, RemoteIdFile) fd, err := os.Open(remoteIdFile) if errors.Is(err, fs.ErrNotExist) { // write the file diff --git a/waveshell/pkg/packet/packet.go b/waveshell/pkg/packet/packet.go index 6887324d..553e16e6 100644 --- a/waveshell/pkg/packet/packet.go +++ b/waveshell/pkg/packet/packet.go @@ -687,18 +687,18 @@ func FmtMessagePacket(fmtStr string, args ...interface{}) *MessagePacketType { } type InitPacketType struct { - Type string `json:"type"` - RespId string `json:"respid,omitempty"` - Version string `json:"version"` - BuildTime string `json:"buildtime,omitempty"` - MShellHomeDir string `json:"mshellhomedir,omitempty"` - HomeDir string `json:"homedir,omitempty"` - User string `json:"user,omitempty"` - HostName string `json:"hostname,omitempty"` - NotFound bool `json:"notfound,omitempty"` - UName string `json:"uname,omitempty"` - Shell string `json:"shell,omitempty"` - RemoteId string `json:"remoteid,omitempty"` + Type string `json:"type"` + RespId string `json:"respid,omitempty"` + Version string `json:"version"` + BuildTime string `json:"buildtime,omitempty"` + WaveshellHomeDir string `json:"waveshellhomedir,omitempty"` + HomeDir string `json:"homedir,omitempty"` + User string `json:"user,omitempty"` + HostName string `json:"hostname,omitempty"` + NotFound bool `json:"notfound,omitempty"` + UName string `json:"uname,omitempty"` + Shell string `json:"shell,omitempty"` + RemoteId string `json:"remoteid,omitempty"` } func (*InitPacketType) GetType() string { @@ -772,12 +772,12 @@ func MakeCmdDonePacket(ck base.CommandKey) *CmdDonePacketType { } type CmdStartPacketType struct { - Type string `json:"type"` - RespId string `json:"respid,omitempty"` - Ts int64 `json:"ts"` - CK base.CommandKey `json:"ck"` - Pid int `json:"pid,omitempty"` - MShellPid int `json:"mshellpid,omitempty"` + Type string `json:"type"` + RespId string `json:"respid,omitempty"` + Ts int64 `json:"ts"` + CK base.CommandKey `json:"ck"` + Pid int `json:"pid,omitempty"` + WaveshellPid int `json:"waveshellpid,omitempty"` } func (*CmdStartPacketType) GetType() string { diff --git a/waveshell/pkg/server/server.go b/waveshell/pkg/server/server.go index 520c7d1b..1de50a0e 100644 --- a/waveshell/pkg/server/server.go +++ b/waveshell/pkg/server/server.go @@ -455,7 +455,7 @@ func (m *MServer) writeFile(pk *packet.WriteFilePacketType, wfc *WriteFileContex } var writeFd *os.File if pk.UseTemp { - writeFd, err = os.CreateTemp("", "mshell.writefile.*") // "" means make this file in standard TempDir + writeFd, err = os.CreateTemp("", "waveshell.writefile.*") // "" means make this file in standard TempDir if err != nil { resp := packet.MakeWriteFileReadyPacket(pk.ReqId) resp.Error = fmt.Sprintf("cannot create temp file: %v", err) @@ -754,14 +754,14 @@ func (m *MServer) runCommand(runPacket *packet.RunPacketType) { m.Sender.SendErrorResponse(runPacket.ReqId, fmt.Errorf("test error")) return } - ecmd, err := shexec.MakeMShellSingleCmd() + ecmd, err := shexec.MakeWaveshellSingleCmd() if err != nil { m.Sender.SendErrorResponse(runPacket.ReqId, fmt.Errorf("server run packets require valid ck: %s", err)) return } cproc, err := shexec.MakeClientProc(context.Background(), shexec.CmdWrap{Cmd: ecmd}) if err != nil { - m.Sender.SendErrorResponse(runPacket.ReqId, fmt.Errorf("starting mshell client: %s", err)) + m.Sender.SendErrorResponse(runPacket.ReqId, fmt.Errorf("starting waveshell client: %s", err)) return } m.Lock.Lock() @@ -833,7 +833,7 @@ func (server *MServer) runReadLoop() { } continue } - server.Sender.SendMessageFmt("invalid packet '%s' sent to mshell server", packet.AsString(pk)) + server.Sender.SendMessageFmt("invalid packet '%s' sent to waveshell server", packet.AsString(pk)) continue } } diff --git a/waveshell/pkg/shellapi/shellapi.go b/waveshell/pkg/shellapi/shellapi.go index db758758..eca26c51 100644 --- a/waveshell/pkg/shellapi/shellapi.go +++ b/waveshell/pkg/shellapi/shellapi.go @@ -162,7 +162,7 @@ const FirstExtraFilesFdNum = 3 func StreamCommandWithExtraFd(ctx context.Context, ecmd *exec.Cmd, outputCh chan []byte, extraFdNum int, endBytes []byte, stdinDataCh chan []byte) ([]byte, error) { defer close(outputCh) ecmd.Env = os.Environ() - shellutil.UpdateCmdEnv(ecmd, shellutil.MShellEnvVars(shellutil.DefaultTermType)) + shellutil.UpdateCmdEnv(ecmd, shellutil.WaveshellEnvVars(shellutil.DefaultTermType)) cmdPty, cmdTty, err := pty.Open() if err != nil { return nil, fmt.Errorf("opening new pty: %w", err) @@ -232,7 +232,7 @@ func StreamCommandWithExtraFd(ctx context.Context, ecmd *exec.Cmd, outputCh chan func RunSimpleCmdInPty(ecmd *exec.Cmd, endBytes []byte) ([]byte, error) { ecmd.Env = os.Environ() - shellutil.UpdateCmdEnv(ecmd, shellutil.MShellEnvVars(shellutil.DefaultTermType)) + shellutil.UpdateCmdEnv(ecmd, shellutil.WaveshellEnvVars(shellutil.DefaultTermType)) cmdPty, cmdTty, err := pty.Open() if err != nil { return nil, fmt.Errorf("opening new pty: %w", err) @@ -311,8 +311,8 @@ func parseExtVarOutput(pvarBytes []byte, promptOutput string, zmodsOutput string // for debugging (not for production use) func writeStateToFile(shellType string, outputBytes []byte) error { - msHome := base.GetMShellHomeDir() - stateFileName := path.Join(msHome, shellType+"-state.txt") + wsHome := base.GetWaveshellHomeDir() + stateFileName := path.Join(wsHome, shellType+"-state.txt") os.WriteFile(stateFileName, outputBytes, 0644) return nil } diff --git a/waveshell/pkg/shellutil/shellutil.go b/waveshell/pkg/shellutil/shellutil.go index 8ba4c79e..6a9f612b 100644 --- a/waveshell/pkg/shellutil/shellutil.go +++ b/waveshell/pkg/shellutil/shellutil.go @@ -15,13 +15,13 @@ const DefaultTermType = "xterm-256color" const DefaultTermRows = 24 const DefaultTermCols = 80 -func MShellEnvVars(termType string) map[string]string { +func WaveshellEnvVars(termType string) map[string]string { rtn := make(map[string]string) if termType != "" { rtn["TERM"] = termType } rtn["WAVESHELL"], _ = os.Executable() - rtn["WAVESHELL_VERSION"] = base.MShellVersion + rtn["WAVESHELL_VERSION"] = base.WaveshellVersion return rtn } diff --git a/waveshell/pkg/shexec/client.go b/waveshell/pkg/shexec/client.go index 04aea9b6..65712fae 100644 --- a/waveshell/pkg/shexec/client.go +++ b/waveshell/pkg/shexec/client.go @@ -170,8 +170,8 @@ type WaveshellLaunchError struct { func (wle WaveshellLaunchError) Error() string { if wle.InitPk.NotFound { return "waveshell client not found" - } else if semver.MajorMinor(wle.InitPk.Version) != semver.MajorMinor(base.MShellVersion) { - return fmt.Sprintf("invalid remote waveshell version '%s', must be '=%s'", wle.InitPk.Version, semver.MajorMinor(base.MShellVersion)) + } else if semver.MajorMinor(wle.InitPk.Version) != semver.MajorMinor(base.WaveshellVersion) { + return fmt.Sprintf("invalid remote waveshell version '%s', must be '=%s'", wle.InitPk.Version, semver.MajorMinor(base.WaveshellVersion)) } return fmt.Sprintf("invalid waveshell: init packet=%v", *wle.InitPk) } @@ -232,7 +232,7 @@ func MakeClientProc(ctx context.Context, ecmd ConnInterface) (*ClientProc, error cproc.Close() return nil, WaveshellLaunchError{InitPk: initPk} } - if semver.MajorMinor(initPk.Version) != semver.MajorMinor(base.MShellVersion) { + if semver.MajorMinor(initPk.Version) != semver.MajorMinor(base.WaveshellVersion) { cproc.Close() return nil, WaveshellLaunchError{InitPk: initPk} } diff --git a/waveshell/pkg/shexec/shexec.go b/waveshell/pkg/shexec/shexec.go index a7ae780b..3f4c115c 100644 --- a/waveshell/pkg/shexec/shexec.go +++ b/waveshell/pkg/shexec/shexec.go @@ -72,7 +72,7 @@ fi ` func MakeClientCommandStr() string { - return strings.ReplaceAll(ClientCommandFmt, "[%VERSION%]", semver.MajorMinor(base.MShellVersion)) + return strings.ReplaceAll(ClientCommandFmt, "[%VERSION%]", semver.MajorMinor(base.WaveshellVersion)) } const InstallCommandFmt = ` @@ -88,10 +88,10 @@ fi ` func MakeInstallCommandStr() string { - return strings.ReplaceAll(InstallCommandFmt, "[%VERSION%]", semver.MajorMinor(base.MShellVersion)) + return strings.ReplaceAll(InstallCommandFmt, "[%VERSION%]", semver.MajorMinor(base.WaveshellVersion)) } -type MShellBinaryReaderFn func(version string, goos string, goarch string) (io.ReadCloser, error) +type WaveshellBinaryReaderFn func(version string, goos string, goarch string) (io.ReadCloser, error) type ReturnStateBuf struct { Lock *sync.Mutex @@ -277,7 +277,7 @@ func (c *ShExecType) MakeCmdStartPacket(reqId string) *packet.CmdStartPacketType startPacket.Ts = time.Now().UnixMilli() startPacket.CK = c.CK startPacket.Pid = c.Cmd.Process.Pid - startPacket.MShellPid = os.Getpid() + startPacket.WaveshellPid = os.Getpid() return startPacket } @@ -295,7 +295,7 @@ func MakeSimpleStaticWriterPipe(data []byte) (*os.File, error) { } func MakeRunnerExec(ck base.CommandKey) (*exec.Cmd, error) { - msPath, err := base.GetMShellPath() + msPath, err := base.GetWaveshellPath() if err != nil { return nil, err } @@ -317,7 +317,7 @@ func MakeDetachedExecCmd(pk *packet.RunPacketType, cmdTty *os.File) (*exec.Cmd, ecmd.Env = os.Environ() } shellutil.UpdateCmdEnv(ecmd, shellenv.EnvMapFromState(state)) - shellutil.UpdateCmdEnv(ecmd, shellutil.MShellEnvVars(getTermType(pk))) + shellutil.UpdateCmdEnv(ecmd, shellutil.WaveshellEnvVars(getTermType(pk))) if state.Cwd != "" { ecmd.Dir = base.ExpandHomeDir(state.Cwd) } @@ -470,10 +470,10 @@ type ClientOpts struct { UsePty bool } -func MakeMShellSingleCmd() (*exec.Cmd, error) { +func MakeWaveshellSingleCmd() (*exec.Cmd, error) { execFile, err := os.Executable() if err != nil { - return nil, fmt.Errorf("cannot find local mshell executable: %w", err) + return nil, fmt.Errorf("cannot find local waveshell executable: %w", err) } ecmd := exec.Command(execFile, "--single-from-server") return ecmd, nil @@ -528,31 +528,6 @@ func (opts SSHOpts) MakeSSHExecCmd(remoteCommand string, sapi shellapi.ShellApi) } } -func (opts SSHOpts) MakeMShellSSHOpts() string { - var moreSSHOpts []string - if opts.SSHIdentity != "" { - identityOpt := fmt.Sprintf("-i %s", shellescape.Quote(opts.SSHIdentity)) - moreSSHOpts = append(moreSSHOpts, identityOpt) - } - if opts.SSHUser != "" { - userOpt := fmt.Sprintf("-l %s", shellescape.Quote(opts.SSHUser)) - moreSSHOpts = append(moreSSHOpts, userOpt) - } - if opts.SSHPort != 0 { - portOpt := fmt.Sprintf("-p %d", opts.SSHPort) - moreSSHOpts = append(moreSSHOpts, portOpt) - } - if opts.SSHOptsStr != "" { - optsOpt := fmt.Sprintf("--ssh-opts %s", shellescape.Quote(opts.SSHOptsStr)) - moreSSHOpts = append(moreSSHOpts, optsOpt) - } - if opts.SSHHost != "" { - sshArg := fmt.Sprintf("--ssh %s", shellescape.Quote(opts.SSHHost)) - moreSSHOpts = append(moreSSHOpts, sshArg) - } - return strings.Join(moreSSHOpts, " ") -} - func GetTerminalSize() (int, int, error) { fd, err := os.Open("/dev/tty") if err != nil { @@ -610,19 +585,19 @@ func ValidateRemoteFds(rfds []packet.RemoteFd) error { dupMap := make(map[int]bool) for _, rfd := range rfds { if rfd.FdNum < 0 { - return fmt.Errorf("mshell negative fd numbers fd=%d", rfd.FdNum) + return fmt.Errorf("waveshell negative fd numbers fd=%d", rfd.FdNum) } if rfd.FdNum < FirstExtraFilesFdNum { - return fmt.Errorf("mshell does not support re-opening fd=%d (0, 1, and 2, are always open)", rfd.FdNum) + return fmt.Errorf("waveshell does not support re-opening fd=%d (0, 1, and 2, are always open)", rfd.FdNum) } if rfd.FdNum > MaxFdNum { - return fmt.Errorf("mshell does not support opening fd numbers above %d", MaxFdNum) + return fmt.Errorf("waveshell does not support opening fd numbers above %d", MaxFdNum) } if dupMap[rfd.FdNum] { - return fmt.Errorf("mshell got duplicate entries for fd=%d", rfd.FdNum) + return fmt.Errorf("waveshell got duplicate entries for fd=%d", rfd.FdNum) } if rfd.Read && rfd.Write { - return fmt.Errorf("mshell does not support opening fd numbers for reading and writing, fd=%d", rfd.FdNum) + return fmt.Errorf("waveshell does not support opening fd numbers for reading and writing, fd=%d", rfd.FdNum) } if !rfd.Read && !rfd.Write { return fmt.Errorf("invalid fd=%d, neither reading or writing mode specified", rfd.FdNum) @@ -632,14 +607,14 @@ func ValidateRemoteFds(rfds []packet.RemoteFd) error { return nil } -func sendMShellBinary(input io.WriteCloser, mshellStream io.Reader) { +func sendWaveshellBinary(input io.WriteCloser, waveshellStream io.Reader) { go func() { defer input.Close() - io.Copy(input, mshellStream) + io.Copy(input, waveshellStream) }() } -func RunInstallFromCmd(ctx context.Context, ecmd ConnInterface, tryDetect bool, mshellStream io.Reader, mshellReaderFn MShellBinaryReaderFn, msgFn func(string)) error { +func RunInstallFromCmd(ctx context.Context, ecmd ConnInterface, tryDetect bool, waveshellStream io.Reader, waveshellReaderFn WaveshellBinaryReaderFn, msgFn func(string)) error { inputWriter, err := ecmd.StdinPipe() if err != nil { return fmt.Errorf("creating stdin pipe: %v", err) @@ -655,8 +630,8 @@ func RunInstallFromCmd(ctx context.Context, ecmd ConnInterface, tryDetect bool, go func() { io.Copy(os.Stderr, stderrReader) }() - if mshellStream != nil { - sendMShellBinary(inputWriter, mshellStream) + if waveshellStream != nil { + sendWaveshellBinary(inputWriter, waveshellStream) } packetParser := packet.MakePacketParser(stdoutReader, nil) err = ecmd.Start() @@ -686,24 +661,24 @@ func RunInstallFromCmd(ctx context.Context, ecmd ConnInterface, tryDetect bool, } goos, goarch, err := DetectGoArch(initPacket.UName) if err != nil { - return fmt.Errorf("arch cannot be detected (might be incompatible with mshell): %w", err) + return fmt.Errorf("arch cannot be detected (might be incompatible with waveshell): %w", err) } - msgStr := fmt.Sprintf("mshell detected remote architecture as '%s.%s'\n", goos, goarch) + msgStr := fmt.Sprintf("waveshell detected remote architecture as '%s.%s'\n", goos, goarch) msgFn(msgStr) - detectedMSS, err := mshellReaderFn(base.MShellVersion, goos, goarch) + detectedMSS, err := waveshellReaderFn(base.WaveshellVersion, goos, goarch) if err != nil { return err } defer detectedMSS.Close() - sendMShellBinary(inputWriter, detectedMSS) + sendWaveshellBinary(inputWriter, detectedMSS) continue } if pk.GetType() == packet.InitPacketStr && !firstInit { initPacket := pk.(*packet.InitPacketType) - if initPacket.Version == base.MShellVersion { + if initPacket.Version == base.WaveshellVersion { return nil } - return fmt.Errorf("invalid version '%s' received from client, expecting '%s'", initPacket.Version, base.MShellVersion) + return fmt.Errorf("invalid version '%s' received from client, expecting '%s'", initPacket.Version, base.WaveshellVersion) } if pk.GetType() == packet.RawPacketStr { rawPk := pk.(*packet.RawPacketType) @@ -770,7 +745,7 @@ func DetectGoArch(uname string) (string, string, error) { osVal := strings.TrimSpace(strings.ToLower(fields[0])) archVal := strings.TrimSpace(strings.ToLower(fields[1])) if osVal != "darwin" && osVal != "linux" { - return "", "", fmt.Errorf("invalid uname OS '%s', mshell only supports OS X (darwin) and linux", osVal) + return "", "", fmt.Errorf("invalid uname OS '%s', waveshell only supports OS X (darwin) and linux", osVal) } goos := osVal goarch := "" @@ -780,7 +755,7 @@ func DetectGoArch(uname string) (string, string, error) { goarch = "arm64" } if goarch == "" { - return "", "", fmt.Errorf("invalid uname machine type '%s', mshell only supports aarch64 (amd64) and x86_64 (amd64)", archVal) + return "", "", fmt.Errorf("invalid uname machine type '%s', waveshell only supports aarch64 (amd64) and x86_64 (amd64)", archVal) } if !base.ValidGoArch(goos, goarch) { return "", "", fmt.Errorf("invalid arch detected %s.%s", goos, goarch) @@ -975,7 +950,7 @@ func RunCommandSimple(pk *packet.RunPacketType, sender *packet.PacketSender, fro cmdTty.Close() }() cmd.CmdPty = cmdPty - shellutil.UpdateCmdEnv(cmd.Cmd, shellutil.MShellEnvVars(getTermType(pk))) + shellutil.UpdateCmdEnv(cmd.Cmd, shellutil.WaveshellEnvVars(getTermType(pk))) } if cmdTty != nil { cmd.Cmd.Stdin = cmdTty @@ -1151,8 +1126,8 @@ func (rs *ReturnStateBuf) Run() { } } -// in detached run mode, we don't want mshell to die from signals -// since we want mshell to persist even if the mshell --server is terminated +// in detached run mode, we don't want waveshell to die from signals since +// we want waveshell to persist even if the waveshell --server is terminated func SetupSignalsForDetach() { sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGPIPE) @@ -1163,8 +1138,8 @@ func SetupSignalsForDetach() { }() } -// in detached run mode, we don't want mshell to die from signals -// since we want mshell to persist even if the mshell --server is terminated +// in detached run mode, we don't want waveshell to die from signals since +// we want waveshell to persist even if the waveshell --server is terminated func IgnoreSigPipe() { sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGPIPE) @@ -1241,10 +1216,10 @@ func (c *ShExecType) WaitForCommand() *packet.CmdDonePacketType { func MakeInitPacket() *packet.InitPacketType { initPacket := packet.MakeInitPacket() - initPacket.Version = base.MShellVersion + initPacket.Version = base.WaveshellVersion initPacket.BuildTime = base.BuildTime initPacket.HomeDir = base.GetHomeDir() - initPacket.MShellHomeDir = base.GetMShellHomeDir() + initPacket.WaveshellHomeDir = base.GetWaveshellHomeDir() if user, _ := user.Current(); user != nil { initPacket.User = user.Username } diff --git a/wavesrv/cmd/main-server.go b/wavesrv/cmd/main-server.go index ce1d9861..0bc6b944 100644 --- a/wavesrv/cmd/main-server.go +++ b/wavesrv/cmd/main-server.go @@ -452,12 +452,12 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { WriteJsonError(w, fmt.Errorf("invalid line, no remote")) return } - msh := remote.GetRemoteById(cmd.Remote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(cmd.Remote.RemoteId) + if wsh == nil { WriteJsonError(w, fmt.Errorf("invalid line, cannot resolve remote")) return } - rrState := msh.GetRemoteRuntimeState() + rrState := wsh.GetRemoteRuntimeState() fullPath, err := rrState.ExpandHomeDir(params.Path) if err != nil { WriteJsonError(w, fmt.Errorf("error expanding homedir: %v", err)) @@ -472,7 +472,7 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { } else { writePk.Path = filepath.Join(cwd, fullPath) } - iter, err := msh.PacketRpcIter(r.Context(), writePk) + iter, err := wsh.PacketRpcIter(r.Context(), writePk) if err != nil { WriteJsonError(w, fmt.Errorf("error: %v", err)) return @@ -502,7 +502,7 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { } else if err != nil { dataErr := fmt.Errorf("error reading file data: %v", err) dataPk.Error = dataErr.Error() - msh.SendFileData(dataPk) + wsh.SendFileData(dataPk) WriteJsonError(w, dataErr) return } @@ -510,7 +510,7 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { dataPk.Data = make([]byte, nr) copy(dataPk.Data, bufSlice[0:nr]) } - msh.SendFileData(dataPk) + wsh.SendFileData(dataPk) if dataPk.Eof { break } @@ -581,13 +581,13 @@ func HandleReadFile(w http.ResponseWriter, r *http.Request) { w.Write([]byte("invalid line, no remote")) return } - msh := remote.GetRemoteById(cmd.Remote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(cmd.Remote.RemoteId) + if wsh == nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte("invalid line, cannot resolve remote")) return } - rrState := msh.GetRemoteRuntimeState() + rrState := wsh.GetRemoteRuntimeState() fullPath, err := rrState.ExpandHomeDir(path) if err != nil { WriteJsonError(w, fmt.Errorf("error expanding homedir: %v", err)) @@ -601,7 +601,7 @@ func HandleReadFile(w http.ResponseWriter, r *http.Request) { } else { streamPk.Path = filepath.Join(cwd, fullPath) } - iter, err := msh.StreamFile(r.Context(), streamPk) + iter, err := wsh.StreamFile(r.Context(), streamPk) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(fmt.Sprintf("error trying to stream file: %v", err))) diff --git a/wavesrv/pkg/cmdrunner/cmdrunner.go b/wavesrv/pkg/cmdrunner/cmdrunner.go index caadecc9..47b01fcb 100644 --- a/wavesrv/pkg/cmdrunner/cmdrunner.go +++ b/wavesrv/pkg/cmdrunner/cmdrunner.go @@ -1311,7 +1311,7 @@ func checkForWriteFinished(ctx context.Context, iter *packet.RpcResponseIter) er return nil } -func doCopyLocalFileToRemote(ctx context.Context, cmd *sstore.CmdType, remote_msh *remote.MShellProc, localPath string, destPath string, outputPos int64) { +func doCopyLocalFileToRemote(ctx context.Context, cmd *sstore.CmdType, remoteWsh *remote.WaveshellProc, localPath string, destPath string, outputPos int64) { var exitSuccess bool startTime := time.Now() defer func() { @@ -1326,7 +1326,7 @@ func doCopyLocalFileToRemote(ctx context.Context, cmd *sstore.CmdType, remote_ms writePk := packet.MakeWriteFilePacket() writePk.ReqId = uuid.New().String() writePk.Path = destPath - iter, err := remote_msh.WriteFile(ctx, writePk) + iter, err := remoteWsh.WriteFile(ctx, writePk) if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Error starting file write: %v\r\n", err), &outputPos) return @@ -1358,7 +1358,7 @@ func doCopyLocalFileToRemote(ctx context.Context, cmd *sstore.CmdType, remote_ms } else if err != nil { dataErr := fmt.Sprintf("error reading file data: %v", err) dataPk.Error = dataErr - remote_msh.SendFileData(dataPk) + remoteWsh.SendFileData(dataPk) writeStringToPty(ctx, cmd, dataErr, &outputPos) return } @@ -1373,7 +1373,7 @@ func doCopyLocalFileToRemote(ctx context.Context, cmd *sstore.CmdType, remote_ms lastFileTransferPercentage = fileTransferPercentage } } - remote_msh.SendFileData(dataPk) + remoteWsh.SendFileData(dataPk) if dataPk.Eof { break } @@ -1405,7 +1405,7 @@ func getStatusBarString(filePercentageInt int) string { return statusBarString } -func doCopyRemoteFileToRemote(ctx context.Context, cmd *sstore.CmdType, sourceMsh *remote.MShellProc, destMsh *remote.MShellProc, sourcePath string, destPath string, outputPos int64) { +func doCopyRemoteFileToRemote(ctx context.Context, cmd *sstore.CmdType, sourceWsh *remote.WaveshellProc, destWsh *remote.WaveshellProc, sourcePath string, destPath string, outputPos int64) { var exitSuccess bool startTime := time.Now() defer func() { @@ -1414,7 +1414,7 @@ func doCopyRemoteFileToRemote(ctx context.Context, cmd *sstore.CmdType, sourceMs streamPk := packet.MakeStreamFilePacket() streamPk.ReqId = uuid.New().String() streamPk.Path = sourcePath - sourceStreamIter, err := sourceMsh.StreamFile(ctx, streamPk) + sourceStreamIter, err := sourceWsh.StreamFile(ctx, streamPk) if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Error getting file data packet: %v\r\n", err), &outputPos) return @@ -1443,7 +1443,7 @@ func doCopyRemoteFileToRemote(ctx context.Context, cmd *sstore.CmdType, sourceMs writePk := packet.MakeWriteFilePacket() writePk.ReqId = uuid.New().String() writePk.Path = destPath - destWriteIter, err := destMsh.WriteFile(ctx, writePk) + destWriteIter, err := destWsh.WriteFile(ctx, writePk) if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Error starting file write: %v\r\n", err), &outputPos) return @@ -1482,7 +1482,7 @@ func doCopyRemoteFileToRemote(ctx context.Context, cmd *sstore.CmdType, sourceMs writeDataPk.Type = dataPk.Type writeDataPk.Data = make([]byte, int64(len(dataPk.Data))) copy(writeDataPk.Data, dataPk.Data) - err = destMsh.SendFileData(writeDataPk) + err = destWsh.SendFileData(writeDataPk) if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("error sending file to dest: %v\r\n", err), &outputPos) return @@ -1542,7 +1542,7 @@ func doCopyLocalFileToLocal(ctx context.Context, cmd *sstore.CmdType, sourcePath exitSuccess = true } -func doCopyRemoteFileToLocal(ctx context.Context, cmd *sstore.CmdType, remote_msh *remote.MShellProc, sourcePath string, localPath string, outputPos int64) { +func doCopyRemoteFileToLocal(ctx context.Context, cmd *sstore.CmdType, remoteWsh *remote.WaveshellProc, sourcePath string, localPath string, outputPos int64) { var exitSuccess bool startTime := time.Now() defer func() { @@ -1551,7 +1551,7 @@ func doCopyRemoteFileToLocal(ctx context.Context, cmd *sstore.CmdType, remote_ms streamPk := packet.MakeStreamFilePacket() streamPk.ReqId = uuid.New().String() streamPk.Path = sourcePath - iter, err := remote_msh.StreamFile(ctx, streamPk) + iter, err := remoteWsh.StreamFile(ctx, streamPk) if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Error getting file data packet: %v\r\n", err), &outputPos) return @@ -1700,11 +1700,11 @@ func CopyFileCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb var sourceFullPath string var destFullPath string - sourceMsh := sourceRemoteId.MShell - if sourceMsh == nil { - return nil, fmt.Errorf("failure getting source remote mshell") + sourceWsh := sourceRemoteId.Waveshell + if sourceWsh == nil { + return nil, fmt.Errorf("failure getting source remote waveshell") } - sourceRRState := sourceMsh.GetRemoteRuntimeState() + sourceRRState := sourceWsh.GetRemoteRuntimeState() sourcePathWithHome, err := sourceRRState.ExpandHomeDir(sourcePath) if err != nil { return nil, fmt.Errorf("expand home dir err: %v", err) @@ -1720,11 +1720,11 @@ func CopyFileCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb sourceFileName := filepath.Base(sourceFullPath) destPath = filepath.Join(destPath, sourceFileName) } - destMsh := destRemoteId.MShell - if destMsh == nil { - return nil, fmt.Errorf("failure getting dest remote mshell") + destWsh := destRemoteId.Waveshell + if destWsh == nil { + return nil, fmt.Errorf("failure getting dest remote waveshell") } - destRRState := destMsh.GetRemoteRuntimeState() + destRRState := destWsh.GetRemoteRuntimeState() destPathWithHome, err := destRRState.ExpandHomeDir(destPath) if err != nil { return nil, fmt.Errorf("expand home dir err: %v", err) @@ -1757,7 +1757,7 @@ func CopyFileCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb update.AddUpdate(sstore.InteractiveUpdate(pk.Interactive)) if destRemote != ConnectedRemote && destRemoteId != nil && !destRemoteId.RState.IsConnected() { writeStringToPty(ctx, cmd, fmt.Sprintf("Attempting to autoconnect to remote %v\r\n", destRemote), &outputPos) - err = destRemoteId.MShell.TryAutoConnect() + err = destRemoteId.Waveshell.TryAutoConnect() if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Couldn't connect to remote %v\r\n", sourceRemote), &outputPos) } else { @@ -1766,7 +1766,7 @@ func CopyFileCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb } if sourceRemote != LocalRemote && sourceRemoteId != nil && !sourceRemoteId.RState.IsConnected() { writeStringToPty(ctx, cmd, fmt.Sprintf("Attempting to autoconnect to remote %v\r\n", sourceRemote), &outputPos) - err = sourceRemoteId.MShell.TryAutoConnect() + err = sourceRemoteId.Waveshell.TryAutoConnect() if err != nil { writeStringToPty(ctx, cmd, fmt.Sprintf("Couldn't connect to remote %v\r\n", sourceRemote), &outputPos) } else { @@ -1778,11 +1778,11 @@ func CopyFileCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb if destRemote == LocalRemote && sourceRemote == LocalRemote { go doCopyLocalFileToLocal(context.Background(), cmd, sourceFullPath, destFullPath, outputPos) } else if destRemote == LocalRemote && sourceRemote != LocalRemote { - go doCopyRemoteFileToLocal(context.Background(), cmd, sourceMsh, sourceFullPath, destFullPath, outputPos) + go doCopyRemoteFileToLocal(context.Background(), cmd, sourceWsh, sourceFullPath, destFullPath, outputPos) } else if destRemote != LocalRemote && sourceRemote == LocalRemote { - go doCopyLocalFileToRemote(context.Background(), cmd, destMsh, sourceFullPath, destFullPath, outputPos) + go doCopyLocalFileToRemote(context.Background(), cmd, destWsh, sourceFullPath, destFullPath, outputPos) } else if destRemote != LocalRemote && sourceRemote != LocalRemote { - go doCopyRemoteFileToRemote(context.Background(), cmd, sourceMsh, destMsh, sourceFullPath, destFullPath, outputPos) + go doCopyRemoteFileToRemote(context.Background(), cmd, sourceWsh, destWsh, sourceFullPath, destFullPath, outputPos) } return update, nil } @@ -1792,8 +1792,8 @@ func RemoteInstallCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) if err != nil { return nil, err } - mshell := ids.Remote.MShell - go mshell.RunInstall(false) + wshell := ids.Remote.Waveshell + go wshell.RunInstall(false) return createRemoteViewRemoteIdUpdate(ids.Remote.RemotePtr.RemoteId), nil } @@ -1802,8 +1802,8 @@ func RemoteInstallCancelCommand(ctx context.Context, pk *scpacket.FeCommandPacke if err != nil { return nil, err } - mshell := ids.Remote.MShell - go mshell.CancelInstall() + wshell := ids.Remote.Waveshell + go wshell.CancelInstall() return createRemoteViewRemoteIdUpdate(ids.Remote.RemotePtr.RemoteId), nil } @@ -1812,7 +1812,7 @@ func RemoteConnectCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) if err != nil { return nil, err } - go ids.Remote.MShell.Launch(true) + go ids.Remote.Waveshell.Launch(true) return createRemoteViewRemoteIdUpdate(ids.Remote.RemotePtr.RemoteId), nil } @@ -1822,7 +1822,7 @@ func RemoteDisconnectCommand(ctx context.Context, pk *scpacket.FeCommandPacketTy return nil, err } force := resolveBool(pk.Kwargs["force"], false) - go ids.Remote.MShell.Disconnect(force) + go ids.Remote.Waveshell.Disconnect(force) return createRemoteViewRemoteIdUpdate(ids.Remote.RemotePtr.RemoteId), nil } @@ -2082,7 +2082,7 @@ func RemoteSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sc } visualEdit := resolveBool(pk.Kwargs["visual"], false) isSubmitted := resolveBool(pk.Kwargs["submit"], false) - editArgs, err := parseRemoteEditArgs(false, pk, ids.Remote.MShell.IsLocal()) + editArgs, err := parseRemoteEditArgs(false, pk, ids.Remote.Waveshell.IsLocal()) if err != nil { return makeRemoteEditErrorReturn_edit(ids, visualEdit, fmt.Errorf("/remote:new %v", err)) } @@ -2092,7 +2092,7 @@ func RemoteSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sc if !visualEdit && len(editArgs.EditMap) == 0 { return nil, fmt.Errorf("/remote:set no updates, can set %s. (set visual=1 to edit in UI)", formatStrs(RemoteSetArgs, "or", false)) } - err = ids.Remote.MShell.UpdateRemote(ctx, editArgs.EditMap) + err = ids.Remote.Waveshell.UpdateRemote(ctx, editArgs.EditMap) if err != nil { return makeRemoteEditErrorReturn_edit(ids, visualEdit, fmt.Errorf("/remote:new error updating remote: %v", err)) } @@ -2367,19 +2367,19 @@ func RemoteConfigParseCommand(ctx context.Context, pk *scpacket.FeCommandPacketT editMap[sstore.RemoteField_SSHKey] = hostInfo.SshKeyFile } editMap[sstore.RemoteField_ShellPref] = hostInfo.ShellPref - msh := remote.GetRemoteById(previouslyImportedRemote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(previouslyImportedRemote.RemoteId) + if wsh == nil { remoteChangeList["updateErr"] = append(remoteChangeList["updateErr"], hostInfo.CanonicalName) - log.Printf("strange, msh for remote %s [%s] not found\n", hostInfo.CanonicalName, previouslyImportedRemote.RemoteId) + log.Printf("strange, wsh for remote %s [%s] not found\n", hostInfo.CanonicalName, previouslyImportedRemote.RemoteId) continue } - if msh.Remote.ConnectMode == hostInfo.ConnectMode && msh.Remote.SSHOpts.SSHIdentity == hostInfo.SshKeyFile && msh.Remote.RemoteAlias == hostInfo.Host && msh.Remote.ShellPref == hostInfo.ShellPref { + if wsh.Remote.ConnectMode == hostInfo.ConnectMode && wsh.Remote.SSHOpts.SSHIdentity == hostInfo.SshKeyFile && wsh.Remote.RemoteAlias == hostInfo.Host && wsh.Remote.ShellPref == hostInfo.ShellPref { // silently skip this one. it didn't fail, but no changes were needed continue } - err := msh.UpdateRemote(ctx, editMap) + err := wsh.UpdateRemote(ctx, editMap) if err != nil { remoteChangeList["updateErr"] = append(remoteChangeList["updateErr"], hostInfo.CanonicalName) log.Printf("error updating remote[%s]: %v\n", hostInfo.CanonicalName, err) @@ -2548,11 +2548,11 @@ func crShowCommand(ctx context.Context, pk *scpacket.FeCommandPacketType, ids re } for _, ri := range riArr { rptr := sstore.RemotePtrType{RemoteId: ri.RemoteId, Name: ri.Name} - msh := remote.GetRemoteById(ri.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(ri.RemoteId) + if wsh == nil { continue } - baseDisplayName := msh.GetDisplayName() + baseDisplayName := wsh.GetDisplayName() displayName := rptr.GetDisplayName(baseDisplayName) cwdStr := "-" if ri.FeState["cwd"] != "" { @@ -3006,17 +3006,17 @@ func CrCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scbus.Upd if rstate.Archived { return nil, fmt.Errorf("/%s error: remote %q cannot switch to archived remote", GetCmdStr(pk), newRemote) } - newMsh := remote.GetRemoteById(rptr.RemoteId) - if newMsh == nil { - return nil, fmt.Errorf("/%s error: remote %q not found (msh)", GetCmdStr(pk), newRemote) + newWsh := remote.GetRemoteById(rptr.RemoteId) + if newWsh == nil { + return nil, fmt.Errorf("/%s error: remote %q not found (wsh)", GetCmdStr(pk), newRemote) } - if !newMsh.IsConnected() { - err := newMsh.TryAutoConnect() + if !newWsh.IsConnected() { + err := newWsh.TryAutoConnect() if err != nil { return nil, fmt.Errorf("%q is disconnected, auto-connect failed: %w", rstate.GetBaseDisplayName(), err) } - if !newMsh.IsConnected() { - if newMsh.GetRemoteCopy().ConnectMode == sstore.ConnectModeManual { + if !newWsh.IsConnected() { + if newWsh.GetRemoteCopy().ConnectMode == sstore.ConnectModeManual { return nil, fmt.Errorf("%q is disconnected (must manually connect)", rstate.GetBaseDisplayName()) } return nil, fmt.Errorf("%q is disconnected", rstate.GetBaseDisplayName()) @@ -3057,7 +3057,7 @@ func CrCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scbus.Upd ScreenId: ids.ScreenId, RPtr: *rptr, } - go doAsyncResetCommand(newMsh, opts, cmd) + go doAsyncResetCommand(newWsh, opts, cmd) return update, nil } else { outputStr := fmt.Sprintf("reconnected to %s", GetFullRemoteDisplayName(rptr, rstate)) @@ -3298,7 +3298,7 @@ func doCompGen(ctx context.Context, pk *scpacket.FeCommandPacketType, prefix str cgPacket.CompType = compType cgPacket.Prefix = prefix cgPacket.Cwd = ids.Remote.FeState["cwd"] - resp, err := ids.Remote.MShell.PacketRpc(ctx, cgPacket) + resp, err := ids.Remote.Waveshell.PacketRpc(ctx, cgPacket) if err != nil { return nil, false, err } @@ -3942,7 +3942,7 @@ func ClearSudoCache(ctx context.Context, pk *scpacket.FeCommandPacketType) (rtnU if err != nil { return nil, err } - ids.Remote.MShell.ClearCachedSudoPw() + ids.Remote.Waveshell.ClearCachedSudoPw() pluralize := "" clearAll := resolveBool(pk.Kwargs["all"], false) @@ -3966,7 +3966,7 @@ func RemoteResetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) ( if err != nil { return nil, err } - if !ids.Remote.MShell.IsConnected() { + if !ids.Remote.Waveshell.IsConnected() { return nil, fmt.Errorf("cannot reinit, remote is not connected") } verbose := resolveBool(pk.Kwargs["verbose"], false) @@ -3994,7 +3994,7 @@ func RemoteResetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) ( ScreenId: ids.ScreenId, RPtr: ids.Remote.RemotePtr, } - go doAsyncResetCommand(ids.Remote.MShell, opts, cmd) + go doAsyncResetCommand(ids.Remote.Waveshell, opts, cmd) return update, nil } @@ -4007,7 +4007,7 @@ type connectOptsType struct { } // this does the asynchroneous part of the connection reset -func doAsyncResetCommand(msh *remote.MShellProc, opts connectOptsType, cmd *sstore.CmdType) { +func doAsyncResetCommand(wsh *remote.WaveshellProc, opts connectOptsType, cmd *sstore.CmdType) { ctx, cancelFn := context.WithCancel(context.Background()) defer cancelFn() startTime := time.Now() @@ -4025,7 +4025,7 @@ func doAsyncResetCommand(msh *remote.MShellProc, opts connectOptsType, cmd *ssto writeStringToPty(ctx, cmd, string(data), &outputPos) } origStatePtr, _ := sstore.GetRemoteStatePtr(ctx, opts.SessionId, opts.ScreenId, opts.RPtr) - ssPk, err := msh.ReInit(ctx, base.MakeCommandKey(cmd.ScreenId, cmd.LineId), opts.ShellType, dataFn, opts.Verbose) + ssPk, err := wsh.ReInit(ctx, base.MakeCommandKey(cmd.ScreenId, cmd.LineId), opts.ShellType, dataFn, opts.Verbose) if err != nil { rtnErr = err return @@ -4296,11 +4296,11 @@ func resizeRunningCommand(ctx context.Context, cmd *sstore.CmdType, newCols int) feInput := scpacket.MakeFeInputPacket() feInput.CK = base.MakeCommandKey(cmd.ScreenId, cmd.LineId) feInput.WinSize = &packet.WinSize{Rows: int(cmd.TermOpts.Rows), Cols: newCols} - msh := remote.GetRemoteById(cmd.Remote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(cmd.Remote.RemoteId) + if wsh == nil { return fmt.Errorf("cannot resize, cmd remote not found") } - err := msh.HandleFeInput(feInput) + err := wsh.HandleFeInput(feInput) if err != nil { return err } @@ -4421,12 +4421,12 @@ func LineRestartCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) ( if cmd.Status == sstore.CmdStatusRunning || cmd.Status == sstore.CmdStatusDetached { killCtx, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() - err = ids.Remote.MShell.KillRunningCommandAndWait(killCtx, base.MakeCommandKey(ids.ScreenId, lineId)) + err = ids.Remote.Waveshell.KillRunningCommandAndWait(killCtx, base.MakeCommandKey(ids.ScreenId, lineId)) if err != nil { return nil, err } } - ids.Remote.MShell.ResetDataPos(base.MakeCommandKey(ids.ScreenId, lineId)) + ids.Remote.Waveshell.ResetDataPos(base.MakeCommandKey(ids.ScreenId, lineId)) err = sstore.ClearCmdPtyFile(ctx, ids.ScreenId, lineId) if err != nil { return nil, fmt.Errorf("error clearing existing pty file: %v", err) @@ -5065,8 +5065,8 @@ func ViewStatCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb return nil, err } streamPk.StatOnly = true - msh := ids.Remote.MShell - iter, err := msh.StreamFile(ctx, streamPk) + wsh := ids.Remote.Waveshell + iter, err := wsh.StreamFile(ctx, streamPk) if err != nil { return nil, fmt.Errorf("/view:stat error: %v", err) } @@ -5116,8 +5116,8 @@ func ViewTestCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb if err != nil { return nil, err } - msh := ids.Remote.MShell - iter, err := msh.StreamFile(ctx, streamPk) + wsh := ids.Remote.Waveshell + iter, err := wsh.StreamFile(ctx, streamPk) if err != nil { return nil, fmt.Errorf("/view:test error: %v", err) } @@ -5413,8 +5413,8 @@ func EditTestCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb } else { writePk.Path = filepath.Join(cwd, fileArg) } - msh := ids.Remote.MShell - iter, err := msh.PacketRpcIter(ctx, writePk) + wsh := ids.Remote.Waveshell + iter, err := wsh.PacketRpcIter(ctx, writePk) if err != nil { return nil, fmt.Errorf("/edit:test error: %v", err) } @@ -5433,7 +5433,7 @@ func EditTestCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scb dataPk := packet.MakeFileDataPacket(writePk.ReqId) dataPk.Data = []byte(content) dataPk.Eof = true - err = msh.SendFileData(dataPk) + err = wsh.SendFileData(dataPk) if err != nil { return nil, fmt.Errorf("/edit:test error sending data packet: %v", err) } @@ -5500,17 +5500,17 @@ func SignalCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (scbus if !sigNameRe.MatchString(sigArg) { return nil, fmt.Errorf("invalid signal name/number: %q", sigArg) } - msh := remote.GetRemoteById(cmd.Remote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(cmd.Remote.RemoteId) + if wsh == nil { return nil, fmt.Errorf("cannot send signal, no remote found for command") } - if !msh.IsConnected() { + if !wsh.IsConnected() { return nil, fmt.Errorf("cannot send signal, remote is not connected") } inputPk := scpacket.MakeFeInputPacket() inputPk.CK = base.MakeCommandKey(cmd.ScreenId, cmd.LineId) inputPk.SigName = sigArg - err = msh.HandleFeInput(inputPk) + err = wsh.HandleFeInput(inputPk) if err != nil { return nil, fmt.Errorf("cannot send signal: %v", err) } diff --git a/wavesrv/pkg/cmdrunner/resolver.go b/wavesrv/pkg/cmdrunner/resolver.go index da14d17b..adb353b1 100644 --- a/wavesrv/pkg/cmdrunner/resolver.go +++ b/wavesrv/pkg/cmdrunner/resolver.go @@ -39,7 +39,7 @@ type resolvedIds struct { type ResolvedRemote struct { DisplayName string RemotePtr sstore.RemotePtrType - MShell *remote.MShellProc + Waveshell *remote.WaveshellProc RState remote.RemoteRuntimeState RemoteCopy *sstore.RemoteType ShellType string // default remote shell preference @@ -201,11 +201,11 @@ func resolveRemoteArg(remoteArg string) (*sstore.RemotePtrType, error) { if rrUser != "" { return nil, fmt.Errorf("remoteusers not supported") } - msh := remote.GetRemoteByArg(rrRemote) - if msh == nil { + wsh := remote.GetRemoteByArg(rrRemote) + if wsh == nil { return nil, nil } - rcopy := msh.GetRemoteCopy() + rcopy := wsh.GetRemoteCopy() return &sstore.RemotePtrType{RemoteId: rcopy.RemoteId, Name: rrName}, nil } @@ -269,7 +269,7 @@ func resolveUiIds(ctx context.Context, pk *scpacket.FeCommandPacketType, rtype i } if rtype&R_RemoteConnected > 0 { if !rtn.Remote.RState.IsConnected() { - err = rtn.Remote.MShell.TryAutoConnect() + err = rtn.Remote.Waveshell.TryAutoConnect() if err != nil { return rtn, fmt.Errorf("error trying to auto-connect remote [%s]: %w", rtn.Remote.DisplayName, err) } @@ -464,18 +464,18 @@ func ResolveRemoteFromPtr(ctx context.Context, rptr *sstore.RemotePtrType, sessi if rptr == nil || rptr.RemoteId == "" { return nil, nil } - msh := remote.GetRemoteById(rptr.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(rptr.RemoteId) + if wsh == nil { return nil, fmt.Errorf("invalid remote '%s', not found", rptr.RemoteId) } - rstate := msh.GetRemoteRuntimeState() - rcopy := msh.GetRemoteCopy() + rstate := wsh.GetRemoteRuntimeState() + rcopy := wsh.GetRemoteCopy() displayName := rstate.GetDisplayName(rptr) rtn := &ResolvedRemote{ DisplayName: displayName, RemotePtr: *rptr, RState: rstate, - MShell: msh, + Waveshell: wsh, RemoteCopy: &rcopy, StatePtr: nil, FeState: nil, @@ -488,7 +488,7 @@ func ResolveRemoteFromPtr(ctx context.Context, rptr *sstore.RemotePtrType, sessi // continue with state set to nil } else { if ri == nil { - rtn.ShellType = msh.GetShellPref() + rtn.ShellType = wsh.GetShellPref() rtn.StatePtr = nil rtn.FeState = nil } else { diff --git a/wavesrv/pkg/comp/simplecomp.go b/wavesrv/pkg/comp/simplecomp.go index ab517705..20ffe3c0 100644 --- a/wavesrv/pkg/comp/simplecomp.go +++ b/wavesrv/pkg/comp/simplecomp.go @@ -65,8 +65,8 @@ func doCompGen(ctx context.Context, prefix string, compType string, compCtx Comp if !packet.IsValidCompGenType(compType) { return nil, fmt.Errorf("/_compgen invalid type '%s'", compType) } - msh := remote.GetRemoteById(compCtx.RemotePtr.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(compCtx.RemotePtr.RemoteId) + if wsh == nil { return nil, fmt.Errorf("invalid remote '%s', not found", compCtx.RemotePtr) } cgPacket := packet.MakeCompGenPacket() @@ -74,7 +74,7 @@ func doCompGen(ctx context.Context, prefix string, compType string, compCtx Comp cgPacket.CompType = compType cgPacket.Prefix = prefix cgPacket.Cwd = compCtx.Cwd - resp, err := msh.PacketRpc(ctx, cgPacket) + resp, err := wsh.PacketRpc(ctx, cgPacket) if err != nil { return nil, err } diff --git a/wavesrv/pkg/remote/remote.go b/wavesrv/pkg/remote/remote.go index 0dfb13b3..0c0cddb1 100644 --- a/wavesrv/pkg/remote/remote.go +++ b/wavesrv/pkg/remote/remote.go @@ -50,7 +50,7 @@ import ( "golang.org/x/mod/semver" ) -const RemoteTypeMShell = "mshell" +const RemoteTypeWaveshell = "mshell" const DefaultTerm = "xterm-256color" const DefaultMaxPtySize = 1024 * 1024 const CircBufSize = 64 * 1024 @@ -74,12 +74,12 @@ var envVarsToStrip map[string]bool = map[string]bool{ "TERM_SESSION_ID": true, } -// we add this ping packet to the MShellServer Commands in order to deal with spurious SSH output +// we add this ping packet to the WaveshellServer Commands in order to deal with spurious SSH output // basically we guarantee the parser will see a valid packet (either an init error or a ping) // so we can pass ignoreUntilValid to PacketParser const PrintPingPacket = `printf "\n##N{\"type\": \"ping\"}\n"` -const MShellServerCommandFmt = ` +const WaveshellServerCommandFmt = ` PATH=$PATH:~/.mshell; which mshell-[%VERSION%] > /dev/null; if [[ "$?" -ne 0 ]] @@ -91,20 +91,20 @@ else fi ` -func MakeLocalMShellCommandStr(isSudo bool) (string, error) { - mshellPath, err := scbase.LocalMShellBinaryPath() +func MakeLocalWaveshellCommandStr(isSudo bool) (string, error) { + waveshellPath, err := scbase.LocalWaveshellBinaryPath() if err != nil { return "", err } if isSudo { - return fmt.Sprintf(`%s; sudo %s --server`, PrintPingPacket, shellescape.Quote(mshellPath)), nil + return fmt.Sprintf(`%s; sudo %s --server`, PrintPingPacket, shellescape.Quote(waveshellPath)), nil } else { - return fmt.Sprintf(`%s; %s --server`, PrintPingPacket, shellescape.Quote(mshellPath)), nil + return fmt.Sprintf(`%s; %s --server`, PrintPingPacket, shellescape.Quote(waveshellPath)), nil } } func MakeServerCommandStr() string { - rtn := strings.ReplaceAll(MShellServerCommandFmt, "[%VERSION%]", semver.MajorMinor(scbase.MShellVersion)) + rtn := strings.ReplaceAll(WaveshellServerCommandFmt, "[%VERSION%]", semver.MajorMinor(scbase.WaveshellVersion)) rtn = strings.ReplaceAll(rtn, "[%PINGPACKET%]", PrintPingPacket) return rtn } @@ -117,8 +117,8 @@ const ( ) func init() { - if scbase.MShellVersion != base.MShellVersion { - panic(fmt.Sprintf("prompt-server apishell version must match '%s' vs '%s'", scbase.MShellVersion, base.MShellVersion)) + if scbase.WaveshellVersion != base.WaveshellVersion { + panic(fmt.Sprintf("prompt-server apishell version must match '%s' vs '%s'", scbase.WaveshellVersion, base.WaveshellVersion)) } } @@ -126,7 +126,7 @@ var GlobalStore *Store type Store struct { Lock *sync.Mutex - Map map[string]*MShellProc // key=remoteid + Map map[string]*WaveshellProc // key=remoteid CmdWaitMap map[base.CommandKey][]func() } @@ -136,7 +136,7 @@ type pendingStateKey struct { } // provides state, acccess, and control for a waveshell server process -type MShellProc struct { +type WaveshellProc struct { Lock *sync.Mutex Remote *sstore.RemoteType @@ -157,10 +157,10 @@ type MShellProc struct { DataPosMap *utilfn.SyncMap[base.CommandKey, int64] // install - InstallStatus string - NeedsMShellUpgrade bool - InstallCancelFn context.CancelFunc - InstallErr error + InstallStatus string + NeedsWaveshellUpgrade bool + InstallCancelFn context.CancelFunc + InstallErr error // for synthetic commands (not run through RunCommand), this provides a way for them // to register to receive input events from the frontend (e.g. ReInit) @@ -188,7 +188,7 @@ type RunCmdType struct { } type ReinitCommandSink struct { - Remote *MShellProc + Remote *WaveshellProc ReqId string } @@ -214,28 +214,28 @@ func CanComplete(remoteType string) bool { } } -func (msh *MShellProc) GetStatus() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Status +func (wsh *WaveshellProc) GetStatus() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Status } -func (msh *MShellProc) GetRemoteId() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Remote.RemoteId +func (wsh *WaveshellProc) GetRemoteId() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Remote.RemoteId } -func (msh *MShellProc) GetInstallStatus() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.InstallStatus +func (wsh *WaveshellProc) GetInstallStatus() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.InstallStatus } func LoadRemotes(ctx context.Context) error { GlobalStore = &Store{ Lock: &sync.Mutex{}, - Map: make(map[string]*MShellProc), + Map: make(map[string]*WaveshellProc), CmdWaitMap: make(map[base.CommandKey][]func()), } allRemotes, err := sstore.GetAllRemotes(ctx) @@ -245,10 +245,10 @@ func LoadRemotes(ctx context.Context) error { var numLocal int var numSudoLocal int for _, remote := range allRemotes { - msh := MakeMShell(remote) - GlobalStore.Map[remote.RemoteId] = msh + wsh := MakeWaveshell(remote) + GlobalStore.Map[remote.RemoteId] = wsh if remote.ConnectMode == sstore.ConnectModeStartup { - go msh.Launch(false) + go wsh.Launch(false) } if remote.Local { if remote.IsSudo() { @@ -278,16 +278,16 @@ func LoadRemoteById(ctx context.Context, remoteId string) error { if r == nil { return fmt.Errorf("remote %s not found", remoteId) } - msh := MakeMShell(r) + wsh := MakeWaveshell(r) GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() existingRemote := GlobalStore.Map[remoteId] if existingRemote != nil { return fmt.Errorf("cannot add remote %s, already in global map", remoteId) } - GlobalStore.Map[r.RemoteId] = msh + GlobalStore.Map[r.RemoteId] = wsh if r.ConnectMode == sstore.ConnectModeStartup { - go msh.Launch(false) + go wsh.Launch(false) } return nil } @@ -295,14 +295,14 @@ func LoadRemoteById(ctx context.Context, remoteId string) error { func ReadRemotePty(ctx context.Context, remoteId string) (int64, []byte, error) { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() - msh := GlobalStore.Map[remoteId] - if msh == nil { + wsh := GlobalStore.Map[remoteId] + if wsh == nil { return 0, nil, nil } - msh.Lock.Lock() - defer msh.Lock.Unlock() - barr := msh.PtyBuffer.Bytes() - offset := msh.PtyBuffer.TotalWritten() - int64(len(barr)) + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + barr := wsh.PtyBuffer.Bytes() + offset := wsh.PtyBuffer.TotalWritten() - int64(len(barr)) return offset, barr, nil } @@ -326,11 +326,11 @@ func AddRemote(ctx context.Context, r *sstore.RemoteType, shouldStart bool) erro if err != nil { return fmt.Errorf("cannot create remote %q: %v", r.RemoteCanonicalName, err) } - newMsh := MakeMShell(r) - GlobalStore.Map[r.RemoteId] = newMsh - go newMsh.NotifyRemoteUpdate() + newWsh := MakeWaveshell(r) + GlobalStore.Map[r.RemoteId] = newWsh + go newWsh.NotifyRemoteUpdate() if shouldStart { - go newMsh.Launch(true) + go newWsh.Launch(true) } return nil } @@ -338,17 +338,17 @@ func AddRemote(ctx context.Context, r *sstore.RemoteType, shouldStart bool) erro func ArchiveRemote(ctx context.Context, remoteId string) error { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() - msh := GlobalStore.Map[remoteId] - if msh == nil { + wsh := GlobalStore.Map[remoteId] + if wsh == nil { return fmt.Errorf("remote not found, cannot archive") } - if msh.Status == StatusConnected { + if wsh.Status == StatusConnected { return fmt.Errorf("cannot archive connected remote") } - if msh.Remote.Local { + if wsh.Remote.Local { return fmt.Errorf("cannot archive local remote") } - rcopy := msh.GetRemoteCopy() + rcopy := wsh.GetRemoteCopy() archivedRemote := &sstore.RemoteType{ RemoteId: rcopy.RemoteId, RemoteType: rcopy.RemoteType, @@ -361,9 +361,9 @@ func ArchiveRemote(ctx context.Context, remoteId string) error { if err != nil { return err } - newMsh := MakeMShell(archivedRemote) - GlobalStore.Map[remoteId] = newMsh - go newMsh.NotifyRemoteUpdate() + newWsh := MakeWaveshell(archivedRemote) + GlobalStore.Map[remoteId] = newWsh + go newWsh.NotifyRemoteUpdate() return nil } @@ -379,63 +379,63 @@ func NumRemotes() int { return len(GlobalStore.Map) } -func GetRemoteByArg(arg string) *MShellProc { +func GetRemoteByArg(arg string) *WaveshellProc { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() isPuid := isPartialUUID(arg) - for _, msh := range GlobalStore.Map { - rcopy := msh.GetRemoteCopy() + for _, wsh := range GlobalStore.Map { + rcopy := wsh.GetRemoteCopy() if rcopy.RemoteAlias == arg || rcopy.RemoteCanonicalName == arg || rcopy.RemoteId == arg { - return msh + return wsh } if isPuid && strings.HasPrefix(rcopy.RemoteId, arg) { - return msh + return wsh } } return nil } -func getRemoteByCanonicalName_nolock(name string) *MShellProc { - for _, msh := range GlobalStore.Map { - rcopy := msh.GetRemoteCopy() +func getRemoteByCanonicalName_nolock(name string) *WaveshellProc { + for _, wsh := range GlobalStore.Map { + rcopy := wsh.GetRemoteCopy() if rcopy.RemoteCanonicalName == name { - return msh + return wsh } } return nil } -func GetRemoteById(remoteId string) *MShellProc { +func GetRemoteById(remoteId string) *WaveshellProc { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() return GlobalStore.Map[remoteId] } func GetRemoteCopyById(remoteId string) *sstore.RemoteType { - msh := GetRemoteById(remoteId) - if msh == nil { + wsh := GetRemoteById(remoteId) + if wsh == nil { return nil } - rcopy := msh.GetRemoteCopy() + rcopy := wsh.GetRemoteCopy() return &rcopy } -func GetRemoteMap() map[string]*MShellProc { +func GetRemoteMap() map[string]*WaveshellProc { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() - rtn := make(map[string]*MShellProc) - for remoteId, msh := range GlobalStore.Map { - rtn[remoteId] = msh + rtn := make(map[string]*WaveshellProc) + for remoteId, wsh := range GlobalStore.Map { + rtn[remoteId] = wsh } return rtn } -func GetLocalRemote() *MShellProc { +func GetLocalRemote() *WaveshellProc { GlobalStore.Lock.Lock() defer GlobalStore.Lock.Unlock() - for _, msh := range GlobalStore.Map { - if msh.IsLocal() && !msh.IsSudo() { - return msh + for _, wsh := range GlobalStore.Map { + if wsh.IsLocal() && !wsh.IsSudo() { + return wsh } } return nil @@ -447,16 +447,16 @@ func ResolveRemoteRef(remoteRef string) *RemoteRuntimeState { _, err := uuid.Parse(remoteRef) if err == nil { - msh := GlobalStore.Map[remoteRef] - if msh != nil { - state := msh.GetRemoteRuntimeState() + wsh := GlobalStore.Map[remoteRef] + if wsh != nil { + state := wsh.GetRemoteRuntimeState() return &state } return nil } - for _, msh := range GlobalStore.Map { - if msh.Remote.RemoteAlias == remoteRef || msh.Remote.RemoteCanonicalName == remoteRef { - state := msh.GetRemoteRuntimeState() + for _, wsh := range GlobalStore.Map { + if wsh.Remote.RemoteAlias == remoteRef || wsh.Remote.RemoteCanonicalName == remoteRef { + state := wsh.GetRemoteRuntimeState() return &state } } @@ -464,15 +464,15 @@ func ResolveRemoteRef(remoteRef string) *RemoteRuntimeState { } func SendSignalToCmd(ctx context.Context, cmd *sstore.CmdType, sig string) error { - msh := GetRemoteById(cmd.Remote.RemoteId) - if msh == nil { + wsh := GetRemoteById(cmd.Remote.RemoteId) + if wsh == nil { return fmt.Errorf("no connection found") } - if !msh.IsConnected() { + if !wsh.IsConnected() { return fmt.Errorf("not connected") } cmdCk := base.MakeCommandKey(cmd.ScreenId, cmd.LineId) - if !msh.IsCmdRunning(cmdCk) { + if !wsh.IsCmdRunning(cmdCk) { // this could also return nil (depends on use case) // settled on coded error so we can check for this error return base.CodedErrorf(packet.EC_CmdNotRunning, "cmd not running") @@ -480,7 +480,7 @@ func SendSignalToCmd(ctx context.Context, cmd *sstore.CmdType, sig string) error sigPk := packet.MakeSpecialInputPacket() sigPk.CK = cmdCk sigPk.SigName = sig - return msh.ServerProc.Input.SendPacket(sigPk) + return wsh.ServerProc.Input.SendPacket(sigPk) } func unquoteDQBashString(str string) (string, bool) { @@ -527,84 +527,84 @@ func makeShortHost(host string) string { return host[0:dotIdx] } -func (msh *MShellProc) IsLocal() bool { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Remote.Local +func (wsh *WaveshellProc) IsLocal() bool { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Remote.Local } -func (msh *MShellProc) IsSudo() bool { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Remote.IsSudo() +func (wsh *WaveshellProc) IsSudo() bool { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Remote.IsSudo() } -func (msh *MShellProc) tryAutoInstall() { - msh.Lock.Lock() - defer msh.Lock.Unlock() - if !msh.Remote.AutoInstall || !msh.NeedsMShellUpgrade || msh.InstallErr != nil { +func (wsh *WaveshellProc) tryAutoInstall() { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + if !wsh.Remote.AutoInstall || !wsh.NeedsWaveshellUpgrade || wsh.InstallErr != nil { return } - msh.writeToPtyBuffer_nolock("trying auto-install\n") - go msh.RunInstall(true) + wsh.writeToPtyBuffer_nolock("trying auto-install\n") + go wsh.RunInstall(true) } -// if msh.IsConnected() then GetShellPref() should return a valid shell -// if msh is not connected, then InitPkShellType might be empty -func (msh *MShellProc) GetShellPref() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - if msh.Remote.ShellPref == sstore.ShellTypePref_Detect { - return msh.InitPkShellType +// if wsh.IsConnected() then GetShellPref() should return a valid shell +// if wsh is not connected, then InitPkShellType might be empty +func (wsh *WaveshellProc) GetShellPref() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + if wsh.Remote.ShellPref == sstore.ShellTypePref_Detect { + return wsh.InitPkShellType } - if msh.Remote.ShellPref == "" { + if wsh.Remote.ShellPref == "" { return packet.ShellType_bash } - return msh.Remote.ShellPref + return wsh.Remote.ShellPref } -func (msh *MShellProc) GetRemoteRuntimeState() RemoteRuntimeState { - shellPref := msh.GetShellPref() - msh.Lock.Lock() - defer msh.Lock.Unlock() +func (wsh *WaveshellProc) GetRemoteRuntimeState() RemoteRuntimeState { + shellPref := wsh.GetShellPref() + wsh.Lock.Lock() + defer wsh.Lock.Unlock() state := RemoteRuntimeState{ - RemoteType: msh.Remote.RemoteType, - RemoteId: msh.Remote.RemoteId, - RemoteAlias: msh.Remote.RemoteAlias, - RemoteCanonicalName: msh.Remote.RemoteCanonicalName, - Status: msh.Status, - ConnectMode: msh.Remote.ConnectMode, - AutoInstall: msh.Remote.AutoInstall, - Archived: msh.Remote.Archived, - RemoteIdx: msh.Remote.RemoteIdx, - SSHConfigSrc: msh.Remote.SSHConfigSrc, - UName: msh.UName, - InstallStatus: msh.InstallStatus, - NeedsMShellUpgrade: msh.NeedsMShellUpgrade, - Local: msh.Remote.Local, - IsSudo: msh.Remote.IsSudo(), - NoInitPk: msh.ErrNoInitPk, - AuthType: sstore.RemoteAuthTypeNone, - ShellPref: msh.Remote.ShellPref, - DefaultShellType: shellPref, + RemoteType: wsh.Remote.RemoteType, + RemoteId: wsh.Remote.RemoteId, + RemoteAlias: wsh.Remote.RemoteAlias, + RemoteCanonicalName: wsh.Remote.RemoteCanonicalName, + Status: wsh.Status, + ConnectMode: wsh.Remote.ConnectMode, + AutoInstall: wsh.Remote.AutoInstall, + Archived: wsh.Remote.Archived, + RemoteIdx: wsh.Remote.RemoteIdx, + SSHConfigSrc: wsh.Remote.SSHConfigSrc, + UName: wsh.UName, + InstallStatus: wsh.InstallStatus, + NeedsWaveshellUpgrade: wsh.NeedsWaveshellUpgrade, + Local: wsh.Remote.Local, + IsSudo: wsh.Remote.IsSudo(), + NoInitPk: wsh.ErrNoInitPk, + AuthType: sstore.RemoteAuthTypeNone, + ShellPref: wsh.Remote.ShellPref, + DefaultShellType: shellPref, } - if msh.Remote.SSHOpts != nil { - state.AuthType = msh.Remote.SSHOpts.GetAuthType() + if wsh.Remote.SSHOpts != nil { + state.AuthType = wsh.Remote.SSHOpts.GetAuthType() } - if msh.Remote.RemoteOpts != nil { - optsCopy := *msh.Remote.RemoteOpts + if wsh.Remote.RemoteOpts != nil { + optsCopy := *wsh.Remote.RemoteOpts state.RemoteOpts = &optsCopy } - if msh.Err != nil { - state.ErrorStr = msh.Err.Error() + if wsh.Err != nil { + state.ErrorStr = wsh.Err.Error() } - if msh.InstallErr != nil { - state.InstallErrorStr = msh.InstallErr.Error() + if wsh.InstallErr != nil { + state.InstallErrorStr = wsh.InstallErr.Error() } - if msh.Status == StatusConnecting { - state.WaitingForPassword = msh.isWaitingForPassword_nolock() - if msh.MakeClientDeadline != nil { - state.ConnectTimeout = int(time.Until(*msh.MakeClientDeadline) / time.Second) + if wsh.Status == StatusConnecting { + state.WaitingForPassword = wsh.isWaitingForPassword_nolock() + if wsh.MakeClientDeadline != nil { + state.ConnectTimeout = int(time.Until(*wsh.MakeClientDeadline) / time.Second) if state.ConnectTimeout < 0 { state.ConnectTimeout = 0 } @@ -613,40 +613,40 @@ func (msh *MShellProc) GetRemoteRuntimeState() RemoteRuntimeState { state.CountdownActive = false } } - vars := msh.Remote.StateVars + vars := wsh.Remote.StateVars if vars == nil { vars = make(map[string]string) } - vars["user"] = msh.Remote.RemoteUser + vars["user"] = wsh.Remote.RemoteUser vars["bestuser"] = vars["user"] - vars["host"] = msh.Remote.RemoteHost - vars["shorthost"] = makeShortHost(msh.Remote.RemoteHost) - vars["alias"] = msh.Remote.RemoteAlias - vars["cname"] = msh.Remote.RemoteCanonicalName - vars["remoteid"] = msh.Remote.RemoteId - vars["status"] = msh.Status - vars["type"] = msh.Remote.RemoteType - if msh.Remote.IsSudo() { + vars["host"] = wsh.Remote.RemoteHost + vars["shorthost"] = makeShortHost(wsh.Remote.RemoteHost) + vars["alias"] = wsh.Remote.RemoteAlias + vars["cname"] = wsh.Remote.RemoteCanonicalName + vars["remoteid"] = wsh.Remote.RemoteId + vars["status"] = wsh.Status + vars["type"] = wsh.Remote.RemoteType + if wsh.Remote.IsSudo() { vars["sudo"] = "1" } - if msh.Remote.Local { + if wsh.Remote.Local { vars["local"] = "1" } vars["port"] = "22" - if msh.Remote.SSHOpts != nil { - if msh.Remote.SSHOpts.SSHPort != 0 { - vars["port"] = strconv.Itoa(msh.Remote.SSHOpts.SSHPort) + if wsh.Remote.SSHOpts != nil { + if wsh.Remote.SSHOpts.SSHPort != 0 { + vars["port"] = strconv.Itoa(wsh.Remote.SSHOpts.SSHPort) } } - if msh.Remote.RemoteOpts != nil && msh.Remote.RemoteOpts.Color != "" { - vars["color"] = msh.Remote.RemoteOpts.Color + if wsh.Remote.RemoteOpts != nil && wsh.Remote.RemoteOpts.Color != "" { + vars["color"] = wsh.Remote.RemoteOpts.Color } - if msh.ServerProc != nil && msh.ServerProc.InitPk != nil { - initPk := msh.ServerProc.InitPk + if wsh.ServerProc != nil && wsh.ServerProc.InitPk != nil { + initPk := wsh.ServerProc.InitPk if initPk.BuildTime == "" || initPk.BuildTime == "0" { - state.MShellVersion = initPk.Version + state.WaveshellVersion = initPk.Version } else { - state.MShellVersion = fmt.Sprintf("%s+%s", initPk.Version, initPk.BuildTime) + state.WaveshellVersion = fmt.Sprintf("%s+%s", initPk.Version, initPk.BuildTime) } vars["home"] = initPk.HomeDir vars["remoteuser"] = initPk.User @@ -656,12 +656,12 @@ func (msh *MShellProc) GetRemoteRuntimeState() RemoteRuntimeState { vars["besthost"] = vars["remotehost"] vars["bestshorthost"] = vars["remoteshorthost"] } - if msh.Remote.Local && msh.Remote.IsSudo() { + if wsh.Remote.Local && wsh.Remote.IsSudo() { vars["bestuser"] = "sudo" - } else if msh.Remote.IsSudo() { + } else if wsh.Remote.IsSudo() { vars["bestuser"] = "sudo@" + vars["bestuser"] } - if msh.Remote.Local { + if wsh.Remote.Local { vars["bestname"] = vars["bestuser"] + "@local" vars["bestshortname"] = vars["bestuser"] + "@local" } else { @@ -680,8 +680,8 @@ func (msh *MShellProc) GetRemoteRuntimeState() RemoteRuntimeState { return state } -func (msh *MShellProc) NotifyRemoteUpdate() { - rstate := msh.GetRemoteRuntimeState() +func (wsh *WaveshellProc) NotifyRemoteUpdate() { + rstate := wsh.GetRemoteRuntimeState() update := scbus.MakeUpdatePacket() update.AddUpdate(rstate) scbus.MainUpdateBus.DoUpdate(update) @@ -699,12 +699,12 @@ func GetAllRemoteRuntimeState() []*RemoteRuntimeState { return rtn } -func MakeMShell(r *sstore.RemoteType) *MShellProc { +func MakeWaveshell(r *sstore.RemoteType) *WaveshellProc { buf, err := circbuf.NewBuffer(CircBufSize) if err != nil { panic(err) // this should never happen (NewBuffer only returns an error if CirBufSize <= 0) } - rtn := &MShellProc{ + rtn := &WaveshellProc{ Lock: &sync.Mutex{}, Remote: r, RemoteId: r.RemoteId, @@ -727,13 +727,13 @@ func SendRemoteInput(pk *scpacket.RemoteInputPacketType) error { if err != nil { return fmt.Errorf("cannot decode base64: %v", err) } - msh := GetRemoteById(pk.RemoteId) - if msh == nil { + wsh := GetRemoteById(pk.RemoteId) + if wsh == nil { return fmt.Errorf("remote not found") } var cmdPty *os.File - msh.WithLock(func() { - cmdPty = msh.ControllingPty + wsh.WithLock(func() { + cmdPty = wsh.ControllingPty }) if cmdPty == nil { return fmt.Errorf("remote has no attached pty") @@ -742,46 +742,46 @@ func SendRemoteInput(pk *scpacket.RemoteInputPacketType) error { if err != nil { return fmt.Errorf("writing to pty: %v", err) } - msh.resetClientDeadline() + wsh.resetClientDeadline() return nil } -func (msh *MShellProc) getClientDeadline() *time.Time { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.MakeClientDeadline +func (wsh *WaveshellProc) getClientDeadline() *time.Time { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.MakeClientDeadline } -func (msh *MShellProc) resetClientDeadline() { - msh.Lock.Lock() - defer msh.Lock.Unlock() - if msh.Status != StatusConnecting { +func (wsh *WaveshellProc) resetClientDeadline() { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + if wsh.Status != StatusConnecting { return } - deadline := msh.MakeClientDeadline + deadline := wsh.MakeClientDeadline if deadline == nil { return } newDeadline := time.Now().Add(RemoteConnectTimeout) - msh.MakeClientDeadline = &newDeadline + wsh.MakeClientDeadline = &newDeadline } -func (msh *MShellProc) watchClientDeadlineTime() { +func (wsh *WaveshellProc) watchClientDeadlineTime() { for { time.Sleep(1 * time.Second) - status := msh.GetStatus() + status := wsh.GetStatus() if status != StatusConnecting { break } - deadline := msh.getClientDeadline() + deadline := wsh.getClientDeadline() if deadline == nil { break } if time.Now().After(*deadline) { - msh.Disconnect(false) + wsh.Disconnect(false) break } - go msh.NotifyRemoteUpdate() + go wsh.NotifyRemoteUpdate() } } @@ -798,16 +798,16 @@ func convertSSHOpts(opts *sstore.SSHOpts) shexec.SSHOpts { } } -func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) (*os.File, error) { - msh.Lock.Lock() - defer msh.Lock.Unlock() +func (wsh *WaveshellProc) addControllingTty(ecmd *exec.Cmd) (*os.File, error) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() cmdPty, cmdTty, err := pty.Open() if err != nil { return nil, err } pty.Setsize(cmdPty, &pty.Winsize{Rows: RemoteTermRows, Cols: RemoteTermCols}) - msh.ControllingPty = cmdPty + wsh.ControllingPty = cmdPty ecmd.ExtraFiles = append(ecmd.ExtraFiles, cmdTty) if ecmd.SysProcAttr == nil { ecmd.SysProcAttr = &syscall.SysProcAttr{} @@ -818,101 +818,101 @@ func (msh *MShellProc) addControllingTty(ecmd *exec.Cmd) (*os.File, error) { return cmdPty, nil } -func (msh *MShellProc) setErrorStatus(err error) { - msh.Lock.Lock() - defer msh.Lock.Unlock() - msh.Status = StatusError - msh.Err = err - go msh.NotifyRemoteUpdate() +func (wsh *WaveshellProc) setErrorStatus(err error) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + wsh.Status = StatusError + wsh.Err = err + go wsh.NotifyRemoteUpdate() } -func (msh *MShellProc) setInstallErrorStatus(err error) { - msh.WriteToPtyBuffer("*error, %s\n", err.Error()) - msh.Lock.Lock() - defer msh.Lock.Unlock() - msh.InstallStatus = StatusError - msh.InstallErr = err - go msh.NotifyRemoteUpdate() +func (wsh *WaveshellProc) setInstallErrorStatus(err error) { + wsh.WriteToPtyBuffer("*error, %s\n", err.Error()) + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + wsh.InstallStatus = StatusError + wsh.InstallErr = err + go wsh.NotifyRemoteUpdate() } -func (msh *MShellProc) GetRemoteCopy() sstore.RemoteType { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return *msh.Remote +func (wsh *WaveshellProc) GetRemoteCopy() sstore.RemoteType { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return *wsh.Remote } -func (msh *MShellProc) GetUName() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.UName +func (wsh *WaveshellProc) GetUName() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.UName } -func (msh *MShellProc) GetNumRunningCommands() int { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return len(msh.RunningCmds) +func (wsh *WaveshellProc) GetNumRunningCommands() int { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return len(wsh.RunningCmds) } -func (msh *MShellProc) UpdateRemote(ctx context.Context, editMap map[string]interface{}) error { - msh.Lock.Lock() - defer msh.Lock.Unlock() - updatedRemote, err := sstore.UpdateRemote(ctx, msh.Remote.RemoteId, editMap) +func (wsh *WaveshellProc) UpdateRemote(ctx context.Context, editMap map[string]interface{}) error { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + updatedRemote, err := sstore.UpdateRemote(ctx, wsh.Remote.RemoteId, editMap) if err != nil { return err } if updatedRemote == nil { return fmt.Errorf("no remote returned from UpdateRemote") } - msh.Remote = updatedRemote - go msh.NotifyRemoteUpdate() + wsh.Remote = updatedRemote + go wsh.NotifyRemoteUpdate() return nil } -func (msh *MShellProc) Disconnect(force bool) { - status := msh.GetStatus() +func (wsh *WaveshellProc) Disconnect(force bool) { + status := wsh.GetStatus() if status != StatusConnected && status != StatusConnecting { - msh.WriteToPtyBuffer("remote already disconnected (no action taken)\n") + wsh.WriteToPtyBuffer("remote already disconnected (no action taken)\n") return } - numCommands := msh.GetNumRunningCommands() + numCommands := wsh.GetNumRunningCommands() if numCommands > 0 && !force { - msh.WriteToPtyBuffer("remote not disconnected, has %d running commands. use force=1 to force disconnection\n", numCommands) + wsh.WriteToPtyBuffer("remote not disconnected, has %d running commands. use force=1 to force disconnection\n", numCommands) return } - msh.Lock.Lock() - defer msh.Lock.Unlock() - if msh.ServerProc != nil { - msh.ServerProc.Close() - msh.Client = nil + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + if wsh.ServerProc != nil { + wsh.ServerProc.Close() + wsh.Client = nil } - if msh.MakeClientCancelFn != nil { - msh.MakeClientCancelFn() - msh.MakeClientCancelFn = nil + if wsh.MakeClientCancelFn != nil { + wsh.MakeClientCancelFn() + wsh.MakeClientCancelFn = nil } } -func (msh *MShellProc) CancelInstall() { - msh.Lock.Lock() - defer msh.Lock.Unlock() - if msh.InstallCancelFn != nil { - msh.InstallCancelFn() - msh.InstallCancelFn = nil +func (wsh *WaveshellProc) CancelInstall() { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + if wsh.InstallCancelFn != nil { + wsh.InstallCancelFn() + wsh.InstallCancelFn = nil } } -func (msh *MShellProc) GetRemoteName() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Remote.GetName() +func (wsh *WaveshellProc) GetRemoteName() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Remote.GetName() } -func (msh *MShellProc) WriteToPtyBuffer(strFmt string, args ...interface{}) { - msh.Lock.Lock() - defer msh.Lock.Unlock() - msh.writeToPtyBuffer_nolock(strFmt, args...) +func (wsh *WaveshellProc) WriteToPtyBuffer(strFmt string, args ...interface{}) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + wsh.writeToPtyBuffer_nolock(strFmt, args...) } -func (msh *MShellProc) writeToPtyBuffer_nolock(strFmt string, args ...interface{}) { +func (wsh *WaveshellProc) writeToPtyBuffer_nolock(strFmt string, args ...interface{}) { // inefficient string manipulation here and read of PtyBuffer, but these messages are rare, nbd realStr := fmt.Sprintf(strFmt, args...) if !strings.HasPrefix(realStr, "~") { @@ -925,17 +925,17 @@ func (msh *MShellProc) writeToPtyBuffer_nolock(strFmt string, args ...interface{ } else { realStr = "\033[0m\033[32mwave>\033[0m " + realStr } - barr := msh.PtyBuffer.Bytes() + barr := wsh.PtyBuffer.Bytes() if len(barr) > 0 && barr[len(barr)-1] != '\n' { realStr = "\r\n" + realStr } } else { realStr = realStr[1:] } - curOffset := msh.PtyBuffer.TotalWritten() + curOffset := wsh.PtyBuffer.TotalWritten() data := []byte(realStr) - msh.PtyBuffer.Write(data) - sendRemotePtyUpdate(msh.Remote.RemoteId, curOffset, data) + wsh.PtyBuffer.Write(data) + sendRemotePtyUpdate(wsh.Remote.RemoteId, curOffset, data) } func sendRemotePtyUpdate(remoteId string, dataOffset int64, data []byte) { @@ -949,8 +949,8 @@ func sendRemotePtyUpdate(remoteId string, dataOffset int64, data []byte) { scbus.MainUpdateBus.DoUpdate(update) } -func (msh *MShellProc) isWaitingForPassword_nolock() bool { - barr := msh.PtyBuffer.Bytes() +func (wsh *WaveshellProc) isWaitingForPassword_nolock() bool { + barr := wsh.PtyBuffer.Bytes() if len(barr) == 0 { return false } @@ -965,8 +965,8 @@ func (msh *MShellProc) isWaitingForPassword_nolock() bool { return pwIdx != -1 } -func (msh *MShellProc) isWaitingForPassphrase_nolock() bool { - barr := msh.PtyBuffer.Bytes() +func (wsh *WaveshellProc) isWaitingForPassphrase_nolock() bool { + barr := wsh.PtyBuffer.Bytes() if len(barr) == 0 { return false } @@ -981,7 +981,7 @@ func (msh *MShellProc) isWaitingForPassphrase_nolock() bool { return pwIdx != -1 } -func (msh *MShellProc) RunPasswordReadLoop(cmdPty *os.File) { +func (wsh *WaveshellProc) RunPasswordReadLoop(cmdPty *os.File) { buf := make([]byte, PtyReadBufSize) for { _, readErr := cmdPty.Read(buf) @@ -989,12 +989,12 @@ func (msh *MShellProc) RunPasswordReadLoop(cmdPty *os.File) { return } if readErr != nil { - msh.WriteToPtyBuffer("*error reading from controlling-pty: %v\n", readErr) + wsh.WriteToPtyBuffer("*error reading from controlling-pty: %v\n", readErr) return } var newIsWaiting bool - msh.WithLock(func() { - newIsWaiting = msh.isWaitingForPassword_nolock() + wsh.WithLock(func() { + newIsWaiting = wsh.isWaitingForPassword_nolock() }) if newIsWaiting { break @@ -1010,17 +1010,17 @@ func (msh *MShellProc) RunPasswordReadLoop(cmdPty *os.File) { defer cancelFn() response, err := userinput.GetUserInput(ctx, scbus.MainRpcBus, request) if err != nil { - msh.WriteToPtyBuffer("*error timed out waiting for password: %v\n", err) + wsh.WriteToPtyBuffer("*error timed out waiting for password: %v\n", err) return } - msh.WithLock(func() { - curOffset := msh.PtyBuffer.TotalWritten() - msh.PtyBuffer.Write([]byte(response.Text)) - sendRemotePtyUpdate(msh.Remote.RemoteId, curOffset, []byte(response.Text)) + wsh.WithLock(func() { + curOffset := wsh.PtyBuffer.TotalWritten() + wsh.PtyBuffer.Write([]byte(response.Text)) + sendRemotePtyUpdate(wsh.Remote.RemoteId, curOffset, []byte(response.Text)) }) } -func (msh *MShellProc) RunPtyReadLoop(cmdPty *os.File) { +func (wsh *WaveshellProc) RunPtyReadLoop(cmdPty *os.File) { buf := make([]byte, PtyReadBufSize) var isWaiting bool for { @@ -1029,34 +1029,34 @@ func (msh *MShellProc) RunPtyReadLoop(cmdPty *os.File) { break } if readErr != nil { - msh.WriteToPtyBuffer("*error reading from controlling-pty: %v\n", readErr) + wsh.WriteToPtyBuffer("*error reading from controlling-pty: %v\n", readErr) break } var newIsWaiting bool - msh.WithLock(func() { - curOffset := msh.PtyBuffer.TotalWritten() - msh.PtyBuffer.Write(buf[0:n]) - sendRemotePtyUpdate(msh.Remote.RemoteId, curOffset, buf[0:n]) - newIsWaiting = msh.isWaitingForPassword_nolock() + wsh.WithLock(func() { + curOffset := wsh.PtyBuffer.TotalWritten() + wsh.PtyBuffer.Write(buf[0:n]) + sendRemotePtyUpdate(wsh.Remote.RemoteId, curOffset, buf[0:n]) + newIsWaiting = wsh.isWaitingForPassword_nolock() }) if newIsWaiting != isWaiting { isWaiting = newIsWaiting - go msh.NotifyRemoteUpdate() + go wsh.NotifyRemoteUpdate() } } } -func (msh *MShellProc) CheckPasswordRequested(ctx context.Context, requiresPassword chan bool) { +func (wsh *WaveshellProc) CheckPasswordRequested(ctx context.Context, requiresPassword chan bool) { for { - msh.WithLock(func() { - if msh.isWaitingForPassword_nolock() { + wsh.WithLock(func() { + if wsh.isWaitingForPassword_nolock() { select { case requiresPassword <- true: default: } return } - if msh.Status != StatusConnecting { + if wsh.Status != StatusConnecting { select { case requiresPassword <- false: default: @@ -1073,25 +1073,25 @@ func (msh *MShellProc) CheckPasswordRequested(ctx context.Context, requiresPassw } } -func (msh *MShellProc) SendPassword(pw string) { - msh.WithLock(func() { - if msh.ControllingPty == nil { +func (wsh *WaveshellProc) SendPassword(pw string) { + wsh.WithLock(func() { + if wsh.ControllingPty == nil { return } pwBytes := []byte(pw + "\r") - msh.writeToPtyBuffer_nolock("~[sent password]\r\n") - _, err := msh.ControllingPty.Write(pwBytes) + wsh.writeToPtyBuffer_nolock("~[sent password]\r\n") + _, err := wsh.ControllingPty.Write(pwBytes) if err != nil { - msh.writeToPtyBuffer_nolock("*cannot write password to controlling pty: %v\n", err) + wsh.writeToPtyBuffer_nolock("*cannot write password to controlling pty: %v\n", err) } }) } -func (msh *MShellProc) WaitAndSendPasswordNew(pw string) { +func (wsh *WaveshellProc) WaitAndSendPasswordNew(pw string) { requiresPassword := make(chan bool, 1) ctx, cancelFn := context.WithTimeout(context.Background(), 60*time.Second) defer cancelFn() - go msh.CheckPasswordRequested(ctx, requiresPassword) + go wsh.CheckPasswordRequested(ctx, requiresPassword) select { case <-ctx.Done(): err := ctx.Err() @@ -1101,8 +1101,8 @@ func (msh *MShellProc) WaitAndSendPasswordNew(pw string) { } else { errMsg = fmt.Errorf("timed out waiting for password prompt") } - msh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) + wsh.setErrorStatus(errMsg) return case required := <-requiresPassword: if !required { @@ -1125,14 +1125,14 @@ func (msh *MShellProc) WaitAndSendPasswordNew(pw string) { } else { errMsg = fmt.Errorf("timed out waiting for user input") } - msh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) + wsh.setErrorStatus(errMsg) return } - msh.SendPassword(response.Text) + wsh.SendPassword(response.Text) //error out if requested again - go msh.CheckPasswordRequested(ctx, requiresPassword) + go wsh.CheckPasswordRequested(ctx, requiresPassword) select { case <-ctx.Done(): err := ctx.Err() @@ -1142,8 +1142,8 @@ func (msh *MShellProc) WaitAndSendPasswordNew(pw string) { } else { errMsg = fmt.Errorf("timed out waiting for password prompt") } - msh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) + wsh.setErrorStatus(errMsg) return case required := <-requiresPassword: if !required { @@ -1152,22 +1152,22 @@ func (msh *MShellProc) WaitAndSendPasswordNew(pw string) { } } errMsg := fmt.Errorf("*error, incorrect password") - msh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) + wsh.setErrorStatus(errMsg) } -func (msh *MShellProc) WaitAndSendPassword(pw string) { +func (wsh *WaveshellProc) WaitAndSendPassword(pw string) { var numWaits int for { var isWaiting bool var isConnecting bool - msh.WithLock(func() { - if msh.Remote.SSHOpts.GetAuthType() == sstore.RemoteAuthTypeKeyPassword { - isWaiting = msh.isWaitingForPassphrase_nolock() + wsh.WithLock(func() { + if wsh.Remote.SSHOpts.GetAuthType() == sstore.RemoteAuthTypeKeyPassword { + isWaiting = wsh.isWaitingForPassphrase_nolock() } else { - isWaiting = msh.isWaitingForPassword_nolock() + isWaiting = wsh.isWaitingForPassword_nolock() } - isConnecting = msh.Status == StatusConnecting + isConnecting = wsh.Status == StatusConnecting }) if !isConnecting { break @@ -1182,15 +1182,15 @@ func (msh *MShellProc) WaitAndSendPassword(pw string) { time.Sleep(100 * time.Millisecond) } else { // send password - msh.WithLock(func() { - if msh.ControllingPty == nil { + wsh.WithLock(func() { + if wsh.ControllingPty == nil { return } pwBytes := []byte(pw + "\r") - msh.writeToPtyBuffer_nolock("~[sent password]\r\n") - _, err := msh.ControllingPty.Write(pwBytes) + wsh.writeToPtyBuffer_nolock("~[sent password]\r\n") + _, err := wsh.ControllingPty.Write(pwBytes) if err != nil { - msh.writeToPtyBuffer_nolock("*cannot write password to controlling pty: %v\n", err) + wsh.writeToPtyBuffer_nolock("*cannot write password to controlling pty: %v\n", err) } }) break @@ -1198,38 +1198,38 @@ func (msh *MShellProc) WaitAndSendPassword(pw string) { } } -func (msh *MShellProc) RunInstall(autoInstall bool) { +func (wsh *WaveshellProc) RunInstall(autoInstall bool) { defer func() { if r := recover(); r != nil { errMsg := fmt.Errorf("this should not happen. if it does, please reach out to us in our discord or open an issue on our github\n\n"+ "error:\n%v\n\nstack trace:\n%s", r, string(debug.Stack())) log.Printf("fatal error, %s\n", errMsg) - msh.WriteToPtyBuffer("*fatal error, %s\n", errMsg) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*fatal error, %s\n", errMsg) + wsh.setErrorStatus(errMsg) } }() - remoteCopy := msh.GetRemoteCopy() + remoteCopy := wsh.GetRemoteCopy() if remoteCopy.Archived { - msh.WriteToPtyBuffer("*error: cannot install on archived remote\n") + wsh.WriteToPtyBuffer("*error: cannot install on archived remote\n") return } var makeClientCtx context.Context var makeClientCancelFn context.CancelFunc - msh.WithLock(func() { + wsh.WithLock(func() { makeClientCtx, makeClientCancelFn = context.WithCancel(context.Background()) - msh.MakeClientCancelFn = makeClientCancelFn - msh.MakeClientDeadline = nil - go msh.NotifyRemoteUpdate() + wsh.MakeClientCancelFn = makeClientCancelFn + wsh.MakeClientDeadline = nil + go wsh.NotifyRemoteUpdate() }) defer makeClientCancelFn() clientData, err := sstore.EnsureClientData(makeClientCtx) if err != nil { - msh.WriteToPtyBuffer("*error: cannot obtain client data: %v", err) + wsh.WriteToPtyBuffer("*error: cannot obtain client data: %v", err) return } hideShellPrompt := clientData.ClientOpts.ConfirmFlags["hideshellprompt"] - baseStatus := msh.GetStatus() + baseStatus := wsh.GetStatus() if baseStatus == StatusConnected { ctx, cancelFn := context.WithTimeout(makeClientCtx, 60*time.Second) @@ -1242,14 +1242,14 @@ func (msh *MShellProc) RunInstall(autoInstall bool) { response, err := userinput.GetUserInput(ctx, scbus.MainRpcBus, request) if err != nil { if err == context.Canceled { - msh.WriteToPtyBuffer("installation canceled by user\n") + wsh.WriteToPtyBuffer("installation canceled by user\n") } else { - msh.WriteToPtyBuffer("timed out waiting for user input\n") + wsh.WriteToPtyBuffer("timed out waiting for user input\n") } return } if !response.Confirm { - msh.WriteToPtyBuffer("installation canceled by user\n") + wsh.WriteToPtyBuffer("installation canceled by user\n") return } } else if !hideShellPrompt { @@ -1269,19 +1269,19 @@ func (msh *MShellProc) RunInstall(autoInstall bool) { } else { errMsg = fmt.Errorf("timed out waiting for user input") } - msh.WithLock(func() { - msh.Client = nil + wsh.WithLock(func() { + wsh.Client = nil }) - msh.WriteToPtyBuffer("*error, %s\n", errMsg) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*error, %s\n", errMsg) + wsh.setErrorStatus(errMsg) return } if !response.Confirm { errMsg := fmt.Errorf("installation canceled by user") - msh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) - msh.setErrorStatus(err) - msh.WithLock(func() { - msh.Client = nil + wsh.WriteToPtyBuffer("*error, %s\n", errMsg.Error()) + wsh.setErrorStatus(err) + wsh.WithLock(func() { + wsh.Client = nil }) return } @@ -1289,106 +1289,106 @@ func (msh *MShellProc) RunInstall(autoInstall bool) { clientData.ClientOpts.ConfirmFlags["hideshellprompt"] = true err = sstore.SetClientOpts(makeClientCtx, clientData.ClientOpts) if err != nil { - msh.WriteToPtyBuffer("*error, %s\n", err) - msh.setErrorStatus(err) + wsh.WriteToPtyBuffer("*error, %s\n", err) + wsh.setErrorStatus(err) return } //reload updated clientdata before sending clientData, err = sstore.EnsureClientData(makeClientCtx) if err != nil { - msh.WriteToPtyBuffer("*error, %s\n", err) - msh.setErrorStatus(err) + wsh.WriteToPtyBuffer("*error, %s\n", err) + wsh.setErrorStatus(err) return } update := scbus.MakeUpdatePacket() update.AddUpdate(*clientData) } } - curStatus := msh.GetInstallStatus() + curStatus := wsh.GetInstallStatus() if curStatus == StatusConnecting { - msh.WriteToPtyBuffer("*error: cannot install on remote that is already trying to install, cancel current install to try again\n") + wsh.WriteToPtyBuffer("*error: cannot install on remote that is already trying to install, cancel current install to try again\n") return } if remoteCopy.Local { - msh.WriteToPtyBuffer("*error: cannot install on a local remote\n") + wsh.WriteToPtyBuffer("*error: cannot install on a local remote\n") return } _, err = shellapi.MakeShellApi(packet.ShellType_bash) if err != nil { - msh.WriteToPtyBuffer("*error: %v\n", err) + wsh.WriteToPtyBuffer("*error: %v\n", err) return } - if msh.Client == nil { + if wsh.Client == nil { remoteDisplayName := fmt.Sprintf("%s [%s]", remoteCopy.RemoteAlias, remoteCopy.RemoteCanonicalName) client, err := ConnectToClient(makeClientCtx, remoteCopy.SSHOpts, remoteDisplayName) if err != nil { statusErr := fmt.Errorf("ssh cannot connect to client: %w", err) - msh.setInstallErrorStatus(statusErr) + wsh.setInstallErrorStatus(statusErr) return } - msh.WithLock(func() { - msh.Client = client + wsh.WithLock(func() { + wsh.Client = client }) } - session, err := msh.Client.NewSession() + session, err := wsh.Client.NewSession() if err != nil { statusErr := fmt.Errorf("ssh cannot connect to client: %w", err) - msh.setInstallErrorStatus(statusErr) + wsh.setInstallErrorStatus(statusErr) return } installSession := shexec.SessionWrap{Session: session, StartCmd: shexec.MakeInstallCommandStr()} - msh.WriteToPtyBuffer("installing waveshell %s to %s...\n", scbase.MShellVersion, remoteCopy.RemoteCanonicalName) + wsh.WriteToPtyBuffer("installing waveshell %s to %s...\n", scbase.WaveshellVersion, remoteCopy.RemoteCanonicalName) clientCtx, clientCancelFn := context.WithCancel(context.Background()) defer clientCancelFn() - msh.WithLock(func() { - msh.InstallErr = nil - msh.InstallStatus = StatusConnecting - msh.InstallCancelFn = clientCancelFn - go msh.NotifyRemoteUpdate() + wsh.WithLock(func() { + wsh.InstallErr = nil + wsh.InstallStatus = StatusConnecting + wsh.InstallCancelFn = clientCancelFn + go wsh.NotifyRemoteUpdate() }) msgFn := func(msg string) { - msh.WriteToPtyBuffer("%s", msg) + wsh.WriteToPtyBuffer("%s", msg) } - err = shexec.RunInstallFromCmd(clientCtx, installSession, true, nil, scbase.MShellBinaryReader, msgFn) + err = shexec.RunInstallFromCmd(clientCtx, installSession, true, nil, scbase.WaveshellBinaryReader, msgFn) if err == context.Canceled { - msh.WriteToPtyBuffer("*install canceled\n") - msh.WithLock(func() { - msh.InstallStatus = StatusDisconnected - go msh.NotifyRemoteUpdate() + wsh.WriteToPtyBuffer("*install canceled\n") + wsh.WithLock(func() { + wsh.InstallStatus = StatusDisconnected + go wsh.NotifyRemoteUpdate() }) return } if err != nil { statusErr := fmt.Errorf("install failed: %w", err) - msh.setInstallErrorStatus(statusErr) + wsh.setInstallErrorStatus(statusErr) return } var connectMode string - msh.WithLock(func() { - msh.InstallStatus = StatusDisconnected - msh.InstallCancelFn = nil - msh.NeedsMShellUpgrade = false - msh.Status = StatusDisconnected - msh.Err = nil - connectMode = msh.Remote.ConnectMode + wsh.WithLock(func() { + wsh.InstallStatus = StatusDisconnected + wsh.InstallCancelFn = nil + wsh.NeedsWaveshellUpgrade = false + wsh.Status = StatusDisconnected + wsh.Err = nil + connectMode = wsh.Remote.ConnectMode }) - msh.WriteToPtyBuffer("successfully installed waveshell %s to ~/.mshell\n", scbase.MShellVersion) - go msh.NotifyRemoteUpdate() + wsh.WriteToPtyBuffer("successfully installed waveshell %s to ~/.mshell\n", scbase.WaveshellVersion) + go wsh.NotifyRemoteUpdate() if connectMode == sstore.ConnectModeStartup || connectMode == sstore.ConnectModeAuto || autoInstall { // the install was successful, and we didn't click the install button with manual connect mode, try to connect - go msh.Launch(true) + go wsh.Launch(true) } } -func (msh *MShellProc) updateRemoteStateVars(ctx context.Context, remoteId string, initPk *packet.InitPacketType) { - msh.Lock.Lock() - defer msh.Lock.Unlock() +func (wsh *WaveshellProc) updateRemoteStateVars(ctx context.Context, remoteId string, initPk *packet.InitPacketType) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() stateVars := getStateVarsFromInitPk(initPk) if stateVars == nil { return } - msh.Remote.StateVars = stateVars + wsh.Remote.StateVars = stateVars err := sstore.UpdateRemoteStateVars(ctx, remoteId, stateVars) if err != nil { // ignore error, nothing to do @@ -1419,8 +1419,8 @@ func makeReinitErrorUpdate(shellType string) telemetry.ActivityUpdate { return rtn } -func (msh *MShellProc) ReInit(ctx context.Context, ck base.CommandKey, shellType string, dataFn func([]byte), verbose bool) (rtnPk *packet.ShellStatePacketType, rtnErr error) { - if !msh.IsConnected() { +func (wsh *WaveshellProc) ReInit(ctx context.Context, ck base.CommandKey, shellType string, dataFn func([]byte), verbose bool) (rtnPk *packet.ShellStatePacketType, rtnErr error) { + if !wsh.IsConnected() { return nil, fmt.Errorf("cannot reinit, remote is not connected") } if shellType != packet.ShellType_bash && shellType != packet.ShellType_zsh { @@ -1438,18 +1438,18 @@ func (msh *MShellProc) ReInit(ctx context.Context, ck base.CommandKey, shellType reinitPk := packet.MakeReInitPacket() reinitPk.ReqId = uuid.New().String() reinitPk.ShellType = shellType - rpcIter, err := msh.PacketRpcIter(ctx, reinitPk) + rpcIter, err := wsh.PacketRpcIter(ctx, reinitPk) if err != nil { return nil, err } defer rpcIter.Close() if ck != "" { reinitSink := &ReinitCommandSink{ - Remote: msh, + Remote: wsh, ReqId: reinitPk.ReqId, } - msh.registerInputSink(ck, reinitSink) - defer msh.unregisterInputSink(ck) + wsh.registerInputSink(ck, reinitSink) + defer wsh.unregisterInputSink(ck) } var ssPk *packet.ShellStatePacketType for { @@ -1485,15 +1485,15 @@ func (msh *MShellProc) ReInit(ctx context.Context, ck base.CommandKey, shellType } // TODO: maybe we don't need to save statebase here. should be possible to save it on demand // when it is actually used. complication from other functions that try to get the statebase - // from the DB. probably need to route those through MShellProc. + // from the DB. probably need to route those through WaveshellProc. err = sstore.StoreStateBase(ctx, ssPk.State) if err != nil { return nil, fmt.Errorf("error storing remote state: %w", err) } - msh.StateMap.SetCurrentState(ssPk.State.GetShellType(), ssPk.State) + wsh.StateMap.SetCurrentState(ssPk.State.GetShellType(), ssPk.State) timeDur := time.Since(startTs) dataFn([]byte(makeShellInitOutputMsg(verbose, ssPk.State, ssPk.Stats, timeDur, false))) - msh.WriteToPtyBuffer("%s", makeShellInitOutputMsg(false, ssPk.State, ssPk.Stats, timeDur, true)) + wsh.WriteToPtyBuffer("%s", makeShellInitOutputMsg(false, ssPk.State, ssPk.Stats, timeDur, true)) return ssPk, nil } @@ -1514,12 +1514,12 @@ func makeShellInitOutputMsg(verbose bool, state *packet.ShellState, stats *packe return buf.String() } -func (msh *MShellProc) WriteFile(ctx context.Context, writePk *packet.WriteFilePacketType) (*packet.RpcResponseIter, error) { - return msh.PacketRpcIter(ctx, writePk) +func (wsh *WaveshellProc) WriteFile(ctx context.Context, writePk *packet.WriteFilePacketType) (*packet.RpcResponseIter, error) { + return wsh.PacketRpcIter(ctx, writePk) } -func (msh *MShellProc) StreamFile(ctx context.Context, streamPk *packet.StreamFilePacketType) (*packet.RpcResponseIter, error) { - return msh.PacketRpcIter(ctx, streamPk) +func (wsh *WaveshellProc) StreamFile(ctx context.Context, streamPk *packet.StreamFilePacketType) (*packet.RpcResponseIter, error) { + return wsh.PacketRpcIter(ctx, streamPk) } func addScVarsToState(state *packet.ShellState) *packet.ShellState { @@ -1575,51 +1575,51 @@ func stripScVarsFromStateDiff(stateDiff *packet.ShellStateDiff) *packet.ShellSta return &rtn } -func (msh *MShellProc) getActiveShellTypes(ctx context.Context) ([]string, error) { - shellPref := msh.GetShellPref() +func (wsh *WaveshellProc) getActiveShellTypes(ctx context.Context) ([]string, error) { + shellPref := wsh.GetShellPref() rtn := []string{shellPref} - activeShells, err := sstore.GetRemoteActiveShells(ctx, msh.RemoteId) + activeShells, err := sstore.GetRemoteActiveShells(ctx, wsh.RemoteId) if err != nil { return nil, err } return utilfn.CombineStrArrays(rtn, activeShells), nil } -func (msh *MShellProc) createWaveshellSession(clientCtx context.Context, remoteCopy sstore.RemoteType) (shexec.ConnInterface, error) { - msh.WithLock(func() { - msh.Err = nil - msh.ErrNoInitPk = false - msh.Status = StatusConnecting - msh.MakeClientDeadline = nil - go msh.NotifyRemoteUpdate() +func (wsh *WaveshellProc) createWaveshellSession(clientCtx context.Context, remoteCopy sstore.RemoteType) (shexec.ConnInterface, error) { + wsh.WithLock(func() { + wsh.Err = nil + wsh.ErrNoInitPk = false + wsh.Status = StatusConnecting + wsh.MakeClientDeadline = nil + go wsh.NotifyRemoteUpdate() }) - sapi, err := shellapi.MakeShellApi(msh.GetShellType()) + sapi, err := shellapi.MakeShellApi(wsh.GetShellType()) if err != nil { return nil, err } var wsSession shexec.ConnInterface if remoteCopy.SSHOpts.SSHHost == "" && remoteCopy.Local { - cmdStr, err := MakeLocalMShellCommandStr(remoteCopy.IsSudo()) + cmdStr, err := MakeLocalWaveshellCommandStr(remoteCopy.IsSudo()) if err != nil { return nil, fmt.Errorf("cannot find local waveshell binary: %v", err) } ecmd := shexec.MakeLocalExecCmd(cmdStr, sapi) var cmdPty *os.File - cmdPty, err = msh.addControllingTty(ecmd) + cmdPty, err = wsh.addControllingTty(ecmd) if err != nil { return nil, fmt.Errorf("cannot attach controlling tty to waveshell command: %v", err) } - go msh.RunPtyReadLoop(cmdPty) - go msh.WaitAndSendPasswordNew(remoteCopy.SSHOpts.SSHPassword) + go wsh.RunPtyReadLoop(cmdPty) + go wsh.WaitAndSendPasswordNew(remoteCopy.SSHOpts.SSHPassword) wsSession = shexec.CmdWrap{Cmd: ecmd} - } else if msh.Client == nil { + } else if wsh.Client == nil { remoteDisplayName := fmt.Sprintf("%s [%s]", remoteCopy.RemoteAlias, remoteCopy.RemoteCanonicalName) client, err := ConnectToClient(clientCtx, remoteCopy.SSHOpts, remoteDisplayName) if err != nil { return nil, fmt.Errorf("ssh cannot connect to client: %w", err) } - msh.WithLock(func() { - msh.Client = client + wsh.WithLock(func() { + wsh.Client = client }) session, err := client.NewSession() if err != nil { @@ -1628,7 +1628,7 @@ func (msh *MShellProc) createWaveshellSession(clientCtx context.Context, remoteC cmd := fmt.Sprintf("%s -c %s", sapi.GetLocalShellPath(), shellescape.Quote(MakeServerCommandStr())) wsSession = shexec.SessionWrap{Session: session, StartCmd: cmd} } else { - session, err := msh.Client.NewSession() + session, err := wsh.Client.NewSession() if err != nil { return nil, fmt.Errorf("ssh cannot create session: %w", err) } @@ -1638,131 +1638,131 @@ func (msh *MShellProc) createWaveshellSession(clientCtx context.Context, remoteC return wsSession, nil } -func (msh *MShellProc) Launch(interactive bool) { +func (wsh *WaveshellProc) Launch(interactive bool) { defer func() { if r := recover(); r != nil { errMsg := fmt.Errorf("this should not happen. if it does, please reach out to us in our discord or open an issue on our github\n\n"+ "error:\n%v\n\nstack trace:\n%s", r, string(debug.Stack())) log.Printf("fatal error, %s\n", errMsg) - msh.WriteToPtyBuffer("*fatal error, %s\n", errMsg) - msh.setErrorStatus(errMsg) + wsh.WriteToPtyBuffer("*fatal error, %s\n", errMsg) + wsh.setErrorStatus(errMsg) } }() - remoteCopy := msh.GetRemoteCopy() + remoteCopy := wsh.GetRemoteCopy() if remoteCopy.Archived { - msh.WriteToPtyBuffer("cannot launch archived remote\n") + wsh.WriteToPtyBuffer("cannot launch archived remote\n") return } - curStatus := msh.GetStatus() + curStatus := wsh.GetStatus() if curStatus == StatusConnected { - msh.WriteToPtyBuffer("remote is already connected (no action taken)\n") + wsh.WriteToPtyBuffer("remote is already connected (no action taken)\n") return } if curStatus == StatusConnecting { - msh.WriteToPtyBuffer("remote is already connecting, disconnect before trying to connect again\n") + wsh.WriteToPtyBuffer("remote is already connecting, disconnect before trying to connect again\n") return } - istatus := msh.GetInstallStatus() + istatus := wsh.GetInstallStatus() if istatus == StatusConnecting { - msh.WriteToPtyBuffer("remote is trying to install, cancel install before trying to connect again\n") + wsh.WriteToPtyBuffer("remote is trying to install, cancel install before trying to connect again\n") return } var makeClientCtx context.Context var makeClientCancelFn context.CancelFunc - msh.WithLock(func() { + wsh.WithLock(func() { makeClientCtx, makeClientCancelFn = context.WithCancel(context.Background()) - msh.MakeClientCancelFn = makeClientCancelFn - msh.MakeClientDeadline = nil - go msh.NotifyRemoteUpdate() + wsh.MakeClientCancelFn = makeClientCancelFn + wsh.MakeClientDeadline = nil + go wsh.NotifyRemoteUpdate() }) defer makeClientCancelFn() - msh.WriteToPtyBuffer("connecting to %s...\n", remoteCopy.RemoteCanonicalName) - wsSession, err := msh.createWaveshellSession(makeClientCtx, remoteCopy) + wsh.WriteToPtyBuffer("connecting to %s...\n", remoteCopy.RemoteCanonicalName) + wsSession, err := wsh.createWaveshellSession(makeClientCtx, remoteCopy) if err != nil { - msh.WriteToPtyBuffer("*error, %s\n", err.Error()) - msh.setErrorStatus(err) - msh.WithLock(func() { - msh.Client = nil + wsh.WriteToPtyBuffer("*error, %s\n", err.Error()) + wsh.setErrorStatus(err) + wsh.WithLock(func() { + wsh.Client = nil }) return } cproc, err := shexec.MakeClientProc(makeClientCtx, wsSession) - msh.WithLock(func() { - msh.MakeClientCancelFn = nil - msh.MakeClientDeadline = nil + wsh.WithLock(func() { + wsh.MakeClientCancelFn = nil + wsh.MakeClientDeadline = nil }) if err == context.DeadlineExceeded { - msh.WriteToPtyBuffer("*connect timeout\n") - msh.setErrorStatus(errors.New("connect timeout")) - msh.WithLock(func() { - msh.Client = nil + wsh.WriteToPtyBuffer("*connect timeout\n") + wsh.setErrorStatus(errors.New("connect timeout")) + wsh.WithLock(func() { + wsh.Client = nil }) return } else if err == context.Canceled { - msh.WriteToPtyBuffer("*forced disconnection\n") - msh.WithLock(func() { - msh.Status = StatusDisconnected - go msh.NotifyRemoteUpdate() + wsh.WriteToPtyBuffer("*forced disconnection\n") + wsh.WithLock(func() { + wsh.Status = StatusDisconnected + go wsh.NotifyRemoteUpdate() }) - msh.WithLock(func() { - msh.Client = nil + wsh.WithLock(func() { + wsh.Client = nil }) return } else if serr, ok := err.(shexec.WaveshellLaunchError); ok { - msh.WithLock(func() { - msh.UName = serr.InitPk.UName - msh.NeedsMShellUpgrade = true - msh.InitPkShellType = serr.InitPk.Shell + wsh.WithLock(func() { + wsh.UName = serr.InitPk.UName + wsh.NeedsWaveshellUpgrade = true + wsh.InitPkShellType = serr.InitPk.Shell }) - msh.StateMap.Clear() - msh.WriteToPtyBuffer("*error, %s\n", serr.Error()) - msh.setErrorStatus(serr) - go msh.tryAutoInstall() + wsh.StateMap.Clear() + wsh.WriteToPtyBuffer("*error, %s\n", serr.Error()) + wsh.setErrorStatus(serr) + go wsh.tryAutoInstall() return } else if err != nil { - msh.WriteToPtyBuffer("*error, %s\n", err.Error()) - msh.setErrorStatus(err) - msh.WithLock(func() { - msh.Client = nil + wsh.WriteToPtyBuffer("*error, %s\n", err.Error()) + wsh.setErrorStatus(err) + wsh.WithLock(func() { + wsh.Client = nil }) return } - msh.WithLock(func() { - msh.UName = cproc.InitPk.UName - msh.InitPkShellType = cproc.InitPk.Shell - msh.StateMap.Clear() + wsh.WithLock(func() { + wsh.UName = cproc.InitPk.UName + wsh.InitPkShellType = cproc.InitPk.Shell + wsh.StateMap.Clear() // no notify here, because we'll call notify in either case below }) - msh.updateRemoteStateVars(context.Background(), msh.RemoteId, cproc.InitPk) - msh.WithLock(func() { - msh.ServerProc = cproc - msh.Status = StatusConnected + wsh.updateRemoteStateVars(context.Background(), wsh.RemoteId, cproc.InitPk) + wsh.WithLock(func() { + wsh.ServerProc = cproc + wsh.Status = StatusConnected }) - msh.WriteToPtyBuffer("connected to %s\n", remoteCopy.RemoteCanonicalName) + wsh.WriteToPtyBuffer("connected to %s\n", remoteCopy.RemoteCanonicalName) go func() { exitErr := cproc.Cmd.Wait() exitCode := utilfn.GetExitCode(exitErr) - msh.WithLock(func() { - if msh.Status == StatusConnected || msh.Status == StatusConnecting { - msh.Status = StatusDisconnected - go msh.NotifyRemoteUpdate() + wsh.WithLock(func() { + if wsh.Status == StatusConnected || wsh.Status == StatusConnecting { + wsh.Status = StatusDisconnected + go wsh.NotifyRemoteUpdate() } }) - msh.WriteToPtyBuffer("*disconnected exitcode=%d\n", exitCode) + wsh.WriteToPtyBuffer("*disconnected exitcode=%d\n", exitCode) }() - go msh.ProcessPackets() - // msh.initActiveShells() - go msh.NotifyRemoteUpdate() + go wsh.ProcessPackets() + // wsh.initActiveShells() + go wsh.NotifyRemoteUpdate() } -func (msh *MShellProc) initActiveShells() { +func (wsh *WaveshellProc) initActiveShells() { gasCtx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() - activeShells, err := msh.getActiveShellTypes(gasCtx) + activeShells, err := wsh.getActiveShellTypes(gasCtx) if err != nil { // we're not going to fail the connect for this error (it will be unusable, but technically connected) - msh.WriteToPtyBuffer("*error getting active shells: %v\n", err) + wsh.WriteToPtyBuffer("*error getting active shells: %v\n", err) return } var wg sync.WaitGroup @@ -1772,25 +1772,25 @@ func (msh *MShellProc) initActiveShells() { defer wg.Done() reinitCtx, cancelFn := context.WithTimeout(context.Background(), 12*time.Second) defer cancelFn() - _, err = msh.ReInit(reinitCtx, base.CommandKey(""), shellType, nil, false) + _, err = wsh.ReInit(reinitCtx, base.CommandKey(""), shellType, nil, false) if err != nil { - msh.WriteToPtyBuffer("*error reiniting shell %q: %v\n", shellType, err) + wsh.WriteToPtyBuffer("*error reiniting shell %q: %v\n", shellType, err) } }(shellTypeForVar) } wg.Wait() } -func (msh *MShellProc) IsConnected() bool { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.Status == StatusConnected +func (wsh *WaveshellProc) IsConnected() bool { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.Status == StatusConnected } -func (msh *MShellProc) GetShellType() string { - msh.Lock.Lock() - defer msh.Lock.Unlock() - return msh.InitPkShellType +func (wsh *WaveshellProc) GetShellType() string { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + return wsh.InitPkShellType } func replaceHomePath(pathStr string, homeDir string) string { @@ -1806,21 +1806,21 @@ func replaceHomePath(pathStr string, homeDir string) string { return pathStr } -func (msh *MShellProc) IsCmdRunning(ck base.CommandKey) bool { - msh.Lock.Lock() - defer msh.Lock.Unlock() - _, ok := msh.RunningCmds[ck] +func (wsh *WaveshellProc) IsCmdRunning(ck base.CommandKey) bool { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + _, ok := wsh.RunningCmds[ck] return ok } -func (msh *MShellProc) KillRunningCommandAndWait(ctx context.Context, ck base.CommandKey) error { - if !msh.IsCmdRunning(ck) { +func (wsh *WaveshellProc) KillRunningCommandAndWait(ctx context.Context, ck base.CommandKey) error { + if !wsh.IsCmdRunning(ck) { return nil } feiPk := scpacket.MakeFeInputPacket() feiPk.CK = ck feiPk.SigName = "SIGTERM" - err := msh.HandleFeInput(feiPk) + err := wsh.HandleFeInput(feiPk) if err != nil { return fmt.Errorf("error trying to kill running cmd: %w", err) } @@ -1828,20 +1828,20 @@ func (msh *MShellProc) KillRunningCommandAndWait(ctx context.Context, ck base.Co if ctx.Err() != nil { return ctx.Err() } - if !msh.IsCmdRunning(ck) { + if !wsh.IsCmdRunning(ck) { return nil } - // TODO fix busy wait (sync with msh.RunningCmds) + // TODO fix busy wait (sync with wsh.RunningCmds) // not a huge deal though since this is not processor intensive and not widely used time.Sleep(100 * time.Millisecond) } } -func (msh *MShellProc) SendFileData(dataPk *packet.FileDataPacketType) error { - if !msh.IsConnected() { +func (wsh *WaveshellProc) SendFileData(dataPk *packet.FileDataPacketType) error { + if !wsh.IsConnected() { return fmt.Errorf("remote is not connected, cannot send input") } - return msh.ServerProc.Input.SendPacket(dataPk) + return wsh.ServerProc.Input.SendPacket(dataPk) } func makeTermOpts(runPk *packet.RunPacketType) sstore.TermOpts { @@ -1851,14 +1851,14 @@ func makeTermOpts(runPk *packet.RunPacketType) sstore.TermOpts { // returns (ok, rct) // if ok is true, rct will be nil // if ok is false, rct will be the existing pending state command (not nil) -func (msh *MShellProc) testAndSetPendingStateCmd(screenId string, rptr sstore.RemotePtrType, newCK *base.CommandKey) (bool, *RunCmdType) { +func (wsh *WaveshellProc) testAndSetPendingStateCmd(screenId string, rptr sstore.RemotePtrType, newCK *base.CommandKey) (bool, *RunCmdType) { key := pendingStateKey{ScreenId: screenId, RemotePtr: rptr} - msh.Lock.Lock() - defer msh.Lock.Unlock() - ck, found := msh.PendingStateCmds[key] + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + ck, found := wsh.PendingStateCmds[key] if found { - // we don't call GetRunningCmd here because we already hold msh.Lock - rct := msh.RunningCmds[ck] + // we don't call GetRunningCmd here because we already hold wsh.Lock + rct := wsh.RunningCmds[ck] if rct != nil { return false, rct } @@ -1866,21 +1866,21 @@ func (msh *MShellProc) testAndSetPendingStateCmd(screenId string, rptr sstore.Re log.Printf("[warning] found pending state cmd with no running cmd: %s\n", ck) } if newCK != nil { - msh.PendingStateCmds[key] = *newCK + wsh.PendingStateCmds[key] = *newCK } return true, nil } -func (msh *MShellProc) removePendingStateCmd(screenId string, rptr sstore.RemotePtrType, ck base.CommandKey) { +func (wsh *WaveshellProc) removePendingStateCmd(screenId string, rptr sstore.RemotePtrType, ck base.CommandKey) { key := pendingStateKey{ScreenId: screenId, RemotePtr: rptr} - msh.Lock.Lock() - defer msh.Lock.Unlock() - existingCK, found := msh.PendingStateCmds[key] + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + existingCK, found := wsh.PendingStateCmds[key] if !found { return } if existingCK == ck { - delete(msh.PendingStateCmds, key) + delete(wsh.PendingStateCmds, key) } } @@ -1913,11 +1913,11 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru if screenId != runPacket.CK.GetGroupId() { return nil, nil, fmt.Errorf("run commands screenids do not match") } - msh := GetRemoteById(remotePtr.RemoteId) - if msh == nil { + wsh := GetRemoteById(remotePtr.RemoteId) + if wsh == nil { return nil, nil, fmt.Errorf("no remote id=%s found", remotePtr.RemoteId) } - if !msh.IsConnected() { + if !wsh.IsConnected() { return nil, nil, fmt.Errorf("remote '%s' is not connected", remotePtr.RemoteId) } if runPacket.State != nil { @@ -1941,7 +1941,7 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru if runPacket.ReturnState { newPSC = &runPacket.CK } - ok, existingRct := msh.testAndSetPendingStateCmd(screenId, remotePtr, newPSC) + ok, existingRct := wsh.testAndSetPendingStateCmd(screenId, remotePtr, newPSC) if !ok { if rcOpts.EphemeralOpts != nil { // if the existing command is ephemeral, we cancel it and continue @@ -1957,7 +1957,7 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru // if we get an error, remove the pending state cmd // if no error, PSC will get removed when we see a CmdDone or CmdFinal packet if rtnErr != nil { - msh.removePendingStateCmd(screenId, remotePtr, *newPSC) + wsh.removePendingStateCmd(screenId, remotePtr, *newPSC) } }() } @@ -1991,7 +1991,7 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru if rcOpts.EphemeralOpts.OverrideCwd != "" { overrideCwd := rcOpts.EphemeralOpts.OverrideCwd if !strings.HasPrefix(overrideCwd, "/") { - expandedCwd, err := msh.GetRemoteRuntimeState().ExpandHomeDir(overrideCwd) + expandedCwd, err := wsh.GetRemoteRuntimeState().ExpandHomeDir(overrideCwd) if err != nil { return nil, nil, fmt.Errorf("cannot expand home dir for cwd: %w", err) } @@ -2042,18 +2042,18 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru } // RegisterRpc + WaitForResponse is used to get any waveshell side errors // waveshell will either return an error (in a ResponsePacketType) or a CmdStartPacketType - msh.ServerProc.Output.RegisterRpc(runPacket.ReqId) + wsh.ServerProc.Output.RegisterRpc(runPacket.ReqId) go func() { - startPk, err := msh.sendRunPacketAndReturnResponse(runPacket) + startPk, err := wsh.sendRunPacketAndReturnResponse(runPacket) runCmdUpdateFn(runPacket.CK, func() { if err != nil { // the cmd failed (never started) - msh.handleCmdStartError(runningCmdType, err) + wsh.handleCmdStartError(runningCmdType, err) return } ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() - err = sstore.UpdateCmdStartInfo(ctx, runPacket.CK, startPk.Pid, startPk.MShellPid) + err = sstore.UpdateCmdStartInfo(ctx, runPacket.CK, startPk.Pid, startPk.WaveshellPid) if err != nil { log.Printf("error updating cmd start info (in remote.RunCommand): %v\n", err) } @@ -2086,19 +2086,19 @@ func RunCommand(ctx context.Context, rcOpts RunCommandOpts, runPacket *packet.Ru return nil, nil, fmt.Errorf("cannot create local ptyout file for running command: %v", err) } } - msh.AddRunningCmd(runningCmdType) + wsh.AddRunningCmd(runningCmdType) return cmd, func() { removeCmdWait(runPacket.CK) }, nil } // no context because it is called as a goroutine -func (msh *MShellProc) sendRunPacketAndReturnResponse(runPacket *packet.RunPacketType) (*packet.CmdStartPacketType, error) { +func (wsh *WaveshellProc) sendRunPacketAndReturnResponse(runPacket *packet.RunPacketType) (*packet.CmdStartPacketType, error) { ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() - err := shexec.SendRunPacketAndRunData(ctx, msh.ServerProc.Input, runPacket) + err := shexec.SendRunPacketAndRunData(ctx, wsh.ServerProc.Input, runPacket) if err != nil { return nil, fmt.Errorf("sending run packet to remote: %w", err) } - rtnPk := msh.ServerProc.Output.WaitForResponse(ctx, runPacket.ReqId) + rtnPk := wsh.ServerProc.Output.WaitForResponse(ctx, runPacket.ReqId) if rtnPk == nil { return nil, ctx.Err() } @@ -2127,26 +2127,26 @@ func makePSCLineError(existingPSC base.CommandKey, line *sstore.LineType, lineEr return fmt.Errorf("cannot run command while a stateful command (linenum=%d) is still running", line.LineNum) } -func (msh *MShellProc) registerInputSink(ck base.CommandKey, sink CommandInputSink) { - msh.Lock.Lock() - defer msh.Lock.Unlock() - msh.CommandInputMap[ck] = sink +func (wsh *WaveshellProc) registerInputSink(ck base.CommandKey, sink CommandInputSink) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + wsh.CommandInputMap[ck] = sink } -func (msh *MShellProc) unregisterInputSink(ck base.CommandKey) { - msh.Lock.Lock() - defer msh.Lock.Unlock() - delete(msh.CommandInputMap, ck) +func (wsh *WaveshellProc) unregisterInputSink(ck base.CommandKey) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + delete(wsh.CommandInputMap, ck) } -func (msh *MShellProc) HandleFeInput(inputPk *scpacket.FeInputPacketType) error { +func (wsh *WaveshellProc) HandleFeInput(inputPk *scpacket.FeInputPacketType) error { if inputPk == nil { return nil } - if !msh.IsConnected() { + if !wsh.IsConnected() { return fmt.Errorf("connection is not connected, cannot send input") } - if msh.IsCmdRunning(inputPk.CK) { + if wsh.IsCmdRunning(inputPk.CK) { if len(inputPk.InputData64) > 0 { inputLen := packet.B64DecodedLen(inputPk.InputData64) if inputLen > MaxInputDataSize { @@ -2156,7 +2156,7 @@ func (msh *MShellProc) HandleFeInput(inputPk *scpacket.FeInputPacketType) error dataPk.CK = inputPk.CK dataPk.FdNum = 0 // stdin dataPk.Data64 = inputPk.InputData64 - err := msh.ServerProc.Input.SendPacket(dataPk) + err := wsh.ServerProc.Input.SendPacket(dataPk) if err != nil { return err } @@ -2166,16 +2166,16 @@ func (msh *MShellProc) HandleFeInput(inputPk *scpacket.FeInputPacketType) error siPk.CK = inputPk.CK siPk.SigName = inputPk.SigName siPk.WinSize = inputPk.WinSize - err := msh.ServerProc.Input.SendPacket(siPk) + err := wsh.ServerProc.Input.SendPacket(siPk) if err != nil { return err } } return nil } - msh.Lock.Lock() - sink := msh.CommandInputMap[inputPk.CK] - msh.Lock.Unlock() + wsh.Lock.Lock() + sink := wsh.CommandInputMap[inputPk.CK] + wsh.Lock.Unlock() if sink == nil { // no sink and no running command return fmt.Errorf("cannot send input, cmd is not running (%s)", inputPk.CK) @@ -2183,72 +2183,72 @@ func (msh *MShellProc) HandleFeInput(inputPk *scpacket.FeInputPacketType) error return sink.HandleInput(inputPk) } -func (msh *MShellProc) AddRunningCmd(rct *RunCmdType) { - msh.Lock.Lock() - defer msh.Lock.Unlock() +func (wsh *WaveshellProc) AddRunningCmd(rct *RunCmdType) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() if rct.EphemeralOpts != nil { log.Printf("[info] adding ephemeral running command: %s\n", rct.CK) } - msh.RunningCmds[rct.RunPacket.CK] = rct + wsh.RunningCmds[rct.RunPacket.CK] = rct } -func (msh *MShellProc) GetRunningCmd(ck base.CommandKey) *RunCmdType { - msh.Lock.Lock() - defer msh.Lock.Unlock() - rtn := msh.RunningCmds[ck] +func (wsh *WaveshellProc) GetRunningCmd(ck base.CommandKey) *RunCmdType { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + rtn := wsh.RunningCmds[ck] return rtn } -func (msh *MShellProc) RemoveRunningCmd(ck base.CommandKey) { - msh.Lock.Lock() - defer msh.Lock.Unlock() - delete(msh.RunningCmds, ck) - for key, pendingCk := range msh.PendingStateCmds { +func (wsh *WaveshellProc) RemoveRunningCmd(ck base.CommandKey) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() + delete(wsh.RunningCmds, ck) + for key, pendingCk := range wsh.PendingStateCmds { if pendingCk == ck { - delete(msh.PendingStateCmds, key) + delete(wsh.PendingStateCmds, key) } } } -func (msh *MShellProc) PacketRpcIter(ctx context.Context, pk packet.RpcPacketType) (*packet.RpcResponseIter, error) { - if !msh.IsConnected() { +func (wsh *WaveshellProc) PacketRpcIter(ctx context.Context, pk packet.RpcPacketType) (*packet.RpcResponseIter, error) { + if !wsh.IsConnected() { return nil, fmt.Errorf("remote is not connected") } if pk == nil { return nil, fmt.Errorf("PacketRpc passed nil packet") } reqId := pk.GetReqId() - msh.ServerProc.Output.RegisterRpcSz(reqId, RpcIterChannelSize) - err := msh.ServerProc.Input.SendPacketCtx(ctx, pk) + wsh.ServerProc.Output.RegisterRpcSz(reqId, RpcIterChannelSize) + err := wsh.ServerProc.Input.SendPacketCtx(ctx, pk) if err != nil { return nil, err } - return msh.ServerProc.Output.GetResponseIter(reqId), nil + return wsh.ServerProc.Output.GetResponseIter(reqId), nil } -func (msh *MShellProc) PacketRpcRaw(ctx context.Context, pk packet.RpcPacketType) (packet.RpcResponsePacketType, error) { - if !msh.IsConnected() { +func (wsh *WaveshellProc) PacketRpcRaw(ctx context.Context, pk packet.RpcPacketType) (packet.RpcResponsePacketType, error) { + if !wsh.IsConnected() { return nil, fmt.Errorf("remote is not connected") } if pk == nil { return nil, fmt.Errorf("PacketRpc passed nil packet") } reqId := pk.GetReqId() - msh.ServerProc.Output.RegisterRpc(reqId) - defer msh.ServerProc.Output.UnRegisterRpc(reqId) - err := msh.ServerProc.Input.SendPacketCtx(ctx, pk) + wsh.ServerProc.Output.RegisterRpc(reqId) + defer wsh.ServerProc.Output.UnRegisterRpc(reqId) + err := wsh.ServerProc.Input.SendPacketCtx(ctx, pk) if err != nil { return nil, err } - rtnPk := msh.ServerProc.Output.WaitForResponse(ctx, reqId) + rtnPk := wsh.ServerProc.Output.WaitForResponse(ctx, reqId) if rtnPk == nil { return nil, ctx.Err() } return rtnPk, nil } -func (msh *MShellProc) PacketRpc(ctx context.Context, pk packet.RpcPacketType) (*packet.ResponsePacketType, error) { - rtnPk, err := msh.PacketRpcRaw(ctx, pk) +func (wsh *WaveshellProc) PacketRpc(ctx context.Context, pk packet.RpcPacketType) (*packet.ResponsePacketType, error) { + rtnPk, err := wsh.PacketRpcRaw(ctx, pk) if err != nil { return nil, err } @@ -2258,9 +2258,9 @@ func (msh *MShellProc) PacketRpc(ctx context.Context, pk packet.RpcPacketType) ( return nil, fmt.Errorf("invalid response packet received: %s", packet.AsString(rtnPk)) } -func (msh *MShellProc) WithLock(fn func()) { - msh.Lock.Lock() - defer msh.Lock.Unlock() +func (wsh *WaveshellProc) WithLock(fn func()) { + wsh.Lock.Lock() + defer wsh.Lock.Unlock() fn() } @@ -2275,8 +2275,8 @@ func makeDataAckPacket(ck base.CommandKey, fdNum int, ackLen int, err error) *pa return ack } -func (msh *MShellProc) notifyHangups_nolock() { - for ck := range msh.RunningCmds { +func (wsh *WaveshellProc) notifyHangups_nolock() { + for ck := range wsh.RunningCmds { cmd, err := sstore.GetCmdByScreenId(context.Background(), ck.GetGroupId(), ck.GetCmdId()) if err != nil { continue @@ -2286,11 +2286,11 @@ func (msh *MShellProc) notifyHangups_nolock() { scbus.MainUpdateBus.DoScreenUpdate(ck.GetGroupId(), update) go pushNumRunningCmdsUpdate(&ck, -1) } - msh.RunningCmds = make(map[base.CommandKey]*RunCmdType) - msh.PendingStateCmds = make(map[pendingStateKey]base.CommandKey) + wsh.RunningCmds = make(map[base.CommandKey]*RunCmdType) + wsh.PendingStateCmds = make(map[pendingStateKey]base.CommandKey) } -func (msh *MShellProc) resolveFinalState(ctx context.Context, origState *packet.ShellState, origStatePtr *packet.ShellStatePtr, donePk *packet.CmdDonePacketType) (*packet.ShellState, error) { +func (wsh *WaveshellProc) resolveFinalState(ctx context.Context, origState *packet.ShellState, origStatePtr *packet.ShellStatePtr, donePk *packet.CmdDonePacketType) (*packet.ShellState, error) { if donePk.FinalState != nil { if origStatePtr == nil { return nil, fmt.Errorf("command must have a stateptr to resolve final state") @@ -2347,7 +2347,7 @@ const NewStateDiffSizeThreshold = 30 * 1024 // then we check the size of the diff, and only persist the diff it is under some size threshold // also we check to see if the diff succeeds (it can fail if the shell or version changed). // in those cases we also update the RI with the full state -func (msh *MShellProc) updateRIWithFinalState(ctx context.Context, rct *RunCmdType, newState *packet.ShellState) (*sstore.RemoteInstance, error) { +func (wsh *WaveshellProc) updateRIWithFinalState(ctx context.Context, rct *RunCmdType, newState *packet.ShellState) (*sstore.RemoteInstance, error) { curRIState, err := sstore.GetRemoteStatePtr(ctx, rct.SessionId, rct.ScreenId, rct.RemotePtr) if err != nil { return nil, fmt.Errorf("error trying to get current screen stateptr: %w", err) @@ -2381,14 +2381,14 @@ func (msh *MShellProc) updateRIWithFinalState(ctx context.Context, rct *RunCmdTy return sstore.UpdateRemoteState(ctx, rct.SessionId, rct.ScreenId, rct.RemotePtr, feState, nil, newStateDiff) } -func (msh *MShellProc) handleSudoError(ck base.CommandKey, sudoErr error) { +func (wsh *WaveshellProc) handleSudoError(ck base.CommandKey, sudoErr error) { ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() screenId, lineId := ck.Split() update := scbus.MakeUpdatePacket() errOutputStr := fmt.Sprintf("%serror: %v%s\n", utilfn.AnsiRedColor(), sudoErr, utilfn.AnsiResetColor()) - msh.writeToCmdPtyOut(ctx, screenId, lineId, []byte(errOutputStr)) + wsh.writeToCmdPtyOut(ctx, screenId, lineId, []byte(errOutputStr)) doneInfo := sstore.CmdDoneDataValues{ Ts: time.Now().UnixMilli(), ExitCode: 1, @@ -2410,12 +2410,12 @@ func (msh *MShellProc) handleSudoError(ck base.CommandKey, sudoErr error) { scbus.MainUpdateBus.DoUpdate(update) } -func (msh *MShellProc) handleCmdStartError(rct *RunCmdType, startErr error) { +func (wsh *WaveshellProc) handleCmdStartError(rct *RunCmdType, startErr error) { if rct == nil { log.Printf("handleCmdStartError, no rct\n") return } - defer msh.RemoveRunningCmd(rct.CK) + defer wsh.RemoveRunningCmd(rct.CK) if rct.EphemeralOpts != nil { // nothing to do for ephemeral commands besides remove the running command log.Printf("ephemeral command start error: %v\n", startErr) @@ -2425,7 +2425,7 @@ func (msh *MShellProc) handleCmdStartError(rct *RunCmdType, startErr error) { defer cancelFn() update := scbus.MakeUpdatePacket() errOutputStr := fmt.Sprintf("%serror: %v%s\n", utilfn.AnsiRedColor(), startErr, utilfn.AnsiResetColor()) - msh.writeToCmdPtyOut(ctx, rct.ScreenId, rct.CK.GetCmdId(), []byte(errOutputStr)) + wsh.writeToCmdPtyOut(ctx, rct.ScreenId, rct.CK.GetCmdId(), []byte(errOutputStr)) doneInfo := sstore.CmdDoneDataValues{ Ts: time.Now().UnixMilli(), ExitCode: 1, @@ -2447,13 +2447,13 @@ func (msh *MShellProc) handleCmdStartError(rct *RunCmdType, startErr error) { scbus.MainUpdateBus.DoUpdate(update) } -func (msh *MShellProc) handleCmdDonePacket(rct *RunCmdType, donePk *packet.CmdDonePacketType) { +func (wsh *WaveshellProc) handleCmdDonePacket(rct *RunCmdType, donePk *packet.CmdDonePacketType) { if rct == nil { log.Printf("cmddone packet received, but no running command found for it %q\n", donePk.CK) return } // this will remove from RunningCmds and from PendingStateCmds - defer msh.RemoveRunningCmd(donePk.CK) + defer wsh.RemoveRunningCmd(donePk.CK) if rct.EphemeralOpts != nil && rct.EphemeralOpts.Canceled.Load() { log.Printf("cmddone %s (ephemeral canceled)\n", donePk.CK) // do nothing when an ephemeral command is canceled @@ -2499,13 +2499,13 @@ func (msh *MShellProc) handleCmdDonePacket(rct *RunCmdType, donePk *packet.CmdDo // ephemeral commands *do* update the remote state // not all commands get a final state (only RtnState commands have this returned) // so in those cases finalState will be nil - finalState, err := msh.resolveFinalState(ctx, rct.RunPacket.State, rct.RunPacket.StatePtr, donePk) + finalState, err := wsh.resolveFinalState(ctx, rct.RunPacket.State, rct.RunPacket.StatePtr, donePk) if err != nil { log.Printf("error resolving final state for cmd: %v\n", err) // fallthrough } if finalState != nil { - newRI, err := msh.updateRIWithFinalState(ctx, rct, finalState) + newRI, err := wsh.updateRIWithFinalState(ctx, rct, finalState) if err != nil { log.Printf("error updating RI with final state (in handleCmdDonePacket): %v\n", err) // fallthrough @@ -2526,12 +2526,12 @@ func (msh *MShellProc) handleCmdDonePacket(rct *RunCmdType, donePk *packet.CmdDo scbus.MainUpdateBus.DoUpdate(update) } -func (msh *MShellProc) handleCmdFinalPacket(rct *RunCmdType, finalPk *packet.CmdFinalPacketType) { +func (wsh *WaveshellProc) handleCmdFinalPacket(rct *RunCmdType, finalPk *packet.CmdFinalPacketType) { if rct == nil { // this is somewhat expected, since cmddone should have removed the running command return } - defer msh.RemoveRunningCmd(finalPk.CK) + defer wsh.RemoveRunningCmd(finalPk.CK) rtnCmd, err := sstore.GetCmdByScreenId(context.Background(), finalPk.CK.GetGroupId(), finalPk.CK.GetCmdId()) if err != nil { log.Printf("error calling GetCmdById in handleCmdFinalPacket: %v\n", err) @@ -2564,35 +2564,35 @@ func (msh *MShellProc) handleCmdFinalPacket(rct *RunCmdType, finalPk *packet.Cmd scbus.MainUpdateBus.DoUpdate(update) } -func (msh *MShellProc) ResetDataPos(ck base.CommandKey) { - msh.DataPosMap.Delete(ck) +func (wsh *WaveshellProc) ResetDataPos(ck base.CommandKey) { + wsh.DataPosMap.Delete(ck) } -func (msh *MShellProc) writeToCmdPtyOut(ctx context.Context, screenId string, lineId string, data []byte) error { - dataPos := msh.DataPosMap.Get(base.MakeCommandKey(screenId, lineId)) +func (wsh *WaveshellProc) writeToCmdPtyOut(ctx context.Context, screenId string, lineId string, data []byte) error { + dataPos := wsh.DataPosMap.Get(base.MakeCommandKey(screenId, lineId)) update, err := sstore.AppendToCmdPtyBlob(ctx, screenId, lineId, data, dataPos) if err != nil { return err } - utilfn.IncSyncMap(msh.DataPosMap, base.MakeCommandKey(screenId, lineId), int64(len(data))) + utilfn.IncSyncMap(wsh.DataPosMap, base.MakeCommandKey(screenId, lineId), int64(len(data))) if update != nil { scbus.MainUpdateBus.DoScreenUpdate(screenId, update) } return nil } -func (msh *MShellProc) handleDataPacket(rct *RunCmdType, dataPk *packet.DataPacketType, dataPosMap *utilfn.SyncMap[base.CommandKey, int64]) { +func (wsh *WaveshellProc) handleDataPacket(rct *RunCmdType, dataPk *packet.DataPacketType, dataPosMap *utilfn.SyncMap[base.CommandKey, int64]) { if rct == nil { log.Printf("error handling data packet: no running cmd found %s\n", dataPk.CK) ack := makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, fmt.Errorf("no running cmd found")) - msh.ServerProc.Input.SendPacket(ack) + wsh.ServerProc.Input.SendPacket(ack) return } realData, err := base64.StdEncoding.DecodeString(dataPk.Data64) if err != nil { log.Printf("error decoding data packet: %v\n", err) ack := makeDataAckPacket(dataPk.CK, dataPk.FdNum, 0, err) - msh.ServerProc.Input.SendPacket(ack) + wsh.ServerProc.Input.SendPacket(ack) return } if rct.EphemeralOpts != nil { @@ -2618,7 +2618,7 @@ func (msh *MShellProc) handleDataPacket(rct *RunCmdType, dataPk *packet.DataPack log.Printf("ephemeral data packet error: %s\n", dataPk.Error) } ack := makeDataAckPacket(dataPk.CK, dataPk.FdNum, len(realData), nil) - msh.ServerProc.Input.SendPacket(ack) + wsh.ServerProc.Input.SendPacket(ack) return } @@ -2637,7 +2637,7 @@ func (msh *MShellProc) handleDataPacket(rct *RunCmdType, dataPk *packet.DataPack } } if ack != nil { - msh.ServerProc.Input.SendPacket(ack) + wsh.ServerProc.Input.SendPacket(ack) } } @@ -2649,7 +2649,7 @@ func sendScreenUpdates(screens []*sstore.ScreenType) { } } -func (msh *MShellProc) startSudoPwClearChecker(clientData *sstore.ClientData) { +func (wsh *WaveshellProc) startSudoPwClearChecker(clientData *sstore.ClientData) { ctx, cancelFn := context.WithCancel(context.Background()) defer cancelFn() sudoPwStore := clientData.FeOpts.SudoPwStore @@ -2662,12 +2662,12 @@ func (msh *MShellProc) startSudoPwClearChecker(clientData *sstore.ClientData) { } shouldExit := false - msh.WithLock(func() { - if msh.sudoClearDeadline > 0 && time.Now().Unix() > msh.sudoClearDeadline && sudoPwStore != "notimeout" { - msh.sudoPw = nil - msh.sudoClearDeadline = 0 + wsh.WithLock(func() { + if wsh.sudoClearDeadline > 0 && time.Now().Unix() > wsh.sudoClearDeadline && sudoPwStore != "notimeout" { + wsh.sudoPw = nil + wsh.sudoClearDeadline = 0 } - if msh.sudoClearDeadline == 0 { + if wsh.sudoClearDeadline == 0 { shouldExit = true } }) @@ -2678,11 +2678,11 @@ func (msh *MShellProc) startSudoPwClearChecker(clientData *sstore.ClientData) { } } -func (msh *MShellProc) sendSudoPassword(sudoPk *packet.SudoRequestPacketType) error { +func (wsh *WaveshellProc) sendSudoPassword(sudoPk *packet.SudoRequestPacketType) error { var storedPw []byte var rawSecret []byte - msh.WithLock(func() { - storedPw = msh.sudoPw + wsh.WithLock(func() { + storedPw = wsh.sudoPw }) if storedPw != nil && sudoPk.SudoStatus == "first-attempt" { rawSecret = storedPw @@ -2714,12 +2714,12 @@ func (msh *MShellProc) sendSudoPassword(sudoPk *packet.SudoRequestPacketType) er sudoPwTimeout = sstore.DefaultSudoTimeout } pwTimeoutDur := time.Duration(sudoPwTimeout) * time.Minute - msh.WithLock(func() { - msh.sudoPw = rawSecret - if msh.sudoClearDeadline == 0 { - go msh.startSudoPwClearChecker(clientData) + wsh.WithLock(func() { + wsh.sudoPw = rawSecret + if wsh.sudoClearDeadline == 0 { + go wsh.startSudoPwClearChecker(clientData) } - msh.sudoClearDeadline = time.Now().Add(pwTimeoutDur).Unix() + wsh.sudoClearDeadline = time.Now().Add(pwTimeoutDur).Unix() }) srvPrivKey, err := ecdh.P256().GenerateKey(rand.Reader) @@ -2740,14 +2740,14 @@ func (msh *MShellProc) sendSudoPassword(sudoPk *packet.SudoRequestPacketType) er } sudoResponse := packet.MakeSudoResponsePacket(sudoPk.CK, encryptedSecret, srvPubKey) select { - case msh.ServerProc.Input.SendCh <- sudoResponse: + case wsh.ServerProc.Input.SendCh <- sudoResponse: default: } return nil } -func (msh *MShellProc) processSinglePacket(pk packet.PacketType) { +func (wsh *WaveshellProc) processSinglePacket(pk packet.PacketType) { if _, ok := pk.(*packet.DataAckPacketType); ok { // TODO process ack (need to keep track of buffer size for sending) // this is low priority though since most input is coming from keyboard and won't overflow this buffer @@ -2755,89 +2755,89 @@ func (msh *MShellProc) processSinglePacket(pk packet.PacketType) { } if dataPk, ok := pk.(*packet.DataPacketType); ok { runCmdUpdateFn(dataPk.CK, func() { - rct := msh.GetRunningCmd(dataPk.CK) - msh.handleDataPacket(rct, dataPk, msh.DataPosMap) + rct := wsh.GetRunningCmd(dataPk.CK) + wsh.handleDataPacket(rct, dataPk, wsh.DataPosMap) }) go pushStatusIndicatorUpdate(&dataPk.CK, sstore.StatusIndicatorLevel_Output) return } if donePk, ok := pk.(*packet.CmdDonePacketType); ok { runCmdUpdateFn(donePk.CK, func() { - rct := msh.GetRunningCmd(donePk.CK) - msh.handleCmdDonePacket(rct, donePk) + rct := wsh.GetRunningCmd(donePk.CK) + wsh.handleCmdDonePacket(rct, donePk) }) return } if finalPk, ok := pk.(*packet.CmdFinalPacketType); ok { runCmdUpdateFn(finalPk.CK, func() { - rct := msh.GetRunningCmd(finalPk.CK) - msh.handleCmdFinalPacket(rct, finalPk) + rct := wsh.GetRunningCmd(finalPk.CK) + wsh.handleCmdFinalPacket(rct, finalPk) }) return } if sudoPk, ok := pk.(*packet.SudoRequestPacketType); ok { // final failure case -- clear cache if sudoPk.SudoStatus == "failure" { - msh.sudoPw = nil - msh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: incorrect password entered")) + wsh.sudoPw = nil + wsh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: incorrect password entered")) return } // handle waveshell errors here if sudoPk.SudoStatus == "error" { - msh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: shell: %s", sudoPk.ErrStr)) + wsh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: shell: %s", sudoPk.ErrStr)) return } - err := msh.sendSudoPassword(sudoPk) + err := wsh.sendSudoPassword(sudoPk) if err != nil { - msh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: srv: %s", err)) + wsh.handleSudoError(sudoPk.CK, fmt.Errorf("sudo: srv: %s", err)) } } if msgPk, ok := pk.(*packet.MessagePacketType); ok { - msh.WriteToPtyBuffer("msg> [remote %s] [%s] %s\n", msh.GetRemoteName(), msgPk.CK, msgPk.Message) + wsh.WriteToPtyBuffer("msg> [remote %s] [%s] %s\n", wsh.GetRemoteName(), msgPk.CK, msgPk.Message) return } if rawPk, ok := pk.(*packet.RawPacketType); ok { - msh.WriteToPtyBuffer("stderr> [remote %s] %s\n", msh.GetRemoteName(), rawPk.Data) + wsh.WriteToPtyBuffer("stderr> [remote %s] %s\n", wsh.GetRemoteName(), rawPk.Data) return } - msh.WriteToPtyBuffer("*[remote %s] unhandled packet %s\n", msh.GetRemoteName(), packet.AsString(pk)) + wsh.WriteToPtyBuffer("*[remote %s] unhandled packet %s\n", wsh.GetRemoteName(), packet.AsString(pk)) } -func (msh *MShellProc) ClearCachedSudoPw() { - msh.WithLock(func() { - msh.sudoPw = nil - msh.sudoClearDeadline = 0 +func (wsh *WaveshellProc) ClearCachedSudoPw() { + wsh.WithLock(func() { + wsh.sudoPw = nil + wsh.sudoClearDeadline = 0 }) } -func (msh *MShellProc) ChangeSudoTimeout(deltaTime int64) { - msh.WithLock(func() { - if msh.sudoClearDeadline != 0 { - updated := msh.sudoClearDeadline + deltaTime*60 - msh.sudoClearDeadline = max(0, updated) +func (wsh *WaveshellProc) ChangeSudoTimeout(deltaTime int64) { + wsh.WithLock(func() { + if wsh.sudoClearDeadline != 0 { + updated := wsh.sudoClearDeadline + deltaTime*60 + wsh.sudoClearDeadline = max(0, updated) } }) } -func (msh *MShellProc) ProcessPackets() { - defer msh.WithLock(func() { - if msh.Status == StatusConnected { - msh.Status = StatusDisconnected +func (wsh *WaveshellProc) ProcessPackets() { + defer wsh.WithLock(func() { + if wsh.Status == StatusConnected { + wsh.Status = StatusDisconnected } - screens, err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId) + screens, err := sstore.HangupRunningCmdsByRemoteId(context.Background(), wsh.Remote.RemoteId) if err != nil { - msh.writeToPtyBuffer_nolock("error calling HUP on cmds %v\n", err) + wsh.writeToPtyBuffer_nolock("error calling HUP on cmds %v\n", err) } - msh.notifyHangups_nolock() - go msh.NotifyRemoteUpdate() + wsh.notifyHangups_nolock() + go wsh.NotifyRemoteUpdate() if len(screens) > 0 { go sendScreenUpdates(screens) } }) - for pk := range msh.ServerProc.Output.MainCh { - msh.processSinglePacket(pk) + for pk := range wsh.ServerProc.Output.MainCh { + wsh.processSinglePacket(pk) } } @@ -2988,8 +2988,8 @@ func evalPromptEsc(escCode string, vars map[string]string, state *packet.ShellSt return "(" + escCode + ")" } -func (msh *MShellProc) getFullState(shellType string, stateDiff *packet.ShellStateDiff) (*packet.ShellState, error) { - baseState := msh.StateMap.GetStateByHash(shellType, stateDiff.BaseHash) +func (wsh *WaveshellProc) getFullState(shellType string, stateDiff *packet.ShellStateDiff) (*packet.ShellState, error) { + baseState := wsh.StateMap.GetStateByHash(shellType, stateDiff.BaseHash) if baseState != nil && len(stateDiff.DiffHashArr) == 0 { sapi, err := shellapi.MakeShellApi(baseState.GetShellType()) newState, err := sapi.ApplyShellStateDiff(baseState, stateDiff) @@ -3012,8 +3012,8 @@ func (msh *MShellProc) getFullState(shellType string, stateDiff *packet.ShellSta } // internal func, first tries the StateMap, otherwise will fallback on sstore.GetFullState -func (msh *MShellProc) getFeStateFromDiff(stateDiff *packet.ShellStateDiff) (map[string]string, error) { - baseState := msh.StateMap.GetStateByHash(stateDiff.GetShellType(), stateDiff.BaseHash) +func (wsh *WaveshellProc) getFeStateFromDiff(stateDiff *packet.ShellStateDiff) (map[string]string, error) { + baseState := wsh.StateMap.GetStateByHash(stateDiff.GetShellType(), stateDiff.BaseHash) if baseState != nil && len(stateDiff.DiffHashArr) == 0 { sapi, err := shellapi.MakeShellApi(baseState.GetShellType()) if err != nil { @@ -3041,34 +3041,34 @@ func (msh *MShellProc) getFeStateFromDiff(stateDiff *packet.ShellStateDiff) (map } } -func (msh *MShellProc) TryAutoConnect() error { - if msh.IsConnected() { +func (wsh *WaveshellProc) TryAutoConnect() error { + if wsh.IsConnected() { return nil } - rcopy := msh.GetRemoteCopy() + rcopy := wsh.GetRemoteCopy() if rcopy.ConnectMode == sstore.ConnectModeManual { return nil } var err error - msh.WithLock(func() { - if msh.NumTryConnect > 5 { + wsh.WithLock(func() { + if wsh.NumTryConnect > 5 { err = fmt.Errorf("too many unsuccessful tries") return } - msh.NumTryConnect++ + wsh.NumTryConnect++ }) if err != nil { return err } - msh.Launch(false) - if !msh.IsConnected() { + wsh.Launch(false) + if !wsh.IsConnected() { return fmt.Errorf("error connecting") } return nil } -func (msh *MShellProc) GetDisplayName() string { - rcopy := msh.GetRemoteCopy() +func (wsh *WaveshellProc) GetDisplayName() string { + rcopy := wsh.GetRemoteCopy() return rcopy.GetName() } diff --git a/wavesrv/pkg/scbase/scbase.go b/wavesrv/pkg/scbase/scbase.go index 8e52fb45..52752b97 100644 --- a/wavesrv/pkg/scbase/scbase.go +++ b/wavesrv/pkg/scbase/scbase.go @@ -36,7 +36,7 @@ const WaveDirName = ".waveterm" // must match emain.ts const WaveDevDirName = ".waveterm-dev" // must match emain.ts const WaveAppPathVarName = "WAVETERM_APP_PATH" const WaveAuthKeyFileName = "waveterm.authkey" -const MShellVersion = "v0.7.0" // must match base.MShellVersion +const WaveshellVersion = "v0.7.0" // must match base.WaveshellVersion // initialized by InitialzeWaveAuthKey (called by main-server) var WaveAuthKey string @@ -73,7 +73,7 @@ func GetWaveHomeDir() string { return scHome } -func MShellBinaryDir() string { +func WaveshellBinaryDir() string { appPath := os.Getenv(WaveAppPathVarName) if appPath == "" { appPath = "." @@ -81,32 +81,32 @@ func MShellBinaryDir() string { return filepath.Join(appPath, "bin", "mshell") } -func MShellBinaryPath(version string, goos string, goarch string) (string, error) { +func WaveshellBinaryPath(version string, goos string, goarch string) (string, error) { if !base.ValidGoArch(goos, goarch) { return "", fmt.Errorf("invalid goos/goarch combination: %s/%s", goos, goarch) } - binaryDir := MShellBinaryDir() + binaryDir := WaveshellBinaryDir() versionStr := semver.MajorMinor(version) if versionStr == "" { - return "", fmt.Errorf("invalid mshell version: %q", version) + return "", fmt.Errorf("invalid waveshell version: %q", version) } fileName := fmt.Sprintf("mshell-%s-%s.%s", versionStr, goos, goarch) fullFileName := filepath.Join(binaryDir, fileName) return fullFileName, nil } -func LocalMShellBinaryPath() (string, error) { - return MShellBinaryPath(MShellVersion, runtime.GOOS, runtime.GOARCH) +func LocalWaveshellBinaryPath() (string, error) { + return WaveshellBinaryPath(WaveshellVersion, runtime.GOOS, runtime.GOARCH) } -func MShellBinaryReader(version string, goos string, goarch string) (io.ReadCloser, error) { - mshellPath, err := MShellBinaryPath(version, goos, goarch) +func WaveshellBinaryReader(version string, goos string, goarch string) (io.ReadCloser, error) { + waveshellPath, err := WaveshellBinaryPath(version, goos, goarch) if err != nil { return nil, err } - fd, err := os.Open(mshellPath) + fd, err := os.Open(waveshellPath) if err != nil { - return nil, fmt.Errorf("cannot open mshell binary %q: %v", mshellPath, err) + return nil, fmt.Errorf("cannot open waveshell binary %q: %v", waveshellPath, err) } return fd, nil } diff --git a/wavesrv/pkg/scws/scws.go b/wavesrv/pkg/scws/scws.go index 37f4d7a3..1ed59263 100644 --- a/wavesrv/pkg/scws/scws.go +++ b/wavesrv/pkg/scws/scws.go @@ -326,9 +326,9 @@ func sendCmdInput(pk *scpacket.FeInputPacketType) error { if pk.Remote.RemoteId == "" { return fmt.Errorf("input must set remoteid") } - msh := remote.GetRemoteById(pk.Remote.RemoteId) - if msh == nil { + wsh := remote.GetRemoteById(pk.Remote.RemoteId) + if wsh == nil { return fmt.Errorf("remote %s not found", pk.Remote.RemoteId) } - return msh.HandleFeInput(pk) + return wsh.HandleFeInput(pk) } diff --git a/wavesrv/pkg/sstore/dbops.go b/wavesrv/pkg/sstore/dbops.go index 336f797c..f033b35e 100644 --- a/wavesrv/pkg/sstore/dbops.go +++ b/wavesrv/pkg/sstore/dbops.go @@ -751,10 +751,10 @@ func UpdateCmdForRestart(ctx context.Context, ck base.CommandKey, ts int64, cmdP }) } -func UpdateCmdStartInfo(ctx context.Context, ck base.CommandKey, cmdPid int, mshellPid int) error { +func UpdateCmdStartInfo(ctx context.Context, ck base.CommandKey, cmdPid int, waveshellPid int) error { return WithTx(ctx, func(tx *TxWrap) error { query := `UPDATE cmd SET cmdpid = ?, remotepid = ? WHERE screenid = ? AND lineid = ?` - tx.Exec(query, cmdPid, mshellPid, ck.GetGroupId(), lineIdFromCK(ck)) + tx.Exec(query, cmdPid, waveshellPid, ck.GetGroupId(), lineIdFromCK(ck)) return nil }) } diff --git a/wavesrv/pkg/sstore/sstore.go b/wavesrv/pkg/sstore/sstore.go index 4aec42f6..d2599cd3 100644 --- a/wavesrv/pkg/sstore/sstore.go +++ b/wavesrv/pkg/sstore/sstore.go @@ -758,34 +758,34 @@ const ( ) type RemoteRuntimeState struct { - RemoteType string `json:"remotetype"` - RemoteId string `json:"remoteid"` - RemoteAlias string `json:"remotealias,omitempty"` - RemoteCanonicalName string `json:"remotecanonicalname"` - RemoteVars map[string]string `json:"remotevars"` - Status string `json:"status"` - ConnectTimeout int `json:"connecttimeout,omitempty"` - CountdownActive bool `json:"countdownactive"` - ErrorStr string `json:"errorstr,omitempty"` - InstallStatus string `json:"installstatus"` - InstallErrorStr string `json:"installerrorstr,omitempty"` - NeedsMShellUpgrade bool `json:"needsmshellupgrade,omitempty"` - NoInitPk bool `json:"noinitpk,omitempty"` - AuthType string `json:"authtype,omitempty"` - ConnectMode string `json:"connectmode"` - AutoInstall bool `json:"autoinstall"` - Archived bool `json:"archived,omitempty"` - RemoteIdx int64 `json:"remoteidx"` - SSHConfigSrc string `json:"sshconfigsrc"` - UName string `json:"uname"` - MShellVersion string `json:"mshellversion"` - WaitingForPassword bool `json:"waitingforpassword,omitempty"` - Local bool `json:"local,omitempty"` - IsSudo bool `json:"issudo,omitempty"` - RemoteOpts *RemoteOptsType `json:"remoteopts,omitempty"` - CanComplete bool `json:"cancomplete,omitempty"` - ShellPref string `json:"shellpref,omitempty"` - DefaultShellType string `json:"defaultshelltype,omitempty"` + RemoteType string `json:"remotetype"` + RemoteId string `json:"remoteid"` + RemoteAlias string `json:"remotealias,omitempty"` + RemoteCanonicalName string `json:"remotecanonicalname"` + RemoteVars map[string]string `json:"remotevars"` + Status string `json:"status"` + ConnectTimeout int `json:"connecttimeout,omitempty"` + CountdownActive bool `json:"countdownactive"` + ErrorStr string `json:"errorstr,omitempty"` + InstallStatus string `json:"installstatus"` + InstallErrorStr string `json:"installerrorstr,omitempty"` + NeedsWaveshellUpgrade bool `json:"needswaveshellupgrade,omitempty"` + NoInitPk bool `json:"noinitpk,omitempty"` + AuthType string `json:"authtype,omitempty"` + ConnectMode string `json:"connectmode"` + AutoInstall bool `json:"autoinstall"` + Archived bool `json:"archived,omitempty"` + RemoteIdx int64 `json:"remoteidx"` + SSHConfigSrc string `json:"sshconfigsrc"` + UName string `json:"uname"` + WaveshellVersion string `json:"waveshellversion"` + WaitingForPassword bool `json:"waitingforpassword,omitempty"` + Local bool `json:"local,omitempty"` + IsSudo bool `json:"issudo,omitempty"` + RemoteOpts *RemoteOptsType `json:"remoteopts,omitempty"` + CanComplete bool `json:"cancomplete,omitempty"` + ShellPref string `json:"shellpref,omitempty"` + DefaultShellType string `json:"defaultshelltype,omitempty"` } func (state RemoteRuntimeState) IsConnected() bool {