func main() { go worker() state, err := term.SetRawTerminal(os.Stdin.Fd()) if err != nil { panic(err) } defer term.RestoreTerminal(os.Stdin.Fd(), state) winsize, _ = term.GetWinsize(os.Stdin.Fd()) client, err := beam.NewClient(&beam.NetTransport{"tcp", ":6379"}) if err != nil { panic(err) } defer client.Close() job := createJob(client) if err := job.Start(); err != nil { panic(err) } if err := job.Wait(); err != nil { panic(err) } }
func (cli *DockerCli) resizeTty(id string) { ws, err := term.GetWinsize(os.Stdin.Fd()) if err != nil { utils.Debugf("Error getting size: %s", err) } v := url.Values{} v.Set("h", strconv.Itoa(int(ws.Height))) v.Set("w", strconv.Itoa(int(ws.Width))) if _, _, err := cli.call("POST", "/containers/"+id+"/resize?"+v.Encode(), nil); err != nil { utils.Debugf("Error resize: %s", err) } }
func (cli *DockerCli) getTtySize() (int, int) { if !cli.isTerminal { return 0, 0 } ws, err := term.GetWinsize(cli.terminalFd) if err != nil { utils.Debugf("Error getting size: %s", err) if ws == nil { return 0, 0 } } return int(ws.Height), int(ws.Width) }
func (client *Client) getTtySize() (h int, w int) { if !client.isTerminal { return 0, 0 } ws, err := term.GetWinsize(client.terminalFd) if err.(syscall.Errno) != 0 { panic(fmt.Errorf("siphon: client error getting terminal size: %s\n", err)) } if ws == nil { return 0, 0 } return int(ws.Height), int(ws.Width) }
func (p *JSONProgress) String() string { var ( width = 200 pbBox string numbersBox string timeLeftBox string ) ws, err := term.GetWinsize(p.terminalFd) if err == nil { width = int(ws.Width) } if p.Current <= 0 && p.Total <= 0 { return "" } current := HumanSize(int64(p.Current)) if p.Total <= 0 { return fmt.Sprintf("%8v", current) } total := HumanSize(int64(p.Total)) percentage := int(float64(p.Current)/float64(p.Total)*100) / 2 if width > 110 { pbBox = fmt.Sprintf("[%s>%s] ", strings.Repeat("=", percentage), strings.Repeat(" ", 50-percentage)) } numbersBox = fmt.Sprintf("%8v/%v", current, total) if p.Start > 0 { fromStart := time.Now().UTC().Sub(time.Unix(int64(p.Start), 0)) perEntry := fromStart / time.Duration(p.Current) left := time.Duration(p.Total-p.Current) * perEntry left = (left / time.Second) * time.Second if width > 50 { timeLeftBox = " " + left.String() } } return pbBox + numbersBox + timeLeftBox }
func main() { disc, err := discover.NewClient() if err != nil { log.Fatal(err) } scheduler, err := client.New() if err != nil { log.Fatal(err) } state, err := scheduler.State() if err != nil { log.Fatal(err) } var firstHost string for k := range state { firstHost = k break } if firstHost == "" { log.Fatal("no hosts") } id := randomID() services, err := disc.Services("flynn-lorne-attach." + firstHost) if err != nil { log.Fatal(err) } conn, err := net.Dial("tcp", services.OnlineAddrs()[0]) if err != nil { log.Fatal(err) } ws, _ := term.GetWinsize(os.Stdin.Fd()) err = gob.NewEncoder(conn).Encode(&lorne.AttachReq{ JobID: id, Flags: lorne.AttachFlagStdout | lorne.AttachFlagStderr | lorne.AttachFlagStdin | lorne.AttachFlagStream, Height: int(ws.Height), Width: int(ws.Width), }) if err != nil { log.Fatal(err) } attachState := make([]byte, 1) if _, err := conn.Read(attachState); err != nil { log.Fatal(err) } switch attachState[0] { case lorne.AttachError: log.Fatal("attach error") } schedReq := &sampi.ScheduleReq{ Incremental: true, HostJobs: map[string][]*sampi.Job{firstHost: {{ID: id, Config: &docker.Config{ Image: "titanous/redis", Cmd: []string{"/bin/bash", "-i"}, Tty: true, AttachStdin: true, AttachStdout: true, AttachStderr: true, OpenStdin: true, StdinOnce: true, Env: []string{ "COLUMNS=" + strconv.Itoa(int(ws.Width)), "LINES=" + strconv.Itoa(int(ws.Height)), "TERM=" + os.Getenv("TERM"), }, }}}}, } if _, err := scheduler.Schedule(schedReq); err != nil { log.Fatal(err) } if _, err := conn.Read(attachState); err != nil { log.Fatal(err) } oldState, err := term.SetRawTerminal(os.Stdin.Fd()) if err != nil { log.Fatal(err) } go io.Copy(conn, os.Stdin) if _, err := io.Copy(os.Stdout, conn); err != nil { log.Fatal(err) } term.RestoreTerminal(os.Stdin.Fd(), oldState) }