-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.go
128 lines (109 loc) · 3.6 KB
/
main.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
package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/budacom/lndbackup/backup"
"github.com/lightninglabs/lndclient"
"google.golang.org/grpc"
)
func getEnv(key, defaultValue string) string {
value, ok := os.LookupEnv(key)
if !ok {
return defaultValue
}
return value
}
var (
// Set during go build
version string
gitCommit string
signalsChannel = make(chan os.Signal, 1)
quit = make(chan struct{})
backupsPending = false
// maxMsgRecvSize is the largest message our client will receive. We
// set this to ~50Mb atm.
maxMsgRecvSize = grpc.MaxCallRecvMsgSize(1 * 1024 * 1024 * 50)
// Defaults values
defaultRPCHost = getEnv("RPC_HOST", "localhost")
defaultRPCPort = getEnv("RPC_PORT", "10009")
defaultTLSCertPath = getEnv("TLS_CERT_PATH", "/root/.lnd")
defaultMacaroonDir = getEnv("MACAROON_PATH", "")
defaultNetwork = getEnv("NETWORK", "mainnet")
defaultBucketURL = getEnv("BUCKET_URL", "")
// Command-line flags
rpcHost = flag.String("rpc-host", defaultRPCHost,
"Lightning node RPC host. The default value can be overwritten by RPC_HOST environment variable.")
rpcPort = flag.String("rpc-port", defaultRPCPort,
"Lightning node RPC port. The default value can be overwritten by RPC_PORT environment variable.")
tlsCertPath = flag.String("tls-cert-path", defaultTLSCertPath,
"The path to the tls certificate. The default value can be overwritten by TLS_CERT_PATH environment variable.")
macaroonDir = flag.String("macaroon-dir", defaultMacaroonDir,
"The directory where macaroons are stored. The default value can be overwritten by MACAROON_DIR environment variable.")
network = flag.String("network", defaultNetwork,
"The chain network to operate on. The default value can be overwritten by NETWORK environment variable.")
bucketURL = flag.String("bucket-url", defaultBucketURL,
"The bucket url to backup the snapshot. The default value can be overwritten by BUCKET_URL environment variable.")
)
func main() {
flag.Parse()
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
log.Printf("Starting Lightning Static Channel Backup Version=%v GitCommit=%v", version, gitCommit)
handleSignals()
client, err := lndclient.NewLndServices(&lndclient.LndServicesConfig{
LndAddress: *rpcHost,
Network: lndclient.Network(*network),
CustomMacaroonPath: fmt.Sprintf("%s/admin.macaroon", *macaroonDir),
TLSPath: *tlsCertPath,
// Use the default lnd version check which checks for version
// v0.11.0 and requires all build tags.
CheckVersion: nil,
})
if err != nil {
log.Printf("cannot connect to lightning services: %v", err)
os.Exit(1)
}
defer client.Close()
log.Printf("Initial backup")
snapShot, err := client.Client.ChannelBackups(ctx)
err = backup.ChannelSnapshot(ctx, *bucketURL, snapShot)
if err != nil {
os.Exit(1)
}
backupUpdates, _, _ := client.Client.SubscribeChannelBackups(ctx)
log.Printf("Subscribed to channel backups")
ReadBackupUpdates:
for {
select {
case channelSnapshot := <-backupUpdates:
backupsPending = true
multiChanBackup := channelSnapshot.GetMultiChanBackup()
backup.ChannelSnapshot(ctx, *bucketURL, multiChanBackup.MultiChanBackup)
backupsPending = false
case <-quit:
break ReadBackupUpdates
}
}
}
func handleSignals() {
signal.Notify(signalsChannel, syscall.SIGINT, syscall.SIGTERM)
go func() {
for {
select {
case <-signalsChannel:
if backupsPending == true {
log.Println("Waiting for pending backups")
}
log.Println("Shutting Down Gracefully")
close(quit)
return
}
}
}()
}