예제 #1
0
파일: build.go 프로젝트: csquared/cli
func streamBuild(app, build string) error {
	host, password, err := currentLogin()

	if err != nil {
		stdcli.Error(err)
		return err
	}

	origin := fmt.Sprintf("https://%s", host)
	url := fmt.Sprintf("wss://%s/apps/%s/builds/%s/logs", host, app, build)

	config, err := websocket.NewConfig(url, origin)

	if err != nil {
		stdcli.Error(err)
		return err
	}

	userpass := fmt.Sprintf("convox:%s", password)
	userpass_encoded := base64.StdEncoding.EncodeToString([]byte(userpass))

	config.Header.Add("Authorization", fmt.Sprintf("Basic %s", userpass_encoded))

	config.TlsConfig = &tls.Config{
		InsecureSkipVerify: true,
	}

	ws, err := websocket.DialConfig(config)

	if err != nil {
		stdcli.Error(err)
		return err
	}

	defer ws.Close()

	var message []byte

	for {
		err := websocket.Message.Receive(ws, &message)

		if err != nil {
			fmt.Fprintf(os.Stderr, "ws %s, retrying...\n", err.Error())
			streamBuild(app, build)
		}

		fmt.Print(string(message))
	}

	return nil
}
예제 #2
0
파일: logs.go 프로젝트: nguyendangminh/cli
func cmdLogsStream(c *cli.Context) {
	for {
		_, app, err := stdcli.DirApp(c, ".")

		if err != nil {
			stdcli.Error(err)
			return
		}

		host, password, err := currentLogin()

		if err != nil {
			stdcli.Error(err)
			return
		}

		origin := fmt.Sprintf("https://%s", host)
		url := fmt.Sprintf("wss://%s/apps/%s/logs/stream", host, app)

		config, err := websocket.NewConfig(url, origin)

		if err != nil {
			stdcli.Error(err)
			return
		}

		userpass := fmt.Sprintf("convox:%s", password)
		userpass_encoded := b64.StdEncoding.EncodeToString([]byte(userpass))

		config.Header.Add("Authorization", fmt.Sprintf("Basic %s", userpass_encoded))

		config.TlsConfig = &tls.Config{
			InsecureSkipVerify: true,
		}

		ws, err := websocket.DialConfig(config)

		if err != nil {
			stdcli.Error(err)
			return
		}

		defer ws.Close()

		var message []byte

		for {
			err := websocket.Message.Receive(ws, &message)

			if err == io.EOF {
				return
			}

			if err != nil {
				break
			}

			fmt.Print(string(message))
		}

		fmt.Println("out")
	}
}
예제 #3
0
파일: run.go 프로젝트: noqcks/cli
func cmdRunAttached(c *cli.Context) {
	fd := os.Stdin.Fd()
	oldState, err := term.SetRawTerminal(fd)
	if err != nil {
		stdcli.Error(err)
		return
	}
	defer term.RestoreTerminal(fd, oldState)

	_, app, err := stdcli.DirApp(c, ".")

	if err != nil {
		stdcli.Error(err)
		return
	}

	if len(c.Args()) < 2 {
		stdcli.Usage(c, "run")
		return
	}

	ps := c.Args()[0]

	host, password, err := currentLogin()

	if err != nil {
		stdcli.Error(err)
		return
	}

	origin := fmt.Sprintf("https://%s", host)
	url := fmt.Sprintf("wss://%s/apps/%s/processes/%s/run", host, app, ps)

	config, err := websocket.NewConfig(url, origin)

	if err != nil {
		stdcli.Error(err)
		return
	}

	command := strings.Join(c.Args()[1:], " ")

	config.Header.Set("Command", command)

	userpass := fmt.Sprintf("convox:%s", password)
	userpass_encoded := b64.StdEncoding.EncodeToString([]byte(userpass))

	config.Header.Add("Authorization", fmt.Sprintf("Basic %s", userpass_encoded))

	config.TlsConfig = &tls.Config{
		InsecureSkipVerify: true,
	}

	ws, err := websocket.DialConfig(config)

	if err != nil {
		stdcli.Error(err)
		return
	}

	defer ws.Close()

	ch := make(chan int)
	go io.Copy(ws, os.Stdin)
	go messageReceive(ws, os.Stdout, ch)

	code := <-ch

	term.RestoreTerminal(os.Stdin.Fd(), oldState)
	os.Exit(code)
}