// Run accepts incoming `quiltctl` connections and responds to them. func Run(conn db.Conn, listenAddr string) error { proto, addr, err := api.ParseListenAddress(listenAddr) if err != nil { return err } var sock net.Listener apiServer := server{conn} for { sock, err = net.Listen(proto, addr) if err == nil { break } log.WithError(err).Error("Failed to open socket.") time.Sleep(30 * time.Second) } // Cleanup the socket if we're interrupted. sigc := make(chan os.Signal, 1) signal.Notify(sigc, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGHUP) go func(c chan os.Signal) { sig := <-c log.Printf("Caught signal %s: shutting down.\n", sig) sock.Close() os.Exit(0) }(sigc) s := grpc.NewServer() pb.RegisterAPIServer(s, apiServer) s.Serve(sock) return nil }
// New creates a new Quilt client connected to `lAddr`. func New(lAddr string) (Client, error) { proto, addr, err := api.ParseListenAddress(lAddr) if err != nil { return nil, err } dialer := func(dialAddr string, t time.Duration) (net.Conn, error) { return net.DialTimeout(proto, dialAddr, t) } cc, err := grpc.Dial(addr, grpc.WithDialer(dialer), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(connectTimeout)) if err != nil { return nil, err } pbClient := pb.NewAPIClient(cc) host, _, _ := net.SplitHostPort(addr) return clientImpl{ pbClient: pbClient, cc: cc, serverHost: host, }, err }