1package tlsrptdb
2
3import (
4 "context"
5 "fmt"
6 "os"
7 "path/filepath"
8 "time"
9
10 "github.com/mjl-/bstore"
11
12 "github.com/mjl-/mox/mlog"
13 "github.com/mjl-/mox/mox-"
14 "github.com/mjl-/mox/moxvar"
15)
16
17var (
18 ReportDBTypes = []any{Record{}}
19 ReportDB *bstore.DB
20
21 // Accessed directly by tlsrptsend.
22 ResultDBTypes = []any{TLSResult{}, SuppressAddress{}}
23 ResultDB *bstore.DB
24)
25
26// Init opens and possibly initializes the databases.
27func Init() error {
28 if ReportDB != nil || ResultDB != nil {
29 return fmt.Errorf("already initialized")
30 }
31
32 log := mlog.New("tlsrptdb", nil)
33 var err error
34
35 ReportDB, err = openReportDB(mox.Shutdown, log)
36 if err != nil {
37 return fmt.Errorf("opening report db: %v", err)
38 }
39 ResultDB, err = openResultDB(mox.Shutdown, log)
40 if err != nil {
41 return fmt.Errorf("opening result db: %v", err)
42 }
43 return nil
44}
45
46func openReportDB(ctx context.Context, log mlog.Log) (*bstore.DB, error) {
47 p := mox.DataDirPath("tlsrpt.db")
48 os.MkdirAll(filepath.Dir(p), 0770)
49 opts := bstore.Options{Timeout: 5 * time.Second, Perm: 0660, RegisterLogger: moxvar.RegisterLogger(p, log.Logger)}
50 return bstore.Open(ctx, p, &opts, ReportDBTypes...)
51}
52
53func openResultDB(ctx context.Context, log mlog.Log) (*bstore.DB, error) {
54 p := mox.DataDirPath("tlsrptresult.db")
55 os.MkdirAll(filepath.Dir(p), 0770)
56 opts := bstore.Options{Timeout: 5 * time.Second, Perm: 0660, RegisterLogger: moxvar.RegisterLogger(p, log.Logger)}
57 return bstore.Open(ctx, p, &opts, ResultDBTypes...)
58}
59
60// Close closes the database connections.
61func Close() error {
62 if err := ResultDB.Close(); err != nil {
63 return fmt.Errorf("closing result db: %w", err)
64 }
65 ResultDB = nil
66
67 if err := ReportDB.Close(); err != nil {
68 return fmt.Errorf("closing report db: %w", err)
69 }
70 ReportDB = nil
71 return nil
72}
73