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 }