1 package notmain
2
3 import (
4 "context"
5 "flag"
6 "os"
7
8 "github.com/letsencrypt/boulder/cmd"
9 "github.com/letsencrypt/boulder/config"
10 "github.com/letsencrypt/boulder/features"
11 bgrpc "github.com/letsencrypt/boulder/grpc"
12 "github.com/letsencrypt/boulder/sa"
13 sapb "github.com/letsencrypt/boulder/sa/proto"
14 )
15
16 type Config struct {
17 SA struct {
18 cmd.ServiceConfig
19 DB cmd.DBConfig
20 ReadOnlyDB cmd.DBConfig `validate:"-"`
21 IncidentsDB cmd.DBConfig `validate:"-"`
22
23 Features map[string]bool
24
25
26 ParallelismPerRPC int `validate:"omitempty,min=1"`
27
28
29 LagFactor config.Duration `validate:"-"`
30 }
31
32 Syslog cmd.SyslogConfig
33 OpenTelemetry cmd.OpenTelemetryConfig
34 }
35
36 func main() {
37 grpcAddr := flag.String("addr", "", "gRPC listen address override")
38 debugAddr := flag.String("debug-addr", "", "Debug server address override")
39 configFile := flag.String("config", "", "File path to the configuration file for this service")
40 flag.Parse()
41 if *configFile == "" {
42 flag.Usage()
43 os.Exit(1)
44 }
45
46 var c Config
47 err := cmd.ReadConfigFile(*configFile, &c)
48 cmd.FailOnError(err, "Reading JSON config file into config structure")
49
50 err = features.Set(c.SA.Features)
51 cmd.FailOnError(err, "Failed to set feature flags")
52
53 if *grpcAddr != "" {
54 c.SA.GRPC.Address = *grpcAddr
55 }
56 if *debugAddr != "" {
57 c.SA.DebugAddr = *debugAddr
58 }
59
60 scope, logger, oTelShutdown := cmd.StatsAndLogging(c.Syslog, c.OpenTelemetry, c.SA.DebugAddr)
61 defer oTelShutdown(context.Background())
62 logger.Info(cmd.VersionString())
63
64 dbMap, err := sa.InitWrappedDb(c.SA.DB, scope, logger)
65 cmd.FailOnError(err, "While initializing dbMap")
66
67 dbReadOnlyMap := dbMap
68 if c.SA.ReadOnlyDB != (cmd.DBConfig{}) {
69 dbReadOnlyMap, err = sa.InitWrappedDb(c.SA.ReadOnlyDB, scope, logger)
70 cmd.FailOnError(err, "While initializing dbReadOnlyMap")
71 }
72
73 dbIncidentsMap := dbMap
74 if c.SA.IncidentsDB != (cmd.DBConfig{}) {
75 dbIncidentsMap, err = sa.InitWrappedDb(c.SA.IncidentsDB, scope, logger)
76 cmd.FailOnError(err, "While initializing dbIncidentsMap")
77 }
78
79 clk := cmd.Clock()
80
81 parallel := c.SA.ParallelismPerRPC
82 if parallel < 1 {
83 parallel = 1
84 }
85
86 tls, err := c.SA.TLS.Load(scope)
87 cmd.FailOnError(err, "TLS config")
88
89 saroi, err := sa.NewSQLStorageAuthorityRO(
90 dbReadOnlyMap, dbIncidentsMap, scope, parallel, c.SA.LagFactor.Duration, clk, logger)
91 cmd.FailOnError(err, "Failed to create read-only SA impl")
92
93 sai, err := sa.NewSQLStorageAuthorityWrapping(saroi, dbMap, scope)
94 cmd.FailOnError(err, "Failed to create SA impl")
95
96 start, err := bgrpc.NewServer(c.SA.GRPC, logger).WithCheckInterval(c.SA.HealthCheckInterval.Duration).Add(
97 &sapb.StorageAuthorityReadOnly_ServiceDesc, saroi).Add(
98 &sapb.StorageAuthority_ServiceDesc, sai).Build(
99 tls, scope, clk)
100 cmd.FailOnError(err, "Unable to setup SA gRPC server")
101
102 cmd.FailOnError(start(), "SA gRPC service failed")
103 }
104
105 func init() {
106 cmd.RegisterCommand("boulder-sa", main, &cmd.ConfigValidator{Config: &Config{}})
107 }
108
View as plain text