-
Notifications
You must be signed in to change notification settings - Fork 375
/
daemon.go
140 lines (122 loc) · 4.24 KB
/
daemon.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"berty.tech/core/manager/account"
"berty.tech/core/network/p2p"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
type daemonOptions struct {
sql sqlOptions `mapstructure:"sql"`
grpcBind string `mapstructure:"grpc-bind"`
gqlBind string `mapstructure:"gql-bind"`
hideBanner bool `mapstructure:"hide-banner"`
dropDatabase bool `mapstructure:"drop-database"`
initOnly bool `mapstructure:"init-only"`
withBot bool `mapstructure:"with-bot"`
// p2p
identity string `mapstructure:"identity"`
bootstrap []string `mapstructure:"bootstrap"`
noP2P bool `mapstructure:"no-p2p"`
bindP2P []string `mapstructure:"bind-p2p"`
transportP2P []string `mapstructure:"transport-p2p"`
hop bool `mapstructure:"hop"` // relay hop
mdns bool `mapstructure:"mdns"`
nickname string `mapstructure:"nickname"`
password string `mapstructure:"password"`
}
func daemonSetupFlags(flags *pflag.FlagSet, opts *daemonOptions) {
flags.StringVar(&opts.nickname, "nickname", "berty-daemon", "set account nickname")
flags.StringVar(&opts.password, "password", "secure", "set account password")
flags.BoolVar(&opts.dropDatabase, "drop-database", false, "drop database to force a reinitialization")
flags.BoolVar(&opts.hideBanner, "hide-banner", false, "hide banner")
flags.BoolVar(&opts.initOnly, "init-only", false, "stop after node initialization (useful for integration tests")
flags.BoolVar(&opts.noP2P, "no-p2p", false, "Disable p2p Driver")
flags.BoolVar(&opts.hop, "hop", false, "enable relay hop (should not be enable for client)")
flags.BoolVar(&opts.withBot, "bot", false, "enable bot")
flags.BoolVar(&opts.mdns, "mdns", true, "enable mdns discovery")
flags.StringVar(&opts.grpcBind, "grpc-bind", ":1337", "gRPC listening address")
flags.StringVar(&opts.gqlBind, "gql-bind", ":8700", "Bind graphql api")
flags.StringVarP(&opts.identity, "p2p-identity", "i", "", "set p2p identity")
flags.StringSliceVar(&opts.bootstrap, "bootstrap", p2p.DefaultBootstrap, "boostrap peers")
// flags.StringSliceVar(&opts.bindP2P, "bind-p2p", []string{"/ip4/0.0.0.0/tcp/0", "/ble/00000000-0000-0000-0000-000000000000"}, "p2p listening address")
flags.StringSliceVar(&opts.bindP2P, "bind-p2p", []string{"/ip4/0.0.0.0/tcp/0"}, "p2p listening address")
flags.StringSliceVar(&opts.transportP2P, "transport-p2p", []string{"default"}, "p2p transport to enable")
_ = viper.BindPFlags(flags)
}
func newDaemonCommand() *cobra.Command {
opts := &daemonOptions{}
cmd := &cobra.Command{
Use: "daemon",
RunE: func(cmd *cobra.Command, args []string) error {
if err := viper.Unmarshal(opts); err != nil {
return err
}
if err := viper.Unmarshal(&opts.sql); err != nil {
return err
}
return daemon(opts)
},
}
daemonSetupFlags(cmd.Flags(), opts)
sqlSetupFlags(cmd.Flags(), &opts.sql)
return cmd
}
func daemon(opts *daemonOptions) error {
var err error
a := &account.Account{}
defer a.PanicHandler()
accountOptions := account.Options{
account.WithName(opts.nickname),
account.WithPassphrase(opts.password),
account.WithDatabase(&account.DatabaseOptions{
Path: "/tmp",
Drop: opts.dropDatabase,
}),
account.WithBanner(banner),
account.WithGrpcServer(&account.GrpcServerOptions{
Bind: opts.grpcBind,
Interceptors: true,
JaegerAddr: jaegerAddr,
}),
account.WithGQL(&account.GQLOptions{
Bind: opts.gqlBind,
Interceptors: true,
JaegerAddr: jaegerAddr,
}),
}
if !opts.noP2P {
accountOptions = append(accountOptions, account.WithP2PNetwork(
&account.P2PNetworkOptions{
Bind: opts.bindP2P,
Transport: opts.transportP2P,
Bootstrap: opts.bootstrap,
MDNS: opts.mdns,
Relay: opts.hop,
Metrics: true,
Identity: opts.identity,
},
))
} else {
accountOptions = append(accountOptions, account.WithEnqueurNetwork())
}
if opts.withBot {
accountOptions = append(accountOptions, account.WithBot())
}
if opts.initOnly {
accountOptions = append(accountOptions, account.WithInitOnly())
}
a, err = account.New(accountOptions...)
if err != nil {
return err
}
defer a.Close()
err = a.Open()
if err != nil {
return err
}
if opts.initOnly {
return nil
}
return <-a.ErrChan()
}