Example #1
0
func Dial(addr string) (*GearConn, error) {
	log.Printf("Opening libchan connection to %s", addr)

	conn, err := net.Dial("tcp", addr)
	if err != nil {
		return nil, err
	}

	transport, err := spdy.NewClientTransport(conn)
	if err != nil {
		conn.Close()
		return nil, err
	}

	main, err := transport.NewSendChannel()
	if err != nil {
		conn.Close()
		return nil, err
	}

	if err := doEcho(main, time.Second); err != nil {
		conn.Close()
		return nil, fmt.Errorf("initial echo %s", err.Error())
	}
	log.Printf("Libchan connection to %s open", addr)
	gc := &GearConn{conn: conn, mainChan: main, addr: addr}

	go gc.pinger()

	return gc, nil
}
Example #2
0
func main() {
	if len(os.Args) < 2 {
		log.Fatal("usage: <command> [<arg> ]")
	}

	var client net.Conn
	var err error
	if os.Getenv("USE_TLS") != "" {
		client, err = tls.Dial("tcp", "127.0.0.1:9323", &tls.Config{InsecureSkipVerify: true})
	} else {
		client, err = net.Dial("tcp", "127.0.0.1:9323")
	}
	if err != nil {
		log.Fatal(err)
	}

	transport, err := spdy.NewClientTransport(client)
	if err != nil {
		log.Fatal(err)
	}
	sender, err := transport.NewSendChannel()
	if err != nil {
		log.Fatal(err)
	}

	receiver, remoteSender := libchan.Pipe()

	command := &RemoteCommand{
		Cmd:        os.Args[1],
		Args:       os.Args[2:],
		Stdin:      os.Stdin,
		Stdout:     os.Stdout,
		Stderr:     os.Stderr,
		StatusChan: remoteSender,
	}

	err = sender.Send(command)
	if err != nil {
		log.Fatal(err)
	}

	response := &CommandResponse{}
	err = receiver.Receive(response)
	if err != nil {
		log.Fatal(err)
	}

	os.Exit(response.Status)
}
Example #3
0
func NewRemoteRepository(remoteURL string) ThingeyRepository {
	receiver, remoteSender := libchan.Pipe()
	var client net.Conn
	var err error
	client, err = net.Dial("tcp", remoteURL)
	if err != nil {
		log.Fatal(err)
	}

	transport, err := spdy.NewClientTransport(client)
	if err != nil {
		log.Fatal(err)
	}
	return NewThingeyRepository(transport.NewSendChannel, receiver, remoteSender)
}
Example #4
0
func Client(task *Task, proto *string, socket *string) int {
	var client net.Conn
	var err error
	if os.Getenv("USE_TLS") != "" {
		client, err = tls.Dial(*proto, *socket, &tls.Config{InsecureSkipVerify: true})
	} else {
		client, err = net.Dial(*proto, *socket)
	}
	if err != nil {
		log.Fatal(err)
	}
	transport, err := spdy.NewClientTransport(client)
	if err != nil {
		log.Fatal(err)
	}
	sender, err := transport.NewSendChannel()
	if err != nil {
		log.Fatal(err)
	}
	receiver, remoteSender := libchan.Pipe()
	//_, remoteSender := libchan.Pipe()
	command := &Command{
		Cmd:        task.Module,
		Args:       task.Args[0:],
		Stdin:      os.Stdin,
		Stdout:     os.Stdout,
		Stderr:     os.Stderr,
		StatusChan: remoteSender,
	}
	err = sender.Send(command)
	if err != nil {
		log.Fatal(err)
	}
	//sender.Close()
	response := &CommandResponse{}
	err = receiver.Receive(response)
	if err != nil {
		log.Fatal(err)
	}
	//command.StatusChan.Close()
	//sender.Close()
	//remoteSender.Close()
	//client.Close()
	return response.Status
	//	os.Exit(response.Status)
}
Example #5
0
// Start starts the designated child process storage driver and binds a socket
// to this process for IPC method calls
func (driver *StorageDriverClient) Start() error {
	driver.exitErr = nil
	driver.exitChan = make(chan error)
	driver.stopChan = make(chan struct{})

	fileDescriptors, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM, 0)
	if err != nil {
		return err
	}

	childSocket := os.NewFile(uintptr(fileDescriptors[0]), "childSocket")
	driver.socket = os.NewFile(uintptr(fileDescriptors[1]), "parentSocket")

	driver.subprocess.Stdout = os.Stdout
	driver.subprocess.Stderr = os.Stderr
	driver.subprocess.ExtraFiles = []*os.File{childSocket}

	if err = driver.subprocess.Start(); err != nil {
		driver.Stop()
		return err
	}

	go driver.handleSubprocessExit()

	if err = childSocket.Close(); err != nil {
		driver.Stop()
		return err
	}

	connection, err := net.FileConn(driver.socket)
	if err != nil {
		driver.Stop()
		return err
	}
	driver.transport, err = spdy.NewClientTransport(connection)
	if err != nil {
		driver.Stop()
		return err
	}
	driver.sender, err = driver.transport.NewSendChannel()
	if err != nil {
		driver.Stop()
		return err
	}

	// Check the driver's version to determine compatibility
	receiver, remoteSender := libchan.Pipe()
	err = driver.sender.Send(&Request{Type: "Version", ResponseChannel: remoteSender})
	if err != nil {
		driver.Stop()
		return err
	}

	var response VersionResponse
	err = receiver.Receive(&response)
	if err != nil {
		driver.Stop()
		return err
	}

	if response.Error != nil {
		return response.Error.Unwrap()
	}

	driver.version = response.Version

	if driver.version.Major() != storagedriver.CurrentVersion.Major() || driver.version.Minor() > storagedriver.CurrentVersion.Minor() {
		return IncompatibleVersionError{driver.version}
	}

	return nil
}
Example #6
0
	var dbDir string

	BeforeEach(func() {
		dbDir = fmt.Sprintf("/tmp/db-%d", os.Getpid())
		db, _ = database.Open(dbDir) // db is global defined in main.go

		var err error
		serverListener, err = net.Listen("tcp", "localhost:9323")
		Ω(err).ShouldNot(HaveOccurred())
		go ServeChan(serverListener)
		time.Sleep(10 * time.Millisecond)

		clientConn, err = net.Dial("tcp", "127.0.0.1:9323")
		Ω(err).ShouldNot(HaveOccurred())

		transport, err := spdy.NewClientTransport(clientConn)
		Ω(err).ShouldNot(HaveOccurred())

		clientSender, err = transport.NewSendChannel()
		Ω(err).ShouldNot(HaveOccurred())
	})

	AfterEach(func() {
		if clientConn != nil {
			clientConn.Close()
		}
		if serverListener != nil {
			fmt.Printf("Closing serverListener\n")
			serverListener.Close()
		}
		time.Sleep(10 * time.Millisecond)