diff --git a/db/migrations/000001_init.up.sql b/db/migrations/000001_init.up.sql index eedc7bf4..1c6d6bf6 100644 --- a/db/migrations/000001_init.up.sql +++ b/db/migrations/000001_init.up.sql @@ -78,7 +78,7 @@ CREATE TABLE remote ( remotesudo boolean NOT NULL, remoteuser varchar(50) NOT NULL, remotehost varchar(200) NOT NULL, - autoconnect boolean NOT NULL, + connectmode varchar(20) NOT NULL, initpk json NOT NULL, sshopts json NOT NULL, remoteopts json NOT NULL, diff --git a/db/schema.sql b/db/schema.sql index 7a32d70c..eedef254 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -73,9 +73,10 @@ CREATE TABLE remote ( remotesudo boolean NOT NULL, remoteuser varchar(50) NOT NULL, remotehost varchar(200) NOT NULL, - autoconnect boolean NOT NULL, + connectmode varchar(20) NOT NULL, initpk json NOT NULL, sshopts json NOT NULL, + remoteopts json NOT NULL, lastconnectts bigint NOT NULL ); CREATE TABLE cmd ( diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index 03909ef0..d2a8b038 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -53,6 +53,8 @@ func SubMetaCmd(cmd string) string { return "comment" case "e": return "eval" + case "export": + return "setenv" default: return cmd } @@ -66,6 +68,7 @@ var ValidCommands = []string{ "/comment", "/cd", "/compgen", + "/setenv", } func HandleCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { @@ -94,6 +97,9 @@ func HandleCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstor case "compgen": return CompGenCommand(ctx, pk) + case "setenv": + return SetEnvCommand(ctx, pk) + default: return nil, fmt.Errorf("invalid command '/%s', no handler", pk.MetaCmd) } @@ -338,6 +344,12 @@ func evalCommandInternal(ctx context.Context, pk *scpacket.FeCommandPacketType) } else if commandStr == "cr" || strings.HasPrefix(commandStr, "cr ") { metaCmd = "cr" commandStr = strings.TrimSpace(commandStr[2:]) + } else if commandStr == "export" || strings.HasPrefix(commandStr, "export ") { + metaCmd = "setenv" + commandStr = strings.TrimSpace(commandStr[6:]) + } else if commandStr == "setenv" || strings.HasPrefix(commandStr, "setenv ") { + metaCmd = "setenv" + commandStr = strings.TrimSpace(commandStr[6:]) } else if commandStr[0] == '/' { spaceIdx := strings.Index(commandStr, " ") if spaceIdx == -1 { @@ -425,6 +437,10 @@ func ScreenCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstor return update, nil } +func SetEnvCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { + return nil, nil +} + func CrCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) { ids, err := resolveIds(ctx, pk, R_Session|R_Window) if err != nil { diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index 410ba219..89593cad 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -62,7 +62,7 @@ type RemoteState struct { Status string `json:"status"` ErrorStr string `json:"errorstr,omitempty"` DefaultState *sstore.RemoteState `json:"defaultstate"` - AutoConnect bool `json:"autoconnect"` + ConnectMode string `json:"connectmode"` } type MShellProc struct { @@ -91,7 +91,7 @@ func LoadRemotes(ctx context.Context) error { for _, remote := range allRemotes { msh := MakeMShell(remote) GlobalStore.Map[remote.RemoteId] = msh - if remote.AutoConnect { + if remote.ConnectMode == sstore.ConnectModeStartup { go msh.Launch() } } @@ -128,7 +128,7 @@ func GetAllRemoteState() []RemoteState { RemoteCanonicalName: proc.Remote.RemoteCanonicalName, PhysicalId: proc.Remote.PhysicalId, Status: proc.Status, - AutoConnect: proc.Remote.AutoConnect, + ConnectMode: proc.Remote.ConnectMode, } if proc.Err != nil { state.ErrorStr = proc.Err.Error() diff --git a/pkg/sstore/dbops.go b/pkg/sstore/dbops.go index 8df780cd..8d105757 100644 --- a/pkg/sstore/dbops.go +++ b/pkg/sstore/dbops.go @@ -90,8 +90,8 @@ func InsertRemote(ctx context.Context, remote *RemoteType) error { if err != nil { return err } - query := `INSERT INTO remote ( remoteid, physicalid, remotetype, remotealias, remotecanonicalname, remotesudo, remoteuser, remotehost, autoconnect, initpk, sshopts, remoteopts, lastconnectts) VALUES - (:remoteid,:physicalid,:remotetype,:remotealias,:remotecanonicalname,:remotesudo,:remoteuser,:remotehost,:autoconnect,:initpk,:sshopts,:remoteopts,:lastconnectts)` + query := `INSERT INTO remote ( remoteid, physicalid, remotetype, remotealias, remotecanonicalname, remotesudo, remoteuser, remotehost, connectmode, initpk, sshopts, remoteopts, lastconnectts) VALUES + (:remoteid,:physicalid,:remotetype,:remotealias,:remotecanonicalname,:remotesudo,:remoteuser,:remotehost,:connectmode,:initpk,:sshopts,:remoteopts,:lastconnectts)` _, err = db.NamedExec(query, remote.ToMap()) if err != nil { return err diff --git a/pkg/sstore/sstore.go b/pkg/sstore/sstore.go index c189f886..b814ec4d 100644 --- a/pkg/sstore/sstore.go +++ b/pkg/sstore/sstore.go @@ -50,6 +50,16 @@ const ( ShareModeShared = "shared" ) +const ( + ConnectModeStartup = "startup" + ConnectModeAuto = "auto" + ConnectModeManual = "manual" +) + +const ( + RemoteTypeSsh = "ssh" +) + var globalDBLock = &sync.Mutex{} var globalDB *sqlx.DB var globalDBErr error @@ -298,7 +308,7 @@ type RemoteType struct { RemoteSudo bool `json:"remotesudo"` RemoteUser string `json:"remoteuser"` RemoteHost string `json:"remotehost"` - AutoConnect bool `json:"autoconnect"` + ConnectMode string `json:"connectmode"` InitPk *packet.InitPacketType `json:"inipk"` SSHOpts *SSHOpts `json:"sshopts"` RemoteOpts *RemoteOptsType `json:"remoteopts"` @@ -340,7 +350,7 @@ func (r *RemoteType) ToMap() map[string]interface{} { rtn["remotesudo"] = r.RemoteSudo rtn["remoteuser"] = r.RemoteUser rtn["remotehost"] = r.RemoteHost - rtn["autoconnect"] = r.AutoConnect + rtn["connectmode"] = r.ConnectMode rtn["initpk"] = quickJson(r.InitPk) rtn["sshopts"] = quickJson(r.SSHOpts) rtn["remoteopts"] = quickJson(r.RemoteOpts) @@ -361,7 +371,7 @@ func RemoteFromMap(m map[string]interface{}) *RemoteType { quickSetBool(&r.RemoteSudo, m, "remotesudo") quickSetStr(&r.RemoteUser, m, "remoteuser") quickSetStr(&r.RemoteHost, m, "remotehost") - quickSetBool(&r.AutoConnect, m, "autoconnect") + quickSetStr(&r.ConnectMode, m, "connectmode") quickSetJson(&r.InitPk, m, "initpk") quickSetJson(&r.SSHOpts, m, "sshopts") quickSetJson(&r.RemoteOpts, m, "remoteopts") @@ -470,13 +480,13 @@ func EnsureLocalRemote(ctx context.Context) error { localRemote := &RemoteType{ RemoteId: uuid.New().String(), PhysicalId: physicalId, - RemoteType: "ssh", + RemoteType: RemoteTypeSsh, RemoteAlias: LocalRemoteName, RemoteCanonicalName: fmt.Sprintf("%s@%s", user.Username, hostName), RemoteSudo: false, RemoteUser: user.Username, RemoteHost: hostName, - AutoConnect: true, + ConnectMode: ConnectModeStartup, } err = InsertRemote(ctx, localRemote) if err != nil { @@ -496,7 +506,7 @@ func AddTest01Remote(ctx context.Context) error { } testRemote := &RemoteType{ RemoteId: uuid.New().String(), - RemoteType: "ssh", + RemoteType: RemoteTypeSsh, RemoteAlias: "test01", RemoteCanonicalName: "ubuntu@test01.ec2", RemoteSudo: false, @@ -507,7 +517,7 @@ func AddTest01Remote(ctx context.Context) error { SSHUser: "ubuntu", SSHIdentity: "/Users/mike/aws/mfmt.pem", }, - AutoConnect: true, + ConnectMode: ConnectModeStartup, } err = InsertRemote(ctx, testRemote) if err != nil { @@ -527,7 +537,7 @@ func AddTest02Remote(ctx context.Context) error { } testRemote := &RemoteType{ RemoteId: uuid.New().String(), - RemoteType: "ssh", + RemoteType: RemoteTypeSsh, RemoteAlias: "test2", RemoteCanonicalName: "test2@test01.ec2", RemoteSudo: false, @@ -537,7 +547,7 @@ func AddTest02Remote(ctx context.Context) error { SSHHost: "test01.ec2", SSHUser: "test2", }, - AutoConnect: true, + ConnectMode: ConnectModeStartup, } err = InsertRemote(ctx, testRemote) if err != nil {