2019-02-19 23:56:41 +00:00
|
|
|
// Copyright 2019 Drone IO, Inc.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/drone/drone/cmd/drone-server/config"
|
2019-04-24 22:22:55 +00:00
|
|
|
"github.com/drone/drone/core"
|
2019-02-19 23:56:41 +00:00
|
|
|
"github.com/drone/drone/handler/api"
|
2019-05-21 20:29:58 +00:00
|
|
|
"github.com/drone/drone/handler/health"
|
2019-02-19 23:56:41 +00:00
|
|
|
"github.com/drone/drone/handler/web"
|
|
|
|
"github.com/drone/drone/metric"
|
|
|
|
"github.com/drone/drone/operator/manager"
|
|
|
|
"github.com/drone/drone/operator/manager/rpc"
|
2019-05-21 18:45:42 +00:00
|
|
|
"github.com/drone/drone/operator/manager/rpc2"
|
2019-02-19 23:56:41 +00:00
|
|
|
"github.com/drone/drone/server"
|
|
|
|
"github.com/google/wire"
|
|
|
|
|
|
|
|
"github.com/go-chi/chi"
|
2019-12-30 01:59:42 +00:00
|
|
|
"github.com/go-chi/chi/middleware"
|
2019-02-19 23:56:41 +00:00
|
|
|
"github.com/unrolled/secure"
|
|
|
|
)
|
|
|
|
|
2019-05-21 20:00:16 +00:00
|
|
|
type (
|
|
|
|
healthzHandler http.Handler
|
|
|
|
metricsHandler http.Handler
|
2019-12-30 01:59:42 +00:00
|
|
|
pprofHandler http.Handler
|
2019-05-21 20:00:16 +00:00
|
|
|
rpcHandlerV1 http.Handler
|
|
|
|
rpcHandlerV2 http.Handler
|
|
|
|
)
|
|
|
|
|
2019-02-19 23:56:41 +00:00
|
|
|
// wire set for loading the server.
|
|
|
|
var serverSet = wire.NewSet(
|
|
|
|
manager.New,
|
|
|
|
api.New,
|
|
|
|
web.New,
|
2019-05-21 20:29:58 +00:00
|
|
|
provideHealthz,
|
2019-04-24 22:22:55 +00:00
|
|
|
provideMetric,
|
2019-12-30 01:59:42 +00:00
|
|
|
providePprof,
|
2019-02-19 23:56:41 +00:00
|
|
|
provideRouter,
|
|
|
|
provideRPC,
|
2019-05-21 18:45:42 +00:00
|
|
|
provideRPC2,
|
2019-02-19 23:56:41 +00:00
|
|
|
provideServer,
|
|
|
|
provideServerOptions,
|
|
|
|
)
|
|
|
|
|
|
|
|
// provideRouter is a Wire provider function that returns a
|
|
|
|
// router that is serves the provided handlers.
|
2019-12-30 01:59:42 +00:00
|
|
|
func provideRouter(api api.Server, web web.Server, rpcv1 rpcHandlerV1, rpcv2 rpcHandlerV2, healthz healthzHandler, metrics *metric.Server, pprof pprofHandler) *chi.Mux {
|
2019-02-19 23:56:41 +00:00
|
|
|
r := chi.NewRouter()
|
2019-05-21 20:29:58 +00:00
|
|
|
r.Mount("/healthz", healthz)
|
2019-02-19 23:56:41 +00:00
|
|
|
r.Mount("/metrics", metrics)
|
|
|
|
r.Mount("/api", api.Handler())
|
2019-05-21 18:45:42 +00:00
|
|
|
r.Mount("/rpc/v2", rpcv2)
|
2019-05-21 20:00:16 +00:00
|
|
|
r.Mount("/rpc", rpcv1)
|
2019-02-19 23:56:41 +00:00
|
|
|
r.Mount("/", web.Handler())
|
2019-12-30 01:59:42 +00:00
|
|
|
r.Mount("/debug", pprof)
|
2019-02-19 23:56:41 +00:00
|
|
|
return r
|
|
|
|
}
|
|
|
|
|
2019-05-21 20:29:58 +00:00
|
|
|
// provideMetric is a Wire provider function that returns the
|
|
|
|
// healthcheck server.
|
|
|
|
func provideHealthz() healthzHandler {
|
|
|
|
v := health.New()
|
|
|
|
return healthzHandler(v)
|
|
|
|
}
|
|
|
|
|
2019-04-24 22:22:55 +00:00
|
|
|
// provideMetric is a Wire provider function that returns the
|
|
|
|
// metrics server exposing metrics in prometheus format.
|
|
|
|
func provideMetric(session core.Session, config config.Config) *metric.Server {
|
|
|
|
return metric.NewServer(session, config.Prometheus.EnableAnonymousAccess)
|
|
|
|
}
|
|
|
|
|
2019-12-30 01:59:42 +00:00
|
|
|
// providePprof is a Wire provider function that returns the
|
|
|
|
// pprof server endpoints.
|
|
|
|
func providePprof(config config.Config) pprofHandler {
|
|
|
|
if config.Server.Pprof == false {
|
|
|
|
return pprofHandler(
|
|
|
|
http.NotFoundHandler(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
return pprofHandler(
|
|
|
|
middleware.Profiler(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2019-02-19 23:56:41 +00:00
|
|
|
// provideRPC is a Wire provider function that returns an rpc
|
|
|
|
// handler that exposes the build manager to a remote agent.
|
2019-05-21 20:00:16 +00:00
|
|
|
func provideRPC(m manager.BuildManager, config config.Config) rpcHandlerV1 {
|
|
|
|
v := rpc.NewServer(m, config.RPC.Secret)
|
|
|
|
return rpcHandlerV1(v)
|
2019-02-19 23:56:41 +00:00
|
|
|
}
|
|
|
|
|
2019-05-21 18:45:42 +00:00
|
|
|
// provideRPC2 is a Wire provider function that returns an rpc
|
|
|
|
// handler that exposes the build manager to a remote agent.
|
2019-05-21 20:00:16 +00:00
|
|
|
func provideRPC2(m manager.BuildManager, config config.Config) rpcHandlerV2 {
|
|
|
|
v := rpc2.NewServer(m, config.RPC.Secret)
|
|
|
|
return rpcHandlerV2(v)
|
2019-05-21 18:45:42 +00:00
|
|
|
}
|
|
|
|
|
2019-02-19 23:56:41 +00:00
|
|
|
// provideServer is a Wire provider function that returns an
|
|
|
|
// http server that is configured from the environment.
|
|
|
|
func provideServer(handler *chi.Mux, config config.Config) *server.Server {
|
|
|
|
return &server.Server{
|
|
|
|
Acme: config.Server.Acme,
|
|
|
|
Addr: config.Server.Port,
|
|
|
|
Cert: config.Server.Cert,
|
|
|
|
Key: config.Server.Key,
|
|
|
|
Host: config.Server.Host,
|
|
|
|
Handler: handler,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideServerOptions is a Wire provider function that returns
|
|
|
|
// the http web server security option from the environment.
|
|
|
|
func provideServerOptions(config config.Config) secure.Options {
|
|
|
|
return secure.Options{
|
|
|
|
AllowedHosts: config.HTTP.AllowedHosts,
|
|
|
|
HostsProxyHeaders: config.HTTP.HostsProxyHeaders,
|
|
|
|
SSLRedirect: config.HTTP.SSLRedirect,
|
|
|
|
SSLTemporaryRedirect: config.HTTP.SSLTemporaryRedirect,
|
|
|
|
SSLHost: config.HTTP.SSLHost,
|
|
|
|
SSLProxyHeaders: config.HTTP.SSLProxyHeaders,
|
|
|
|
STSSeconds: config.HTTP.STSSeconds,
|
|
|
|
STSIncludeSubdomains: config.HTTP.STSIncludeSubdomains,
|
|
|
|
STSPreload: config.HTTP.STSPreload,
|
|
|
|
ForceSTSHeader: config.HTTP.ForceSTSHeader,
|
|
|
|
FrameDeny: config.HTTP.FrameDeny,
|
|
|
|
ContentTypeNosniff: config.HTTP.ContentTypeNosniff,
|
|
|
|
BrowserXssFilter: config.HTTP.BrowserXSSFilter,
|
|
|
|
ContentSecurityPolicy: config.HTTP.ContentSecurityPolicy,
|
|
|
|
ReferrerPolicy: config.HTTP.ReferrerPolicy,
|
|
|
|
}
|
|
|
|
}
|