100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"isle/bootstrap"
|
|
"isle/daemon"
|
|
"isle/daemon/jsonrpc2"
|
|
"isle/garage/garagesrv"
|
|
"net"
|
|
"net/http"
|
|
|
|
"dev.mediocregopher.com/mediocre-go-lib.git/mctx"
|
|
"dev.mediocregopher.com/mediocre-go-lib.git/mlog"
|
|
)
|
|
|
|
func coalesceDaemonConfigAndBootstrap(
|
|
hostBootstrap bootstrap.Bootstrap, daemonConfig daemon.Config,
|
|
) (
|
|
bootstrap.Bootstrap, error,
|
|
) {
|
|
host := bootstrap.Host{
|
|
HostAssigned: hostBootstrap.HostAssigned,
|
|
HostConfigured: bootstrap.HostConfigured{
|
|
Nebula: bootstrap.NebulaHost{
|
|
PublicAddr: daemonConfig.VPN.PublicAddr,
|
|
},
|
|
},
|
|
}
|
|
|
|
if allocs := daemonConfig.Storage.Allocations; len(allocs) > 0 {
|
|
|
|
for i, alloc := range allocs {
|
|
|
|
id, rpcPort, err := garagesrv.InitAlloc(alloc.MetaPath, alloc.RPCPort)
|
|
if err != nil {
|
|
return bootstrap.Bootstrap{}, fmt.Errorf(
|
|
"initializing alloc at %q: %w", alloc.MetaPath, err,
|
|
)
|
|
}
|
|
|
|
host.Garage.Instances = append(host.Garage.Instances, bootstrap.GarageHostInstance{
|
|
ID: id,
|
|
RPCPort: rpcPort,
|
|
S3APIPort: alloc.S3APIPort,
|
|
})
|
|
|
|
allocs[i].RPCPort = rpcPort
|
|
}
|
|
}
|
|
|
|
hostBootstrap.Hosts[host.Name] = host
|
|
|
|
if err := writeBootstrapToStateDir(hostBootstrap); err != nil {
|
|
return bootstrap.Bootstrap{}, fmt.Errorf("writing bootstrap file: %w", err)
|
|
}
|
|
|
|
return hostBootstrap, nil
|
|
}
|
|
|
|
const daemonHTTPRPCPath = "/rpc/v0.json"
|
|
|
|
func newHTTPServer(
|
|
ctx context.Context, logger *mlog.Logger, rpc *daemon.RPC,
|
|
) (
|
|
*http.Server, error,
|
|
) {
|
|
socketPath := daemon.HTTPSocketPath()
|
|
l, err := net.Listen("unix", socketPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf(
|
|
"failed to listen on socket %q: %w", socketPath, err,
|
|
)
|
|
}
|
|
|
|
ctx = mctx.Annotate(ctx, "httpAddr", l.Addr().String())
|
|
logger.Info(ctx, "HTTP server socket created")
|
|
|
|
rpcHandler := jsonrpc2.Chain(
|
|
jsonrpc2.NewMLogMiddleware(logger.WithNamespace("rpc")),
|
|
jsonrpc2.ExposeServerSideErrorsMiddleware,
|
|
)(
|
|
jsonrpc2.NewDispatchHandler(&rpc),
|
|
)
|
|
|
|
httpMux := http.NewServeMux()
|
|
httpMux.Handle(daemonHTTPRPCPath, jsonrpc2.NewHTTPHandler(rpcHandler))
|
|
|
|
srv := &http.Server{Handler: httpMux}
|
|
|
|
go func() {
|
|
if err := srv.Serve(l); !errors.Is(err, http.ErrServerClosed) {
|
|
logger.Fatal(ctx, "HTTP server unexpectedly shut down", err)
|
|
}
|
|
}()
|
|
|
|
return srv, nil
|
|
}
|