Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion cmd/boulder-mtca/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ package notmain

import (
"context"
"database/sql"
"flag"
"log/slog"
"os"

"github.com/jmhodges/clock"

"github.com/letsencrypt/borp"
"github.com/letsencrypt/boulder/blog"
"github.com/letsencrypt/boulder/cmd"
bgrpc "github.com/letsencrypt/boulder/grpc"
Expand All @@ -23,6 +26,8 @@ type Config struct {

GRPCMTCA *cmd.GRPCServerConfig

DB cmd.DBConfig

// Issuer holds the configuration for a single MTCA instance with a single mtcaID.
// We run a separate process for each issuer.
// TODO: the issuance package parses the CA certificate as a self-signed X.509
Expand All @@ -39,6 +44,9 @@ func main() {
grpcAddr := flag.String("addr", "", "gRPC listen address override")
debugAddr := flag.String("debug-addr", "", "Debug server address override")
configFile := flag.String("config", "", "File path to the configuration file for this service")
initLog := flag.Bool("init-log", false, "Initialize log metadata in the database and exit")
initLogForTest := flag.Bool("init-log-for-test", false, "For testing: initialize log metadata (ignoring errors), then serve")

flag.Parse()
if *configFile == "" {
flag.Usage()
Expand Down Expand Up @@ -68,14 +76,40 @@ func main() {
issuer, err := issuance.LoadIssuer(c.MTCA.Issuer, clk)
cmd.FailOnError(err, "Loading issuer")

mtcaImpl := mtca.New(issuer)
url, err := c.MTCA.DB.URL()
cmd.FailOnError(err, "Reading DB URL")
db, err := sql.Open("mysql", url)
cmd.FailOnError(err, "Opening DB")
dbMap := &borp.DbMap{Db: db, Dialect: borp.MySQLDialect{}}

mtcaImpl := mtca.New(issuer, dbMap, logger)

if *initLog {
err = mtcaImpl.InitLog(context.Background())
cmd.FailOnError(err, "Initializing log")
return
}
if *initLogForTest {
err = mtcaImpl.InitLog(context.Background())
if err != nil {
logger.Info(context.Background(),
"Non-fatal error initializing MTC log DB for test",
slog.String("info", err.Error()))
}
}

srv := bgrpc.NewServer(c.MTCA.GRPCMTCA, logger).Add(
&mtcapb.MTCA_ServiceDesc, mtcaImpl)

start, err := srv.Build(tlsConfig, scope, clk)
cmd.FailOnError(err, "Unable to setup MTCA gRPC server")

ctx, cancel := context.WithCancel(context.Background())
// Cancel will be called after start() returns, which happens after GracefulStop() returns.
// That means all inflight RPCs will be done, which means the last of the pool has been sequenced.
defer cancel()
go mtcaImpl.Loop(ctx)

cmd.FailOnError(start(), "MTCA gRPC service failed")
}

Expand Down
Loading
Loading