make a fake cmd for 'cr'. add 'connect'

This commit is contained in:
sawka
2023-02-28 17:50:42 -08:00
parent b557da8694
commit fa393e2eec
2 changed files with 50 additions and 18 deletions
+47 -15
View File
@@ -112,6 +112,7 @@ func init() {
registerCmdFn("eval", EvalCommand)
registerCmdFn("comment", CommentCommand)
registerCmdFn("cr", CrCommand)
registerCmdFn("connect", CrCommand)
registerCmdFn("_compgen", CompGenCommand)
registerCmdFn("clear", ClearCommand)
registerCmdFn("reset", RemoteResetCommand)
@@ -205,6 +206,13 @@ func registerCmdAlias(cmdName string, fn MetaCmdFnType) {
MetaCmdFnMap[cmdName] = MetaCmdEntryType{IsAlias: true, Fn: fn}
}
func GetCmdStr(pk *scpacket.FeCommandPacketType) string {
if pk.MetaSubCmd == "" {
return pk.MetaCmd
}
return pk.MetaCmd + ":" + pk.MetaSubCmd
}
func HandleCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
metaCmd := SubMetaCmd(pk.MetaCmd)
var cmdName string
@@ -1140,40 +1148,64 @@ func crShowCommand(ctx context.Context, pk *scpacket.FeCommandPacketType, ids re
return update, nil
}
func GetFullRemoteDisplayName(rptr *sstore.RemotePtrType, rstate *remote.RemoteRuntimeState) string {
if rptr == nil {
return "(invalid)"
}
if rstate.RemoteAlias != "" {
fullName := rstate.RemoteAlias
if rptr.Name != "" {
fullName = fullName + ":" + rptr.Name
}
return fmt.Sprintf("[%s] (%s)", fullName, rstate.RemoteCanonicalName)
} else {
if rptr.Name != "" {
return fmt.Sprintf("[%s:%s]", rstate.RemoteCanonicalName, rptr.Name)
}
return fmt.Sprintf("[%s]", rstate.RemoteCanonicalName)
}
}
func CrCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
ids, err := resolveUiIds(ctx, pk, R_Session|R_Window)
if err != nil {
return nil, fmt.Errorf("/cr error: %w", err)
return nil, fmt.Errorf("/%s error: %w", GetCmdStr(pk), err)
}
newRemote := firstArg(pk)
if newRemote == "" {
return crShowCommand(ctx, pk, ids)
}
remoteName, rptr, rstate, err := resolveRemote(ctx, newRemote, ids.SessionId, ids.WindowId)
_, rptr, rstate, err := resolveRemote(ctx, newRemote, ids.SessionId, ids.WindowId)
if err != nil {
return nil, err
}
if rptr == nil {
return nil, fmt.Errorf("/cr error: remote %q not found", newRemote)
return nil, fmt.Errorf("/%s error: remote %q not found", GetCmdStr(pk), newRemote)
}
if rstate.Archived {
return nil, fmt.Errorf("/cr error: remote %q cannot switch to archived remote", newRemote)
return nil, fmt.Errorf("/%s error: remote %q cannot switch to archived remote", GetCmdStr(pk), newRemote)
}
err = sstore.UpdateCurRemote(ctx, ids.SessionId, ids.WindowId, *rptr)
if err != nil {
return nil, fmt.Errorf("/cr error: cannot update curremote: %w", err)
return nil, fmt.Errorf("/%s error: cannot update curremote: %w", GetCmdStr(pk), err)
}
update := sstore.ModelUpdate{
Windows: []*sstore.WindowType{&sstore.WindowType{
SessionId: ids.SessionId,
WindowId: ids.WindowId,
CurRemote: *rptr,
}},
Info: &sstore.InfoMsgType{
InfoMsg: fmt.Sprintf("current remote = %q", remoteName),
TimeoutMs: 2000,
},
outputStr := fmt.Sprintf("connected to %s", GetFullRemoteDisplayName(rptr, rstate))
cmd, err := makeStaticCmd(ctx, GetCmdStr(pk), ids, pk.GetRawStr(), []byte(outputStr))
if err != nil {
// TODO tricky error since the command was a success, but we can't show the output
return nil, err
}
update, err := addLineForCmd(ctx, "/"+GetCmdStr(pk), false, ids, cmd)
if err != nil {
// TODO tricky error since the command was a success, but we can't show the output
return nil, err
}
update.Windows = []*sstore.WindowType{&sstore.WindowType{
SessionId: ids.SessionId,
WindowId: ids.WindowId,
CurRemote: *rptr,
}}
update.Interactive = pk.Interactive
return update, nil
}
+3 -3
View File
@@ -272,7 +272,7 @@ func resolveUiIds(ctx context.Context, pk *scpacket.FeCommandPacketType, rtype i
if !rtn.Remote.RState.IsConnected() {
err = rtn.Remote.MShell.TryAutoConnect()
if err != nil {
return rtn, fmt.Errorf("error trying to auto-connect remote %q: %w", rtn.Remote.DisplayName, err)
return rtn, fmt.Errorf("error trying to auto-connect remote [%s]: %w", rtn.Remote.DisplayName, err)
}
rrNew, err := resolveRemoteFromPtr(ctx, rptr, rtn.SessionId, rtn.WindowId)
if err != nil {
@@ -281,10 +281,10 @@ func resolveUiIds(ctx context.Context, pk *scpacket.FeCommandPacketType, rtype i
rtn.Remote = rrNew
}
if !rtn.Remote.RState.IsConnected() {
return rtn, fmt.Errorf("remote %q is not connected", rtn.Remote.DisplayName)
return rtn, fmt.Errorf("remote [%s] is not connected", rtn.Remote.DisplayName)
}
if rtn.Remote.StatePtr == nil || rtn.Remote.FeState == nil {
return rtn, fmt.Errorf("remote %q state is not available", rtn.Remote.DisplayName)
return rtn, fmt.Errorf("remote [%s] state is not available", rtn.Remote.DisplayName)
}
}
return rtn, nil