-
Notifications
You must be signed in to change notification settings - Fork 384
/
daemon.go
138 lines (128 loc) · 4.58 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
package main
import (
"context"
"flag"
"fmt"
"os"
"sync"
"time"
"github.com/mdp/qrterminal/v3"
"github.com/peterbourgon/ff/v3/ffcli"
"berty.tech/berty/v2/go/internal/logutil"
"berty.tech/berty/v2/go/pkg/banner"
"berty.tech/berty/v2/go/pkg/errcode"
"berty.tech/berty/v2/go/pkg/messengertypes"
"berty.tech/berty/v2/go/pkg/protocoltypes"
)
func daemonCommand() *ffcli.Command {
var (
noQRFlag = false
noBannerFlag = false
noSystemInfoFlag = false
passphraseFlag = ""
)
fsBuilder := func() (*flag.FlagSet, error) {
fs := flag.NewFlagSet("berty daemon", flag.ExitOnError)
fs.String("config", "", "config file (optional)")
manager.Session.Kind = "cli.daemon"
manager.SetupLoggingFlags(fs) // also available at root level
manager.SetupLocalMessengerServerFlags(fs) // we want to configure a local messenger server
manager.SetupDefaultGRPCListenersFlags(fs)
manager.SetupMetricsFlags(fs)
manager.SetupInitTimeout(fs)
fs.StringVar(&passphraseFlag, "passphrase", passphraseFlag, "optional sharing-link encryption passphrase")
fs.BoolVar(&noQRFlag, "no-qr", noQRFlag, "do not print the QR code in terminal on startup")
fs.BoolVar(&noBannerFlag, "no-banner", noQRFlag, "do not print the Berty banner on startup")
fs.BoolVar(&noSystemInfoFlag, "no-system-info", noQRFlag, "do not print system info on startup")
return fs, nil
}
return &ffcli.Command{
Name: "daemon",
ShortUsage: "berty [global flags] daemon [flags]",
ShortHelp: "start a full Berty instance (Berty Protocol + Berty Messenger)",
Options: ffSubcommandOptions(),
FlagSetBuilder: fsBuilder,
UsageFunc: usageFunc,
Exec: func(ctx context.Context, args []string) error {
if len(args) > 0 {
return flag.ErrHelp
}
logger, err := manager.GetLogger()
if err != nil {
return err
}
// since this command is daemon, we want to be sure to run a local daemon with protocol and messenger
{
_, err := manager.GetLocalProtocolServer()
if err != nil {
return err
}
_, err = manager.GetLocalMessengerServer()
if err != nil {
return err
}
}
// connect to the local client
{
protocolClient, err := manager.GetProtocolClient()
if err != nil {
return err
}
info, err := protocolClient.InstanceGetConfiguration(ctx, &protocoltypes.InstanceGetConfiguration_Request{})
if err != nil {
return errcode.TODO.Wrap(err)
}
logger.Named("main").Info("daemon initialized", logutil.PrivateString("peer-id", info.PeerID), logutil.PrivateStrings("listeners", info.Listeners))
}
// display startup info
var printLock sync.Mutex
if !noBannerFlag {
time.AfterFunc(time.Second, func() {
printLock.Lock()
fmt.Fprintln(os.Stderr, banner.OfTheDay())
printLock.Unlock()
})
}
if !noQRFlag {
messenger, err := manager.GetMessengerClient()
if err != nil {
return errcode.TODO.Wrap(err)
}
ret, err := messenger.InstanceShareableBertyID(ctx, &messengertypes.InstanceShareableBertyID_Request{
DisplayName: manager.Node.Messenger.DisplayName,
Passphrase: []byte(passphraseFlag),
})
if err != nil {
return errcode.TODO.Wrap(err)
}
time.AfterFunc(time.Second, func() {
printLock.Lock()
qrterminal.GenerateHalfBlock(ret.InternalURL, qrterminal.L, os.Stderr)
// fmt.Fprintln(os.Stderr, ret.InternalURL)
fmt.Fprintln(os.Stderr, ret.WebURL)
printLock.Unlock()
})
}
if !noSystemInfoFlag {
messenger, err := manager.GetMessengerClient()
if err != nil {
return errcode.TODO.Wrap(err)
}
ret, err := messenger.SystemInfo(ctx, &messengertypes.SystemInfo_Request{})
if err != nil {
return errcode.TODO.Wrap(err)
}
time.AfterFunc(time.Second, func() {
printLock.Lock()
fmt.Fprintf(os.Stderr, " Berty: %-30s Go: %-10s\n", ret.Protocol.Process.Version, ret.Protocol.Process.GoVersion)
fmt.Fprintf(os.Stderr, " PID: %-12d Arch: %-12s OS: %-10s\n", ret.Protocol.Process.PID, ret.Protocol.Process.Arch, ret.Protocol.Process.OperatingSystem)
fmt.Fprintf(os.Stderr, " P2P peers: %-26d Hostname: %-30s\n", ret.Protocol.P2P.ConnectedPeers, ret.Protocol.Process.HostName)
fmt.Fprintf(os.Stderr, " Accounts=%-2d Contacts=%-2d Convs=%-2d Members=%-2d Devices=%-2d\n", ret.Messenger.DB.Accounts, ret.Messenger.DB.Contacts, ret.Messenger.DB.Conversations, ret.Messenger.DB.Members, ret.Messenger.DB.Devices)
fmt.Fprintf(os.Stderr, " Work dir: %-50s\n", ret.Protocol.Process.WorkingDir)
printLock.Unlock()
})
}
return manager.RunWorkers()
},
}
}