Skip to content

Commit 8957692

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 7609378 commit 8957692

File tree

5 files changed

+107
-32
lines changed

5 files changed

+107
-32
lines changed

config_dev.go

Lines changed: 31 additions & 8 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+
closeFn []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+
closeFn = append(closeFn, 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+
closeFn = append(closeFn, sqlStore.BaseDB.Close)
120122

121123
default:
122124
accountStore, err := accounts.NewBoltStore(
@@ -136,7 +138,7 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
136138

137139
acctStore = accountStore
138140
sessStore = sessionStore
139-
closeFn = func() error {
141+
closeFn = append(closeFn, func() error {
140142
var returnErr error
141143
err = accountStore.Close()
142144
if err != nil {
@@ -149,12 +151,33 @@ func NewStores(cfg *Config, clock clock.Clock) (*stores, error) {
149151
}
150152

151153
return returnErr
152-
}
154+
})
153155
}
154156

157+
firewallBoltDB, err := firewalldb.NewBoltDB(
158+
networkDir, firewalldb.DBFilename, sessStore,
159+
)
160+
if err != nil {
161+
return nil, fmt.Errorf("error creating firewall BoltDB: %v",
162+
err)
163+
}
164+
closeFn = append(closeFn, firewallBoltDB.Close)
165+
155166
return &stores{
156-
accounts: acctStore,
157-
sessions: sessStore,
158-
close: closeFn,
167+
accounts: acctStore,
168+
sessions: sessStore,
169+
firewall: firewalldb.NewDB(firewallBoltDB),
170+
firewallBolt: firewallBoltDB,
171+
close: func() error {
172+
var returnErr error
173+
for _, fn := range closeFn {
174+
err := fn()
175+
if err != nil {
176+
returnErr = err
177+
}
178+
}
179+
180+
return returnErr
181+
},
159182
}, nil
160183
}

config_prod.go

Lines changed: 12 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,9 +47,18 @@ 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 {

firewalldb/db.go

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

33
import (
4+
"context"
45
"fmt"
6+
"sync/atomic"
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 atomic.Bool
20+
stopped atomic.Bool
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+
if !db.started.CompareAndSwap(false, true) {
38+
return nil
39+
}
40+
41+
ctx, cancel := context.WithCancel(ctx)
42+
db.cancel = fn.Some(cancel)
43+
44+
return nil
45+
}
46+
47+
// Stop stops the firewall database operations.
48+
func (db *DB) Stop() error {
49+
if !db.started.CompareAndSwap(false, true) {
50+
return nil
51+
}
52+
53+
return nil
54+
}

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)