diff --git a/app.go b/app.go index 606a942..c503fa7 100644 --- a/app.go +++ b/app.go @@ -1,91 +1,90 @@ package sshtunnel import ( "flag" "log" "golang.org/x/crypto/ssh" "sync" "os/exec" "os" "io" ) func (c *Client) Start() { var wg sync.WaitGroup //The intermediary server for port binding serverHostname := flag.String("server", "ubuntu.cse.unr.edu", "a string") - execPath := flag.String("exec", "", "a binary to execute after connecting.") logFile := flag.String("log", "log.txt", "logfile location") lf, err := os.OpenFile(*logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening file: %v", err) } defer lf.Close() mw := io.MultiWriter(os.Stdout, lf) log.SetOutput(mw) var endpoints EndpointsFlag flag.Var(&endpoints, "endpoints", "Local and remote endpoints") flag.Parse() if len(endpoints) < 1 { log.Printf("No endpoints defined: %d\n", len(endpoints)) endpoints = make(EndpointsFlag, 0) endpoints = append(endpoints, "5555:172.28.128.230:5555") // MATLAB endpoints = append(endpoints, "25734:172.28.128.230:25734") // SolidWorks endpoints = append(endpoints, "25735:172.28.128.230:25735") // SolidWorks endpoints = append(endpoints, "7788:134.197.20.21:7788") // MATHCAD } localE, remoteE := ParseEndpointsFromArray(endpoints) log.Printf("localE: %v remoteE: %v", localE, remoteE) // 27013 serverEndpoint := &Endpoint{ Host: *serverHostname, Port: 22, } log.Printf("Endpoints: %v serverEndpoint: %v\n", endpoints, serverEndpoint) - //log.Printf("%v %v", serverEndpoint) - //credChan := make(chan Credentials) var passwordForm = NewPasswordForm() - //passwordForm.SetChan(credChan) - passwordForm.Show(); + + passwordForm.Show() credentials := passwordForm.Credentials log.Printf("Connecting to %s, User: %s ", *serverHostname, credentials.Username) sshConfig := &ssh.ClientConfig{ User: credentials.Username, HostKeyCallback: KeyPrint, Auth: []ssh.AuthMethod{ ssh.Password(credentials.Password), }, } tunnel := &SSHtunnel{ Config: sshConfig, Local: localE, Server: serverEndpoint, Remote: remoteE, } wg.Add(1) + go func() { defer wg.Done() tunnel.Start() - }(); + }() + if len(*execPath) > 0 { cmd := exec.Command(*execPath) err := cmd.Start() if err != nil { log.Fatal(err) } } wg.Wait() } diff --git a/windows_ui.go b/windows_ui.go index 742969d..45b50aa 100644 --- a/windows_ui.go +++ b/windows_ui.go @@ -1,67 +1,66 @@ // +build windows,!linux package sshtunnel import ( . "github.com/lxn/walk/declarative" "github.com/lxn/walk" ) type PasswordForm struct { Credentials *Credentials } func NewPasswordForm() *PasswordForm { - return &PasswordForm{} } func (p *PasswordForm) Show() { var mainWindow *walk.MainWindow var usernameLE, passwordLE *walk.LineEdit p.Credentials = &Credentials{Username: "Test"} MainWindow{ AssignTo: &mainWindow, Title: "Login", MinSize: Size{250, 150}, Layout: VBox{}, Children: []Widget{ HSplitter{ Children: []Widget{ Label{Text: "Username"}, LineEdit{AssignTo: &usernameLE}, }, }, HSplitter{ Children: []Widget{ Label{Text: "Password"}, LineEdit{PasswordMode: true, AssignTo: &passwordLE, OnKeyDown: func(key walk.Key) { if key == walk.KeyReturn { p.Credentials.Username = usernameLE.Text() p.Credentials.Password = passwordLE.Text() mainWindow.Close() } }, }, }, }, PushButton{ Text: "Login", OnClicked: func() { p.Credentials.Username = usernameLE.Text() p.Credentials.Password = passwordLE.Text() mainWindow.Close() }, }, PushButton{ Text: "Cancel", OnClicked: func() { mainWindow.Close() }, }, }, }.Run() }