package space_worker import ( "fmt" "os" "os/exec" "playbookctl/internal/types" "strconv" "strings" ) func (app *SpaceWorker) Openports(targetHost string) error { app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) var ansibleHost string if targetHost != "" { ansibleHost = targetHost } else { var err error ansibleHost, err = app.GetDefaultHost() if err != nil { return err } } app.log.Trace("try read hosts.yml") hosts, err := types.ReadHosts(app.workDir) if err != nil { return err } var sshTargetHost string var sshTargetPort uint16 var sshTargetUser string for serverName, props := range *hosts { if serverName == ansibleHost { sshTargetHost = props.Host sshTargetPort = props.Port sshTargetUser = props.User break } } //------------------------------------------------------------------------------------------------------------------ app.log.Trace("try read ports.yml") portsDef, err := types.ReadPortsDef(app.workDir) if err != nil { return err } message := []string{"Open SSH connection to"} sshArgs := []string{"-N"} for _, portDef := range *portsDef { sshArgs = append(sshArgs, "-L", fmt.Sprintf("127.0.0.1:%d:127.0.0.1:%d", portDef.LocalPort, portDef.RemotePort)) if portDef.Url == "" { message = append(message, fmt.Sprintf(" - %s (%d -> %d)", portDef.Name, portDef.LocalPort, portDef.RemotePort)) } else { message = append(message, fmt.Sprintf(" - %s (%d -> %d) :: %s", portDef.Name, portDef.LocalPort, portDef.RemotePort, portDef.Url)) } } sshArgs = append(sshArgs, "-p", strconv.Itoa(int(sshTargetPort)), fmt.Sprintf("%s@%s", sshTargetUser, sshTargetHost)) app.log.Info(strings.Join(message, "\n")) command := exec.Command("/usr/bin/ssh", sshArgs...) command.Dir = app.workDir command.Stdin = os.Stdin command.Stdout = os.Stdout command.Stderr = os.Stderr app.log.Debug(fmt.Sprintf("ssh command line: %s", command.Args)) err = command.Run() return err }