Skip to content

Commit

Permalink
feat(cmd): add server rdvp cmd
Browse files Browse the repository at this point in the history
  • Loading branch information
gfanton committed Mar 6, 2020
1 parent 86b033a commit 1d98744
Show file tree
Hide file tree
Showing 4 changed files with 184 additions and 3 deletions.
6 changes: 6 additions & 0 deletions go/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@ bazel.unittest: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, test, --test_output=streamed //...)

.PHONY: bazel.rdvp
bazel.rdvp: bazel.generate
$(call check-program, $(BAZEL))
$(call bazel, run, //cmd/rdvp -- serve)


.PHONY: bazel.generate
bazel.generate: pb.generate $(SAMPLE_GAZELLE_GENERATED_FILE)

Expand Down
2 changes: 2 additions & 0 deletions go/cmd/rdvp/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// rendezvous is a service to hold berty's rendezvous point
package main
173 changes: 173 additions & 0 deletions go/cmd/rdvp/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package main

import (
"context"
"flag"
"fmt"
"log"
"math/rand"
"net"
"os"
"strings"
"time"

"berty.tech/berty/go/pkg/errcode"
libp2p "github.com/libp2p/go-libp2p"
libp2p_host "github.com/libp2p/go-libp2p-core/host"
libp2p_peer "github.com/libp2p/go-libp2p-core/peer"
libp2p_rp "github.com/libp2p/go-libp2p-rendezvous"
libp2p_rpdb "github.com/libp2p/go-libp2p-rendezvous/db/sqlite"

ma "github.com/multiformats/go-multiaddr"

"github.com/peterbourgon/ff"
"github.com/peterbourgon/ff/ffcli"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)

func main() {
log.SetFlags(0)

var (
logger *zap.Logger
globalFlags = flag.NewFlagSet("rdvp", flag.ExitOnError)
globalDebug = globalFlags.Bool("debug", false, "debug mode")

serveFlags = flag.NewFlagSet("serve", flag.ExitOnError)
serveFlagsURN = serveFlags.String("db", ":memory:", "rdvp sqlite URN")
serveFlagsListeners = serveFlags.String("l", ":4040", "lists of listeners of (m)addrs separate by a comma")
)

globalPreRun := func() error {
rand.Seed(time.Now().UnixNano())
if *globalDebug {
config := zap.NewDevelopmentConfig()
config.Level.SetLevel(zap.DebugLevel)
config.DisableStacktrace = true
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
var err error
logger, err = config.Build()
if err != nil {
return errcode.TODO.Wrap(err)
}
logger.Debug("logger initialized in debug mode")
} else {
config := zap.NewDevelopmentConfig()
config.Level.SetLevel(zap.InfoLevel)
config.DisableStacktrace = true
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
var err error
logger, err = config.Build()
if err != nil {
return errcode.TODO.Wrap(err)
}
}
return nil
}

ctx := context.Background()

serve := &ffcli.Command{
Name: "serve",
Usage: "serve -l <maddrs> -pk <private_key> -db <file>",
FlagSet: serveFlags,
Exec: func(args []string) error {
if err := globalPreRun(); err != nil {
return err
}

ctx, cancel := context.WithCancel(ctx)
defer cancel()

_ = logger
_ = globalDebug

laddrs := strings.Split(*serveFlagsListeners, ",")
listeners, err := parseAddrs(laddrs...)
if err != nil {
return err
}

// @TODO(gfanton): Support private key file
host, err := libp2p.New(ctx, libp2p.ListenAddrs(listeners...))
if err != nil {
return err
}

logHostInfo(logger, host)
defer host.Close()

db, err := libp2p_rpdb.OpenDB(ctx, *serveFlagsURN)
if err != nil {
return err
}

defer db.Close()

// @TODO(gfanton): override libp2p logger
_ = libp2p_rp.NewRendezvousService(host, db)

select {}
},
}

root := &ffcli.Command{
Usage: "rdvp [global flags] <subcommand> [flags] [args...]",
FlagSet: globalFlags,
Options: []ff.Option{ff.WithEnvVarPrefix("RDVP")},
Subcommands: []*ffcli.Command{serve},
Exec: func([]string) error {
globalFlags.Usage()
return flag.ErrHelp
},
}

if err := root.Run(os.Args[1:]); err != nil {
log.Fatalf("error: %v", err)
}
}

// helpers

func logHostInfo(l *zap.Logger, host libp2p_host.Host) {
// print peer addrs
fields := []zapcore.Field{zap.String("peerID", host.ID().String())}

addrs := host.Addrs()
pi := libp2p_peer.AddrInfo{
ID: host.ID(),
Addrs: addrs,
}
if maddrs, err := libp2p_peer.AddrInfoToP2pAddrs(&pi); err == nil {
for _, maddr := range maddrs {
fields = append(fields, zap.Stringer("maddr", maddr))
}
}

l.Info("host started", fields...)
}

func parseAddrs(addrs ...string) (maddrs []ma.Multiaddr, err error) {
maddrs = make([]ma.Multiaddr, len(addrs))
for i, addr := range addrs {
maddrs[i], err = ma.NewMultiaddr(addr)

if err != nil {
// try to get a tcp multiaddr from host:port
host, port, serr := net.SplitHostPort(addr)
if serr != nil {
return
}

if host == "" {
host = "127.0.0.1"
}

addr = fmt.Sprintf("/ip4/%s/tcp/%s/", host, port)
maddrs[i], err = ma.NewMultiaddr(addr)
}
}

return
}
6 changes: 3 additions & 3 deletions go/gen.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1d98744

Please sign in to comment.