// Copyright (C) 2020 Storj Labs, Inc. // See LICENSE for copying information. // Package admin implements administrative endpoints for satellite. package admin import ( "context" "net" "net/http" "github.com/gorilla/mux" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) // Config defines configuration for debug server. type Config struct { Address string `help:"admin peer http listening address" releaseDefault:"" devDefault:""` } // Server provides endpoints for debugging. type Server struct { log *zap.Logger listener net.Listener server http.Server mux mux.Router } // NewServer returns a new debug.Server. func NewServer(log *zap.Logger, listener net.Listener, config Config) *Server { server := &Server{log: log} server.listener = listener server.server.Handler = &server.mux return server } // Run starts the debug endpoint. func (server *Server) Run(ctx context.Context) error { if server.listener == nil { return nil } ctx, cancel := context.WithCancel(ctx) var group errgroup.Group group.Go(func() error { <-ctx.Done() return Error.Wrap(server.server.Shutdown(context.Background())) }) group.Go(func() error { defer cancel() return Error.Wrap(server.server.Serve(server.listener)) }) return group.Wait() } // Close closes server and underlying listener. func (server *Server) Close() error { return Error.Wrap(server.server.Close()) }