mirror of
https://github.com/wavetermdev/backup.git
synced 2026-08-05 13:57:07 -07:00
make a fake cmd for 'cr'. add 'connect'
This commit is contained in:
+47
-15
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user