Skip to content

Commit

Permalink
Merge pull request #54 from andymac4182/feat/remote_host
Browse files Browse the repository at this point in the history
Add AWS-StartPortForwardingSessionToRemoteHost
  • Loading branch information
gjbae1212 committed Jul 13, 2022
2 parents 8f5a810 + 6e8d72c commit f96bb31
Show file tree
Hide file tree
Showing 3 changed files with 157 additions and 0 deletions.
142 changes: 142 additions & 0 deletions cmd/fwdrem.go
@@ -0,0 +1,142 @@
package cmd

import (
"context"
"encoding/json"
"fmt"
"strings"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ssm"
"github.com/fatih/color"
"github.com/gjbae1212/gossm/internal"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

var (
fwdremCommand = &cobra.Command{
Use: "fwdrem",
Short: "Exec `fwdrem` under AWS SSM with interactive CLI",
Long: "Exec `fwdrem` under AWS SSM with interactive CLI",
Run: func(cmd *cobra.Command, args []string) {
ctx := context.Background()
var (
target *internal.Target
remotePort string
localPort string
host string
err error
)

// get target
argTarget := strings.TrimSpace(viper.GetString("fwd-target"))
if argTarget != "" {
table, err := internal.FindInstances(ctx, *_credential.awsConfig)
if err != nil {
panicRed(err)
}
for _, t := range table {
if t.Name == argTarget {
target = t
break
}
}
}
if target == nil {
target, err = internal.AskTarget(ctx, *_credential.awsConfig)
if err != nil {
panicRed(err)
}
}

// get port
argRemotePort := strings.TrimSpace(viper.GetString("fwd-remote-port"))
argLocalPort := strings.TrimSpace(viper.GetString("fwd-local-port"))
if argRemotePort == "" {
askPort, err := internal.AskPorts()
if err != nil {
panicRed(err)
}
remotePort = askPort.Remote
localPort = askPort.Local
} else {
remotePort = argRemotePort
localPort = argLocalPort
if localPort == "" {
localPort = remotePort
}
}

argHost := strings.TrimSpace(viper.GetString("fwd-host"))
if argHost == "" {
askHost, err := internal.AskHost()
if err != nil {
panicRed(err)
}
host = askHost
} else {
host = argHost
}

internal.PrintReady(fmt.Sprintf("start-port-forwarding %s -> %s", localPort, remotePort), _credential.awsConfig.Region, target.Name)

docName := "AWS-StartPortForwardingSessionToRemoteHost" // https://us-east-1.console.aws.amazon.com/systems-manager/documents/AWS-StartPortForwardingSession/description?region=us-east-1

input := &ssm.StartSessionInput{
DocumentName: &docName,
Parameters: map[string][]string{
"portNumber": []string{remotePort},
"localPortNumber": []string{localPort},
"host": []string{host},
},
Target: aws.String(target.Name),
}

// start session
session, err := internal.CreateStartSession(ctx, *_credential.awsConfig, input)
if err != nil {
panicRed(err)
}

sessJson, err := json.Marshal(session)
if err != nil {
panicRed(err)
}

paramsJson, err := json.Marshal(input)
if err != nil {
panicRed(err)
}

if err := internal.CallProcess(_credential.ssmPluginPath, string(sessJson),
_credential.awsConfig.Region, "StartSession",
_credential.awsProfile, string(paramsJson)); err != nil {
color.Red("[err] %v", err.Error())
}

// delete session
if err := internal.DeleteStartSession(ctx, *_credential.awsConfig, &ssm.TerminateSessionInput{
SessionId: session.SessionId,
}); err != nil {
panicRed(err)
}
},
}
)

func init() {
// add sub command
fwdremCommand.Flags().StringP("remote", "z", "", "[optional] remote port to forward to, ex) 8080")
fwdremCommand.Flags().StringP("local", "l", "", "[optional] local port to use, ex) 1234")
fwdremCommand.Flags().StringP("target", "t", "", "[optional] it is ec2 instanceId to proxy through.")
fwdremCommand.Flags().StringP("host", "a", "", "[optional] it is remote host address to proxy to.")

// mapping viper
viper.BindPFlag("fwd-remote-port", fwdremCommand.Flags().Lookup("remote"))
viper.BindPFlag("fwd-local-port", fwdremCommand.Flags().Lookup("local"))
viper.BindPFlag("fwd-target", fwdremCommand.Flags().Lookup("target"))
viper.BindPFlag("fwd-host", fwdremCommand.Flags().Lookup("host"))

rootCmd.AddCommand(fwdremCommand)
}
1 change: 1 addition & 0 deletions cmd/fwdrem_test.go
@@ -0,0 +1 @@
package cmd
14 changes: 14 additions & 0 deletions internal/ssm.go
Expand Up @@ -428,6 +428,20 @@ func FindDomainByInstanceId(ctx context.Context, cfg aws.Config, instanceId stri
return []string{}, nil
}

// AskUser asks you which selects a user.
func AskHost() (host string, retErr error) {
prompt := &survey.Input{
Message: "Type your host address you want to forward to:",
}
survey.AskOne(prompt, &host)
host = strings.TrimSpace(host)
if host == "" {
retErr = errors.New("you must specify a host address")
return
}
return
}

// CreateStartSession creates start session.
func CreateStartSession(ctx context.Context, cfg aws.Config, input *ssm.StartSessionInput) (*ssm.StartSessionOutput, error) {
client := ssm.NewFromConfig(cfg)
Expand Down

0 comments on commit f96bb31

Please sign in to comment.