Skip to content

Commit b7e5ed3

Browse files
committed
firewalldb: add DB struct and Start/Stop methods
In this commit, we add a `DB` struct in the `firewalldb` package. This struct will be responsible for housing abstract implementations of the various stores in the `firewalldb`. For now, we start with just the RulesDB. We also add Start&Stop methods for the struct in preparation for future additions here - for now, these do nothing. In the main LiT setup, we move the firewall.BoltDB and the new firewalldb.DB to the `stores` struct and implement them in the two `config_` files. For now, both varients create the Bbolt version of the firewallDB and this is used to init the `firewalldb.DB` struct. This will be changed in future commits where we will add a sql implementation.
1 parent b529501 commit b7e5ed3

File tree

5 files changed

+114
-43
lines changed

5 files changed

+114
-43
lines changed

config_dev.go

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
package terminal
44

55
import (
6+
"fmt"
67
"path/filepath"
78

89
"github.com/lightninglabs/lightning-terminal/accounts"
910
"github.com/lightninglabs/lightning-terminal/db"
11+
"github.com/lightninglabs/lightning-terminal/firewalldb"
1012
"github.com/lightninglabs/lightning-terminal/session"
1113
"github.com/lightningnetwork/lnd/clock"
1214
)
@@ -87,7 +89,7 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
8789
networkDir = filepath.Join(cfg.LitDir, cfg.Network)
8890
acctStore accounts.Store
8991
sessStore session.Store
90-
closeFn func() error
92+
closeFns = make(map[string]func() error)
9193
)
9294

9395
switch cfg.DatabaseBackend {
@@ -106,7 +108,7 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
106108

107109
acctStore = accounts.NewSQLStore(sqlStore.BaseDB, clock)
108110
sessStore = session.NewSQLStore(sqlStore.BaseDB, clock)
109-
closeFn = sqlStore.BaseDB.Close
111+
closeFns["sqlite"] = sqlStore.BaseDB.Close
110112

111113
case DatabaseBackendPostgres:
112114
sqlStore, err := db.NewPostgresStore(cfg.Postgres)
@@ -116,7 +118,7 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
116118

117119
acctStore = accounts.NewSQLStore(sqlStore.BaseDB, clock)
118120
sessStore = session.NewSQLStore(sqlStore.BaseDB, clock)
119-
closeFn = sqlStore.BaseDB.Close
121+
closeFns["postgres"] = sqlStore.BaseDB.Close
120122

121123
default:
122124
accountStore, err := accounts.NewBoltStore(
@@ -126,35 +128,46 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
126128
if err != nil {
127129
return nil, err
128130
}
131+
closeFns["bbolt-accounts"] = accountStore.Close
129132

130133
sessionStore, err := session.NewDB(
131134
networkDir, session.DBFilename, clock, accountStore,
132135
)
133136
if err != nil {
134137
return nil, err
135138
}
139+
closeFns["bbolt-sessions"] = sessionStore.Close
136140

137141
acctStore = accountStore
138142
sessStore = sessionStore
139-
closeFn = func() error {
140-
var returnErr error
141-
err = accountStore.Close()
142-
if err != nil {
143-
returnErr = err
144-
}
145-
146-
err = sessionStore.Close()
147-
if err != nil {
148-
returnErr = err
149-
}
143+
}
150144

151-
return returnErr
152-
}
145+
firewallBoltDB, err := firewalldb.NewBoltDB(
146+
networkDir, firewalldb.DBFilename, sessStore,
147+
)
148+
if err != nil {
149+
return nil, fmt.Errorf("error creating firewall BoltDB: %v",
150+
err)
153151
}
152+
closeFns["bbolt-firewalldb"] = firewallBoltDB.Close
154153

155154
return &stores{
156-
accounts: acctStore,
157-
sessions: sessStore,
158-
close: closeFn,
155+
accounts: acctStore,
156+
sessions: sessStore,
157+
firewall: firewalldb.NewDB(firewallBoltDB),
158+
firewallBolt: firewallBoltDB,
159+
close: func() error {
160+
var returnErr error
161+
for storeName, fn := range closeFns {
162+
err := fn()
163+
if err != nil {
164+
log.Errorf("error closing %s store: %v",
165+
storeName, err)
166+
returnErr = err
167+
}
168+
}
169+
170+
return returnErr
171+
},
159172
}, nil
160173
}

config_prod.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path/filepath"
88

99
"github.com/lightninglabs/lightning-terminal/accounts"
10+
"github.com/lightninglabs/lightning-terminal/firewalldb"
1011
"github.com/lightninglabs/lightning-terminal/session"
1112
"github.com/lightningnetwork/lnd/clock"
1213
)
@@ -46,18 +47,37 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
4647
err)
4748
}
4849

50+
firewallDB, err := firewalldb.NewBoltDB(
51+
networkDir, firewalldb.DBFilename, sessStore,
52+
)
53+
if err != nil {
54+
return nil, fmt.Errorf("error creating firewall DB: %v", err)
55+
}
56+
4957
return &stores{
50-
accounts: acctStore,
51-
sessions: sessStore,
58+
accounts: acctStore,
59+
sessions: sessStore,
60+
firewallBolt: firewallDB,
61+
firewall: firewalldb.NewDB(firewallDB),
5262
close: func() error {
5363
var returnErr error
5464
if err := acctStore.Close(); err != nil {
5565
returnErr = fmt.Errorf("error closing "+
5666
"account store: %v", err)
67+
68+
log.Error(returnErr.Error())
5769
}
5870
if err := sessStore.Close(); err != nil {
5971
returnErr = fmt.Errorf("error closing "+
6072
"session store: %v", err)
73+
74+
log.Error(returnErr.Error())
75+
}
76+
if err := firewallDB.Close(); err != nil {
77+
returnErr = fmt.Errorf("error closing "+
78+
"firewall DB: %v", err)
79+
80+
log.Error(returnErr.Error())
6181
}
6282

6383
return returnErr

firewalldb/db.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,50 @@
11
package firewalldb
22

33
import (
4+
"context"
45
"fmt"
6+
"sync"
7+
8+
"github.com/lightningnetwork/lnd/fn"
59
)
610

711
var (
812
// ErrNoSuchKeyFound is returned when there is no key-value pair found
913
// for the given key.
1014
ErrNoSuchKeyFound = fmt.Errorf("no such key found")
1115
)
16+
17+
// DB manages the firewall rules database.
18+
type DB struct {
19+
started sync.Once
20+
stopped sync.Once
21+
22+
RulesDB
23+
24+
cancel fn.Option[context.CancelFunc]
25+
}
26+
27+
// NewDB creates a new firewall database. For now, it only contains the
28+
// underlying rules' database.
29+
func NewDB(kvdb RulesDB) *DB {
30+
return &DB{
31+
RulesDB: kvdb,
32+
}
33+
}
34+
35+
// Start starts the firewall database.
36+
func (db *DB) Start(ctx context.Context) error {
37+
db.started.Do(func() {
38+
_, cancel := context.WithCancel(ctx)
39+
db.cancel = fn.Some(cancel)
40+
})
41+
42+
return nil
43+
}
44+
45+
// Stop stops the firewall database operations.
46+
func (db *DB) Stop() error {
47+
db.stopped.Do(func() {})
48+
49+
return nil
50+
}

firewalldb/kvstores.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ type KVStore interface {
100100

101101
// RulesDB can be used to initialise a new rules.KVStores.
102102
type RulesDB interface {
103+
// GetKVStores constructs a new rules.KVStores in a namespace defined
104+
// by the rule name, group ID and feature name.
103105
GetKVStores(rule string, groupID session.ID, feature string) KVStores
104106
}
105107

terminal.go

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,6 @@ type LightningTerminal struct {
223223

224224
stores *stores
225225

226-
firewallDB *firewalldb.BoltDB
227-
228226
restHandler http.Handler
229227
restCancel func()
230228
}
@@ -241,6 +239,9 @@ type stores struct {
241239
accounts accounts.Store
242240
sessions session.Store
243241

242+
firewall *firewalldb.DB
243+
firewallBolt *firewalldb.BoltDB
244+
244245
// close is a callback that can be used to close all the stores in the
245246
// stores struct.
246247
close func() error
@@ -436,6 +437,10 @@ func (g *LightningTerminal) start(ctx context.Context) error {
436437
return fmt.Errorf("could not create stores: %v", err)
437438
}
438439

440+
if err := g.stores.firewall.Start(ctx); err != nil {
441+
return fmt.Errorf("could not start firewall DB: %v", err)
442+
}
443+
439444
g.accountService, err = accounts.NewService(
440445
g.stores.accounts, accountServiceErrCallback,
441446
)
@@ -457,13 +462,6 @@ func (g *LightningTerminal) start(ctx context.Context) error {
457462

458463
g.ruleMgrs = rules.NewRuleManagerSet()
459464

460-
g.firewallDB, err = firewalldb.NewBoltDB(
461-
networkDir, firewalldb.DBFilename, g.stores.sessions,
462-
)
463-
if err != nil {
464-
return fmt.Errorf("error creating firewall DB: %v", err)
465-
}
466-
467465
if !g.cfg.Autopilot.Disable {
468466
if g.cfg.Autopilot.Address == "" &&
469467
len(g.cfg.Autopilot.DialOpts) == 0 {
@@ -517,10 +515,10 @@ func (g *LightningTerminal) start(ctx context.Context) error {
517515
superMacBaker: superMacBaker,
518516
firstConnectionDeadline: g.cfg.FirstLNCConnDeadline,
519517
permMgr: g.permsMgr,
520-
actionsDB: g.firewallDB,
518+
actionsDB: g.stores.firewallBolt,
521519
autopilot: g.autopilotClient,
522520
ruleMgrs: g.ruleMgrs,
523-
privMap: g.firewallDB.PrivacyDB,
521+
privMap: g.stores.firewallBolt.PrivacyDB,
524522
})
525523
if err != nil {
526524
return fmt.Errorf("could not create new session rpc "+
@@ -1079,14 +1077,14 @@ func (g *LightningTerminal) startInternalSubServers(ctx context.Context,
10791077
}
10801078

10811079
requestLogger, err := firewall.NewRequestLogger(
1082-
g.cfg.Firewall.RequestLogger, g.firewallDB,
1080+
g.cfg.Firewall.RequestLogger, g.stores.firewallBolt,
10831081
)
10841082
if err != nil {
10851083
return fmt.Errorf("error creating new request logger")
10861084
}
10871085

10881086
privacyMapper := firewall.NewPrivacyMapper(
1089-
g.firewallDB.PrivacyDB, firewall.CryptoRandIntn,
1087+
g.stores.firewallBolt.PrivacyDB, firewall.CryptoRandIntn,
10901088
g.stores.sessions,
10911089
)
10921090

@@ -1098,7 +1096,8 @@ func (g *LightningTerminal) startInternalSubServers(ctx context.Context,
10981096

10991097
if !g.cfg.Autopilot.Disable {
11001098
ruleEnforcer := firewall.NewRuleEnforcer(
1101-
g.firewallDB, g.firewallDB, g.stores.sessions,
1099+
g.stores.firewall, g.stores.firewallBolt,
1100+
g.stores.sessions,
11021101
g.autopilotClient.ListFeaturePerms,
11031102
g.permsMgr, g.lndClient.NodePubkey,
11041103
g.lndClient.Router,
@@ -1108,7 +1107,7 @@ func (g *LightningTerminal) startInternalSubServers(ctx context.Context,
11081107
reqID, firewalldb.ActionStateError,
11091108
reason,
11101109
)
1111-
}, g.firewallDB.PrivacyDB,
1110+
}, g.stores.firewallBolt.PrivacyDB,
11121111
)
11131112

11141113
mw = append(mw, ruleEnforcer)
@@ -1443,13 +1442,6 @@ func (g *LightningTerminal) shutdownSubServers() error {
14431442
g.middleware.Stop()
14441443
}
14451444

1446-
if g.firewallDB != nil {
1447-
if err := g.firewallDB.Close(); err != nil {
1448-
log.Errorf("Error closing rules DB: %v", err)
1449-
returnErr = err
1450-
}
1451-
}
1452-
14531445
if g.ruleMgrs != nil {
14541446
if err := g.ruleMgrs.Stop(); err != nil {
14551447
log.Errorf("Error stopping rule manager set: %v", err)
@@ -1458,6 +1450,11 @@ func (g *LightningTerminal) shutdownSubServers() error {
14581450
}
14591451

14601452
if g.stores != nil {
1453+
if err := g.stores.firewall.Stop(); err != nil {
1454+
log.Errorf("Error stoppint firewall DB: %v", err)
1455+
returnErr = err
1456+
}
1457+
14611458
err = g.stores.close()
14621459
if err != nil {
14631460
log.Errorf("Error closing stores: %v", err)

0 commit comments

Comments
 (0)